muzzle-velocity/lib/note_editor.dart

134 lines
3.7 KiB
Dart
Raw Normal View History

2025-02-20 22:40:41 +02:00
import 'package:flutter/material.dart';
import 'package:flutter_code_editor/flutter_code_editor.dart';
2025-02-21 17:46:41 +02:00
import 'themes/day.dart';
import 'themes/night.dart';
import 'themes/markdown.dart';
2025-02-20 22:40:41 +02:00
import 'dart:io';
class NoteEditorScreen extends StatefulWidget {
final File note;
2025-02-21 17:46:41 +02:00
bool isDarkMode;
2025-02-20 22:40:41 +02:00
NoteEditorScreen({required this.note, required this.isDarkMode});
@override
_NoteEditorScreenState createState() => _NoteEditorScreenState();
}
class _NoteEditorScreenState extends State<NoteEditorScreen> {
late CodeController _controller;
2025-02-21 17:46:41 +02:00
double _fontSize = 16.0; // Default font size
void _updateFontSize(double newSize) {
setState(() {
_fontSize = newSize;
});
}
2025-02-20 22:40:41 +02:00
@override
void initState() {
super.initState();
_loadNoteContent();
}
Future<void> _loadNoteContent() async {
final content = await widget.note.readAsString();
setState(() {
_controller = CodeController(
text: content,
language: markdown,
);
_controller.addListener(_saveNote);
_controller.popupController.enabled = false;
});
}
Future<void> _saveNote() async {
await widget.note.writeAsString(_controller.text);
}
@override
void dispose() {
_controller.removeListener(_saveNote);
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.note.uri.pathSegments.last.replaceAll('.md', '')),
2025-02-21 17:46:41 +02:00
actions: [
PopupMenuButton<String>(
icon: Icon(Icons.more_vert), // Menu button (⋮)
onSelected: (String value) {
if (value == 'Toggle Theme') {
setState(() {
widget.isDarkMode = !widget.isDarkMode;
});
}
},
itemBuilder: (BuildContext context) => [
PopupMenuItem<String>(
value: 'Toggle Theme',
child: ListTile(
leading: Icon(
widget.isDarkMode ? Icons.light_mode : Icons.dark_mode,
),
title: Text(
widget.isDarkMode ? 'Switch to Light Mode' : 'Switch to Dark Mode',
),
),
),
PopupMenuItem<String>(
enabled: false,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Font Size'),
StatefulBuilder(
builder: (context, setState) {
return Slider(
value: _fontSize,
min: 12.0,
max: 24.0,
divisions: 6,
label: _fontSize.toString(),
onChanged: (newSize) {
setState(() {
_fontSize = newSize;
});
_updateFontSize(newSize);
},
);
},
),
],
),
),
],
),
],
2025-02-20 22:40:41 +02:00
),
body: _controller == null
? Center(child: CircularProgressIndicator())
: Padding(
padding: const EdgeInsets.all(16.0),
child: CodeTheme(
2025-02-21 17:46:41 +02:00
data: CodeThemeData(styles: widget.isDarkMode ? nightTheme : dayTheme),
2025-02-20 22:40:41 +02:00
child: CodeField(
gutterStyle: GutterStyle.none,
controller: _controller,
expands: true,
textStyle: TextStyle(
2025-02-21 17:46:41 +02:00
fontSize: _fontSize,
2025-02-20 22:40:41 +02:00
),
),
),
),
);
}
}