diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterFragment.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterFragment.java index d0d34b9..b448406 100644 --- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterFragment.java +++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterFragment.java @@ -80,12 +80,14 @@ public class EditMonsterFragment extends MCFragment { } }); } + mHolder.basicInfoButton.setOnClickListener(v -> { NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditBasicInfoFragment(); View view = getView(); assert view != null; Navigation.findNavController(view).navigate(action); }); + mHolder.armorButton.setOnClickListener(v -> { NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditArmorFragment(); View view = getView(); @@ -93,6 +95,13 @@ public class EditMonsterFragment extends MCFragment { Navigation.findNavController(view).navigate(action); }); + mHolder.speedButton.setOnClickListener(v -> { + NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditSpeedFragment(); + View view = getView(); + assert view != null; + Navigation.findNavController(view).navigate(action); + }); + requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), new OnBackPressedCallback(true) { @Override public void handleOnBackPressed() { @@ -144,10 +153,12 @@ public class EditMonsterFragment extends MCFragment { TextView basicInfoButton; TextView armorButton; + TextView speedButton; ViewHolder(View root) { basicInfoButton = root.findViewById(R.id.basicInfo); armorButton = root.findViewById(R.id.armor); + speedButton = root.findViewById(R.id.speed); } } } \ No newline at end of file diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterViewModel.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterViewModel.java index e0d1fdb..5a7d142 100644 --- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterViewModel.java +++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterViewModel.java @@ -21,10 +21,17 @@ public class EditMonsterViewModel extends ViewModel { private final MutableLiveData mHasChanges; private final MutableLiveData mHasCustomHitPoints; private final MutableLiveData mHasShield; + private final MutableLiveData mCanHover; + private final MutableLiveData mHasCustomSpeed; private final MutableLiveData mArmorType; private final MutableLiveData mHitDice; private final MutableLiveData mNaturalArmorBonus; private final MutableLiveData mShieldBonus; + private final MutableLiveData mWalkSpeed; + private final MutableLiveData mBurrowSpeed; + private final MutableLiveData mClimbSpeed; + private final MutableLiveData mFlySpeed; + private final MutableLiveData mSwimSpeed; private final MutableLiveData mName; private final MutableLiveData mErrorMessage; private final MutableLiveData mSize; @@ -33,6 +40,7 @@ public class EditMonsterViewModel extends ViewModel { private final MutableLiveData mAlignment; private final MutableLiveData mCustomHitPoints; private final MutableLiveData mCustomArmor; + private final MutableLiveData mCustomSpeed; public EditMonsterViewModel() { @@ -53,6 +61,14 @@ public class EditMonsterViewModel extends ViewModel { mHasShield = new MutableLiveData<>(false); mShieldBonus = new MutableLiveData<>(0); mCustomArmor = new MutableLiveData<>(""); + mWalkSpeed = new MutableLiveData<>(0); + mBurrowSpeed = new MutableLiveData<>(0); + mClimbSpeed = new MutableLiveData<>(0); + mFlySpeed = new MutableLiveData<>(0); + mSwimSpeed = new MutableLiveData<>(0); + mCanHover = new MutableLiveData<>(false); + mHasCustomSpeed = new MutableLiveData<>(false); + mCustomSpeed = new MutableLiveData<>(""); // TODO: consider initializing this to true so all new monsters need saving mHasChanges = new MutableLiveData<>(false); } @@ -73,6 +89,15 @@ public class EditMonsterViewModel extends ViewModel { mHasShield.setValue(monster.shieldBonus != 0); mShieldBonus.setValue(monster.shieldBonus); mCustomArmor.setValue(monster.otherArmorDescription); + mWalkSpeed.setValue(monster.walkSpeed); + mBurrowSpeed.setValue(monster.burrowSpeed); + mClimbSpeed.setValue(monster.climbSpeed); + mFlySpeed.setValue(monster.flySpeed); + mSwimSpeed.setValue(monster.swimSpeed); + mCanHover.setValue(monster.canHover); + mHasCustomSpeed.setValue(monster.hasCustomSpeed); + mCustomSpeed.setValue(monster.customSpeedDescription); + mHasChanges.setValue(false); } @@ -297,6 +322,136 @@ public class EditMonsterViewModel extends ViewModel { return mShieldBonus.getValue().toString(); } + public LiveData getWalkSpeed() { + return mWalkSpeed; + } + + public void setWalkSpeed(int walkSpeed) { + if (!Objects.equals(mWalkSpeed.getValue(), walkSpeed)) { + mWalkSpeed.setValue(walkSpeed); + mHasChanges.setValue(true); + Logger.logDebug(String.format("Setting walk speed to %d ft.", walkSpeed)); + } + } + + public void incrementWalkSpeed() { + setWalkSpeed(mWalkSpeed.getValue() + 5); + } + + public void decrementWalkSpeed() { + setWalkSpeed(mWalkSpeed.getValue() - 5); + } + + public LiveData getBurrowSpeed() { + return mBurrowSpeed; + } + + public void setBurrowSpeed(int burrowSpeed) { + if (!Objects.equals(mBurrowSpeed.getValue(), burrowSpeed)) { + mBurrowSpeed.setValue(burrowSpeed); + mHasChanges.setValue(true); + } + } + + public LiveData getClimbSpeed() { + return mClimbSpeed; + } + + public void setClimbSpeed(int climbSpeed) { + if (!Objects.equals(mClimbSpeed.getValue(), climbSpeed)) { + mClimbSpeed.setValue(climbSpeed); + mHasChanges.setValue(true); + } + } + + public LiveData getFlySpeed() { + return mFlySpeed; + } + + public void setFlySpeed(int flySpeed) { + if (!Objects.equals(mFlySpeed.getValue(), flySpeed)) { + mFlySpeed.setValue(flySpeed); + mHasChanges.setValue(true); + } + } + + public LiveData getSwimSpeed() { + return mSwimSpeed; + } + + public void setSwimSpeed(int swimSpeed) { + if (!Objects.equals(mSwimSpeed.getValue(), swimSpeed)) { + mSwimSpeed.setValue(swimSpeed); + mHasChanges.setValue(true); + } + } + + public LiveData getCanHover() { + return mCanHover; + } + + public void setCanHover(boolean canHover) { + if (!Objects.equals(mCanHover.getValue(), canHover)) { + mCanHover.setValue(canHover); + mHasChanges.setValue(true); + } + } + + public LiveData getHasCustomSpeed() { + return mHasCustomSpeed; + } + + public void setHasCustomSpeed(boolean hasCustomSpeed) { + if (!Objects.equals(mHasCustomSpeed.getValue(), hasCustomSpeed)) { + mHasCustomSpeed.setValue(hasCustomSpeed); + mHasChanges.setValue(true); + } + } + + public LiveData getCustomSpeed() { + return mCustomSpeed; + } + + public void setCustomSpeed(String customSpeed) { + if (!Objects.equals(mCustomSpeed.getValue(), customSpeed)) { + mCustomSpeed.setValue(customSpeed); + mHasChanges.setValue(true); + } + } + + public void incrementBurrowSpeed() { + setBurrowSpeed(mBurrowSpeed.getValue() + 5); + } + + public void decrementBurrowSpeed() { + setBurrowSpeed(mBurrowSpeed.getValue() - 5); + } + + public void incrementClimbSpeed() { + setClimbSpeed(mClimbSpeed.getValue() + 5); + } + + public void decrementClimbSpeed() { + setClimbSpeed(mClimbSpeed.getValue() - 5); + } + + public void incrementFlySpeed() { + setFlySpeed(mFlySpeed.getValue() + 5); + } + + public void decrementFlySpeed() { + setFlySpeed(mFlySpeed.getValue() - 5); + } + + public void incrementSwimSpeed() { + setSwimSpeed(mSwimSpeed.getValue() + 5); + } + + public void decrementSwimSpeed() { + setSwimSpeed(mSwimSpeed.getValue() - 5); + } + + public Monster buildMonster() { Monster monster = new Monster(); @@ -313,6 +468,14 @@ public class EditMonsterViewModel extends ViewModel { monster.naturalArmorBonus = mNaturalArmorBonus.getValue(); monster.shieldBonus = mShieldBonus.getValue(); monster.otherArmorDescription = mCustomArmor.getValue(); + monster.walkSpeed = mWalkSpeed.getValue(); + monster.burrowSpeed = mBurrowSpeed.getValue(); + monster.climbSpeed = mClimbSpeed.getValue(); + monster.flySpeed = mFlySpeed.getValue(); + monster.swimSpeed = mSwimSpeed.getValue(); + monster.canHover = mCanHover.getValue(); + monster.hasCustomSpeed = mHasCustomSpeed.getValue(); + monster.customSpeedDescription = mCustomSpeed.getValue(); return monster; } diff --git a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSpeedFragment.java b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSpeedFragment.java index 0893635..7ffb29f 100644 --- a/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSpeedFragment.java +++ b/Android/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditSpeedFragment.java @@ -4,52 +4,59 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; import android.widget.EditText; +import android.widget.TextView; -import androidx.annotation.NonNull; import androidx.appcompat.widget.SwitchCompat; +import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.navigation.NavBackStackEntry; import androidx.navigation.NavController; import androidx.navigation.Navigation; import com.majinnaibu.monstercards.R; -import com.majinnaibu.monstercards.ui.components.Stepper; -import com.majinnaibu.monstercards.ui.shared.MCFragment; import com.majinnaibu.monstercards.utils.TextChangedListener; -public class EditSpeedFragment extends MCFragment { +public class EditSpeedFragment extends Fragment { private EditMonsterViewModel mViewModel; private ViewHolder mHolder; @Override - public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { NavController navController = Navigation.findNavController(requireActivity(), R.id.nav_host_fragment); NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation); mViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class); + + // Inflate the layout for this fragment View root = inflater.inflate(R.layout.fragment_edit_speed, container, false); + mHolder = new ViewHolder(root); - mHolder.baseSpeed.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setWalkSpeed(newValue)); - mHolder.baseSpeed.setOnFormatValueCallback(value -> String.format(getString(R.string.format_distance_in_feet), value)); - mViewModel.getWalkSpeed().observe(getViewLifecycleOwner(), value -> mHolder.baseSpeed.setValue(value)); + mViewModel.getWalkSpeed().observe(getViewLifecycleOwner(), value -> { + mHolder.baseSpeed.setText(String.format(getString(R.string.format_distance_in_feet), value)); + }); + mHolder.incrementBaseSpeed.setOnClickListener(v -> mViewModel.incrementWalkSpeed()); + mHolder.decrementBaseSpeed.setOnClickListener(v -> mViewModel.decrementWalkSpeed()); - mHolder.burrowSpeed.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setBurrowSpeed(newValue)); - mHolder.burrowSpeed.setOnFormatValueCallback(value -> String.format(getString(R.string.format_distance_in_feet), value)); - mViewModel.getBurrowSpeed().observe(getViewLifecycleOwner(), value -> mHolder.burrowSpeed.setValue(value)); + mViewModel.getBurrowSpeed().observe(getViewLifecycleOwner(), value -> { + mHolder.burrowSpeed.setText(String.format(getString(R.string.format_distance_in_feet), value)); + }); + mHolder.incrementBurrowSpeed.setOnClickListener(v -> mViewModel.incrementBurrowSpeed()); + mHolder.decrementBurrowSpeed.setOnClickListener(v -> mViewModel.decrementBurrowSpeed()); - mHolder.climbSpeed.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setClimbSpeed(newValue)); - mHolder.climbSpeed.setOnFormatValueCallback(value -> String.format(getString(R.string.format_distance_in_feet), value)); - mViewModel.getClimbSpeed().observe(getViewLifecycleOwner(), value -> mHolder.climbSpeed.setValue(value)); + mViewModel.getClimbSpeed().observe(getViewLifecycleOwner(), value -> mHolder.climbSpeed.setText(String.format(getString(R.string.format_distance_in_feet), value))); + mHolder.incrementClimbSpeed.setOnClickListener(v -> mViewModel.incrementClimbSpeed()); + mHolder.decrementBurrowSpeed.setOnClickListener(v -> mViewModel.decrementClimbSpeed()); - mHolder.flySpeed.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setFlySpeed(newValue)); - mHolder.flySpeed.setOnFormatValueCallback(value -> String.format(getString(R.string.format_distance_in_feet), value)); - mViewModel.getFlySpeed().observe(getViewLifecycleOwner(), value -> mHolder.flySpeed.setValue(value)); + mViewModel.getFlySpeed().observe(getViewLifecycleOwner(), value -> mHolder.flySpeed.setText(String.format(getString(R.string.format_distance_in_feet), value))); + mHolder.incrementFlySpeed.setOnClickListener(v -> mViewModel.incrementFlySpeed()); + mHolder.decrementBurrowSpeed.setOnClickListener(v -> mViewModel.decrementFlySpeed()); - mHolder.swimSpeed.setOnValueChangeListener((newValue, oldValue) -> mViewModel.setSwimSpeed(newValue)); - mHolder.swimSpeed.setOnFormatValueCallback(value -> String.format(getString(R.string.format_distance_in_feet), value)); - mViewModel.getSwimSpeed().observe(getViewLifecycleOwner(), value -> mHolder.swimSpeed.setValue(value)); + mViewModel.getSwimSpeed().observe(getViewLifecycleOwner(), value -> mHolder.swimSpeed.setText(String.format(getString(R.string.format_distance_in_feet), value))); + mHolder.incrementSwimSpeed.setOnClickListener(v -> mViewModel.incrementSwimSpeed()); + mHolder.decrementBurrowSpeed.setOnClickListener(v -> mViewModel.decrementSwimSpeed()); mViewModel.getCanHover().observe(getViewLifecycleOwner(), value -> mHolder.canHover.setChecked(value)); mHolder.canHover.setOnCheckedChangeListener((buttonView, isChecked) -> mViewModel.setCanHover(isChecked)); @@ -66,25 +73,45 @@ public class EditSpeedFragment extends MCFragment { private static class ViewHolder { - final Stepper baseSpeed; - final Stepper burrowSpeed; - final Stepper climbSpeed; - final Stepper flySpeed; - final Stepper swimSpeed; + final TextView baseSpeed; + final Button incrementBaseSpeed; + final Button decrementBaseSpeed; + final TextView burrowSpeed; + final Button incrementBurrowSpeed; + final Button decrementBurrowSpeed; + final TextView climbSpeed; + final Button incrementClimbSpeed; + final Button decrementClimbSpeed; + final TextView flySpeed; + final Button incrementFlySpeed; + final Button decrementFlySpeed; + final TextView swimSpeed; + final Button incrementSwimSpeed; + final Button decrementSwimSpeed; final SwitchCompat canHover; final SwitchCompat hasCustomSpeed; final EditText customSpeed; - ViewHolder(@NonNull View root) { + ViewHolder(View root) { baseSpeed = root.findViewById(R.id.baseSpeed); + incrementBaseSpeed = root.findViewById(R.id.baseSpeed_increment); + decrementBaseSpeed = root.findViewById(R.id.baseSpeed_decrement); burrowSpeed = root.findViewById(R.id.burrowSpeed); + incrementBurrowSpeed = root.findViewById(R.id.burrowSpeed_increment); + decrementBurrowSpeed = root.findViewById(R.id.burrowSpeed_decrement); climbSpeed = root.findViewById(R.id.climbSpeed); + incrementClimbSpeed = root.findViewById(R.id.climbSpeed_increment); + decrementClimbSpeed = root.findViewById(R.id.climbSpeed_decrement); flySpeed = root.findViewById(R.id.flySpeed); + incrementFlySpeed = root.findViewById(R.id.flySpeed_increment); + decrementFlySpeed = root.findViewById(R.id.flySpeed_decrement); swimSpeed = root.findViewById(R.id.swimSpeed); + incrementSwimSpeed = root.findViewById(R.id.swimSpeed_increment); + decrementSwimSpeed = root.findViewById(R.id.swimSpeed_decrement); canHover = root.findViewById(R.id.canHover); hasCustomSpeed = root.findViewById(R.id.hasCustomSpeed); customSpeed = root.findViewById(R.id.customSpeed); } } -} +} \ No newline at end of file diff --git a/Android/app/src/main/res/layout/fragment_edit_speed.xml b/Android/app/src/main/res/layout/fragment_edit_speed.xml index 8904f2d..5de66a1 100644 --- a/Android/app/src/main/res/layout/fragment_edit_speed.xml +++ b/Android/app/src/main/res/layout/fragment_edit_speed.xml @@ -11,55 +11,215 @@ android:layout_height="wrap_content" android:orientation="vertical"> - + android:layout_margin="@dimen/text_margin"> - + - + - +