Files
GitJournal/lib/editors/journal_editor.dart
Vishesh Handa 7e7503ca2f 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.
2020-08-20 11:47:31 +02:00

147 lines
3.4 KiB
Dart

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:gitjournal/core/note.dart';
import 'package:gitjournal/editors/common.dart';
import 'package:gitjournal/editors/disposable_change_notifier.dart';
import 'package:gitjournal/editors/note_body_editor.dart';
import 'package:gitjournal/widgets/editor_scroll_view.dart';
import 'package:gitjournal/widgets/journal_editor_header.dart';
class JournalEditor extends StatefulWidget implements Editor {
final Note note;
final bool noteModified;
@override
final NoteCallback noteDeletionSelected;
@override
final NoteCallback noteEditorChooserSelected;
@override
final NoteCallback exitEditorSelected;
@override
final NoteCallback renameNoteSelected;
@override
final NoteCallback editTagsSelected;
@override
final NoteCallback moveNoteToFolderSelected;
@override
final NoteCallback discardChangesSelected;
final bool isNewNote;
JournalEditor({
Key key,
@required this.note,
@required this.noteModified,
@required this.noteDeletionSelected,
@required this.noteEditorChooserSelected,
@required this.exitEditorSelected,
@required this.renameNoteSelected,
@required this.editTagsSelected,
@required this.moveNoteToFolderSelected,
@required this.discardChangesSelected,
this.isNewNote = false,
}) : super(key: key);
@override
JournalEditorState createState() {
return JournalEditorState(note);
}
}
class JournalEditorState extends State<JournalEditor>
with DisposableChangeNotifier
implements EditorState {
Note note;
TextEditingController _textController = TextEditingController();
bool _noteModified;
JournalEditorState(this.note) {
_textController = TextEditingController(text: note.body);
}
@override
void initState() {
super.initState();
_noteModified = widget.noteModified;
}
@override
void dispose() {
_textController.dispose();
super.disposeListenables();
super.dispose();
}
@override
void didUpdateWidget(JournalEditor oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.noteModified != widget.noteModified) {
_noteModified = widget.noteModified;
}
}
@override
Widget build(BuildContext context) {
var editor = EditorScrollView(
child: Column(
children: <Widget>[
JournalEditorHeader(note),
NoteBodyEditor(
textController: _textController,
autofocus: widget.isNewNote,
onChanged: _noteTextChanged,
),
],
),
);
return EditorScaffold(
editor: widget,
editorState: this,
noteModified: _noteModified,
isNewNote: widget.isNewNote,
parentFolder: note.parent,
body: editor,
);
}
@override
Note getNote() {
note.body = _textController.text.trim();
note.type = NoteType.Journal;
return note;
}
void _noteTextChanged() {
if (_noteModified && !widget.isNewNote) {
notifyListeners();
return;
}
var newState = !(widget.isNewNote && _textController.text.trim().isEmpty);
if (newState != _noteModified) {
setState(() {
_noteModified = newState;
});
}
notifyListeners();
}
@override
Future<void> addImage(File file) async {
await getNote().addImage(file);
setState(() {
_textController.text = note.body;
_noteModified = true;
});
}
@override
bool get noteModified => _noteModified;
}