feat: Customizable shortcuts/hotkeys (#439)

This implements the logic for allowing hotkeys with modifiers.
Implemented globalhotkeys and videocontrol hotkeys
Also implements saving the forward backwards seconds to the user.

Co-authored-by: PartyDonut <PartyDonut@users.noreply.github.com>
This commit is contained in:
PartyDonut 2025-08-08 16:36:50 +02:00 committed by GitHub
parent 23385d8e62
commit fa30e634b4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
29 changed files with 1360 additions and 162 deletions

View file

@ -4,9 +4,14 @@ import 'package:flutter/material.dart';
import 'package:auto_route/auto_route.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:iconsax_plus/iconsax_plus.dart';
import 'package:window_manager/window_manager.dart';
import 'package:fladder/models/settings/client_settings_model.dart';
import 'package:fladder/providers/settings/client_settings_provider.dart';
import 'package:fladder/providers/user_provider.dart';
import 'package:fladder/routes/auto_router.gr.dart';
import 'package:fladder/screens/shared/fladder_snackbar.dart';
import 'package:fladder/util/input_handler.dart';
import 'package:fladder/util/localization_helper.dart';
import 'package:fladder/util/string_extensions.dart';
import 'package:fladder/widgets/navigation_scaffold/components/adaptive_fab.dart';
@ -17,8 +22,7 @@ enum HomeTabs {
dashboard,
library,
favorites,
sync,
;
sync;
const HomeTabs();
@ -120,16 +124,37 @@ class HomeScreen extends ConsumerWidget {
})
.nonNulls
.toList();
return HeroControllerScope(
controller: HeroController(),
child: AutoRouter(
builder: (context, child) {
return NavigationScaffold(
destinations: destinations.nonNulls.toList(),
currentRouteName: context.router.current.name,
nestedChild: child,
);
},
return InputHandler<GlobalHotKeys>(
autoFocus: false,
keyMapResult: (result) {
switch (result) {
case GlobalHotKeys.search:
context.navigateTo(LibrarySearchRoute());
return true;
case GlobalHotKeys.exit:
Future.microtask(() async {
final manager = WindowManager.instance;
if (await manager.isClosable()) {
manager.close();
} else {
fladderSnackbar(context, title: context.localized.somethingWentWrong);
}
});
return true;
}
},
keyMap: ref.watch(clientSettingsProvider.select((value) => value.currentShortcuts)),
child: HeroControllerScope(
controller: HeroController(),
child: AutoRouter(
builder: (context, child) {
return NavigationScaffold(
destinations: destinations.nonNulls.toList(),
currentRouteName: context.router.current.name,
nestedChild: child,
);
},
),
),
);
}