mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-01-25 07:21:14 +01:00
Android: Add the ability to delete cheats
This commit is contained in:
parent
404eb13e2f
commit
1470dfcf81
@ -20,6 +20,7 @@ public class CheatsViewModel extends ViewModel
|
|||||||
|
|
||||||
private final MutableLiveData<Integer> mCheatAddedEvent = new MutableLiveData<>(null);
|
private final MutableLiveData<Integer> mCheatAddedEvent = new MutableLiveData<>(null);
|
||||||
private final MutableLiveData<Integer> mCheatChangedEvent = new MutableLiveData<>(null);
|
private final MutableLiveData<Integer> mCheatChangedEvent = new MutableLiveData<>(null);
|
||||||
|
private final MutableLiveData<Integer> mCheatDeletedEvent = new MutableLiveData<>(null);
|
||||||
private final MutableLiveData<Boolean> mOpenDetailsViewEvent = new MutableLiveData<>(false);
|
private final MutableLiveData<Boolean> mOpenDetailsViewEvent = new MutableLiveData<>(false);
|
||||||
|
|
||||||
private ArrayList<PatchCheat> mPatchCheats;
|
private ArrayList<PatchCheat> mPatchCheats;
|
||||||
@ -200,6 +201,41 @@ public class CheatsViewModel extends ViewModel
|
|||||||
mCheatChangedEvent.setValue(null);
|
mCheatChangedEvent.setValue(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* When a cheat is deleted, the integer stored in the returned LiveData
|
||||||
|
* changes to the position of that cheat, then changes back to null.
|
||||||
|
*/
|
||||||
|
public LiveData<Integer> getCheatDeletedEvent()
|
||||||
|
{
|
||||||
|
return mCheatDeletedEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteSelectedCheat()
|
||||||
|
{
|
||||||
|
Cheat cheat = mSelectedCheat.getValue();
|
||||||
|
int position = mSelectedCheatPosition;
|
||||||
|
|
||||||
|
setSelectedCheat(null, -1);
|
||||||
|
|
||||||
|
if (mPatchCheats.remove(cheat))
|
||||||
|
mPatchCheatsNeedSaving = true;
|
||||||
|
if (mARCheats.remove(cheat))
|
||||||
|
mARCheatsNeedSaving = true;
|
||||||
|
if (mGeckoCheats.remove(cheat))
|
||||||
|
mGeckoCheatsNeedSaving = true;
|
||||||
|
|
||||||
|
notifyCheatDeleted(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Notifies that the cheat at the given position has been deleted.
|
||||||
|
*/
|
||||||
|
private void notifyCheatDeleted(int position)
|
||||||
|
{
|
||||||
|
mCheatDeletedEvent.setValue(position);
|
||||||
|
mCheatDeletedEvent.setValue(null);
|
||||||
|
}
|
||||||
|
|
||||||
public LiveData<Boolean> getOpenDetailsViewEvent()
|
public LiveData<Boolean> getOpenDetailsViewEvent()
|
||||||
{
|
{
|
||||||
return mOpenDetailsViewEvent;
|
return mOpenDetailsViewEvent;
|
||||||
|
@ -13,6 +13,7 @@ import android.widget.TextView;
|
|||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.lifecycle.LiveData;
|
import androidx.lifecycle.LiveData;
|
||||||
import androidx.lifecycle.ViewModelProvider;
|
import androidx.lifecycle.ViewModelProvider;
|
||||||
@ -32,6 +33,7 @@ public class CheatDetailsFragment extends Fragment
|
|||||||
private TextView mLabelNotes;
|
private TextView mLabelNotes;
|
||||||
private EditText mEditNotes;
|
private EditText mEditNotes;
|
||||||
private EditText mEditCode;
|
private EditText mEditCode;
|
||||||
|
private Button mButtonDelete;
|
||||||
private Button mButtonEdit;
|
private Button mButtonEdit;
|
||||||
private Button mButtonCancel;
|
private Button mButtonCancel;
|
||||||
private Button mButtonOk;
|
private Button mButtonOk;
|
||||||
@ -59,6 +61,7 @@ public class CheatDetailsFragment extends Fragment
|
|||||||
mLabelNotes = view.findViewById(R.id.label_notes);
|
mLabelNotes = view.findViewById(R.id.label_notes);
|
||||||
mEditNotes = view.findViewById(R.id.edit_notes);
|
mEditNotes = view.findViewById(R.id.edit_notes);
|
||||||
mEditCode = view.findViewById(R.id.edit_code);
|
mEditCode = view.findViewById(R.id.edit_code);
|
||||||
|
mButtonDelete = view.findViewById(R.id.button_delete);
|
||||||
mButtonEdit = view.findViewById(R.id.button_edit);
|
mButtonEdit = view.findViewById(R.id.button_edit);
|
||||||
mButtonCancel = view.findViewById(R.id.button_cancel);
|
mButtonCancel = view.findViewById(R.id.button_cancel);
|
||||||
mButtonOk = view.findViewById(R.id.button_ok);
|
mButtonOk = view.findViewById(R.id.button_ok);
|
||||||
@ -69,6 +72,7 @@ public class CheatDetailsFragment extends Fragment
|
|||||||
mViewModel.getSelectedCheat().observe(getViewLifecycleOwner(), this::onSelectedCheatUpdated);
|
mViewModel.getSelectedCheat().observe(getViewLifecycleOwner(), this::onSelectedCheatUpdated);
|
||||||
mViewModel.getIsEditing().observe(getViewLifecycleOwner(), this::onIsEditingUpdated);
|
mViewModel.getIsEditing().observe(getViewLifecycleOwner(), this::onIsEditingUpdated);
|
||||||
|
|
||||||
|
mButtonDelete.setOnClickListener(this::onDeleteClicked);
|
||||||
mButtonEdit.setOnClickListener((v) -> mViewModel.setIsEditing(true));
|
mButtonEdit.setOnClickListener((v) -> mViewModel.setIsEditing(true));
|
||||||
mButtonCancel.setOnClickListener((v) ->
|
mButtonCancel.setOnClickListener((v) ->
|
||||||
{
|
{
|
||||||
@ -84,6 +88,16 @@ public class CheatDetailsFragment extends Fragment
|
|||||||
mEditCode.setError(null);
|
mEditCode.setError(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void onDeleteClicked(View view)
|
||||||
|
{
|
||||||
|
AlertDialog.Builder builder =
|
||||||
|
new AlertDialog.Builder(requireContext(), R.style.DolphinDialogBase);
|
||||||
|
builder.setMessage(getString(R.string.cheats_delete_confirmation, mCheat.getName()));
|
||||||
|
builder.setPositiveButton(R.string.yes, (dialog, i) -> mViewModel.deleteSelectedCheat());
|
||||||
|
builder.setNegativeButton(R.string.no, null);
|
||||||
|
builder.show();
|
||||||
|
}
|
||||||
|
|
||||||
private void onOkClicked(View view)
|
private void onOkClicked(View view)
|
||||||
{
|
{
|
||||||
clearEditErrors();
|
clearEditErrors();
|
||||||
@ -138,6 +152,7 @@ public class CheatDetailsFragment extends Fragment
|
|||||||
mEditNotes.setVisibility(notesVisibility);
|
mEditNotes.setVisibility(notesVisibility);
|
||||||
|
|
||||||
boolean userDefined = cheat != null && cheat.getUserDefined();
|
boolean userDefined = cheat != null && cheat.getUserDefined();
|
||||||
|
mButtonDelete.setEnabled(userDefined);
|
||||||
mButtonEdit.setEnabled(userDefined);
|
mButtonEdit.setEnabled(userDefined);
|
||||||
|
|
||||||
// If the fragment was recreated while editing a cheat, it's vital that we
|
// If the fragment was recreated while editing a cheat, it's vital that we
|
||||||
@ -162,6 +177,7 @@ public class CheatDetailsFragment extends Fragment
|
|||||||
mEditNotes.setEnabled(isEditing);
|
mEditNotes.setEnabled(isEditing);
|
||||||
mEditCode.setEnabled(isEditing);
|
mEditCode.setEnabled(isEditing);
|
||||||
|
|
||||||
|
mButtonDelete.setVisibility(isEditing ? View.GONE : View.VISIBLE);
|
||||||
mButtonEdit.setVisibility(isEditing ? View.GONE : View.VISIBLE);
|
mButtonEdit.setVisibility(isEditing ? View.GONE : View.VISIBLE);
|
||||||
mButtonCancel.setVisibility(isEditing ? View.VISIBLE : View.GONE);
|
mButtonCancel.setVisibility(isEditing ? View.VISIBLE : View.GONE);
|
||||||
mButtonOk.setVisibility(isEditing ? View.VISIBLE : View.GONE);
|
mButtonOk.setVisibility(isEditing ? View.VISIBLE : View.GONE);
|
||||||
|
@ -37,6 +37,12 @@ public class CheatsAdapter extends RecyclerView.Adapter<CheatItemViewHolder>
|
|||||||
if (position != null)
|
if (position != null)
|
||||||
notifyItemChanged(position);
|
notifyItemChanged(position);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
mViewModel.getCheatDeletedEvent().observe(owner, (position) ->
|
||||||
|
{
|
||||||
|
if (position != null)
|
||||||
|
notifyItemRemoved(position);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
|
@ -141,7 +141,18 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:barrierDirection="top"
|
app:barrierDirection="top"
|
||||||
app:constraint_referenced_ids="button_edit,button_cancel,button_ok" />
|
app:constraint_referenced_ids="button_delete,button_edit,button_cancel,button_ok" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/button_delete"
|
||||||
|
android:layout_width="0dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_margin="@dimen/spacing_large"
|
||||||
|
android:text="@string/cheats_delete"
|
||||||
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/button_edit"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/barrier"
|
||||||
|
app:layout_constraintBottom_toBottomOf="parent" />
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:id="@+id/button_edit"
|
android:id="@+id/button_edit"
|
||||||
@ -149,7 +160,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_margin="@dimen/spacing_large"
|
android:layout_margin="@dimen/spacing_large"
|
||||||
android:text="@string/cheats_edit"
|
android:text="@string/cheats_edit"
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toEndOf="@id/button_delete"
|
||||||
app:layout_constraintEnd_toStartOf="@id/button_cancel"
|
app:layout_constraintEnd_toStartOf="@id/button_cancel"
|
||||||
app:layout_constraintTop_toBottomOf="@id/barrier"
|
app:layout_constraintTop_toBottomOf="@id/barrier"
|
||||||
app:layout_constraintBottom_toBottomOf="parent" />
|
app:layout_constraintBottom_toBottomOf="parent" />
|
||||||
|
@ -400,6 +400,8 @@
|
|||||||
<string name="cheats_notes">Notes</string>
|
<string name="cheats_notes">Notes</string>
|
||||||
<string name="cheats_code">Code</string>
|
<string name="cheats_code">Code</string>
|
||||||
<string name="cheats_edit">Edit</string>
|
<string name="cheats_edit">Edit</string>
|
||||||
|
<string name="cheats_delete">Delete</string>
|
||||||
|
<string name="cheats_delete_confirmation">Are you sure you want to delete "%1$s"?</string>
|
||||||
<string name="cheats_error_no_name">Name can\'t be empty</string>
|
<string name="cheats_error_no_name">Name can\'t be empty</string>
|
||||||
<string name="cheats_error_no_code_lines">Code can\'t be empty</string>
|
<string name="cheats_error_no_code_lines">Code can\'t be empty</string>
|
||||||
<string name="cheats_error_on_line">Error on line %1$d</string>
|
<string name="cheats_error_on_line">Error on line %1$d</string>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user