add view mode as default, open new notes in edit mode with cursor ready

- Introduce NoteMode enum { view, edit, preview } replacing the old bool
- Default mode when opening a note is view (syntax-highlighted, read-only)
- Menu now shows all three modes with a checkmark on the active one
- Save and autosave menu items disabled outside edit mode
- New notes open in edit mode with cursor positioned after the header
  and keyboard focused, ready to type

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
randogoth 2026-06-19 17:21:00 +03:00
parent 6b11515aa2
commit bf214afe72
2 changed files with 57 additions and 14 deletions

View file

@ -17,28 +17,35 @@ class NoteEditorScreen extends StatefulWidget {
final String? notesDirectoryPath; // Add this
final bool isDarkMode;
final NoteMode initialMode;
const NoteEditorScreen({
super.key,
required this.note,
required this.isDarkMode,
required this.notesDirectoryPath,
this.initialMode = NoteMode.view,
});
@override
State<NoteEditorScreen> createState() => _NoteEditorScreenState();
}
enum NoteMode { view, edit, preview }
class _NoteEditorScreenState extends State<NoteEditorScreen> {
late CodeController _controller;
late String _initialContent;
bool _isPreviewMode = false;
late NoteMode _mode;
final FocusNode _editorFocusNode = FocusNode();
bool _isLoading = true;
bool _autoSaveEnabled = false; // Controlled by user toggle
bool _autoSaveEnabled = false;
double _fontSize = 16.0;
@override
void initState() {
super.initState();
_mode = widget.initialMode;
_loadPreferences();
_loadNoteContent();
}
@ -74,10 +81,18 @@ class _NoteEditorScreenState extends State<NoteEditorScreen> {
_controller.addListener(_onTextChanged);
_isLoading = false;
});
if (widget.initialMode == NoteMode.edit) {
WidgetsBinding.instance.addPostFrameCallback((_) {
_controller.selection =
TextSelection.collapsed(offset: _controller.text.length);
_editorFocusNode.requestFocus();
});
}
}
void _onTextChanged() {
if (_autoSaveEnabled && _controller.text != _initialContent) {
if (_mode == NoteMode.edit && _autoSaveEnabled && _controller.text != _initialContent) {
_saveNote();
}
}
@ -105,7 +120,7 @@ class _NoteEditorScreenState extends State<NoteEditorScreen> {
}
Future<bool> _onWillPop() async {
if (_controller.text == _initialContent) return true; // No changes, exit
if (_mode != NoteMode.edit || _controller.text == _initialContent) return true;
return await showDialog(
context: context,
@ -144,6 +159,7 @@ class _NoteEditorScreenState extends State<NoteEditorScreen> {
void dispose() {
_controller.removeListener(_onTextChanged);
_controller.dispose();
_editorFocusNode.dispose();
super.dispose();
}
@ -187,10 +203,14 @@ class _NoteEditorScreenState extends State<NoteEditorScreen> {
case 'Toggle Autosave':
_setAutoSaveEnabled(!_autoSaveEnabled);
break;
case 'Toggle Preview':
setState(() {
_isPreviewMode = !_isPreviewMode;
});
case 'Mode View':
setState(() { _mode = NoteMode.view; });
break;
case 'Mode Edit':
setState(() { _mode = NoteMode.edit; });
break;
case 'Mode Preview':
setState(() { _mode = NoteMode.preview; });
break;
}
},
@ -205,6 +225,7 @@ class _NoteEditorScreenState extends State<NoteEditorScreen> {
PopupMenuDivider(),
PopupMenuItem<String>(
value: 'Save',
enabled: _mode == NoteMode.edit,
child: ListTile(
leading: Icon(Icons.save_outlined),
title: Text("Save"),
@ -212,6 +233,7 @@ class _NoteEditorScreenState extends State<NoteEditorScreen> {
),
PopupMenuItem<String>(
value: 'Toggle Autosave',
enabled: _mode == NoteMode.edit,
child: ListTile(
leading: Icon(_autoSaveEnabled
? Icons.alarm_off
@ -250,12 +272,30 @@ class _NoteEditorScreenState extends State<NoteEditorScreen> {
),
PopupMenuDivider(),
PopupMenuItem<String>(
value: 'Toggle Preview',
value: 'Mode View',
child: ListTile(
leading:
Icon(_isPreviewMode ? Icons.edit_note_outlined : Icons.visibility_outlined),
title:
Text(_isPreviewMode ? "Edit Mode" : "Preview Mode"),
leading: Icon(_mode == NoteMode.view
? Icons.check
: Icons.book_outlined),
title: Text("View Mode"),
),
),
PopupMenuItem<String>(
value: 'Mode Edit',
child: ListTile(
leading: Icon(_mode == NoteMode.edit
? Icons.check
: Icons.edit_note_outlined),
title: Text("Edit Mode"),
),
),
PopupMenuItem<String>(
value: 'Mode Preview',
child: ListTile(
leading: Icon(_mode == NoteMode.preview
? Icons.check
: Icons.visibility_outlined),
title: Text("Preview Mode"),
),
),
],
@ -265,7 +305,7 @@ class _NoteEditorScreenState extends State<NoteEditorScreen> {
),
body: _isLoading
? Center(child: CircularProgressIndicator())
: _isPreviewMode
: _mode == NoteMode.preview
? Padding(
padding: const EdgeInsets.all(16.0),
child: SingleChildScrollView(
@ -325,6 +365,8 @@ class _NoteEditorScreenState extends State<NoteEditorScreen> {
child: WrappedCodeField(
wrap: true,
controller: _controller,
readOnly: _mode == NoteMode.view,
focusNode: _editorFocusNode,
textStyle: TextStyle(
fontSize: _fontSize,
),