From 0e3f14f288078a64817e45ded37f9a3ea39b4872 Mon Sep 17 00:00:00 2001 From: Tom Hicks Date: Mon, 31 May 2021 20:23:39 -0700 Subject: [PATCH] Adds edit challenge rating screen. --- .../EditChallengeRatingFragment.java | 93 +++++++++++++++++++ .../ui/editmonster/EditMonsterFragment.java | 25 ++--- .../ui/editmonster/EditMonsterViewModel.java | 9 ++ .../main/res/layout/fragment_edit_armor.xml | 2 - .../layout/fragment_edit_challenge_rating.xml | 48 ++++++++++ .../main/res/navigation/mobile_navigation.xml | 8 ++ app/src/main/res/values/strings.xml | 2 + 7 files changed, 170 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditChallengeRatingFragment.java create mode 100644 app/src/main/res/layout/fragment_edit_challenge_rating.xml diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditChallengeRatingFragment.java b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditChallengeRatingFragment.java new file mode 100644 index 0000000..ec4b724 --- /dev/null +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditChallengeRatingFragment.java @@ -0,0 +1,93 @@ +package com.majinnaibu.monstercards.ui.editmonster; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.EditText; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +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.data.enums.ChallengeRating; +import com.majinnaibu.monstercards.helpers.ArrayHelper; +import com.majinnaibu.monstercards.utils.TextChangedListener; + +public class EditChallengeRatingFragment extends Fragment { + private EditMonsterViewModel mViewModel; + private ViewHolder mHolder; + + @Override + 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_challenge_rating, container, false); + mHolder = new ViewHolder(root); + + mHolder.challengeRating.setAdapter(new ArrayAdapter(requireContext(), R.layout.dropdown_list_item, ChallengeRating.values()) { + @NonNull + @Override + public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + ChallengeRating item = getItem(position); + TextView view = (TextView) super.getView(position, convertView, parent); + view.setText(item.displayName); + return view; + } + + @Override + public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + ChallengeRating item = getItem(position); + TextView view = (TextView) super.getDropDownView(position, convertView, parent); + view.setText(item.displayName); + return view; + } + }); + mHolder.challengeRating.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + ChallengeRating selectedItem = (ChallengeRating) parent.getItemAtPosition(position); + mViewModel.setChallengeRating(selectedItem); + } + + @Override + public void onNothingSelected(AdapterView parent) { + mViewModel.setChallengeRating(ChallengeRating.CUSTOM); + } + }); + mHolder.challengeRating.setSelection(ArrayHelper.indexOf(ChallengeRating.values(), mViewModel.getChallengeRating().getValue())); + + mHolder.customChallengeRatingDescription.setText(mViewModel.getCustomChallengeRatingDescription().getValue()); + mHolder.customChallengeRatingDescription.addTextChangedListener((new TextChangedListener((TextChangedListener.OnTextChangedCallback) (s, start, before, count) -> mViewModel.setCustomChallengeRatingDescription(s.toString())))); + + mHolder.customProficiencyBonus.setText(mViewModel.getCustomProficiencyBonusValueAsString()); + mHolder.customProficiencyBonus.addTextChangedListener((new TextChangedListener((TextChangedListener.OnTextChangedCallback) (s, start, before, count) -> mViewModel.setCustomProficiencyBonus(s.toString())))); + + return root; + } + + private static class ViewHolder { + final Spinner challengeRating; + final EditText customChallengeRatingDescription; + final EditText customProficiencyBonus; + + ViewHolder(View root) { + challengeRating = root.findViewById(R.id.challengeRating); + customChallengeRatingDescription = root.findViewById(R.id.customChallengeRatingDescription); + customProficiencyBonus = root.findViewById(R.id.customProficiencyBonus); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterFragment.java b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterFragment.java index 51bb80a..a7975bd 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterFragment.java +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterFragment.java @@ -83,37 +83,32 @@ public class EditMonsterFragment extends MCFragment { mHolder.basicInfoButton.setOnClickListener(v -> { NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditBasicInfoFragment(); - View view = getView(); - assert view != null; - Navigation.findNavController(view).navigate(action); + Navigation.findNavController(requireView()).navigate(action); }); mHolder.armorButton.setOnClickListener(v -> { NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditArmorFragment(); - View view = getView(); - assert view != null; - Navigation.findNavController(view).navigate(action); + Navigation.findNavController(requireView()).navigate(action); }); mHolder.speedButton.setOnClickListener(v -> { NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditSpeedFragment(); - View view = getView(); - assert view != null; - Navigation.findNavController(view).navigate(action); + Navigation.findNavController(requireView()).navigate(action); }); mHolder.abilityScoresButton.setOnClickListener(v -> { NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditAbilityScoresFragment(); - View view = getView(); - assert view != null; - Navigation.findNavController(view).navigate(action); + Navigation.findNavController(requireView()).navigate(action); }); mHolder.savingThrows.setOnClickListener(v -> { NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditSavingThrowsFragment(); - View view = getView(); - assert view != null; - Navigation.findNavController(view).navigate(action); + Navigation.findNavController(requireView()).navigate(action); + }); + + mHolder.challengeRating.setOnClickListener(v -> { + NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditChallengeRatingFragment(); + Navigation.findNavController(requireView()).navigate(action); }); requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), new OnBackPressedCallback(true) { diff --git a/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterViewModel.java b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterViewModel.java index 0d782ca..5c0c022 100644 --- a/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterViewModel.java +++ b/app/src/main/java/com/majinnaibu/monstercards/ui/editmonster/EditMonsterViewModel.java @@ -729,6 +729,15 @@ public class EditMonsterViewModel extends ViewModel { mCustomProficiencyBonus.setValue(proficiencyBonus); } + public void setCustomProficiencyBonus(String proficiencyBonus) { + Integer parsedValue = StringHelper.parseInt(proficiencyBonus); + this.setCustomProficiencyBonus(parsedValue != null ? parsedValue : 0); + } + + public String getCustomProficiencyBonusValueAsString() { + return mCustomProficiencyBonus.getValue().toString(); + } + public LiveData getBlindsightRange() { return mBlindsightRange; } diff --git a/app/src/main/res/layout/fragment_edit_armor.xml b/app/src/main/res/layout/fragment_edit_armor.xml index 36c4206..765d887 100644 --- a/app/src/main/res/layout/fragment_edit_armor.xml +++ b/app/src/main/res/layout/fragment_edit_armor.xml @@ -24,7 +24,6 @@ android:id="@+id/naturalArmorBonus" android:layout_width="match_parent" android:layout_height="wrap_content" - android:digits="0123456789" android:hint="@string/label_natural_armor_bonus" android:importantForAutofill="no" android:inputType="numberSigned" @@ -48,7 +47,6 @@ android:id="@+id/shieldBonus" android:layout_width="match_parent" android:layout_height="wrap_content" - android:digits="0123456789" android:hint="@string/label_shield_bonus" android:importantForAutofill="no" android:inputType="numberSigned" diff --git a/app/src/main/res/layout/fragment_edit_challenge_rating.xml b/app/src/main/res/layout/fragment_edit_challenge_rating.xml new file mode 100644 index 0000000..7fb40f4 --- /dev/null +++ b/app/src/main/res/layout/fragment_edit_challenge_rating.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index fe6f878..56c5290 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -87,6 +87,9 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 9934f06..ad74cda 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -28,7 +28,9 @@ Condition Immunities Constitution Custom Armor + Custom CR Custom HP + Custom Proficiency Bonus Custom Speed Damage Immunities Damage Resistances