diff --git a/lib/note_editor.dart b/lib/note_editor.dart index 47edbb8..5a50118 100755 --- a/lib/note_editor.dart +++ b/lib/note_editor.dart @@ -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 createState() => _NoteEditorScreenState(); } +enum NoteMode { view, edit, preview } + class _NoteEditorScreenState extends State { 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 { _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 { } Future _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 { void dispose() { _controller.removeListener(_onTextChanged); _controller.dispose(); + _editorFocusNode.dispose(); super.dispose(); } @@ -187,10 +203,14 @@ class _NoteEditorScreenState extends State { 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 { PopupMenuDivider(), PopupMenuItem( value: 'Save', + enabled: _mode == NoteMode.edit, child: ListTile( leading: Icon(Icons.save_outlined), title: Text("Save"), @@ -212,6 +233,7 @@ class _NoteEditorScreenState extends State { ), PopupMenuItem( value: 'Toggle Autosave', + enabled: _mode == NoteMode.edit, child: ListTile( leading: Icon(_autoSaveEnabled ? Icons.alarm_off @@ -250,12 +272,30 @@ class _NoteEditorScreenState extends State { ), PopupMenuDivider(), PopupMenuItem( - 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( + value: 'Mode Edit', + child: ListTile( + leading: Icon(_mode == NoteMode.edit + ? Icons.check + : Icons.edit_note_outlined), + title: Text("Edit Mode"), + ), + ), + PopupMenuItem( + 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 { ), 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 { child: WrappedCodeField( wrap: true, controller: _controller, + readOnly: _mode == NoteMode.view, + focusNode: _editorFocusNode, textStyle: TextStyle( fontSize: _fontSize, ), diff --git a/lib/note_list.dart b/lib/note_list.dart index 87d884d..315af1f 100755 --- a/lib/note_list.dart +++ b/lib/note_list.dart @@ -449,6 +449,7 @@ Happy note taking! ✨ note: newNote, isDarkMode: widget.isDarkMode, notesDirectoryPath: notesDirectoryPath, + initialMode: NoteMode.edit, ), ), );