Files
GitJournal/lib/editors/journal_editor.dart
Vishesh Handa 62b5761ec4 Editors: Do not use BottomAppBar in the scaffold property
The BottomAppBar when given in the Scaffold gets hidden when the
keyboard is visible. We had hacked around that by translating its
position, however that resulted in the cursor at the bottom being hidden
when we were typing a long note.

It is not just part of the body of the scaffold.

Also converted many functions into widgets.
2020-05-06 15:16:37 +02:00

144 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/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 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.moveNoteToFolderSelected,
@required this.discardChangesSelected,
this.isNewNote = false,
}) : super(key: key);
@override
JournalEditorState createState() {
return JournalEditorState(note);
}
}
class JournalEditorState extends State<JournalEditor> 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.dispose();
}
@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,
parentFolder: note.parent,
body: editor,
);
}
@override
Note getNote() {
note.body = _textController.text.trim();
note.type = NoteType.Journal;
return note;
}
void _noteTextChanged() {
if (_noteModified) return;
setState(() {
_noteModified = true;
});
}
@override
Future<void> addImage(File file) async {
await getNote().addImage(file);
setState(() {
_textController.text = note.body;
_noteModified = true;
});
}
}
class _NoteBodyEditor extends StatelessWidget {
final TextEditingController textController;
final bool autofocus;
final Function onChanged;
_NoteBodyEditor({this.textController, this.autofocus, this.onChanged});
@override
Widget build(BuildContext context) {
var style = Theme.of(context).textTheme.subhead;
return TextField(
autofocus: autofocus,
keyboardType: TextInputType.multiline,
maxLines: null,
style: style,
decoration: const InputDecoration(
hintText: 'Write here',
border: InputBorder.none,
isDense: true,
),
controller: textController,
textCapitalization: TextCapitalization.sentences,
scrollPadding: const EdgeInsets.all(0.0),
onChanged: (_) => onChanged(),
);
}
}