Skip to content

Commit 2bfb3fd

Browse files
committed
reorganize tab bar menus; readerview button visibility via setting;
1 parent 55305c3 commit 2bfb3fd

File tree

10 files changed

+418
-306
lines changed

10 files changed

+418
-306
lines changed

app/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/bottom_app_bar.dart

Lines changed: 72 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,11 @@ import 'package:flutter_material_design_icons/flutter_material_design_icons.dart
2424
import 'package:flutter_mozilla_components/flutter_mozilla_components.dart';
2525
import 'package:go_router/go_router.dart';
2626
import 'package:hooks_riverpod/hooks_riverpod.dart';
27-
import 'package:share_plus/share_plus.dart';
2827
import 'package:weblibre/core/providers/defaults.dart';
2928
import 'package:weblibre/core/routing/routes.dart';
3029
import 'package:weblibre/features/geckoview/domain/controllers/bottom_sheet.dart';
30+
import 'package:weblibre/features/geckoview/domain/entities/states/readerable.dart';
3131
import 'package:weblibre/features/geckoview/domain/providers.dart';
32-
import 'package:weblibre/features/geckoview/domain/providers/desktop_mode.dart';
3332
import 'package:weblibre/features/geckoview/domain/providers/selected_tab.dart';
3433
import 'package:weblibre/features/geckoview/domain/providers/tab_session.dart';
3534
import 'package:weblibre/features/geckoview/domain/providers/tab_state.dart';
@@ -40,8 +39,8 @@ import 'package:weblibre/features/geckoview/features/browser/presentation/widget
4039
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/extension_badge_icon.dart';
4140
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/extension_shortcut_menu.dart';
4241
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/tab_creation_menu.dart';
42+
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/tab_menu.dart';
4343
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/tabs_action_button.dart';
44-
import 'package:weblibre/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart';
4544
import 'package:weblibre/features/geckoview/features/readerview/presentation/controllers/readerable.dart';
4645
import 'package:weblibre/features/geckoview/features/readerview/presentation/widgets/reader_button.dart';
4746
import 'package:weblibre/features/tor/domain/services/tor_proxy.dart';
@@ -62,6 +61,7 @@ class BrowserBottomAppBar extends HookConsumerWidget {
6261

6362
final tabMenuController = useMenuController();
6463
final extensionMenuController = useMenuController();
64+
final hamburgerMenuController = useMenuController();
6565
final trippleDotMenuController = useMenuController();
6666

6767
final selectedTabId = ref.watch(selectedTabProvider);
@@ -138,7 +138,48 @@ class BrowserBottomAppBar extends HookConsumerWidget {
138138
: null,
139139
actions: [
140140
if (selectedTabId != null && displayedSheet is! ViewTabsSheet)
141-
ReaderButton(),
141+
Consumer(
142+
builder: (context, ref, child) {
143+
final tabBarReaderView = ref.watch(
144+
generalSettingsWithDefaultsProvider.select(
145+
(value) => value.tabBarReaderView,
146+
),
147+
);
148+
149+
final readerabilityStateActive = ref.watch(
150+
selectedTabStateProvider.select(
151+
(state) =>
152+
(state?.readerableState ?? ReaderableState.$default())
153+
.active,
154+
),
155+
);
156+
157+
return Visibility(
158+
visible: tabBarReaderView || readerabilityStateActive,
159+
child: ReaderButton(
160+
buttonBuilder: (isLoading, readerActive, icon) => InkWell(
161+
onTap: isLoading
162+
? null
163+
: () async {
164+
await ref
165+
.read(
166+
readerableScreenControllerProvider
167+
.notifier,
168+
)
169+
.toggleReaderView(!readerActive);
170+
},
171+
child: Padding(
172+
padding: const EdgeInsets.symmetric(
173+
vertical: 15.0,
174+
horizontal: 8.0,
175+
),
176+
child: icon,
177+
),
178+
),
179+
),
180+
);
181+
},
182+
),
142183
if (showExtensionShortcut)
143184
ExtensionShortcutMenu(
144185
controller: extensionMenuController,
@@ -153,6 +194,27 @@ class BrowserBottomAppBar extends HookConsumerWidget {
153194
icon: const Icon(MdiIcons.puzzle),
154195
),
155196
),
197+
if (selectedTabId != null)
198+
TabMenu(
199+
controller: trippleDotMenuController,
200+
selectedTabId: selectedTabId,
201+
child: InkWell(
202+
onTap: () {
203+
if (trippleDotMenuController.isOpen) {
204+
trippleDotMenuController.close();
205+
} else {
206+
trippleDotMenuController.open();
207+
}
208+
},
209+
child: const Padding(
210+
padding: EdgeInsets.symmetric(
211+
horizontal: 8.0,
212+
vertical: 15.0,
213+
),
214+
child: Icon(MdiIcons.dotsHorizontal),
215+
),
216+
),
217+
),
156218
TabCreationMenu(
157219
controller: tabMenuController,
158220
selectedTabId: selectedTabId,
@@ -187,7 +249,7 @@ class BrowserBottomAppBar extends HookConsumerWidget {
187249
),
188250
),
189251
MenuAnchor(
190-
controller: trippleDotMenuController,
252+
controller: hamburgerMenuController,
191253
builder: (context, controller, child) {
192254
return Padding(
193255
padding: const EdgeInsets.only(right: 4.0),
@@ -204,7 +266,7 @@ class BrowserBottomAppBar extends HookConsumerWidget {
204266
vertical: 15.0,
205267
horizontal: 8.0,
206268
),
207-
child: Icon(Icons.more_vert),
269+
child: Icon(Icons.menu),
208270
),
209271
),
210272
);
@@ -377,80 +439,6 @@ class BrowserBottomAppBar extends HookConsumerWidget {
377439
child: const Text('Feeds'),
378440
),
379441
const Divider(),
380-
if (selectedTabId != null)
381-
MenuItemButton(
382-
onPressed: () async {
383-
final tabState = ref.read(
384-
tabStateProvider(selectedTabId),
385-
);
386-
387-
if (tabState?.url case final Uri url) {
388-
await ui_helper.launchUrlFeedback(context, url);
389-
}
390-
},
391-
leadingIcon: const Icon(Icons.open_in_browser),
392-
child: const Text('Launch External'),
393-
),
394-
if (selectedTabId != null)
395-
MenuItemButton(
396-
onPressed: () async {
397-
final tabState = ref.read(
398-
tabStateProvider(selectedTabId),
399-
);
400-
401-
if (tabState?.url case final Uri url) {
402-
await SharePlus.instance.share(ShareParams(uri: url));
403-
}
404-
},
405-
leadingIcon: const Icon(Icons.share),
406-
child: const Text('Share'),
407-
),
408-
if (selectedTabId != null) const Divider(),
409-
if (selectedTabId != null)
410-
MenuItemButton(
411-
onPressed: () {
412-
final tabId = ref.read(selectedTabProvider);
413-
if (tabId != null) {
414-
ref
415-
.read(findInPageControllerProvider(tabId).notifier)
416-
.show();
417-
}
418-
},
419-
leadingIcon: const Icon(Icons.search),
420-
child: const Text('Find in page'),
421-
),
422-
if (selectedTabId != null)
423-
Consumer(
424-
builder: (context, childRef, child) {
425-
final enabled = childRef.watch(
426-
desktopModeProvider(selectedTabId),
427-
);
428-
429-
return MenuItemButton(
430-
onPressed: () {
431-
ref
432-
.read(desktopModeProvider(selectedTabId).notifier)
433-
.toggle();
434-
},
435-
leadingIcon: const Icon(MdiIcons.monitor),
436-
trailingIcon: Checkbox(
437-
value: enabled,
438-
onChanged: (value) {
439-
if (value != null) {
440-
ref
441-
.read(
442-
desktopModeProvider(selectedTabId).notifier,
443-
)
444-
.enabled(value);
445-
trippleDotMenuController.close();
446-
}
447-
},
448-
),
449-
child: const Text('Desktop Mode'),
450-
);
451-
},
452-
),
453-
if (selectedTabId != null) const Divider(),
454442
if (selectedTabId != null)
455443
MenuItemButton(
456444
onPressed: () async {
@@ -459,7 +447,7 @@ class BrowserBottomAppBar extends HookConsumerWidget {
459447
);
460448

461449
await controller.reload();
462-
trippleDotMenuController.close();
450+
hamburgerMenuController.close();
463451
},
464452
leadingIcon: const Icon(Icons.refresh),
465453
child: const Text('Reload'),
@@ -513,7 +501,7 @@ class BrowserBottomAppBar extends HookConsumerWidget {
513501
await controller.goBack();
514502
}
515503

516-
trippleDotMenuController.close();
504+
hamburgerMenuController.close();
517505
},
518506
icon: const Icon(Icons.arrow_back),
519507
)
@@ -523,7 +511,7 @@ class BrowserBottomAppBar extends HookConsumerWidget {
523511
.read(tabRepositoryProvider.notifier)
524512
.closeTab(selectedTabId);
525513

526-
trippleDotMenuController.close();
514+
hamburgerMenuController.close();
527515

528516
if (context.mounted) {
529517
ui_helper.showTabUndoClose(
@@ -551,7 +539,7 @@ class BrowserBottomAppBar extends HookConsumerWidget {
551539
);
552540

553541
await controller.goForward();
554-
trippleDotMenuController.close();
542+
hamburgerMenuController.close();
555543
}
556544
: null,
557545
icon: const Icon(Icons.arrow_forward),

0 commit comments

Comments
 (0)