consolidate icons
This commit is contained in:
+3
-4
@@ -29,6 +29,7 @@ import 'package:weblibre/features/geckoview/domain/controllers/bottom_sheet.dart
|
|||||||
import 'package:weblibre/features/geckoview/domain/providers/tab_state.dart';
|
import 'package:weblibre/features/geckoview/domain/providers/tab_state.dart';
|
||||||
import 'package:weblibre/features/geckoview/features/browser/domain/entities/sheet.dart';
|
import 'package:weblibre/features/geckoview/features/browser/domain/entities/sheet.dart';
|
||||||
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/tab_icon.dart';
|
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/tab_icon.dart';
|
||||||
|
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/toolbar_button.dart';
|
||||||
import 'package:weblibre/presentation/widgets/uri_breadcrumb.dart';
|
import 'package:weblibre/presentation/widgets/uri_breadcrumb.dart';
|
||||||
|
|
||||||
class AppBarTitle extends HookConsumerWidget {
|
class AppBarTitle extends HookConsumerWidget {
|
||||||
@@ -70,16 +71,14 @@ class AppBarTitle extends HookConsumerWidget {
|
|||||||
|
|
||||||
return Row(
|
return Row(
|
||||||
children: [
|
children: [
|
||||||
// Icon tap → opens site settings sheet
|
ToolbarButton(
|
||||||
GestureDetector(
|
|
||||||
onTap: () {
|
onTap: () {
|
||||||
ref
|
ref
|
||||||
.read(bottomSheetControllerProvider.notifier)
|
.read(bottomSheetControllerProvider.notifier)
|
||||||
.show(SiteSettingsSheet(tabState: tabState));
|
.show(SiteSettingsSheet(tabState: tabState));
|
||||||
},
|
},
|
||||||
child: TabIcon(tabState: tabState),
|
child: TabIcon(tabState: tabState, iconSize: 24),
|
||||||
),
|
),
|
||||||
const SizedBox(width: 8),
|
|
||||||
// Title/URL tap → opens search screen
|
// Title/URL tap → opens search screen
|
||||||
Expanded(
|
Expanded(
|
||||||
child: GestureDetector(
|
child: GestureDetector(
|
||||||
|
|||||||
+8
-19
@@ -45,6 +45,7 @@ import 'package:weblibre/features/geckoview/features/browser/presentation/widget
|
|||||||
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/tab_creation_menu.dart';
|
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/tab_creation_menu.dart';
|
||||||
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/tab_menu.dart';
|
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/tab_menu.dart';
|
||||||
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/tabs_action_button.dart';
|
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/tabs_action_button.dart';
|
||||||
|
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/toolbar_button.dart';
|
||||||
import 'package:weblibre/features/geckoview/features/history/domain/repositories/history.dart';
|
import 'package:weblibre/features/geckoview/features/history/domain/repositories/history.dart';
|
||||||
import 'package:weblibre/features/geckoview/features/readerview/presentation/controllers/readerable.dart';
|
import 'package:weblibre/features/geckoview/features/readerview/presentation/controllers/readerable.dart';
|
||||||
import 'package:weblibre/features/geckoview/features/readerview/presentation/widgets/reader_button.dart';
|
import 'package:weblibre/features/geckoview/features/readerview/presentation/widgets/reader_button.dart';
|
||||||
@@ -281,7 +282,7 @@ class BrowserTabBar extends HookConsumerWidget {
|
|||||||
child: AppBar(
|
child: AppBar(
|
||||||
primary: false,
|
primary: false,
|
||||||
automaticallyImplyLeading: false,
|
automaticallyImplyLeading: false,
|
||||||
titleSpacing: 8.0,
|
titleSpacing: 0.0,
|
||||||
toolbarHeight: kToolbarHeight,
|
toolbarHeight: kToolbarHeight,
|
||||||
backgroundColor:
|
backgroundColor:
|
||||||
(containerColor != null && displayedSheet is! ViewTabsSheet)
|
(containerColor != null && displayedSheet is! ViewTabsSheet)
|
||||||
@@ -314,7 +315,7 @@ class BrowserTabBar extends HookConsumerWidget {
|
|||||||
visible: tabBarReaderView || readerabilityStateActive,
|
visible: tabBarReaderView || readerabilityStateActive,
|
||||||
child: ReaderButton(
|
child: ReaderButton(
|
||||||
buttonBuilder: (isLoading, readerActive, icon) =>
|
buttonBuilder: (isLoading, readerActive, icon) =>
|
||||||
InkWell(
|
ToolbarButton(
|
||||||
onTap: isLoading
|
onTap: isLoading
|
||||||
? null
|
? null
|
||||||
: () async {
|
: () async {
|
||||||
@@ -325,30 +326,24 @@ class BrowserTabBar extends HookConsumerWidget {
|
|||||||
)
|
)
|
||||||
.toggleReaderView(!readerActive);
|
.toggleReaderView(!readerActive);
|
||||||
},
|
},
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.symmetric(
|
|
||||||
vertical: 15.0,
|
|
||||||
horizontal: 8.0,
|
|
||||||
),
|
|
||||||
child: icon,
|
child: icon,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
if (showExtensionShortcut)
|
if (showExtensionShortcut)
|
||||||
ExtensionShortcutMenu(
|
ExtensionShortcutMenu(
|
||||||
controller: extensionMenuController,
|
controller: extensionMenuController,
|
||||||
child: IconButton(
|
child: ToolbarButton(
|
||||||
onPressed: () {
|
onTap: () {
|
||||||
if (extensionMenuController.isOpen) {
|
if (extensionMenuController.isOpen) {
|
||||||
extensionMenuController.close();
|
extensionMenuController.close();
|
||||||
} else {
|
} else {
|
||||||
extensionMenuController.open();
|
extensionMenuController.open();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
icon: const Icon(MdiIcons.puzzle),
|
child: const Icon(MdiIcons.puzzle),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
if (selectedTabId != null)
|
if (selectedTabId != null)
|
||||||
@@ -356,7 +351,7 @@ class BrowserTabBar extends HookConsumerWidget {
|
|||||||
controller: trippleDotMenuController,
|
controller: trippleDotMenuController,
|
||||||
selectedTabId: selectedTabId,
|
selectedTabId: selectedTabId,
|
||||||
builder: (context, controller, child) {
|
builder: (context, controller, child) {
|
||||||
return InkWell(
|
return ToolbarButton(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
if (controller.isOpen) {
|
if (controller.isOpen) {
|
||||||
controller.close();
|
controller.close();
|
||||||
@@ -364,13 +359,7 @@ class BrowserTabBar extends HookConsumerWidget {
|
|||||||
controller.open();
|
controller.open();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
child: const Padding(
|
child: const Icon(MdiIcons.dotsVertical),
|
||||||
padding: EdgeInsets.symmetric(
|
|
||||||
horizontal: 8.0,
|
|
||||||
vertical: 15.0,
|
|
||||||
),
|
|
||||||
child: Icon(MdiIcons.dotsVertical),
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class TabIcon extends HookConsumerWidget {
|
|||||||
|
|
||||||
final double iconSize;
|
final double iconSize;
|
||||||
|
|
||||||
const TabIcon({super.key, required this.tabState, this.iconSize = 16});
|
const TabIcon({super.key, required this.tabState, required this.iconSize});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
|
|||||||
+1
-1
@@ -175,7 +175,7 @@ class GridTabPreview extends HookConsumerWidget {
|
|||||||
Row(
|
Row(
|
||||||
children: [
|
children: [
|
||||||
const SizedBox(width: 6.0),
|
const SizedBox(width: 6.0),
|
||||||
TabIcon(tabState: tabState),
|
TabIcon(tabState: tabState, iconSize: 16.0),
|
||||||
const SizedBox(width: 6.0),
|
const SizedBox(width: 6.0),
|
||||||
Expanded(
|
Expanded(
|
||||||
child: Text(
|
child: Text(
|
||||||
|
|||||||
+2
-4
@@ -22,6 +22,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|||||||
import 'package:nullability/nullability.dart';
|
import 'package:nullability/nullability.dart';
|
||||||
import 'package:skeletonizer/skeletonizer.dart';
|
import 'package:skeletonizer/skeletonizer.dart';
|
||||||
import 'package:weblibre/core/logger.dart';
|
import 'package:weblibre/core/logger.dart';
|
||||||
|
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/toolbar_button.dart';
|
||||||
import 'package:weblibre/features/geckoview/features/tabs/data/entities/container_filter.dart';
|
import 'package:weblibre/features/geckoview/features/tabs/data/entities/container_filter.dart';
|
||||||
import 'package:weblibre/features/geckoview/features/tabs/domain/providers.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/providers/selected_container.dart';
|
||||||
@@ -56,12 +57,10 @@ class TabsActionButton extends HookConsumerWidget {
|
|||||||
selectedContainerDataProvider.select((value) => value.value?.color),
|
selectedContainerDataProvider.select((value) => value.value?.color),
|
||||||
);
|
);
|
||||||
|
|
||||||
return InkWell(
|
return ToolbarButton(
|
||||||
onTap: onTap,
|
onTap: onTap,
|
||||||
onDoubleTap: onDoubleTap,
|
onDoubleTap: onDoubleTap,
|
||||||
onLongPress: onLongPress,
|
onLongPress: onLongPress,
|
||||||
child: Padding(
|
|
||||||
padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 15.0),
|
|
||||||
child: Container(
|
child: Container(
|
||||||
decoration: BoxDecoration(
|
decoration: BoxDecoration(
|
||||||
border: Border.all(
|
border: Border.all(
|
||||||
@@ -116,7 +115,6 @@ class TabsActionButton extends HookConsumerWidget {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
import 'package:flutter/material.dart';
|
||||||
|
|
||||||
|
class ToolbarButton extends StatelessWidget {
|
||||||
|
final Widget child;
|
||||||
|
final VoidCallback? onTap;
|
||||||
|
final VoidCallback? onDoubleTap;
|
||||||
|
final VoidCallback? onLongPress;
|
||||||
|
|
||||||
|
const ToolbarButton({
|
||||||
|
super.key,
|
||||||
|
required this.child,
|
||||||
|
this.onTap,
|
||||||
|
this.onDoubleTap,
|
||||||
|
this.onLongPress,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
return InkWell(
|
||||||
|
onTap: onTap,
|
||||||
|
onDoubleTap: onDoubleTap,
|
||||||
|
onLongPress: onLongPress,
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 15.0),
|
||||||
|
child: child,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -330,7 +330,7 @@ class SearchScreen extends HookConsumerWidget {
|
|||||||
label: (activeBang != null)
|
label: (activeBang != null)
|
||||||
? const Text('Search')
|
? const Text('Search')
|
||||||
: const Text('Address / Search'),
|
: const Text('Address / Search'),
|
||||||
unfocusOnTapOutside: !isEditMode,
|
unfocusOnTapOutside: false,
|
||||||
onSubmitted: (value) async {
|
onSubmitted: (value) async {
|
||||||
if (value.isNotEmpty) {
|
if (value.isNotEmpty) {
|
||||||
var newUrl = uri_parser.tryParseUrl(
|
var newUrl = uri_parser.tryParseUrl(
|
||||||
|
|||||||
+5
-3
@@ -284,7 +284,8 @@ class _BangChipsList extends HookConsumerWidget {
|
|||||||
searchTextController.clear();
|
searchTextController.clear();
|
||||||
} else {
|
} else {
|
||||||
// Site tab - only clear if text is a valid URL
|
// Site tab - only clear if text is a valid URL
|
||||||
final hasSupportedScheme = uri_parser
|
final hasSupportedScheme =
|
||||||
|
uri_parser
|
||||||
.tryParseUrl(searchTextController.text)
|
.tryParseUrl(searchTextController.text)
|
||||||
.mapNotNull((uri) => uri.hasSupportedScheme) ??
|
.mapNotNull((uri) => uri.hasSupportedScheme) ??
|
||||||
false;
|
false;
|
||||||
@@ -318,8 +319,9 @@ class _BangChipsList extends HookConsumerWidget {
|
|||||||
WidgetRef ref,
|
WidgetRef ref,
|
||||||
BangData bang,
|
BangData bang,
|
||||||
) async {
|
) async {
|
||||||
final currentSelection =
|
final currentSelection = ref.read(
|
||||||
ref.read(selectedBangTriggerProvider(domain: domain));
|
selectedBangTriggerProvider(domain: domain),
|
||||||
|
);
|
||||||
|
|
||||||
if (currentSelection == bang.toKey()) {
|
if (currentSelection == bang.toKey()) {
|
||||||
// Clear selection if the deleted bang is currently selected
|
// Clear selection if the deleted bang is currently selected
|
||||||
|
|||||||
Reference in New Issue
Block a user