Adds editing support for other traits using some shared fragments.
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
package com.majinnaibu.monstercards.data.enums;
|
||||
|
||||
public enum TraitType {
|
||||
ABILITY,
|
||||
ACTION,
|
||||
LAIR_ACTION,
|
||||
LEGENDARY_ACTION,
|
||||
REGIONAL_ACTION,
|
||||
REACTIONS
|
||||
}
|
||||
@@ -19,6 +19,7 @@ import androidx.navigation.Navigation;
|
||||
import com.google.android.material.snackbar.Snackbar;
|
||||
import com.majinnaibu.monstercards.R;
|
||||
import com.majinnaibu.monstercards.data.MonsterRepository;
|
||||
import com.majinnaibu.monstercards.data.enums.TraitType;
|
||||
import com.majinnaibu.monstercards.models.Monster;
|
||||
import com.majinnaibu.monstercards.ui.monster.MonsterDetailFragmentArgs;
|
||||
import com.majinnaibu.monstercards.ui.shared.MCFragment;
|
||||
@@ -146,10 +147,36 @@ public class EditMonsterFragment extends MCFragment {
|
||||
});
|
||||
|
||||
mHolder.abilities.setOnClickListener(v -> {
|
||||
NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditAbilitiesFragment();
|
||||
NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditTraitListFragment(TraitType.ABILITY);
|
||||
Navigation.findNavController(requireView()).navigate(action);
|
||||
});
|
||||
|
||||
mHolder.actions.setOnClickListener(v -> {
|
||||
NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditTraitListFragment(TraitType.ACTION);
|
||||
Navigation.findNavController(requireView()).navigate(action);
|
||||
});
|
||||
|
||||
mHolder.lairActions.setOnClickListener(v -> {
|
||||
NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditTraitListFragment(TraitType.LAIR_ACTION);
|
||||
Navigation.findNavController(requireView()).navigate(action);
|
||||
});
|
||||
|
||||
mHolder.legendaryActions.setOnClickListener(v -> {
|
||||
NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditTraitListFragment(TraitType.LEGENDARY_ACTION);
|
||||
Navigation.findNavController(requireView()).navigate(action);
|
||||
});
|
||||
|
||||
mHolder.reactions.setOnClickListener(v -> {
|
||||
NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditTraitListFragment(TraitType.REACTIONS);
|
||||
Navigation.findNavController(requireView()).navigate(action);
|
||||
});
|
||||
|
||||
mHolder.regionalActions.setOnClickListener(v -> {
|
||||
NavDirections action = EditMonsterFragmentDirections.actionEditMonsterFragmentToEditTraitListFragment(TraitType.REGIONAL_ACTION);
|
||||
Navigation.findNavController(requireView()).navigate(action);
|
||||
});
|
||||
|
||||
|
||||
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
|
||||
@@ -9,6 +9,7 @@ import com.majinnaibu.monstercards.data.enums.AdvantageType;
|
||||
import com.majinnaibu.monstercards.data.enums.ArmorType;
|
||||
import com.majinnaibu.monstercards.data.enums.ChallengeRating;
|
||||
import com.majinnaibu.monstercards.data.enums.ProficiencyType;
|
||||
import com.majinnaibu.monstercards.data.enums.TraitType;
|
||||
import com.majinnaibu.monstercards.helpers.StringHelper;
|
||||
import com.majinnaibu.monstercards.models.Language;
|
||||
import com.majinnaibu.monstercards.models.Monster;
|
||||
@@ -16,6 +17,7 @@ import com.majinnaibu.monstercards.models.Skill;
|
||||
import com.majinnaibu.monstercards.models.Trait;
|
||||
import com.majinnaibu.monstercards.ui.shared.ChangeTrackedViewModel;
|
||||
import com.majinnaibu.monstercards.utils.ChangeTrackedLiveData;
|
||||
import com.majinnaibu.monstercards.utils.Logger;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
@@ -740,14 +742,14 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
|
||||
return mTelepathyRange;
|
||||
}
|
||||
|
||||
public int getTelepathyRangeUnboxed() {
|
||||
return Helpers.unboxInteger(mTelepathyRange.getValue(), 0);
|
||||
}
|
||||
|
||||
public void setTelepathyRange(int telepathyRange) {
|
||||
mTelepathyRange.setValue(telepathyRange);
|
||||
}
|
||||
|
||||
public int getTelepathyRangeUnboxed() {
|
||||
return Helpers.unboxInteger(mTelepathyRange.getValue(), 0);
|
||||
}
|
||||
|
||||
public LiveData<String> getUnderstandsButDescription() {
|
||||
return mUnderstandsButDescription;
|
||||
}
|
||||
@@ -923,133 +925,6 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
|
||||
Helpers.replaceItemInList(mLanguages, oldLanguage, newLanguage, Language::compareTo);
|
||||
}
|
||||
|
||||
public LiveData<List<Trait>> getAbilities() {
|
||||
return mAbilities;
|
||||
}
|
||||
|
||||
public List<Trait> getAbilitiesArray() {
|
||||
return mAbilities.getValue();
|
||||
}
|
||||
|
||||
public Trait addNewAbility() {
|
||||
Trait newAbility = new Trait("", "");
|
||||
return Helpers.addItemToList(mAbilities, newAbility, Trait::compareTo);
|
||||
}
|
||||
|
||||
public void removeAbility(int position) {
|
||||
Helpers.removeFromList(mAbilities, position);
|
||||
}
|
||||
|
||||
public void replaceAbility(Trait oldAbility, Trait newAbility) {
|
||||
Helpers.replaceItemInList(mAbilities, oldAbility, newAbility);
|
||||
}
|
||||
|
||||
|
||||
public LiveData<List<Trait>> getActions() {
|
||||
return mActions;
|
||||
}
|
||||
|
||||
public List<Trait> getActionsArray() {
|
||||
return mActions.getValue();
|
||||
}
|
||||
|
||||
public Trait addNewAction() {
|
||||
Trait newAction = new Trait("", "");
|
||||
return Helpers.addItemToList(mActions, newAction, Trait::compareTo);
|
||||
}
|
||||
|
||||
public void removeAction(int position) {
|
||||
Helpers.removeFromList(mActions, position);
|
||||
}
|
||||
|
||||
public void replaceAction(Trait oldAction, Trait newAction) {
|
||||
Helpers.replaceItemInList(mActions, oldAction, newAction);
|
||||
}
|
||||
|
||||
public LiveData<List<Trait>> getReactions() {
|
||||
return mReactions;
|
||||
}
|
||||
|
||||
public List<Trait> getReactionsArray() {
|
||||
return mReactions.getValue();
|
||||
}
|
||||
|
||||
public Trait addNewReaction() {
|
||||
Trait newReaction = new Trait("", "");
|
||||
return Helpers.addItemToList(mReactions, newReaction, Trait::compareTo);
|
||||
}
|
||||
|
||||
public void removeReaction(int position) {
|
||||
Helpers.removeFromList(mReactions, position);
|
||||
}
|
||||
|
||||
public void replaceReaction(Trait oldReaction, Trait newReaction) {
|
||||
Helpers.replaceItemInList(mReactions, oldReaction, newReaction);
|
||||
}
|
||||
|
||||
public LiveData<List<Trait>> getLairActions() {
|
||||
return mLairActions;
|
||||
}
|
||||
|
||||
public List<Trait> getLairActionsArray() {
|
||||
return mLairActions.getValue();
|
||||
}
|
||||
|
||||
public Trait addNewLairAction() {
|
||||
Trait newLairAction = new Trait("", "");
|
||||
return Helpers.addItemToList(mLairActions, newLairAction, Trait::compareTo);
|
||||
}
|
||||
|
||||
public void removeLairAction(int position) {
|
||||
Helpers.removeFromList(mLairActions, position);
|
||||
}
|
||||
|
||||
public void replaceLairAction(Trait oldLairAction, Trait newLairAction) {
|
||||
Helpers.replaceItemInList(mLairActions, oldLairAction, newLairAction);
|
||||
}
|
||||
|
||||
public LiveData<List<Trait>> getLegendaryActions() {
|
||||
return mLegendaryActions;
|
||||
}
|
||||
|
||||
public List<Trait> getLegendaryActionsArray() {
|
||||
return mLegendaryActions.getValue();
|
||||
}
|
||||
|
||||
public Trait addNewLegendaryAction() {
|
||||
Trait newLegendaryAction = new Trait("", "");
|
||||
return Helpers.addItemToList(mLegendaryActions, newLegendaryAction, Trait::compareTo);
|
||||
}
|
||||
|
||||
public void removeLegendaryAction(int position) {
|
||||
Helpers.removeFromList(mLegendaryActions, position);
|
||||
}
|
||||
|
||||
public void replaceLegendaryAction(Trait oldLegendaryAction, Trait newLegendaryAction) {
|
||||
Helpers.replaceItemInList(mLegendaryActions, oldLegendaryAction, newLegendaryAction);
|
||||
}
|
||||
|
||||
public LiveData<List<Trait>> getRegionalActions() {
|
||||
return mRegionalActions;
|
||||
}
|
||||
|
||||
public List<Trait> getRegionalActionsArray() {
|
||||
return mRegionalActions.getValue();
|
||||
}
|
||||
|
||||
public Trait addNewRegionalAction() {
|
||||
Trait newRegionalAction = new Trait("", "");
|
||||
return Helpers.addItemToList(mRegionalActions, newRegionalAction, Trait::compareTo);
|
||||
}
|
||||
|
||||
public void removeRegionalAction(int position) {
|
||||
Helpers.removeFromList(mRegionalActions, position);
|
||||
}
|
||||
|
||||
public void replaceRegionalAction(Trait oldRegionalAction, Trait newRegionalAction) {
|
||||
Helpers.replaceItemInList(mRegionalActions, oldRegionalAction, newRegionalAction);
|
||||
}
|
||||
|
||||
public Monster buildMonster() {
|
||||
Monster monster = new Monster();
|
||||
|
||||
@@ -1114,12 +989,107 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
|
||||
return monster;
|
||||
}
|
||||
|
||||
public LiveData<List<Trait>> getTraits(TraitType type) {
|
||||
switch (type) {
|
||||
case ABILITY:
|
||||
return mAbilities;
|
||||
case ACTION:
|
||||
return mActions;
|
||||
case LAIR_ACTION:
|
||||
return mLairActions;
|
||||
case LEGENDARY_ACTION:
|
||||
return mLegendaryActions;
|
||||
case REACTIONS:
|
||||
return mReactions;
|
||||
case REGIONAL_ACTION:
|
||||
return mRegionalActions;
|
||||
default:
|
||||
Logger.logWTF(String.format("Unrecognized TraitType: %s", type));
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void removeTrait(TraitType type, int position) {
|
||||
switch (type) {
|
||||
case ABILITY:
|
||||
Helpers.removeFromList(mAbilities, position);
|
||||
break;
|
||||
case ACTION:
|
||||
Helpers.removeFromList(mActions, position);
|
||||
break;
|
||||
case LAIR_ACTION:
|
||||
Helpers.removeFromList(mLairActions, position);
|
||||
break;
|
||||
case LEGENDARY_ACTION:
|
||||
Helpers.removeFromList(mLegendaryActions, position);
|
||||
break;
|
||||
case REACTIONS:
|
||||
Helpers.removeFromList(mReactions, position);
|
||||
break;
|
||||
case REGIONAL_ACTION:
|
||||
Helpers.removeFromList(mRegionalActions, position);
|
||||
break;
|
||||
default:
|
||||
Logger.logWTF(String.format("Unrecognized TraitType: %s", type));
|
||||
}
|
||||
}
|
||||
|
||||
public void replaceTrait(TraitType type, Trait oldTrait, Trait newTrait) {
|
||||
switch (type) {
|
||||
case ABILITY:
|
||||
Helpers.replaceItemInList(mAbilities, oldTrait, newTrait);
|
||||
break;
|
||||
case ACTION:
|
||||
Helpers.replaceItemInList(mActions, oldTrait, newTrait);
|
||||
break;
|
||||
case LAIR_ACTION:
|
||||
Helpers.replaceItemInList(mLairActions, oldTrait, newTrait);
|
||||
break;
|
||||
case LEGENDARY_ACTION:
|
||||
Helpers.replaceItemInList(mLegendaryActions, oldTrait, newTrait);
|
||||
break;
|
||||
case REACTIONS:
|
||||
Helpers.replaceItemInList(mReactions, oldTrait, newTrait);
|
||||
break;
|
||||
case REGIONAL_ACTION:
|
||||
Helpers.replaceItemInList(mRegionalActions, oldTrait, newTrait);
|
||||
break;
|
||||
default:
|
||||
Logger.logWTF(String.format("Unrecognized TraitType: %s", type));
|
||||
}
|
||||
}
|
||||
|
||||
public Trait addNewTrait(TraitType type) {
|
||||
Trait newAction = new Trait("", "");
|
||||
switch (type) {
|
||||
case ABILITY:
|
||||
return Helpers.addItemToList(mAbilities, newAction);
|
||||
case ACTION:
|
||||
return Helpers.addItemToList(mActions, newAction);
|
||||
case LAIR_ACTION:
|
||||
return Helpers.addItemToList(mLairActions, newAction);
|
||||
case LEGENDARY_ACTION:
|
||||
return Helpers.addItemToList(mLegendaryActions, newAction);
|
||||
case REACTIONS:
|
||||
return Helpers.addItemToList(mReactions, newAction);
|
||||
case REGIONAL_ACTION:
|
||||
return Helpers.addItemToList(mRegionalActions, newAction);
|
||||
default:
|
||||
Logger.logWTF(String.format("Unrecognized TraitType: %s", type));
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("SameParameterValue")
|
||||
private static class Helpers {
|
||||
static String addStringToList(String newString, MutableLiveData<List<String>> strings) {
|
||||
return addItemToList(strings, newString, String::compareToIgnoreCase);
|
||||
}
|
||||
|
||||
static <T> T addItemToList(MutableLiveData<List<T>> listData, T newItem) {
|
||||
return addItemToList(listData, newItem, null);
|
||||
}
|
||||
|
||||
static <T> T addItemToList(MutableLiveData<List<T>> listData, T newItem, Comparator<? super T> comparator) {
|
||||
ArrayList<T> newList = new ArrayList<>(listData.getValue());
|
||||
newList.add(newItem);
|
||||
@@ -1174,7 +1144,7 @@ public class EditMonsterViewModel extends ChangeTrackedViewModel {
|
||||
boolean hasReplaced = false;
|
||||
ArrayList<T> newList = new ArrayList<>(oldList.size());
|
||||
for (T item : oldList) {
|
||||
if (Objects.equals(item, oldItem)) {
|
||||
if (!hasReplaced && Objects.equals(item, oldItem)) {
|
||||
newList.add(newItem);
|
||||
hasReplaced = true;
|
||||
} else {
|
||||
|
||||
@@ -15,26 +15,29 @@ import androidx.navigation.NavController;
|
||||
import androidx.navigation.Navigation;
|
||||
|
||||
import com.majinnaibu.monstercards.R;
|
||||
import com.majinnaibu.monstercards.data.enums.TraitType;
|
||||
import com.majinnaibu.monstercards.models.Trait;
|
||||
import com.majinnaibu.monstercards.ui.shared.MCFragment;
|
||||
import com.majinnaibu.monstercards.utils.Logger;
|
||||
import com.majinnaibu.monstercards.utils.TextChangedListener;
|
||||
|
||||
public class EditAbilityFragment extends MCFragment {
|
||||
public class EditTraitFragment extends MCFragment {
|
||||
private EditMonsterViewModel mEditMonsterViewModel;
|
||||
private EditTraitViewModel mViewModel;
|
||||
private ViewHolder mHolder;
|
||||
private EditTraitFragment.ViewHolder mHolder;
|
||||
private Trait mOldValue;
|
||||
private TraitType mTraitType;
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
|
||||
mViewModel = new ViewModelProvider(this).get(EditTraitViewModel.class);
|
||||
if (getArguments() != null) {
|
||||
EditAbilityFragmentArgs args = EditAbilityFragmentArgs.fromBundle(getArguments());
|
||||
EditTraitFragmentArgs args = EditTraitFragmentArgs.fromBundle(getArguments());
|
||||
mOldValue = new Trait(args.getName(), args.getDescription());
|
||||
mViewModel.copyFromTrait(mOldValue);
|
||||
mTraitType = args.getTraitType();
|
||||
} else {
|
||||
Logger.logWTF("EditAbilityFragment needs arguments");
|
||||
Logger.logWTF("EditTraitFragment needs arguments");
|
||||
mOldValue = null;
|
||||
}
|
||||
|
||||
@@ -49,7 +52,7 @@ public class EditAbilityFragment extends MCFragment {
|
||||
NavBackStackEntry backStackEntry = navController.getBackStackEntry(R.id.edit_monster_navigation);
|
||||
mEditMonsterViewModel = new ViewModelProvider(backStackEntry).get(EditMonsterViewModel.class);
|
||||
View root = inflater.inflate(R.layout.fragment_edit_trait, container, false);
|
||||
mHolder = new ViewHolder(root);
|
||||
mHolder = new EditTraitFragment.ViewHolder(root);
|
||||
|
||||
mHolder.name.setText(mViewModel.getNameAsString());
|
||||
mHolder.name.addTextChangedListener(new TextChangedListener((TextChangedListener.OnTextChangedCallback) (s, start, before, count) -> mViewModel.setName(s.toString())));
|
||||
@@ -61,7 +64,7 @@ public class EditAbilityFragment extends MCFragment {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
if (mViewModel.hasChanges()) {
|
||||
mEditMonsterViewModel.replaceAbility(mOldValue, mViewModel.getAbilityValue());
|
||||
mEditMonsterViewModel.replaceTrait(mTraitType, mOldValue, mViewModel.getAbilityValue());
|
||||
}
|
||||
Navigation.findNavController(requireView()).navigateUp();
|
||||
}
|
||||
@@ -8,6 +8,7 @@ import android.view.ViewGroup;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.lifecycle.LiveData;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.navigation.NavBackStackEntry;
|
||||
import androidx.navigation.NavController;
|
||||
@@ -20,30 +21,45 @@ import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
import com.majinnaibu.monstercards.R;
|
||||
import com.majinnaibu.monstercards.data.enums.TraitType;
|
||||
import com.majinnaibu.monstercards.models.Trait;
|
||||
import com.majinnaibu.monstercards.ui.shared.MCFragment;
|
||||
import com.majinnaibu.monstercards.ui.shared.SwipeToDeleteCallback;
|
||||
import com.majinnaibu.monstercards.utils.Logger;
|
||||
|
||||
public class EditAbilitiesFragment extends MCFragment {
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
// TODO: rename to EditTraitsFragment
|
||||
public class EditTraitListFragment extends MCFragment {
|
||||
private EditMonsterViewModel mViewModel;
|
||||
private ViewHolder mHolder;
|
||||
private TraitType mTraitType;
|
||||
|
||||
private void navigateToEditAbility(Trait trait) {
|
||||
NavDirections action = EditAbilitiesFragmentDirections.actionEditAbilitiesFragmentToEditAbilityFragment(trait.description, trait.name);
|
||||
Navigation.findNavController(requireView()).navigate(action);
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
|
||||
if (getArguments() != null) {
|
||||
EditTraitListFragmentArgs args = EditTraitListFragmentArgs.fromBundle(getArguments());
|
||||
mTraitType = args.getTraitType();
|
||||
} else {
|
||||
Logger.logWTF("EditTraitFragment needs arguments");
|
||||
}
|
||||
super.onCreate(savedInstanceState);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@org.jetbrains.annotations.Nullable
|
||||
@Override
|
||||
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
|
||||
public View onCreateView(@NonNull @NotNull LayoutInflater inflater, @Nullable @org.jetbrains.annotations.Nullable ViewGroup container, @Nullable @org.jetbrains.annotations.Nullable 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);
|
||||
View root = inflater.inflate(R.layout.fragment_edit_abilities_list, container, false);
|
||||
View root = inflater.inflate(R.layout.fragment_edit_traits_list, container, false);
|
||||
mHolder = new ViewHolder(root);
|
||||
setupRecyclerView(mHolder.list);
|
||||
setupAddAbilityButton(mHolder.addAbility);
|
||||
setupAddButton(mHolder.addTrait);
|
||||
return root;
|
||||
}
|
||||
|
||||
@@ -52,38 +68,47 @@ public class EditAbilitiesFragment extends MCFragment {
|
||||
LinearLayoutManager layoutManager = new LinearLayoutManager(context);
|
||||
recyclerView.setLayoutManager(layoutManager);
|
||||
|
||||
mViewModel.getAbilities().observe(getViewLifecycleOwner(), abilities -> {
|
||||
EditAbilitiesRecyclerViewAdapter adapter = new EditAbilitiesRecyclerViewAdapter(abilities, ability -> {
|
||||
if (ability != null) {
|
||||
navigateToEditAbility(ability);
|
||||
LiveData<List<Trait>> traitData = mViewModel.getTraits(mTraitType);
|
||||
if (traitData != null) {
|
||||
traitData.observe(getViewLifecycleOwner(), traits -> {
|
||||
EditTraitsRecyclerViewAdapter adapter = new EditTraitsRecyclerViewAdapter(traits, trait -> {
|
||||
if (trait != null) {
|
||||
navigateToEditTrait(trait);
|
||||
} else {
|
||||
Logger.logError("Can't navigate to EditAbilityFragment with a null ability");
|
||||
Logger.logError("Can't navigate to EditTraitFragment with a null trait");
|
||||
}
|
||||
});
|
||||
recyclerView.setAdapter(adapter);
|
||||
});
|
||||
|
||||
}
|
||||
DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(context, layoutManager.getOrientation());
|
||||
recyclerView.addItemDecoration(dividerItemDecoration);
|
||||
|
||||
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new SwipeToDeleteCallback(context, mViewModel::removeAbility));
|
||||
ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new SwipeToDeleteCallback(context, position -> mViewModel.removeTrait(mTraitType, position)));
|
||||
itemTouchHelper.attachToRecyclerView(recyclerView);
|
||||
}
|
||||
|
||||
private void setupAddAbilityButton(@NonNull FloatingActionButton fab) {
|
||||
private void setupAddButton(@NonNull FloatingActionButton fab) {
|
||||
fab.setOnClickListener(view -> {
|
||||
Trait ability = mViewModel.addNewAbility();
|
||||
navigateToEditAbility(ability);
|
||||
Trait newTrait = mViewModel.addNewTrait(mTraitType);
|
||||
if (newTrait != null) {
|
||||
navigateToEditTrait(newTrait);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
protected void navigateToEditTrait(Trait trait) {
|
||||
NavDirections action = EditTraitListFragmentDirections.actionEditTraitListFragmentToEditTraitFragment(trait.description, trait.name, mTraitType);
|
||||
Navigation.findNavController(requireView()).navigate(action);
|
||||
}
|
||||
|
||||
private static class ViewHolder {
|
||||
RecyclerView list;
|
||||
FloatingActionButton addAbility;
|
||||
FloatingActionButton addTrait;
|
||||
|
||||
ViewHolder(View root) {
|
||||
list = root.findViewById(R.id.list);
|
||||
addAbility = root.findViewById(R.id.add_ability);
|
||||
addTrait = root.findViewById(R.id.add_trait);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,18 +6,18 @@ import android.widget.TextView;
|
||||
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.majinnaibu.monstercards.databinding.FragmentEditAbilitiesListItemBinding;
|
||||
import com.majinnaibu.monstercards.databinding.FragmentEditTraitsListItemBinding;
|
||||
import com.majinnaibu.monstercards.models.Trait;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class EditAbilitiesRecyclerViewAdapter extends RecyclerView.Adapter<EditAbilitiesRecyclerViewAdapter.ViewHolder> {
|
||||
public class EditTraitsRecyclerViewAdapter extends RecyclerView.Adapter<EditTraitsRecyclerViewAdapter.ViewHolder> {
|
||||
private final List<Trait> mValues;
|
||||
private final ItemCallback mOnClick;
|
||||
|
||||
public EditAbilitiesRecyclerViewAdapter(List<Trait> items, ItemCallback onClick) {
|
||||
public EditTraitsRecyclerViewAdapter(List<Trait> items, ItemCallback onClick) {
|
||||
mValues = items;
|
||||
mOnClick = onClick;
|
||||
}
|
||||
@@ -25,7 +25,7 @@ public class EditAbilitiesRecyclerViewAdapter extends RecyclerView.Adapter<EditA
|
||||
@NotNull
|
||||
@Override
|
||||
public ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) {
|
||||
return new ViewHolder(FragmentEditAbilitiesListItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
|
||||
return new ViewHolder(FragmentEditTraitsListItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -52,7 +52,7 @@ public class EditAbilitiesRecyclerViewAdapter extends RecyclerView.Adapter<EditA
|
||||
public final TextView mContentView;
|
||||
public Trait mItem;
|
||||
|
||||
public ViewHolder(FragmentEditAbilitiesListItemBinding binding) {
|
||||
public ViewHolder(FragmentEditTraitsListItemBinding binding) {
|
||||
super(binding.getRoot());
|
||||
mContentView = binding.content;
|
||||
}
|
||||
@@ -62,6 +62,5 @@ public class EditAbilitiesRecyclerViewAdapter extends RecyclerView.Adapter<EditA
|
||||
public String toString() {
|
||||
return super.toString() + " '" + mContentView.getText() + "'";
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -20,12 +20,12 @@
|
||||
tools:listitem="@layout/fragment_edit_abilities_list_item" />
|
||||
|
||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
||||
android:id="@+id/add_ability"
|
||||
android:id="@+id/add_trait"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_gravity="bottom|end"
|
||||
android:layout_margin="@dimen/fab_margin"
|
||||
android:contentDescription="@string/action_add_ability"
|
||||
android:contentDescription="@string/action_add_trait"
|
||||
app:layout_constraintBottom_toBottomOf="parent"
|
||||
app:layout_constraintEnd_toEndOf="parent"
|
||||
app:srcCompat="@android:drawable/ic_input_add"
|
||||
@@ -112,8 +112,8 @@
|
||||
android:id="@+id/action_editMonsterFragment_to_editLanguagesFragment"
|
||||
app:destination="@id/editLanguagesFragment" />
|
||||
<action
|
||||
android:id="@+id/action_editMonsterFragment_to_editAbilitiesFragment"
|
||||
app:destination="@id/editAbilitiesFragment" />
|
||||
android:id="@+id/action_editMonsterFragment_to_editTraitListFragment"
|
||||
app:destination="@id/editTraitListFragment" />
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/editBasicInfoFragment"
|
||||
@@ -279,23 +279,29 @@
|
||||
app:argType="boolean" />
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/editAbilitiesFragment"
|
||||
android:name="com.majinnaibu.monstercards.ui.editmonster.EditAbilitiesFragment"
|
||||
android:label="EditAbilitiesFragment" >
|
||||
<action
|
||||
android:id="@+id/action_editAbilitiesFragment_to_editAbilityFragment"
|
||||
app:destination="@id/editAbilityFragment" />
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/editAbilityFragment"
|
||||
android:name="com.majinnaibu.monstercards.ui.editmonster.EditAbilityFragment"
|
||||
android:label="EditAbilityFragment" >
|
||||
android:id="@+id/editTraitFragment"
|
||||
android:name="com.majinnaibu.monstercards.ui.editmonster.EditTraitFragment"
|
||||
android:label="EditTraitFragment">
|
||||
<argument
|
||||
android:name="description"
|
||||
app:argType="string" />
|
||||
<argument
|
||||
android:name="name"
|
||||
app:argType="string" />
|
||||
<argument
|
||||
android:name="traitType"
|
||||
app:argType="com.majinnaibu.monstercards.data.enums.TraitType" />
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/editTraitListFragment"
|
||||
android:name="com.majinnaibu.monstercards.ui.editmonster.EditTraitListFragment"
|
||||
android:label="EditTraitListFragment">
|
||||
<action
|
||||
android:id="@+id/action_editTraitListFragment_to_editTraitFragment"
|
||||
app:destination="@id/editTraitFragment" />
|
||||
<argument
|
||||
android:name="traitType"
|
||||
app:argType="com.majinnaibu.monstercards.data.enums.TraitType" />
|
||||
</fragment>
|
||||
</navigation>
|
||||
</navigation>
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
<string name="action_add_monster">Add monster</string>
|
||||
<string name="action_add_sense">Add Sense</string>
|
||||
<string name="action_add_skill">Add Skill</string>
|
||||
<string name="action_add_trait">Add Trait</string>
|
||||
<string name="action_edit">Edit</string>
|
||||
<string name="actions_label">Actions</string>
|
||||
<string name="app_name">MonsterCards</string>
|
||||
|
||||
Reference in New Issue
Block a user