From 31b863427f53042dc816c08802c1af7612376251 Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Tue, 4 Aug 2026 16:16:25 +0200 Subject: [PATCH] new gesture/toolbar actions --- .../controllers/home_target_controller.g.dart | 2 +- .../domain/entities/toolbar_button_id.dart | 2 + .../domain/entities/toolbar_button_spec.dart | 13 ++++++ .../presentation/toolbar_button_registry.dart | 42 +++++++++++++++++++ .../gestures/data/models/gesture_action.dart | 12 ++++++ .../data/models/gesture_settings.g.dart | 2 + .../domain/services/gesture_control.dart | 16 +++++++ .../domain/services/gesture_control.g.dart | 2 +- 8 files changed, 89 insertions(+), 2 deletions(-) diff --git a/apps/weblibre/lib/features/geckoview/features/browser/domain/controllers/home_target_controller.g.dart b/apps/weblibre/lib/features/geckoview/features/browser/domain/controllers/home_target_controller.g.dart index 1175e043..3dd34085 100644 --- a/apps/weblibre/lib/features/geckoview/features/browser/domain/controllers/home_target_controller.g.dart +++ b/apps/weblibre/lib/features/geckoview/features/browser/domain/controllers/home_target_controller.g.dart @@ -45,7 +45,7 @@ final class HomeTargetControllerProvider } String _$homeTargetControllerHash() => - r'1bb3a879ee569261b1dfcc4c0d8b28ef0cb7f7d3'; + r'db486c85ce71b99a67fde8ca142da43aef402973'; /// Applies the configured [HomeTarget] when the browser has nothing to show. diff --git a/apps/weblibre/lib/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_id.dart b/apps/weblibre/lib/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_id.dart index 6c8e7627..5142a3b6 100644 --- a/apps/weblibre/lib/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_id.dart +++ b/apps/weblibre/lib/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_id.dart @@ -21,6 +21,7 @@ enum ToolbarButtonId { back, forward, + home, history, bookmarks, bookmarkToggle, @@ -44,5 +45,6 @@ enum ToolbarButtonId { font, extensionShortcut, toggleGestures, + hideTabBar, quit, } diff --git a/apps/weblibre/lib/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_spec.dart b/apps/weblibre/lib/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_spec.dart index 2595bddc..b149d479 100644 --- a/apps/weblibre/lib/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_spec.dart +++ b/apps/weblibre/lib/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_spec.dart @@ -46,6 +46,11 @@ const forwardToolbarButtonSpec = ToolbarButtonSpec( defaultFallback: ToolbarButtonId.share, ); +const homeToolbarButtonSpec = ToolbarButtonSpec( + id: ToolbarButtonId.home, + defaultVisible: false, +); + const historyToolbarButtonSpec = ToolbarButtonSpec( id: ToolbarButtonId.history, defaultVisible: false, @@ -174,9 +179,16 @@ const toggleGesturesToolbarButtonSpec = ToolbarButtonSpec( defaultVisible: false, ); +const hideTabBarToolbarButtonSpec = ToolbarButtonSpec( + id: ToolbarButtonId.hideTabBar, + defaultVisible: false, + canBeFallbackTarget: false, +); + const toolbarButtonSpecs = [ backToolbarButtonSpec, forwardToolbarButtonSpec, + homeToolbarButtonSpec, historyToolbarButtonSpec, bookmarksToolbarButtonSpec, bookmarkToggleToolbarButtonSpec, @@ -200,6 +212,7 @@ const toolbarButtonSpecs = [ fontToolbarButtonSpec, extensionShortcutToolbarButtonSpec, toggleGesturesToolbarButtonSpec, + hideTabBarToolbarButtonSpec, quitToolbarButtonSpec, ]; diff --git a/apps/weblibre/lib/features/geckoview/features/browser/features/contextual_toolbar/presentation/toolbar_button_registry.dart b/apps/weblibre/lib/features/geckoview/features/browser/features/contextual_toolbar/presentation/toolbar_button_registry.dart index 11faa1ab..3289a3d3 100644 --- a/apps/weblibre/lib/features/geckoview/features/browser/features/contextual_toolbar/presentation/toolbar_button_registry.dart +++ b/apps/weblibre/lib/features/geckoview/features/browser/features/contextual_toolbar/presentation/toolbar_button_registry.dart @@ -40,6 +40,7 @@ import 'package:weblibre/features/geckoview/features/browser/features/contextual import 'package:weblibre/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_config_location.dart'; import 'package:weblibre/features/geckoview/features/browser/features/contextual_toolbar/presentation/models/contextual_toolbar_scope.dart'; import 'package:weblibre/features/geckoview/features/browser/features/contextual_toolbar/presentation/widgets/contextual_bar_buttons.dart'; +import 'package:weblibre/features/geckoview/features/browser/presentation/controllers/toolbar_visibility.dart'; import 'package:weblibre/features/geckoview/features/browser/presentation/utils/tab_close_confirmation.dart'; import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/extension_shortcut_menu.dart'; import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/font_size_bottom_sheet.dart'; @@ -49,6 +50,7 @@ import 'package:weblibre/features/geckoview/features/browser/presentation/widget import 'package:weblibre/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart'; import 'package:weblibre/features/geckoview/features/readerview/presentation/controllers/readerable.dart'; import 'package:weblibre/features/geckoview/features/tabs/data/entities/tab_mode.dart'; +import 'package:weblibre/features/geckoview/features/tabs/domain/providers/selected_container.dart'; import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/tab.dart'; import 'package:weblibre/features/gestures/data/models/gesture_settings.dart'; import 'package:weblibre/features/gestures/domain/repositories/gesture_settings.dart'; @@ -146,6 +148,22 @@ final List toolbarButtonRegistry = [ return NavigateForwardButton(selectedTabId: scope.selectedTabId); }, ), + ToolbarButtonDefinition( + spec: homeToolbarButtonSpec, + label: 'Home', + icon: Icons.home_outlined, + builder: (scope, context, ref) { + return IconButton( + tooltip: 'Home', + onPressed: scope.isPreview + ? () {} + : () { + ref.read(forceBrowserHomeProvider.notifier).request(); + }, + icon: const Icon(Icons.home_outlined), + ); + }, + ), ToolbarButtonDefinition( spec: historyToolbarButtonSpec, label: 'History', @@ -450,6 +468,30 @@ final List toolbarButtonRegistry = [ ); }, ), + ToolbarButtonDefinition( + spec: hideTabBarToolbarButtonSpec, + label: 'Hide Tab Bar', + icon: MdiIcons.dockBottom, + builder: (scope, context, ref) { + return IconButton( + tooltip: 'Hide tab bar', + // Same dismissal the swipe on the bar performs; the dock FAB brings it + // back afterwards, since this button goes away with the bar. + onPressed: scope.isPreview + ? () {} + : () { + ref + .read( + toolbarVisibilityControllerProvider( + scope.selectedTabId, + ).notifier, + ) + .dismiss(); + }, + icon: const Icon(MdiIcons.dockBottom), + ); + }, + ), ToolbarButtonDefinition( spec: pageUpToolbarButtonSpec, label: 'Page Up', diff --git a/apps/weblibre/lib/features/gestures/data/models/gesture_action.dart b/apps/weblibre/lib/features/gestures/data/models/gesture_action.dart index aa7ce5bb..65f13a39 100644 --- a/apps/weblibre/lib/features/gestures/data/models/gesture_action.dart +++ b/apps/weblibre/lib/features/gestures/data/models/gesture_action.dart @@ -162,6 +162,12 @@ enum GestureAction { ), // Open + showHome( + 'Home', + 'Open the home screen', + Icons.home_outlined, + GestureActionCategory.open, + ), showHistory( 'History', 'Open browsing history', @@ -176,6 +182,12 @@ enum GestureAction { ), // App + toggleTabBar( + 'Hide / Show Tab Bar', + 'Hide the tab bar, or bring it back', + MdiIcons.dockBottom, + GestureActionCategory.app, + ), moveToBackground( 'Minimize', 'Send WebLibre to the background', diff --git a/apps/weblibre/lib/features/gestures/data/models/gesture_settings.g.dart b/apps/weblibre/lib/features/gestures/data/models/gesture_settings.g.dart index 851af7f0..66029333 100644 --- a/apps/weblibre/lib/features/gestures/data/models/gesture_settings.g.dart +++ b/apps/weblibre/lib/features/gestures/data/models/gesture_settings.g.dart @@ -259,8 +259,10 @@ const _$GestureActionEnumMap = { GestureAction.decreaseFontSize: 'decreaseFontSize', GestureAction.toggleBookmark: 'toggleBookmark', GestureAction.translatePage: 'translatePage', + GestureAction.showHome: 'showHome', GestureAction.showHistory: 'showHistory', GestureAction.showBookmarks: 'showBookmarks', + GestureAction.toggleTabBar: 'toggleTabBar', GestureAction.moveToBackground: 'moveToBackground', GestureAction.quitBrowser: 'quitBrowser', }; diff --git a/apps/weblibre/lib/features/gestures/domain/services/gesture_control.dart b/apps/weblibre/lib/features/gestures/domain/services/gesture_control.dart index e2c4d4cf..c8c2d9af 100644 --- a/apps/weblibre/lib/features/gestures/domain/services/gesture_control.dart +++ b/apps/weblibre/lib/features/gestures/domain/services/gesture_control.dart @@ -35,10 +35,12 @@ import 'package:weblibre/features/geckoview/domain/providers/tab_state.dart'; import 'package:weblibre/features/geckoview/domain/repositories/tab.dart'; import 'package:weblibre/features/geckoview/features/bookmarks/domain/repositories/bookmarks.dart'; import 'package:weblibre/features/geckoview/features/browser/domain/entities/font_size_constants.dart'; +import 'package:weblibre/features/geckoview/features/browser/presentation/controllers/toolbar_visibility.dart'; import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/translation_bottom_sheet.dart'; import 'package:weblibre/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart'; import 'package:weblibre/features/geckoview/features/readerview/presentation/controllers/readerable.dart'; import 'package:weblibre/features/geckoview/features/tabs/domain/providers.dart'; +import 'package:weblibre/features/geckoview/features/tabs/domain/providers/selected_container.dart'; import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/tab.dart'; import 'package:weblibre/features/gestures/data/models/gesture_action.dart'; import 'package:weblibre/features/gestures/data/models/gesture_settings.dart'; @@ -193,6 +195,20 @@ class GestureControlService extends _$GestureControlService { await _adjustFontSize(increase: true); case GestureAction.decreaseFontSize: await _adjustFontSize(increase: false); + case GestureAction.showHome: + ref.read(forceBrowserHomeProvider.notifier).request(); + case GestureAction.toggleTabBar: + final controller = ref.read( + toolbarVisibilityControllerProvider(tabId).notifier, + ); + // Dismissing is the only state the user cannot leave by scrolling, so + // the same gesture has to bring the bar back. + if (ref.read(toolbarVisibilityControllerProvider(tabId)) == + ToolbarVisibility.dismissed) { + controller.forceShow(); + } else { + controller.dismiss(); + } case GestureAction.showHistory: await _pushLocation(const HistoryRoute().location); case GestureAction.showBookmarks: diff --git a/apps/weblibre/lib/features/gestures/domain/services/gesture_control.g.dart b/apps/weblibre/lib/features/gestures/domain/services/gesture_control.g.dart index 27841d7c..b8f8ea07 100644 --- a/apps/weblibre/lib/features/gestures/domain/services/gesture_control.g.dart +++ b/apps/weblibre/lib/features/gestures/domain/services/gesture_control.g.dart @@ -66,7 +66,7 @@ final class GestureControlServiceProvider } String _$gestureControlServiceHash() => - r'3741c0a3d9cb6726c044bab1efd4ce80208f21d8'; + r'be774bb3a9cd7793167c7b6f6c656caf2abff380'; /// Bridges gesture settings and recognized-gesture events to app actions. ///