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 exitEditorSelected;
NoteCallback get renameNoteSelected; NoteCallback get renameNoteSelected;
NoteCallback get moveNoteToFolderSelected; NoteCallback get moveNoteToFolderSelected;
NoteCallback get discardChangesSelected;
} }
abstract class EditorState { abstract class EditorState {
Note getNote(); Note getNote();
} }
enum DropDownChoices { Rename, MoveToFolder } enum DropDownChoices { Rename, MoveToFolder, DiscardChanges }
AppBar buildEditorAppBar( AppBar buildEditorAppBar(
Editor editor, Editor editor,
@ -58,6 +59,11 @@ AppBar buildEditorAppBar(
var note = editorState.getNote(); var note = editorState.getNote();
editor.moveNoteToFolderSelected(note); editor.moveNoteToFolderSelected(note);
return; return;
case DropDownChoices.DiscardChanges:
var note = editorState.getNote();
editor.discardChangesSelected(note);
return;
} }
}, },
itemBuilder: (BuildContext context) => itemBuilder: (BuildContext context) =>
@ -70,6 +76,10 @@ AppBar buildEditorAppBar(
value: DropDownChoices.MoveToFolder, value: DropDownChoices.MoveToFolder,
child: Text('Move to Folder'), 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; final NoteCallback renameNoteSelected;
@override @override
final NoteCallback moveNoteToFolderSelected; final NoteCallback moveNoteToFolderSelected;
@override
final NoteCallback discardChangesSelected;
final bool autofocusOnEditor; final bool autofocusOnEditor;
@ -28,6 +30,7 @@ class MarkdownEditor extends StatefulWidget implements Editor {
@required this.exitEditorSelected, @required this.exitEditorSelected,
@required this.renameNoteSelected, @required this.renameNoteSelected,
@required this.moveNoteToFolderSelected, @required this.moveNoteToFolderSelected,
@required this.discardChangesSelected,
this.autofocusOnEditor = false, this.autofocusOnEditor = false,
}) : super(key: key); }) : super(key: key);

View File

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

View File

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

View File

@ -12,7 +12,7 @@ import 'package:gitjournal/utils.dart';
import 'package:gitjournal/widgets/folder_selection_dialog.dart'; import 'package:gitjournal/widgets/folder_selection_dialog.dart';
import 'package:gitjournal/widgets/rename_dialog.dart'; import 'package:gitjournal/widgets/rename_dialog.dart';
final todoEditorEnabled = false; final todoEditorEnabled = true;
class NoteEditor extends StatefulWidget { class NoteEditor extends StatefulWidget {
final Note note; final Note note;
@ -77,6 +77,7 @@ class NoteEditorState extends State<NoteEditor> {
exitEditorSelected: _exitEditorSelected, exitEditorSelected: _exitEditorSelected,
renameNoteSelected: _renameNoteSelected, renameNoteSelected: _renameNoteSelected,
moveNoteToFolderSelected: _moveNoteToFolderSelected, moveNoteToFolderSelected: _moveNoteToFolderSelected,
discardChangesSelected: _discardChangesSelected,
autofocusOnEditor: _isNewNote, autofocusOnEditor: _isNewNote,
); );
case EditorType.Raw: case EditorType.Raw:
@ -88,6 +89,7 @@ class NoteEditorState extends State<NoteEditor> {
exitEditorSelected: _exitEditorSelected, exitEditorSelected: _exitEditorSelected,
renameNoteSelected: _renameNoteSelected, renameNoteSelected: _renameNoteSelected,
moveNoteToFolderSelected: _moveNoteToFolderSelected, moveNoteToFolderSelected: _moveNoteToFolderSelected,
discardChangesSelected: _discardChangesSelected,
); );
case EditorType.Todo: case EditorType.Todo:
return TodoEditor( return TodoEditor(
@ -98,6 +100,7 @@ class NoteEditorState extends State<NoteEditor> {
exitEditorSelected: _exitEditorSelected, exitEditorSelected: _exitEditorSelected,
renameNoteSelected: _renameNoteSelected, renameNoteSelected: _renameNoteSelected,
moveNoteToFolderSelected: _moveNoteToFolderSelected, moveNoteToFolderSelected: _moveNoteToFolderSelected,
discardChangesSelected: _discardChangesSelected,
); );
} }
return null; return null;
@ -262,4 +265,42 @@ class NoteEditorState extends State<NoteEditor> {
stateContainer.moveNote(note, destFolder); 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),
),
],
);
}
} }