mirror of
https://github.com/GitJournal/GitJournal.git
synced 2025-06-27 17:29:50 +08:00
Editor: Add 'Discard Changes' button
It got removed while merging the editor/viewer
This commit is contained in:
@ -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'),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user