Skip to content

Commit

Permalink
Support to update ShortcutViewer on a page
Browse files Browse the repository at this point in the history
- Create ShortcutInfo just for infos
- Set some unamed shortcuts
  • Loading branch information
LuanRoger committed Oct 22, 2022
1 parent 5b20ac6 commit e2633cd
Show file tree
Hide file tree
Showing 12 changed files with 77 additions and 67 deletions.
38 changes: 6 additions & 32 deletions lib/controllers/keyboard_controller_action_manipulator.dart
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:provider/provider.dart';
import 'package:xbox_launcher/models/controller_keyboard_pair.dart';
import 'package:xbox_launcher/models/shortcut_models/shortcut_option.dart';
import 'package:xbox_launcher/providers/controller_action_provider.dart';
import 'package:xbox_launcher/providers/keyboard_action_provider.dart';
import 'package:xinput_gamepad/xinput_gamepad.dart';

class KeyboardControllerActionManipulator {
static void mapKeyboardControllerActions(
BuildContext context,
Map<ControllerKeyboardPair, void Function(BuildContext context)>
actionEntry) {
if (actionEntry.isEmpty) return;
BuildContext context, List<ShortcutOption> shortcutsOptions) {
if (shortcutsOptions.isEmpty) return;

var keyboardProvider =
Provider.of<KeyboardActionProvider>(context, listen: false);
Expand All @@ -19,38 +17,14 @@ class KeyboardControllerActionManipulator {

Map<ShortcutActivator, void Function()> keyboarMapping = {};
Map<ControllerButton, void Function()> controllerMapping = {};
for (var action in actionEntry.entries) {
for (var action in shortcutsOptions
.map((shortcutOption) => shortcutOption.rawShortcut)) {
keyboarMapping[action.key.keyboardkey] = () => action.value(context);
controllerMapping[action.key.controllerButton] =
() => action.value(context);
}
keyboardProvider.keyboardBinding = keyboarMapping;
controllerProvider.controller0Binding = controllerMapping;
}

static void mapKeyboardActions(BuildContext context,
Map<SingleActivator, void Function(BuildContext context)> keyAction) {
if (keyAction.isEmpty) return;

var keyboardProvider =
Provider.of<KeyboardActionProvider>(context, listen: false);
Map<ShortcutActivator, void Function()> keyboardMapping = {};
keyAction.forEach((key, value) {
keyboardMapping[key] = () => value(context);
});

keyboardProvider.keyboardBinding = keyboardMapping;
}

static void mapControllerActions(BuildContext context,
Map<ControllerButton, void Function(BuildContext context)> buttonAction) {
if (buttonAction.isEmpty) return;
var controllerProvider =
Provider.of<ControllerActionProvider>(context, listen: false);
Map<ControllerButton, void Function()> controllerMapping = {};
buttonAction.forEach((key, value) {
controllerMapping[key] = () => value(context);
});
keyboardProvider.keyboardBinding = keyboarMapping;
controllerProvider.controller0Binding = controllerMapping;
}

Expand Down
4 changes: 2 additions & 2 deletions lib/models/mapping_definition.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:xbox_launcher/models/shortcut_models/shortcut_option.dart';
import 'package:xbox_launcher/models/shortcut_models/shortcut_info.dart';

abstract class MappingDefinition {
List<ShortcutOption>? defineMapping(BuildContext context);
List<ShortcutInfo>? defineMapping(BuildContext context);
}
10 changes: 10 additions & 0 deletions lib/models/shortcut_models/shortcut_info.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import 'package:xbox_launcher/models/controller_keyboard_pair.dart';

class ShortcutInfo {
String description;
ControllerKeyboardPair controllerKeyboardPair;
bool show;

ShortcutInfo(this.description,
{required this.controllerKeyboardPair, this.show = true});
}
12 changes: 5 additions & 7 deletions lib/models/shortcut_models/shortcut_option.dart
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:xbox_launcher/models/controller_keyboard_pair.dart';
import 'package:xbox_launcher/models/shortcut_models/shortcut_info.dart';

class ShortcutOption {
String description;
ControllerKeyboardPair controllerKeyboardPair;
class ShortcutOption extends ShortcutInfo {
void Function(BuildContext) action;
bool show;
MapEntry<ControllerKeyboardPair, void Function(BuildContext)>
get rawShortcut => MapEntry(controllerKeyboardPair, action);

ShortcutOption(this.description,
{required this.controllerKeyboardPair,
ShortcutOption(super.description,
{required super.controllerKeyboardPair,
required this.action,
this.show = true});
super.show});
}
1 change: 1 addition & 0 deletions lib/pages/home_page.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:provider/provider.dart';
import 'package:xbox_launcher/models/shortcut_models/shortcut_info.dart';
import 'package:xbox_launcher/models/shortcut_models/shortcut_option.dart';
import 'package:xbox_launcher/providers/profile_provider.dart';
import 'package:xbox_launcher/routes/app_routes.dart';
Expand Down
2 changes: 1 addition & 1 deletion lib/pages/personalization_configuration_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ class PersonalizationConfigurationPage extends ConfigurationMenu {

@override
List<ShortcutOption>? defineMapping(BuildContext context) => [
ShortcutOption("",
ShortcutOption("Back",
controllerKeyboardPair: ControllerKeyboardPair(
const SingleActivator(LogicalKeyboardKey.escape),
ControllerButton.B_BUTTON),
Expand Down
2 changes: 1 addition & 1 deletion lib/pages/video_configuration_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class VideoConfigurationPage extends ConfigurationMenu {

@override
List<ShortcutOption>? defineMapping(BuildContext context) => [
ShortcutOption("",
ShortcutOption("Back",
controllerKeyboardPair: ControllerKeyboardPair(
const SingleActivator(LogicalKeyboardKey.escape),
ControllerButton.B_BUTTON),
Expand Down
4 changes: 2 additions & 2 deletions lib/shared/widgets/keyboard/keyboard_overlay.dart
Original file line number Diff line number Diff line change
Expand Up @@ -145,8 +145,8 @@ class KeyboardOverlay implements MappingDefinition {

_changeKeyboardLayout(KeyboardLayout.ALPHABET);
_initialStringMemento = String.fromCharCodes(controller.text.codeUnits);
KeyboardControllerActionManipulator.mapKeyboardControllerActions(context,
Map.fromEntries(defineMapping(context)!.map((e) => e.rawShortcut)));
KeyboardControllerActionManipulator.mapKeyboardControllerActions(
context, defineMapping(context)!.whereType<ShortcutOption>().toList());

showGeneralDialog(
context: context,
Expand Down
19 changes: 9 additions & 10 deletions lib/shared/widgets/models/xbox_page_stateful.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,28 +2,27 @@ import 'package:fluent_ui/fluent_ui.dart';
import 'package:provider/provider.dart';
import 'package:xbox_launcher/controllers/keyboard_controller_action_manipulator.dart';
import 'package:xbox_launcher/models/mapping_definition.dart';
import 'package:xbox_launcher/models/shortcut_models/shortcut_info.dart';
import 'package:xbox_launcher/models/shortcut_models/shortcut_option.dart';
import 'package:xbox_launcher/providers/keyboard_action_provider.dart';
import 'package:xbox_launcher/shared/app_colors.dart';
import 'package:xbox_launcher/shared/widgets/models/xbox_page_builder.dart';
import 'package:xbox_launcher/shared/widgets/shortcuts/shortcuts_viewer.dart';
import 'package:xbox_launcher/shared/widgets/shortcuts/shortcut_viewer_support.dart';

abstract class XboxPageStateful extends StatefulWidget {
const XboxPageStateful({Key? key}) : super(key: key);
}

abstract class XboxPageState<T extends XboxPageStateful> extends State<T>
abstract class XboxPageState<T extends XboxPageStateful> extends State<T> with ShortcutViewerSupport
implements MappingDefinition, XboxPageBuilder {
ShortcutsViewer? shortcutsOverlay;

Widget virtualBuild(BuildContext context);

@override
Widget genPageChild(BuildContext context) {
if (shortcutsOverlay != null) {
if (supportShortcuts) {
return Stack(children: [
Container(color: AppColors.DARK_BG, child: virtualBuild(context)),
shortcutsOverlay!
shortcutOverlayWidget!
]);
} else {
return Container(color: AppColors.DARK_BG, child: virtualBuild(context));
Expand All @@ -32,12 +31,12 @@ abstract class XboxPageState<T extends XboxPageStateful> extends State<T>

@override
Widget build(BuildContext context) {
List<ShortcutOption>? mapping = defineMapping(context);
List<ShortcutInfo>? mapping = defineMapping(context);

if (mapping != null) {
KeyboardControllerActionManipulator.mapKeyboardControllerActions(
context, Map.fromEntries(mapping.map((e) => e.rawShortcut)));
shortcutsOverlay = ShortcutsViewer(mapping);
context, mapping.whereType<ShortcutOption>().toList());
updateShortcuts(mapping);
}

return CallbackShortcuts(
Expand Down
17 changes: 8 additions & 9 deletions lib/shared/widgets/models/xbox_page_stateless.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,15 @@ import 'package:fluent_ui/fluent_ui.dart';
import 'package:provider/provider.dart';
import 'package:xbox_launcher/controllers/keyboard_controller_action_manipulator.dart';
import 'package:xbox_launcher/models/mapping_definition.dart';
import 'package:xbox_launcher/models/shortcut_models/shortcut_info.dart';
import 'package:xbox_launcher/models/shortcut_models/shortcut_option.dart';
import 'package:xbox_launcher/providers/keyboard_action_provider.dart';
import 'package:xbox_launcher/shared/app_colors.dart';
import 'package:xbox_launcher/shared/widgets/models/xbox_page_builder.dart';
import 'package:xbox_launcher/shared/widgets/shortcuts/shortcuts_viewer.dart';
import 'package:xbox_launcher/shared/widgets/shortcuts/shortcut_viewer_support.dart';

abstract class XboxPageStateless extends StatelessWidget
abstract class XboxPageStateless extends StatelessWidget with ShortcutViewerSupport
implements MappingDefinition, XboxPageBuilder {
ShortcutsViewer? shortcutsOverlay;

XboxPageStateless({
Key? key,
}) : super(key: key);
Expand All @@ -20,10 +19,10 @@ abstract class XboxPageStateless extends StatelessWidget

@override
Widget genPageChild(BuildContext context) {
if (shortcutsOverlay != null) {
if (supportShortcuts) {
return Stack(children: [
Container(color: AppColors.DARK_BG, child: virtualBuild(context)),
shortcutsOverlay!
shortcutOverlayWidget!
]);
} else {
return Container(color: AppColors.DARK_BG, child: virtualBuild(context));
Expand All @@ -32,12 +31,12 @@ abstract class XboxPageStateless extends StatelessWidget

@override
Widget build(BuildContext context) {
List<ShortcutOption>? mapping = defineMapping(context);
List<ShortcutInfo>? mapping = defineMapping(context);

if (mapping != null) {
KeyboardControllerActionManipulator.mapKeyboardControllerActions(
context, Map.fromEntries(mapping.map((map) => map.rawShortcut)));
shortcutsOverlay = ShortcutsViewer(mapping);
context, mapping.whereType<ShortcutOption>().toList());
updateShortcuts(mapping);
}

return CallbackShortcuts(
Expand Down
29 changes: 29 additions & 0 deletions lib/shared/widgets/shortcuts/shortcut_viewer_support.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:xbox_launcher/models/shortcut_models/shortcut_info.dart';
import 'package:xbox_launcher/shared/widgets/shortcuts/shortcuts_viewer.dart';

abstract class ShortcutViewerSupport {
ShortcutsViewer? _shortcutsOverlay;
void Function(void Function())? _reloadShortcutViewer;

bool get supportShortcuts => _shortcutsOverlay != null;

Widget? get shortcutOverlayWidget {
if (_shortcutsOverlay == null) return null;

return StatefulBuilder(
builder: (context, setState) {
_reloadShortcutViewer = setState;

return _shortcutsOverlay!;
},
);
}

void updateShortcuts(List<ShortcutInfo> shortcuts) {
if (shortcuts.isEmpty) return;

_shortcutsOverlay = ShortcutsViewer(shortcuts);
_reloadShortcutViewer?.call(() {});
}
}
6 changes: 3 additions & 3 deletions lib/shared/widgets/shortcuts/shortcuts_viewer.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:xbox_launcher/models/shortcut_models/shortcut_option.dart';
import 'package:xbox_launcher/models/shortcut_models/shortcut_info.dart';
import 'package:xbox_launcher/shared/widgets/utils/generators/button_svg_gen.dart';

class ShortcutsViewer extends StatelessWidget {
final List<ShortcutOption> mappedShortcuts;
final List<ShortcutInfo> mappedShortcuts;

const ShortcutsViewer(this.mappedShortcuts, {super.key});

Expand All @@ -15,7 +15,7 @@ class ShortcutsViewer extends StatelessWidget {

List<Row> shortcutRow = List.empty(growable: true);
int counter = 0;
for (ShortcutOption sOption in mappedShortcuts) {
for (ShortcutInfo sOption in mappedShortcuts) {
if (!sOption.show) continue;

shortcutRow.add(Row(
Expand Down

0 comments on commit e2633cd

Please sign in to comment.