Fix the double escape bug

This commit is contained in:
2025-04-21 22:42:44 +02:00
parent 173c4fbee2
commit 1051805463

View File

@@ -38,6 +38,9 @@ void main() async {
class JournalerApp extends StatelessWidget { class JournalerApp extends StatelessWidget {
const JournalerApp({super.key}); const JournalerApp({super.key});
static final GlobalKey<MainPageState> _mainPageKey =
GlobalKey<MainPageState>();
static final TextTheme _baseTextTheme = const TextTheme( static final TextTheme _baseTextTheme = const TextTheme(
bodyMedium: TextStyle(fontSize: 24), bodyMedium: TextStyle(fontSize: 24),
); );
@@ -111,7 +114,30 @@ class JournalerApp extends StatelessWidget {
theme: lightTheme, theme: lightTheme,
darkTheme: darkTheme, darkTheme: darkTheme,
themeMode: ThemeMode.system, themeMode: ThemeMode.system,
home: const MainPage(), home: Focus(
// Using RawKeyboardListener despite deprecation because KeyboardListener
// and Shortcuts/Actions didn't reliably capture the Escape key press
// before the TextField handled it for unfocusing, requiring two presses.
// RawKeyboardListener intercepts the event earlier.
child: RawKeyboardListener(
// Revert to RawKeyboardListener
focusNode: FocusNode(),
onKey: (RawKeyEvent event) {
// Revert to onKey and RawKeyEvent
if (event is RawKeyDownEvent && // Revert to RawKeyDownEvent
event.logicalKey == LogicalKeyboardKey.escape) {
debugPrint("Escape pressed (RawKeyboardListener - Workaround)");
final state = _mainPageKey.currentState;
if (state != null) {
// Re-add unfocus, as it seemed necessary with Raw listener
FocusManager.instance.primaryFocus?.unfocus();
state.onWindowClose();
}
}
},
child: MainPage(key: _mainPageKey),
),
),
debugShowCheckedModeBanner: false, debugShowCheckedModeBanner: false,
); );
} }
@@ -121,10 +147,10 @@ class MainPage extends StatefulWidget {
const MainPage({super.key}); const MainPage({super.key});
@override @override
State<MainPage> createState() => _MainPageState(); State<MainPage> createState() => MainPageState();
} }
class _MainPageState extends State<MainPage> with WindowListener { class MainPageState extends State<MainPage> with WindowListener {
final SystemTray _systemTray = SystemTray(); final SystemTray _systemTray = SystemTray();
final Menu _menu = Menu(); final Menu _menu = Menu();
final AudioPlayer _audioPlayer = AudioPlayer(); final AudioPlayer _audioPlayer = AudioPlayer();
@@ -260,79 +286,70 @@ class _MainPageState extends State<MainPage> with WindowListener {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return KeyboardListener( return Scaffold(
focusNode: FocusNode(), appBar: AppBar(title: const Text('Journaler'), actions: const []),
autofocus: true, body: Padding(
onKeyEvent: (event) { padding: const EdgeInsets.all(8.0),
if (event is KeyDownEvent && child: Row(
event.logicalKey == LogicalKeyboardKey.escape) { crossAxisAlignment: CrossAxisAlignment.stretch,
debugPrint("Escape key pressed - hiding window."); children: [
onWindowClose(); Expanded(
} flex: 9,
}, child: Column(
child: Scaffold( crossAxisAlignment: CrossAxisAlignment.stretch,
appBar: AppBar(title: const Text('Journaler'), actions: const []), children: [
body: Padding( Expanded(
padding: const EdgeInsets.all(8.0), child: TextField(
child: Row( controller: _previousEntryController,
crossAxisAlignment: CrossAxisAlignment.stretch, maxLines: null,
children: [ expands: true,
Expanded( style: Theme.of(context).textTheme.bodyMedium,
flex: 9, decoration: const InputDecoration(
child: Column( labelText: 'Previous Entry',
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Expanded(
child: TextField(
controller: _previousEntryController,
maxLines: null,
expands: true,
style: Theme.of(context).textTheme.bodyMedium,
decoration: const InputDecoration(
labelText: 'Previous Entry',
),
), ),
), ),
const SizedBox(height: 8),
Expanded(
child: TextField(
controller: _currentEntryController,
focusNode: _currentEntryFocusNode,
maxLines: null,
expands: true,
autofocus: true,
style: Theme.of(context).textTheme.bodyMedium,
decoration: const InputDecoration(
labelText: 'Current Entry (What\'s on your mind?)',
),
onChanged: (text) {},
),
),
],
),
),
const SizedBox(width: 8),
Expanded(
flex: 3,
child: TextField(
controller: _todoController,
maxLines: null,
expands: true,
style:
Theme.of(
context,
).textTheme.bodyMedium, // Apply theme text style
decoration: const InputDecoration(
labelText: 'Todo',
// border: OutlineInputBorder(), // Handled by theme
// contentPadding: EdgeInsets.all(8.0), // Handled by theme or default
), ),
const SizedBox(height: 8),
Expanded(
child: TextField(
controller: _currentEntryController,
focusNode: _currentEntryFocusNode,
maxLines: null,
expands: true,
autofocus: true,
style: Theme.of(context).textTheme.bodyMedium,
decoration: const InputDecoration(
labelText: 'Current Entry (What\'s on your mind?)',
),
onChanged: (text) {},
),
),
],
),
),
const SizedBox(width: 8),
Expanded(
flex: 3,
child: TextField(
controller: _todoController,
maxLines: null,
expands: true,
style:
Theme.of(
context,
).textTheme.bodyMedium, // Apply theme text style
decoration: const InputDecoration(
labelText: 'Todo',
// border: OutlineInputBorder(), // Handled by theme
// contentPadding: EdgeInsets.all(8.0), // Handled by theme or default
), ),
), ),
], ),
), ],
), ),
), ),
); );
} }
} }
// --- End Actions and Shortcuts ---