invoice/lib/ui/app/app_shortcuts.dart

107 lines
3.6 KiB
Dart

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:invoiceninja_flutter/data/models/entities.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
class AppShortcuts extends StatefulWidget {
const AppShortcuts({Key key, this.child}) : super(key: key);
final Widget child;
@override
AppShortcutsState createState() => new AppShortcutsState();
static AppShortcutsState of(BuildContext context) {
return context.findAncestorStateOfType<AppShortcutsState>();
}
}
class AppShortcutsState extends State<AppShortcuts> {
final _shortcuts = <LogicalKeySet, _ShortcutIntent>{
LogicalKeySet(LogicalKeyboardKey.keyN, LogicalKeyboardKey.keyI):
_ShortcutIntent.create(EntityType.invoice),
LogicalKeySet(LogicalKeyboardKey.keyL, LogicalKeyboardKey.keyI):
_ShortcutIntent.list(EntityType.invoice),
LogicalKeySet(LogicalKeyboardKey.keyN, LogicalKeyboardKey.keyC):
_ShortcutIntent.create(EntityType.client),
LogicalKeySet(LogicalKeyboardKey.keyL, LogicalKeyboardKey.keyC):
_ShortcutIntent.list(EntityType.client),
LogicalKeySet(LogicalKeyboardKey.keyN, LogicalKeyboardKey.keyT):
_ShortcutIntent.create(EntityType.task),
LogicalKeySet(LogicalKeyboardKey.keyL, LogicalKeyboardKey.keyT):
_ShortcutIntent.list(EntityType.task),
LogicalKeySet(LogicalKeyboardKey.keyN, LogicalKeyboardKey.keyE):
_ShortcutIntent.create(EntityType.expense),
LogicalKeySet(LogicalKeyboardKey.keyL, LogicalKeyboardKey.keyE):
_ShortcutIntent.list(EntityType.expense),
LogicalKeySet(LogicalKeyboardKey.keyN, LogicalKeyboardKey.keyP):
_ShortcutIntent.create(EntityType.payment),
LogicalKeySet(LogicalKeyboardKey.keyL, LogicalKeyboardKey.keyP):
_ShortcutIntent.list(EntityType.payment),
LogicalKeySet(LogicalKeyboardKey.keyN, LogicalKeyboardKey.keyQ):
_ShortcutIntent.create(EntityType.quote),
LogicalKeySet(LogicalKeyboardKey.keyL, LogicalKeyboardKey.keyQ):
_ShortcutIntent.list(EntityType.quote),
if (!kIsWeb)
LogicalKeySet(LogicalKeyboardKey.alt, LogicalKeyboardKey.arrowLeft):
_ShortcutIntent.back(),
};
@override
Widget build(BuildContext context) {
final _actions = <Type, Action<Intent>>{
_ShortcutIntent: CallbackAction<_ShortcutIntent>(
onInvoke: (_ShortcutIntent intent) {
switch (intent.intentType) {
case _ShortcutIntentType.create:
createEntityByType(
context: context, entityType: intent.entityType);
break;
case _ShortcutIntentType.list:
viewEntitiesByType(
context: context, entityType: intent.entityType);
break;
case _ShortcutIntentType.back:
Navigator.of(context).maybePop();
break;
}
return null;
},
),
};
return widget.child;
return FocusableActionDetector(
child: widget.child,
actions: _actions,
shortcuts: _shortcuts,
autofocus: false,
);
}
}
class _ShortcutIntent extends Intent {
const _ShortcutIntent({this.intentType, this.entityType});
const _ShortcutIntent.create(this.entityType)
: intentType = _ShortcutIntentType.create;
const _ShortcutIntent.list(this.entityType)
: intentType = _ShortcutIntentType.list;
const _ShortcutIntent.back()
: intentType = _ShortcutIntentType.back,
entityType = null;
final _ShortcutIntentType intentType;
final EntityType entityType;
}
enum _ShortcutIntentType {
create,
back,
list,
}