Editors: Expose the preview markdown button on all editors

It's nice to sometimes use the RawEditor to edit something and then
later you want to see what it looks, and having to switch to the
Markdown Editor for that is very annoying.
This commit is contained in:
Vishesh Handa
2020-08-20 11:47:31 +02:00
parent 0d71daa09e
commit 7e7503ca2f
6 changed files with 70 additions and 57 deletions

View File

@ -174,6 +174,7 @@ class ChecklistEditorState extends State<ChecklistEditor>
editor: widget, editor: widget,
editorState: this, editorState: this,
noteModified: _noteModified, noteModified: _noteModified,
isNewNote: widget.isNewNote,
parentFolder: widget.note.parent, parentFolder: widget.note.parent,
body: Column( body: Column(
children: <Widget>[ children: <Widget>[

View File

@ -41,12 +41,16 @@ class EditorAppBar extends StatelessWidget implements PreferredSizeWidget {
final EditorState editorState; final EditorState editorState;
final bool noteModified; final bool noteModified;
final IconButton extraButton; final IconButton extraButton;
final bool allowEdits;
final Func0<void> onEditingModeChange;
EditorAppBar({ EditorAppBar({
Key key, Key key,
@required this.editor, @required this.editor,
@required this.editorState, @required this.editorState,
@required this.noteModified, @required this.noteModified,
@required this.allowEdits,
@required this.onEditingModeChange,
this.extraButton, this.extraButton,
}) : preferredSize = const Size.fromHeight(kToolbarHeight), }) : preferredSize = const Size.fromHeight(kToolbarHeight),
super(key: key); super(key: key);
@ -66,6 +70,12 @@ class EditorAppBar extends StatelessWidget implements PreferredSizeWidget {
), ),
actions: <Widget>[ actions: <Widget>[
if (extraButton != null) extraButton, if (extraButton != null) extraButton,
IconButton(
icon: allowEdits
? const Icon(Icons.remove_red_eye)
: const Icon(Icons.edit),
onPressed: onEditingModeChange,
),
IconButton( IconButton(
key: const ValueKey("EditorSelector"), key: const ValueKey("EditorSelector"),
icon: const Icon(Icons.library_books), icon: const Icon(Icons.library_books),

View File

@ -103,6 +103,7 @@ class JournalEditorState extends State<JournalEditor>
editor: widget, editor: widget,
editorState: this, editorState: this,
noteModified: _noteModified, noteModified: _noteModified,
isNewNote: widget.isNewNote,
parentFolder: note.parent, parentFolder: note.parent,
body: editor, body: editor,
); );

View File

@ -2,8 +2,6 @@ import 'dart:io';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:gitjournal/core/note.dart'; import 'package:gitjournal/core/note.dart';
import 'package:gitjournal/core/notes_folder.dart'; import 'package:gitjournal/core/notes_folder.dart';
import 'package:gitjournal/editors/common.dart'; import 'package:gitjournal/editors/common.dart';
@ -12,11 +10,8 @@ import 'package:gitjournal/editors/heuristics.dart';
import 'package:gitjournal/editors/note_body_editor.dart'; import 'package:gitjournal/editors/note_body_editor.dart';
import 'package:gitjournal/editors/note_title_editor.dart'; import 'package:gitjournal/editors/note_title_editor.dart';
import 'package:gitjournal/error_reporting.dart'; import 'package:gitjournal/error_reporting.dart';
import 'package:gitjournal/settings.dart';
import 'package:gitjournal/utils/logger.dart'; import 'package:gitjournal/utils/logger.dart';
import 'package:gitjournal/widgets/editor_scroll_view.dart'; import 'package:gitjournal/widgets/editor_scroll_view.dart';
import 'package:gitjournal/widgets/markdown_toolbar.dart';
import 'package:gitjournal/widgets/note_viewer.dart';
class MarkdownEditor extends StatefulWidget implements Editor { class MarkdownEditor extends StatefulWidget implements Editor {
final Note note; final Note note;
@ -70,31 +65,18 @@ class MarkdownEditorState extends State<MarkdownEditor>
String _oldText; String _oldText;
bool editingMode = true;
bool _noteModified; bool _noteModified;
MarkdownEditorState(this.note) { MarkdownEditorState(this.note) {
_textController = TextEditingController(text: note.body); _textController = TextEditingController(text: note.body);
_titleTextController = TextEditingController(text: note.title); _titleTextController = TextEditingController(text: note.title);
_oldText = note.body; _oldText = note.body;
var settings = Settings.instance;
if (settings.markdownDefaultView == SettingsMarkdownDefaultView.LastUsed) {
editingMode =
settings.markdownLastUsedView == SettingsMarkdownDefaultView.Edit;
} else {
editingMode =
settings.markdownDefaultView == SettingsMarkdownDefaultView.Edit;
}
} }
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_noteModified = widget.noteModified; _noteModified = widget.noteModified;
if (widget.isNewNote) {
editingMode = true;
}
} }
@override @override
@ -133,12 +115,7 @@ class MarkdownEditorState extends State<MarkdownEditor>
), ),
); );
Widget body = editingMode /*
? editor
: NoteViewer(
note: note,
parentFolder: widget.parentFolder,
);
var settings = Provider.of<Settings>(context); var settings = Provider.of<Settings>(context);
if (settings.experimentalMarkdownToolbar && editingMode) { if (settings.experimentalMarkdownToolbar && editingMode) {
@ -154,43 +131,18 @@ class MarkdownEditorState extends State<MarkdownEditor>
), ),
); );
} }
*/
var extraButton = IconButton(
icon: editingMode
? const Icon(Icons.remove_red_eye)
: const Icon(Icons.edit),
onPressed: _switchMode,
);
return EditorScaffold( return EditorScaffold(
editor: widget, editor: widget,
editorState: this, editorState: this,
extraButton: extraButton,
noteModified: _noteModified, noteModified: _noteModified,
isNewNote: widget.isNewNote,
parentFolder: note.parent, parentFolder: note.parent,
allowEdits: editingMode, body: editor,
body: body,
); );
} }
void _switchMode() {
var settings = Provider.of<Settings>(context);
setState(() {
editingMode = !editingMode;
switch (editingMode) {
case true:
settings.markdownLastUsedView = SettingsMarkdownDefaultView.Edit;
break;
case false:
settings.markdownLastUsedView = SettingsMarkdownDefaultView.View;
break;
}
settings.save();
_updateNote();
});
}
void _updateNote() { void _updateNote() {
note.title = _titleTextController.text.trim(); note.title = _titleTextController.text.trim();
note.body = _textController.text.trim(); note.body = _textController.text.trim();

View File

@ -101,6 +101,7 @@ class RawEditorState extends State<RawEditor>
editor: widget, editor: widget,
editorState: this, editorState: this,
noteModified: _noteModified, noteModified: _noteModified,
isNewNote: widget.isNewNote,
parentFolder: note.parent, parentFolder: note.parent,
body: editor, body: editor,
); );

View File

@ -2,27 +2,29 @@ import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:gitjournal/core/note.dart';
import 'package:gitjournal/core/notes_folder_fs.dart'; import 'package:gitjournal/core/notes_folder_fs.dart';
import 'package:gitjournal/editors/common.dart'; import 'package:gitjournal/editors/common.dart';
import 'package:gitjournal/settings.dart'; import 'package:gitjournal/settings.dart';
import 'package:gitjournal/widgets/note_viewer.dart';
class EditorScaffold extends StatefulWidget { class EditorScaffold extends StatefulWidget {
final Editor editor; final Editor editor;
final EditorState editorState; final EditorState editorState;
final bool noteModified; final bool noteModified;
final bool isNewNote;
final IconButton extraButton; final IconButton extraButton;
final Widget body; final Widget body;
final NotesFolderFS parentFolder; final NotesFolderFS parentFolder;
final bool allowEdits;
EditorScaffold({ EditorScaffold({
@required this.editor, @required this.editor,
@required this.editorState, @required this.editorState,
@required this.noteModified, @required this.noteModified,
@required this.isNewNote,
@required this.body, @required this.body,
@required this.parentFolder, @required this.parentFolder,
this.extraButton, this.extraButton,
this.allowEdits = true,
}); });
@override @override
@ -31,13 +33,33 @@ class EditorScaffold extends StatefulWidget {
class _EditorScaffoldState extends State<EditorScaffold> { class _EditorScaffoldState extends State<EditorScaffold> {
var hideUIElements = false; var hideUIElements = false;
var editingMode = true;
Note note;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
hideUIElements = Settings.instance.zenMode; var settings = Settings.instance;
hideUIElements = settings.zenMode;
widget.editorState.addListener(_editorChanged); widget.editorState.addListener(_editorChanged);
if (settings.markdownDefaultView == SettingsMarkdownDefaultView.LastUsed) {
editingMode =
settings.markdownLastUsedView == SettingsMarkdownDefaultView.Edit;
} else {
editingMode =
settings.markdownDefaultView == SettingsMarkdownDefaultView.Edit;
}
if (widget.isNewNote) {
editingMode = true;
}
if (editingMode == false) {
note = widget.editorState.getNote();
}
} }
@override @override
@ -57,9 +79,33 @@ class _EditorScaffoldState extends State<EditorScaffold> {
} }
} }
void _switchMode() {
var settings = Provider.of<Settings>(context);
setState(() {
editingMode = !editingMode;
switch (editingMode) {
case true:
settings.markdownLastUsedView = SettingsMarkdownDefaultView.Edit;
break;
case false:
settings.markdownLastUsedView = SettingsMarkdownDefaultView.View;
break;
}
settings.save();
note = widget.editorState.getNote();
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var settings = Provider.of<Settings>(context); var settings = Provider.of<Settings>(context);
Widget body = editingMode
? widget.body
: NoteViewer(
note: note,
parentFolder: widget.parentFolder,
);
return Scaffold( return Scaffold(
body: GestureDetector( body: GestureDetector(
@ -80,16 +126,18 @@ class _EditorScaffoldState extends State<EditorScaffold> {
editorState: widget.editorState, editorState: widget.editorState,
noteModified: widget.noteModified, noteModified: widget.noteModified,
extraButton: widget.extraButton, extraButton: widget.extraButton,
allowEdits: editingMode,
onEditingModeChange: _switchMode,
), ),
), ),
Expanded(child: widget.body), Expanded(child: body),
_AnimatedOpacityIgnorePointer( _AnimatedOpacityIgnorePointer(
visible: !hideUIElements, visible: !hideUIElements,
child: EditorBottomBar( child: EditorBottomBar(
editor: widget.editor, editor: widget.editor,
editorState: widget.editorState, editorState: widget.editorState,
parentFolder: widget.parentFolder, parentFolder: widget.parentFolder,
allowEdits: widget.allowEdits, allowEdits: editingMode,
zenMode: settings.zenMode, zenMode: settings.zenMode,
onZenModeChanged: () { onZenModeChanged: () {
setState(() { setState(() {