| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | import 'dart:io';import 'package:appflowy/workspace/application/appearance.dart';import 'package:appflowy/workspace/application/home/home_setting_bloc.dart';import 'package:appflowy/workspace/application/tabs/tabs_bloc.dart';import 'package:flutter/material.dart';import 'package:hotkey_manager/hotkey_manager.dart';import 'package:provider/provider.dart';typedef KeyDownHandler = void Function(HotKey hotKey);/// Helper class that utilizes the global [HotKeyManager] to easily/// add a [HotKey] with different handlers.////// Makes registration of a [HotKey] simple and easy to read, and makes/// sure the [KeyDownHandler], and other handlers, are grouped with the/// relevant [HotKey].///class HotKeyItem {  final HotKey hotKey;  final KeyDownHandler? keyDownHandler;  HotKeyItem({    required this.hotKey,    this.keyDownHandler,  });  void register() =>      hotKeyManager.register(hotKey, keyDownHandler: keyDownHandler);}class HomeHotKeys extends StatelessWidget {  final Widget child;  const HomeHotKeys({required this.child, Key? key}) : super(key: key);  @override  Widget build(BuildContext context) {    // Collapse sidebar menu    HotKeyItem(      hotKey: HotKey(        KeyCode.backslash,        modifiers: [Platform.isMacOS ? KeyModifier.meta : KeyModifier.control],        // Set hotkey scope (default is HotKeyScope.system)        scope: HotKeyScope.inapp, // Set as inapp-wide hotkey.      ),      keyDownHandler: (_) => context          .read<HomeSettingBloc>()          .add(const HomeSettingEvent.collapseMenu()),    ).register();    // Toggle theme mode light/dark    HotKeyItem(      hotKey: HotKey(        KeyCode.keyL,        modifiers: [          Platform.isMacOS ? KeyModifier.meta : KeyModifier.control,          KeyModifier.shift,        ],        scope: HotKeyScope.inapp,      ),      keyDownHandler: (_) =>          context.read<AppearanceSettingsCubit>().toggleThemeMode(),    ).register();    // Close current tab    HotKeyItem(      hotKey: HotKey(        KeyCode.keyW,        modifiers: [Platform.isMacOS ? KeyModifier.meta : KeyModifier.control],        scope: HotKeyScope.inapp,      ),      keyDownHandler: (_) =>          context.read<TabsBloc>().add(const TabsEvent.closeCurrentTab()),    ).register();    // Go to previous tab    HotKeyItem(      hotKey: HotKey(        KeyCode.pageUp,        modifiers: [Platform.isMacOS ? KeyModifier.meta : KeyModifier.control],        scope: HotKeyScope.inapp,      ),      keyDownHandler: (_) => _selectTab(context, -1),    ).register();    // Go to next tab    HotKeyItem(      hotKey: HotKey(        KeyCode.pageDown,        modifiers: [Platform.isMacOS ? KeyModifier.meta : KeyModifier.control],        scope: HotKeyScope.inapp,      ),      keyDownHandler: (_) => _selectTab(context, 1),    ).register();    return child;  }  void _selectTab(BuildContext context, int change) {    final bloc = context.read<TabsBloc>();    bloc.add(TabsEvent.selectTab(bloc.state.currentIndex + change));  }}
 |