improve editor

This commit is contained in:
2024-12-31 15:50:28 +08:00
parent 8eddab5e13
commit 1ca8da1c83

View File

@@ -55,8 +55,9 @@ class _CodeEditorState extends State<CodeEditor> {
Widget buildLineNumbers() { Widget buildLineNumbers() {
return SizedBox( return SizedBox(
width: 14 * 1.5, width: 32,
child: Column(children: [ child: Column(
children: [
for (var i = 1; i <= lineCount; i++) for (var i = 1; i <= lineCount; i++)
SizedBox( SizedBox(
height: 14 * 1.5, height: 14 * 1.5,
@@ -65,15 +66,16 @@ class _CodeEditorState extends State<CodeEditor> {
i.toString(), i.toString(),
style: TextStyle( style: TextStyle(
color: context.colorScheme.outline, color: context.colorScheme.outline,
fontSize: 14, fontSize: 13,
height: 1.0, height: 1.0,
fontFamily: 'consolas', fontFamily: 'Consolas',
fontFamilyFallback: ['Courier New', 'monospace'], fontFamilyFallback: ['Courier New', 'monospace'],
), ),
).paddingBottom(6),
), ),
), ),
],), ),
],
),
).paddingVertical(8); ).paddingVertical(8);
} }
@@ -87,10 +89,18 @@ class _CodeEditorState extends State<CodeEditor> {
if (value.connectionState == ConnectionState.waiting) { if (value.connectionState == ConnectionState.waiting) {
return const SizedBox(); return const SizedBox();
} }
return Scrollbar( return GestureDetector(
onTap: () {
_controller.selection = TextSelection.collapsed(
offset: _controller.text.length,
);
_focusNode.requestFocus();
},
child: Scrollbar(
thumbVisibility: true, thumbVisibility: true,
controller: verticalScrollController, controller: verticalScrollController,
notificationPredicate: (notif) => notif.metrics.axis == Axis.vertical, notificationPredicate: (notif) =>
notif.metrics.axis == Axis.vertical,
child: Scrollbar( child: Scrollbar(
thumbVisibility: true, thumbVisibility: true,
controller: horizontalScrollController, controller: horizontalScrollController,
@@ -102,21 +112,20 @@ class _CodeEditorState extends State<CodeEditor> {
child: SingleChildScrollView( child: SingleChildScrollView(
scrollDirection: Axis.horizontal, scrollDirection: Axis.horizontal,
controller: horizontalScrollController, controller: horizontalScrollController,
child: SingleChildScrollView(
scrollDirection: Axis.vertical,
controller: verticalScrollController,
child: Row( child: Row(
children: [ children: [
buildLineNumbers(), buildLineNumbers(),
IntrinsicWidth( IntrinsicWidth(
stepWidth: 50, stepWidth: 100,
child: TextField( child: TextField(
controller: _controller, controller: _controller,
focusNode: _focusNode, focusNode: _focusNode,
maxLines: null, maxLines: null,
expands: true,
cursorHeight: 1.5 * 14, cursorHeight: 1.5 * 14,
style: TextStyle( style: TextStyle(height: 1.5, fontSize: 14),
height: 1.5,
fontSize: 14
),
decoration: InputDecoration( decoration: InputDecoration(
border: InputBorder.none, border: InputBorder.none,
contentPadding: EdgeInsets.all(8), contentPadding: EdgeInsets.all(8),
@@ -129,7 +138,6 @@ class _CodeEditorState extends State<CodeEditor> {
}); });
} }
}, },
scrollController: verticalScrollController,
), ),
), ),
], ],
@@ -138,6 +146,8 @@ class _CodeEditorState extends State<CodeEditor> {
), ),
), ),
), ),
),
),
); );
}, },
); );
@@ -176,8 +186,8 @@ class _CodeTextEditingController extends TextEditingController {
style = TextStyle( style = TextStyle(
height: 1.5, height: 1.5,
fontSize: 14, fontSize: 14,
fontFamily: 'consolas', fontFamily: 'Consolas',
fontFamilyFallback: ['Courier New', 'monospace'], fontFamilyFallback: ['Courier New', 'Roboto Mono', 'monospace'],
); );
return mergeTextStyle(result, style); return mergeTextStyle(result, style);
@@ -186,7 +196,10 @@ class _CodeTextEditingController extends TextEditingController {
TextSpan mergeTextStyle(TextSpan span, TextStyle style) { TextSpan mergeTextStyle(TextSpan span, TextStyle style) {
var result = TextSpan( var result = TextSpan(
style: style.merge(span.style), style: style.merge(span.style),
children: span.children?.whereType().map((e) => mergeTextStyle(e, style)).toList(), children: span.children
?.whereType()
.map((e) => mergeTextStyle(e, style))
.toList(),
text: span.text, text: span.text,
); );
return result; return result;