From 826015c42f2cdb03cfe558711e32516fd1b4f11c Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Sat, 14 Feb 2026 20:02:48 +0100 Subject: [PATCH] make drawer gesture controllable via settings --- .../browser/presentation/screens/browser.dart | 8 +++++- .../screens/appearance_display_settings.dart | 27 +++++++++++++++++++ .../user/data/models/general_settings.dart | 7 ++++- .../user/data/models/general_settings.g.dart | 16 +++++++++++ .../domain/repositories/general_settings.dart | 4 +++ .../repositories/general_settings.g.dart | 2 +- 6 files changed, 61 insertions(+), 3 deletions(-) diff --git a/app/lib/features/geckoview/features/browser/presentation/screens/browser.dart b/app/lib/features/geckoview/features/browser/presentation/screens/browser.dart index 6f83478c..63befd43 100644 --- a/app/lib/features/geckoview/features/browser/presentation/screens/browser.dart +++ b/app/lib/features/geckoview/features/browser/presentation/screens/browser.dart @@ -292,6 +292,12 @@ class BrowserScreen extends HookConsumerWidget { ), ); + final drawerGestureEnabled = ref.watch( + generalSettingsWithDefaultsProvider.select( + (value) => value.drawerGestureEnabled, + ), + ); + final displayAppBar = useValueNotifier(true); ref.listen(tabBarDismissableControllerProvider, (previous, next) { @@ -462,7 +468,7 @@ class BrowserScreen extends HookConsumerWidget { // Minimal scaffold - only for Material overlay support (SnackBars) resizeToAvoidBottomInset: false, endDrawer: const BrowserNavigationDrawer(), - endDrawerEnableOpenDragGesture: false, + endDrawerEnableOpenDragGesture: drawerGestureEnabled, body: Stack( children: [ // Layer 0: Browser content diff --git a/app/lib/features/settings/presentation/screens/appearance_display_settings.dart b/app/lib/features/settings/presentation/screens/appearance_display_settings.dart index 1b62b6f5..437bc408 100644 --- a/app/lib/features/settings/presentation/screens/appearance_display_settings.dart +++ b/app/lib/features/settings/presentation/screens/appearance_display_settings.dart @@ -134,6 +134,7 @@ class _GesturesSection extends StatelessWidget { children: [ SettingSection(name: 'Gestures'), _PullToRefreshTile(), + _DrawerGestureTile(), _DoubleBackCloseTabTile(), ], ); @@ -470,6 +471,32 @@ class _PullToRefreshTile extends HookConsumerWidget { } } +class _DrawerGestureTile extends HookConsumerWidget { + const _DrawerGestureTile(); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final drawerGestureEnabled = ref.watch( + generalSettingsWithDefaultsProvider.select((s) => s.drawerGestureEnabled), + ); + + return SwitchListTile.adaptive( + title: const Text('Drawer Swipe Gesture'), + subtitle: const Text('Swipe from screen edge to open navigation drawer'), + secondary: const Icon(MdiIcons.gestureSwipe), + value: drawerGestureEnabled, + onChanged: (value) async { + await ref + .read(saveGeneralSettingsControllerProvider.notifier) + .save( + (currentSettings) => + currentSettings.copyWith.drawerGestureEnabled(value), + ); + }, + ); + } +} + class _DoubleBackCloseTabTile extends HookConsumerWidget { const _DoubleBackCloseTabTile(); diff --git a/app/lib/features/user/data/models/general_settings.dart b/app/lib/features/user/data/models/general_settings.dart index d0266561..8b5f29f4 100644 --- a/app/lib/features/user/data/models/general_settings.dart +++ b/app/lib/features/user/data/models/general_settings.dart @@ -88,6 +88,7 @@ class GeneralSettings with FastEquatable { final bool allowClipboardAccess; final bool tabListShowFavicons; final bool quickTabSwitcherShowTitles; + final bool drawerGestureEnabled; GeneralSettings({ required this.themeMode, @@ -118,6 +119,7 @@ class GeneralSettings with FastEquatable { required this.allowClipboardAccess, required this.tabListShowFavicons, required this.quickTabSwitcherShowTitles, + required this.drawerGestureEnabled, }); GeneralSettings.withDefaults({ @@ -149,6 +151,7 @@ class GeneralSettings with FastEquatable { bool? allowClipboardAccess, bool? tabListShowFavicons, bool? quickTabSwitcherShowTitles, + bool? drawerGestureEnabled, }) : themeMode = themeMode ?? ThemeMode.dark, enableReadability = enableReadability ?? true, enforceReadability = enforceReadability ?? false, @@ -180,7 +183,8 @@ class GeneralSettings with FastEquatable { maxSearchHistoryEntries = maxSearchHistoryEntries ?? 5, allowClipboardAccess = allowClipboardAccess ?? true, tabListShowFavicons = tabListShowFavicons ?? false, - quickTabSwitcherShowTitles = quickTabSwitcherShowTitles ?? true; + quickTabSwitcherShowTitles = quickTabSwitcherShowTitles ?? true, + drawerGestureEnabled = drawerGestureEnabled ?? false; factory GeneralSettings.fromJson(Map json) => _$GeneralSettingsFromJson(json); @@ -217,5 +221,6 @@ class GeneralSettings with FastEquatable { allowClipboardAccess, tabListShowFavicons, quickTabSwitcherShowTitles, + drawerGestureEnabled, ]; } diff --git a/app/lib/features/user/data/models/general_settings.g.dart b/app/lib/features/user/data/models/general_settings.g.dart index 9eeb77aa..bb4a1f85 100644 --- a/app/lib/features/user/data/models/general_settings.g.dart +++ b/app/lib/features/user/data/models/general_settings.g.dart @@ -75,6 +75,8 @@ abstract class _$GeneralSettingsCWProxy { GeneralSettings quickTabSwitcherShowTitles(bool quickTabSwitcherShowTitles); + GeneralSettings drawerGestureEnabled(bool drawerGestureEnabled); + /// Creates a new instance with the provided field values. /// Passing `null` to a nullable field nullifies it, while `null` for a non-nullable field is ignored. To update a single field use `GeneralSettings(...).copyWith.fieldName(value)`. /// @@ -111,6 +113,7 @@ abstract class _$GeneralSettingsCWProxy { bool allowClipboardAccess, bool tabListShowFavicons, bool quickTabSwitcherShowTitles, + bool drawerGestureEnabled, }); } @@ -238,6 +241,10 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy { GeneralSettings quickTabSwitcherShowTitles(bool quickTabSwitcherShowTitles) => call(quickTabSwitcherShowTitles: quickTabSwitcherShowTitles); + @override + GeneralSettings drawerGestureEnabled(bool drawerGestureEnabled) => + call(drawerGestureEnabled: drawerGestureEnabled); + @override /// Creates a new instance with the provided field values. /// Passing `null` to a nullable field nullifies it, while `null` for a non-nullable field is ignored. To update a single field use `GeneralSettings(...).copyWith.fieldName(value)`. @@ -275,6 +282,7 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy { Object? allowClipboardAccess = const $CopyWithPlaceholder(), Object? tabListShowFavicons = const $CopyWithPlaceholder(), Object? quickTabSwitcherShowTitles = const $CopyWithPlaceholder(), + Object? drawerGestureEnabled = const $CopyWithPlaceholder(), }) { return GeneralSettings( themeMode: themeMode == const $CopyWithPlaceholder() || themeMode == null @@ -441,6 +449,12 @@ class _$GeneralSettingsCWProxyImpl implements _$GeneralSettingsCWProxy { ? _value.quickTabSwitcherShowTitles // ignore: cast_nullable_to_non_nullable : quickTabSwitcherShowTitles as bool, + drawerGestureEnabled: + drawerGestureEnabled == const $CopyWithPlaceholder() || + drawerGestureEnabled == null + ? _value.drawerGestureEnabled + // ignore: cast_nullable_to_non_nullable + : drawerGestureEnabled as bool, ); } } @@ -519,6 +533,7 @@ GeneralSettings _$GeneralSettingsFromJson( allowClipboardAccess: json['allowClipboardAccess'] as bool?, tabListShowFavicons: json['tabListShowFavicons'] as bool?, quickTabSwitcherShowTitles: json['quickTabSwitcherShowTitles'] as bool?, + drawerGestureEnabled: json['drawerGestureEnabled'] as bool?, ); Map _$GeneralSettingsToJson( @@ -561,6 +576,7 @@ Map _$GeneralSettingsToJson( 'allowClipboardAccess': instance.allowClipboardAccess, 'tabListShowFavicons': instance.tabListShowFavicons, 'quickTabSwitcherShowTitles': instance.quickTabSwitcherShowTitles, + 'drawerGestureEnabled': instance.drawerGestureEnabled, }; const _$ThemeModeEnumMap = { diff --git a/app/lib/features/user/domain/repositories/general_settings.dart b/app/lib/features/user/domain/repositories/general_settings.dart index c540321d..b8b7228b 100644 --- a/app/lib/features/user/domain/repositories/general_settings.dart +++ b/app/lib/features/user/domain/repositories/general_settings.dart @@ -151,6 +151,10 @@ class GeneralSettingsRepository extends _$GeneralSettingsRepository { ), 'quickTabSwitcherShowTitles': settings['quickTabSwitcherShowTitles'] ?.readAs(DriftSqlType.bool, db.typeMapping), + 'drawerGestureEnabled': settings['drawerGestureEnabled']?.readAs( + DriftSqlType.bool, + db.typeMapping, + ), }); } diff --git a/app/lib/features/user/domain/repositories/general_settings.g.dart b/app/lib/features/user/domain/repositories/general_settings.g.dart index 4c80e21d..22778d68 100644 --- a/app/lib/features/user/domain/repositories/general_settings.g.dart +++ b/app/lib/features/user/domain/repositories/general_settings.g.dart @@ -35,7 +35,7 @@ final class GeneralSettingsRepositoryProvider } String _$generalSettingsRepositoryHash() => - r'290fc9fb5dd79b94bb4a42a131184b385a1ecb4d'; + r'33730ccb09471c1a7c187bd19760110f524e055b'; abstract class _$GeneralSettingsRepository extends $StreamNotifier {