diff --git a/lib/codefield.dart b/lib/codefield.dart new file mode 100644 index 0000000..b42b26b --- /dev/null +++ b/lib/codefield.dart @@ -0,0 +1,72 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_code_editor/flutter_code_editor.dart'; + +class WrappedCodeField extends StatefulWidget { + final CodeController controller; + final bool expands; + final bool wrap; + final TextStyle? textStyle; + final Color? cursorColor; + final EdgeInsets padding; + final bool readOnly; + final FocusNode? focusNode; + + const WrappedCodeField({ + super.key, + required this.controller, + this.expands = false, + this.wrap = true, // ✅ Enable wrapping by default + this.textStyle, + this.cursorColor, + this.padding = EdgeInsets.zero, + this.readOnly = false, + this.focusNode, + }); + + @override + _WrappedCodeFieldState createState() => _WrappedCodeFieldState(); +} + +class _WrappedCodeFieldState extends State { + late FocusNode _focusNode; + + @override + void initState() { + super.initState(); + _focusNode = widget.focusNode ?? FocusNode(); + _focusNode.attach(context, onKeyEvent: _onKeyEvent); + } + + KeyEventResult _onKeyEvent(FocusNode node, KeyEvent event) { + return widget.controller.onKey(event); + } + + @override + void dispose() { + _focusNode.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return Container( + padding: widget.padding, + child: TextField( + focusNode: _focusNode, + controller: widget.controller, + expands: widget.expands, + minLines: widget.expands ? null : 1, + maxLines: widget.expands ? null : null, // Allows text to grow dynamically + scrollPhysics: widget.wrap ? const NeverScrollableScrollPhysics() : null, + style: widget.textStyle ?? const TextStyle(fontSize: 16), + cursorColor: widget.cursorColor ?? Colors.white, + decoration: const InputDecoration( + isCollapsed: true, + border: InputBorder.none, + contentPadding: EdgeInsets.symmetric(vertical: 16), + ), + readOnly: widget.readOnly, + ), + ); + } +} diff --git a/lib/note_editor.dart b/lib/note_editor.dart index 2ddd64d..5431d1a 100644 --- a/lib/note_editor.dart +++ b/lib/note_editor.dart @@ -8,6 +8,7 @@ import 'package:path/path.dart' as path; import 'themes/day.dart'; import 'themes/night.dart'; import 'themes/markdown.dart'; +import 'codefield.dart'; class NoteEditorScreen extends StatefulWidget { final File note; @@ -204,12 +205,13 @@ class _NoteEditorScreenState extends State { child: CodeTheme( data: CodeThemeData( styles: widget.isDarkMode ? nightTheme : dayTheme), - child: CodeField( - gutterStyle: GutterStyle.none, - controller: _controller, - expands: true, - textStyle: TextStyle( - fontSize: _fontSize, + child: SingleChildScrollView( + child: WrappedCodeField( + wrap: true, + controller: _controller, + textStyle: TextStyle( + fontSize: _fontSize, + ), ), ), ),