From 793884427cc54aa22c05d50cb2b29a5e38c8f1c3 Mon Sep 17 00:00:00 2001 From: MayurSMahajan Date: Wed, 5 Jul 2023 10:58:36 +0530 Subject: [PATCH 1/2] feat: toggle theme mode shortcut --- .../lib/workspace/application/appearance.dart | 8 ++++++++ .../lib/workspace/presentation/home/hotkeys.dart | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/frontend/appflowy_flutter/lib/workspace/application/appearance.dart b/frontend/appflowy_flutter/lib/workspace/application/appearance.dart index 173becca93..6a82a31df8 100644 --- a/frontend/appflowy_flutter/lib/workspace/application/appearance.dart +++ b/frontend/appflowy_flutter/lib/workspace/application/appearance.dart @@ -50,6 +50,14 @@ class AppearanceSettingsCubit extends Cubit { emit(state.copyWith(themeMode: themeMode)); } + /// Toggle the theme mode + void toggleThemeMode() { + final currentThemeMode = state.themeMode; + setThemeMode( + currentThemeMode == ThemeMode.light ? ThemeMode.dark : ThemeMode.light, + ); + } + /// Update selected font in the user's settings and emit an updated state /// with the font name. void setFontFamily(String fontFamilyName) { diff --git a/frontend/appflowy_flutter/lib/workspace/presentation/home/hotkeys.dart b/frontend/appflowy_flutter/lib/workspace/presentation/home/hotkeys.dart index 25fabd3693..0ba7a76be9 100644 --- a/frontend/appflowy_flutter/lib/workspace/presentation/home/hotkeys.dart +++ b/frontend/appflowy_flutter/lib/workspace/presentation/home/hotkeys.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:appflowy/workspace/application/appearance.dart'; import 'package:appflowy/workspace/application/home/home_setting_bloc.dart'; import 'package:flutter/material.dart'; import 'package:hotkey_manager/hotkey_manager.dart'; @@ -25,6 +26,21 @@ class HomeHotKeys extends StatelessWidget { .add(const HomeSettingEvent.collapseMenu()); }, ); + + final HotKey hotKeyForToggleThemeMode = HotKey( + KeyCode.keyL, + modifiers: [ + Platform.isMacOS ? KeyModifier.meta : KeyModifier.control, + KeyModifier.shift, + ], + scope: HotKeyScope.inapp, + ); + hotKeyManager.register( + hotKeyForToggleThemeMode, + keyDownHandler: (_) { + context.read().toggleThemeMode(); + }, + ); return child; } } From 89ff44b03564a9ae8e9a235d7d01899b572c6fa8 Mon Sep 17 00:00:00 2001 From: MayurSMahajan Date: Wed, 5 Jul 2023 17:46:10 +0530 Subject: [PATCH 2/2] test: hotkeys integration test --- .../integration_test/hotkeys_test.dart | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 frontend/appflowy_flutter/integration_test/hotkeys_test.dart diff --git a/frontend/appflowy_flutter/integration_test/hotkeys_test.dart b/frontend/appflowy_flutter/integration_test/hotkeys_test.dart new file mode 100644 index 0000000000..67ed248342 --- /dev/null +++ b/frontend/appflowy_flutter/integration_test/hotkeys_test.dart @@ -0,0 +1,95 @@ +import 'dart:io'; +import 'package:appflowy/generated/locale_keys.g.dart'; +import 'package:appflowy/workspace/application/settings/prelude.dart'; +import 'package:appflowy/workspace/presentation/home/menu/menu.dart'; +import 'package:appflowy/workspace/presentation/settings/settings_dialog.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +import 'util/keyboard.dart'; +import 'util/util.dart'; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + group('hotkeys test', () { + testWidgets('toggle theme mode', (tester) async { + await tester.initializeAppFlowy(); + + await tester.tapGoButton(); + tester.expectToSeeHomePage(); + + await tester.openSettings(); + await tester.openSettingsPage(SettingsPage.appearance); + await tester.pumpAndSettle(); + + tester.expectToSeeText( + LocaleKeys.settings_appearance_themeMode_system.tr(), + ); + + await tester.tapButton( + find.bySemanticsLabel( + LocaleKeys.settings_appearance_themeMode_system.tr(), + ), + ); + + await tester.pumpAndSettle(); + + await tester.tapButton( + find.bySemanticsLabel( + LocaleKeys.settings_appearance_themeMode_dark.tr(), + ), + ); + + await tester.pumpAndSettle(const Duration(seconds: 1)); + + await tester.tap(find.byType(SettingsDialog)); + + await tester.pumpAndSettle(); + + await FlowyTestKeyboard.simulateKeyDownEvent( + [ + Platform.isMacOS + ? LogicalKeyboardKey.meta + : LogicalKeyboardKey.control, + LogicalKeyboardKey.shift, + LogicalKeyboardKey.keyL, + ], + tester: tester, + ); + + await tester.pumpAndSettle(); + + tester.expectToSeeText( + LocaleKeys.settings_appearance_themeMode_light.tr(), + ); + }); + + testWidgets('show or hide home menu', (tester) async { + await tester.initializeAppFlowy(); + + await tester.tapGoButton(); + tester.expectToSeeHomePage(); + + await tester.pumpAndSettle(); + + expect(find.byType(HomeMenu), findsOneWidget); + + await FlowyTestKeyboard.simulateKeyDownEvent( + [ + Platform.isMacOS + ? LogicalKeyboardKey.meta + : LogicalKeyboardKey.control, + LogicalKeyboardKey.backslash, + ], + tester: tester, + ); + + await tester.pumpAndSettle(); + + expect(find.byType(HomeMenu), findsNothing); + }); + }); +}