diff --git a/app/lib/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_id.dart b/app/lib/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_id.dart index d7534d10..08e02cbd 100644 --- a/app/lib/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_id.dart +++ b/app/lib/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_id.dart @@ -42,4 +42,5 @@ enum ToolbarButtonId { pageDown, font, extensionShortcut, + quit, } diff --git a/app/lib/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_spec.dart b/app/lib/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_spec.dart index 8488f713..df21fda8 100644 --- a/app/lib/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_spec.dart +++ b/app/lib/features/geckoview/features/browser/features/contextual_toolbar/domain/entities/toolbar_button_spec.dart @@ -158,6 +158,12 @@ const extensionShortcutToolbarButtonSpec = ToolbarButtonSpec( canBeFallbackTarget: false, ); +const quitToolbarButtonSpec = ToolbarButtonSpec( + id: ToolbarButtonId.quit, + defaultVisible: false, + canBeFallbackTarget: false, +); + const toolbarButtonSpecs = [ backToolbarButtonSpec, forwardToolbarButtonSpec, @@ -182,6 +188,7 @@ const toolbarButtonSpecs = [ pageDownToolbarButtonSpec, fontToolbarButtonSpec, extensionShortcutToolbarButtonSpec, + quitToolbarButtonSpec, ]; final Map toolbarButtonSpecsById = { diff --git a/app/lib/features/geckoview/features/browser/features/contextual_toolbar/presentation/toolbar_button_registry.dart b/app/lib/features/geckoview/features/browser/features/contextual_toolbar/presentation/toolbar_button_registry.dart index 66a4b8b2..201322dc 100644 --- a/app/lib/features/geckoview/features/browser/features/contextual_toolbar/presentation/toolbar_button_registry.dart +++ b/app/lib/features/geckoview/features/browser/features/contextual_toolbar/presentation/toolbar_button_registry.dart @@ -47,8 +47,10 @@ import 'package:weblibre/features/geckoview/features/readerview/presentation/con import 'package:weblibre/features/geckoview/features/tabs/data/entities/tab_mode.dart'; import 'package:weblibre/features/settings/presentation/controllers/save_settings.dart'; import 'package:weblibre/features/user/data/models/engine_settings.dart'; +import 'package:weblibre/features/user/domain/presentation/dialogs/quit_browser_dialog.dart'; import 'package:weblibre/features/user/domain/repositories/engine_settings.dart'; import 'package:weblibre/features/user/domain/repositories/general_settings.dart'; +import 'package:weblibre/utils/exit_app.dart'; import 'package:weblibre/utils/move_to_background.dart'; import 'package:weblibre/utils/ui_helper.dart' as ui_helper; @@ -477,6 +479,30 @@ final List toolbarButtonRegistry = [ return const _ExtensionShortcutToolbarButton(); }, ), + ToolbarButtonDefinition( + spec: quitToolbarButtonSpec, + label: 'Quit', + icon: MdiIcons.power, + longPressActions: ['Quit without confirmation'], + builder: (scope, context, ref) { + return IconButton( + onPressed: scope.isPreview + ? () {} + : () async { + final result = await showQuitBrowserDialog(context); + if (result == true) { + await exitApp(ref.container); + } + }, + onLongPress: scope.isPreview + ? null + : () async { + await exitApp(ref.container); + }, + icon: const Icon(MdiIcons.power), + ); + }, + ), ]; final Map toolbarButtonRegistryById = {