diff --git a/lib/editors/common.dart b/lib/editors/common.dart index fe87bb09..28da611a 100644 --- a/lib/editors/common.dart +++ b/lib/editors/common.dart @@ -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( + value: DropDownChoices.DiscardChanges, + child: Text('Discard Changes'), + ), ], ), ], diff --git a/lib/editors/markdown_editor.dart b/lib/editors/markdown_editor.dart index cd43f584..35e42d3d 100644 --- a/lib/editors/markdown_editor.dart +++ b/lib/editors/markdown_editor.dart @@ -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); diff --git a/lib/editors/raw_editor.dart b/lib/editors/raw_editor.dart index f1d3354c..61cad122 100644 --- a/lib/editors/raw_editor.dart +++ b/lib/editors/raw_editor.dart @@ -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 diff --git a/lib/editors/todo_editor.dart b/lib/editors/todo_editor.dart index 3da8ffeb..ee2fb3e9 100644 --- a/lib/editors/todo_editor.dart +++ b/lib/editors/todo_editor.dart @@ -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 diff --git a/lib/screens/note_editor.dart b/lib/screens/note_editor.dart index 3485e34d..b02bb1aa 100644 --- a/lib/screens/note_editor.dart +++ b/lib/screens/note_editor.dart @@ -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 { exitEditorSelected: _exitEditorSelected, renameNoteSelected: _renameNoteSelected, moveNoteToFolderSelected: _moveNoteToFolderSelected, + discardChangesSelected: _discardChangesSelected, autofocusOnEditor: _isNewNote, ); case EditorType.Raw: @@ -88,6 +89,7 @@ class NoteEditorState extends State { exitEditorSelected: _exitEditorSelected, renameNoteSelected: _renameNoteSelected, moveNoteToFolderSelected: _moveNoteToFolderSelected, + discardChangesSelected: _discardChangesSelected, ); case EditorType.Todo: return TodoEditor( @@ -98,6 +100,7 @@ class NoteEditorState extends State { exitEditorSelected: _exitEditorSelected, renameNoteSelected: _renameNoteSelected, moveNoteToFolderSelected: _moveNoteToFolderSelected, + discardChangesSelected: _discardChangesSelected, ); } return null; @@ -262,4 +265,42 @@ class NoteEditorState extends State { 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: [ + 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), + ), + ], + ); + } }