hotkeys.dart 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import 'dart:io';
  2. import 'package:appflowy/workspace/application/settings/appearance/appearance_cubit.dart';
  3. import 'package:appflowy/workspace/application/home/home_setting_bloc.dart';
  4. import 'package:appflowy/workspace/application/tabs/tabs_bloc.dart';
  5. import 'package:flutter/material.dart';
  6. import 'package:hotkey_manager/hotkey_manager.dart';
  7. import 'package:provider/provider.dart';
  8. typedef KeyDownHandler = void Function(HotKey hotKey);
  9. /// Helper class that utilizes the global [HotKeyManager] to easily
  10. /// add a [HotKey] with different handlers.
  11. ///
  12. /// Makes registration of a [HotKey] simple and easy to read, and makes
  13. /// sure the [KeyDownHandler], and other handlers, are grouped with the
  14. /// relevant [HotKey].
  15. ///
  16. class HotKeyItem {
  17. final HotKey hotKey;
  18. final KeyDownHandler? keyDownHandler;
  19. HotKeyItem({
  20. required this.hotKey,
  21. this.keyDownHandler,
  22. });
  23. void register() =>
  24. hotKeyManager.register(hotKey, keyDownHandler: keyDownHandler);
  25. }
  26. class HomeHotKeys extends StatelessWidget {
  27. final Widget child;
  28. const HomeHotKeys({required this.child, Key? key}) : super(key: key);
  29. @override
  30. Widget build(BuildContext context) {
  31. // Collapse sidebar menu
  32. HotKeyItem(
  33. hotKey: HotKey(
  34. KeyCode.backslash,
  35. modifiers: [Platform.isMacOS ? KeyModifier.meta : KeyModifier.control],
  36. // Set hotkey scope (default is HotKeyScope.system)
  37. scope: HotKeyScope.inapp, // Set as inapp-wide hotkey.
  38. ),
  39. keyDownHandler: (_) => context
  40. .read<HomeSettingBloc>()
  41. .add(const HomeSettingEvent.collapseMenu()),
  42. ).register();
  43. // Toggle theme mode light/dark
  44. HotKeyItem(
  45. hotKey: HotKey(
  46. KeyCode.keyL,
  47. modifiers: [
  48. Platform.isMacOS ? KeyModifier.meta : KeyModifier.control,
  49. KeyModifier.shift,
  50. ],
  51. scope: HotKeyScope.inapp,
  52. ),
  53. keyDownHandler: (_) =>
  54. context.read<AppearanceSettingsCubit>().toggleThemeMode(),
  55. ).register();
  56. // Close current tab
  57. HotKeyItem(
  58. hotKey: HotKey(
  59. KeyCode.keyW,
  60. modifiers: [Platform.isMacOS ? KeyModifier.meta : KeyModifier.control],
  61. scope: HotKeyScope.inapp,
  62. ),
  63. keyDownHandler: (_) =>
  64. context.read<TabsBloc>().add(const TabsEvent.closeCurrentTab()),
  65. ).register();
  66. // Go to previous tab
  67. HotKeyItem(
  68. hotKey: HotKey(
  69. KeyCode.pageUp,
  70. modifiers: [Platform.isMacOS ? KeyModifier.meta : KeyModifier.control],
  71. scope: HotKeyScope.inapp,
  72. ),
  73. keyDownHandler: (_) => _selectTab(context, -1),
  74. ).register();
  75. // Go to next tab
  76. HotKeyItem(
  77. hotKey: HotKey(
  78. KeyCode.pageDown,
  79. modifiers: [Platform.isMacOS ? KeyModifier.meta : KeyModifier.control],
  80. scope: HotKeyScope.inapp,
  81. ),
  82. keyDownHandler: (_) => _selectTab(context, 1),
  83. ).register();
  84. return child;
  85. }
  86. void _selectTab(BuildContext context, int change) {
  87. final bloc = context.read<TabsBloc>();
  88. bloc.add(TabsEvent.selectTab(bloc.state.currentIndex + change));
  89. }
  90. }