Editor: Add 'Discard Changes' button

It got removed while merging the editor/viewer
This commit is contained in:
Vishesh Handa
2020-01-31 15:55:25 +01:00
parent bded32b027
commit 23c6192162
5 changed files with 62 additions and 2 deletions

View File

@ -9,13 +9,14 @@ abstract class Editor {
NoteCallback get exitEditorSelected;
NoteCallback get renameNoteSelected;
NoteCallback get moveNoteToFolderSelected;
NoteCallback get discardChangesSelected;
}
abstract class EditorState {
Note getNote();
}
enum DropDownChoices { Rename, MoveToFolder }
enum DropDownChoices { Rename, MoveToFolder, DiscardChanges }
AppBar buildEditorAppBar(
Editor editor,
@ -58,6 +59,11 @@ AppBar buildEditorAppBar(
var note = editorState.getNote();
editor.moveNoteToFolderSelected(note);
return;
case DropDownChoices.DiscardChanges:
var note = editorState.getNote();
editor.discardChangesSelected(note);
return;
}
},
itemBuilder: (BuildContext context) =>
@ -70,6 +76,10 @@ AppBar buildEditorAppBar(
value: DropDownChoices.MoveToFolder,
child: Text('Move to Folder'),
),
const PopupMenuItem<DropDownChoices>(
value: DropDownChoices.DiscardChanges,
child: Text('Discard Changes'),
),
],
),
],

View File

@ -17,6 +17,8 @@ class MarkdownEditor extends StatefulWidget implements Editor {
final NoteCallback renameNoteSelected;
@override
final NoteCallback moveNoteToFolderSelected;
@override
final NoteCallback discardChangesSelected;
final bool autofocusOnEditor;
@ -28,6 +30,7 @@ class MarkdownEditor extends StatefulWidget implements Editor {
@required this.exitEditorSelected,
@required this.renameNoteSelected,
@required this.moveNoteToFolderSelected,
@required this.discardChangesSelected,
this.autofocusOnEditor = false,
}) : super(key: key);

View File

@ -17,6 +17,8 @@ class RawEditor extends StatefulWidget implements Editor {
final NoteCallback renameNoteSelected;
@override
final NoteCallback moveNoteToFolderSelected;
@override
final NoteCallback discardChangesSelected;
RawEditor({
Key key,
@ -26,6 +28,7 @@ class RawEditor extends StatefulWidget implements Editor {
@required this.exitEditorSelected,
@required this.renameNoteSelected,
@required this.moveNoteToFolderSelected,
@required this.discardChangesSelected,
}) : super(key: key);
@override

View File

@ -16,6 +16,8 @@ class TodoEditor extends StatefulWidget implements Editor {
final NoteCallback renameNoteSelected;
@override
final NoteCallback moveNoteToFolderSelected;
@override
final NoteCallback discardChangesSelected;
TodoEditor({
Key key,
@ -25,6 +27,7 @@ class TodoEditor extends StatefulWidget implements Editor {
@required this.exitEditorSelected,
@required this.renameNoteSelected,
@required this.moveNoteToFolderSelected,
@required this.discardChangesSelected,
}) : super(key: key);
@override

View File

@ -12,7 +12,7 @@ import 'package:gitjournal/utils.dart';
import 'package:gitjournal/widgets/folder_selection_dialog.dart';
import 'package:gitjournal/widgets/rename_dialog.dart';
final todoEditorEnabled = false;
final todoEditorEnabled = true;
class NoteEditor extends StatefulWidget {
final Note note;
@ -77,6 +77,7 @@ class NoteEditorState extends State<NoteEditor> {
exitEditorSelected: _exitEditorSelected,
renameNoteSelected: _renameNoteSelected,
moveNoteToFolderSelected: _moveNoteToFolderSelected,
discardChangesSelected: _discardChangesSelected,
autofocusOnEditor: _isNewNote,
);
case EditorType.Raw:
@ -88,6 +89,7 @@ class NoteEditorState extends State<NoteEditor> {
exitEditorSelected: _exitEditorSelected,
renameNoteSelected: _renameNoteSelected,
moveNoteToFolderSelected: _moveNoteToFolderSelected,
discardChangesSelected: _discardChangesSelected,
);
case EditorType.Todo:
return TodoEditor(
@ -98,6 +100,7 @@ class NoteEditorState extends State<NoteEditor> {
exitEditorSelected: _exitEditorSelected,
renameNoteSelected: _renameNoteSelected,
moveNoteToFolderSelected: _moveNoteToFolderSelected,
discardChangesSelected: _discardChangesSelected,
);
}
return null;
@ -262,4 +265,42 @@ class NoteEditorState extends State<NoteEditor> {
stateContainer.moveNote(note, destFolder);
}
}
void _discardChangesSelected(Note note) {
if (_noteModified(note)) {
showDialog(context: context, builder: _buildDiscardChangesAlertDialog);
} else {
Navigator.pop(context);
}
}
Widget _buildDiscardChangesAlertDialog(BuildContext context) {
var title = _isNewNote
? "Do you want to discard this?"
: "Do you want to ignore the changes?";
var editText = _isNewNote ? "Keep Writing" : "Keep Editing";
var discardText = _isNewNote ? "Discard" : "Discard Changes";
return AlertDialog(
title: Text(title),
actions: <Widget>[
FlatButton(
onPressed: () => Navigator.of(context).pop(false),
child: Text(editText),
),
FlatButton(
onPressed: () {
// FIXME: This shouldn't be required. Why is the original note modified?
var serializer = MarkdownYAMLSerializer();
note.data = serializer.decode(noteSerialized);
Navigator.pop(context); // Alert box
Navigator.pop(context); // Note Editor
},
child: Text(discardText),
),
],
);
}
}