From 94b9b9ccebff1810d13019560b056e2c6473aa0d Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Sat, 2 May 2026 06:20:11 +0200 Subject: [PATCH] isolated tab type default handling --- .../presentation/utils/tab_view_reorder.dart | 4 +-- .../widgets/browser_modules/browser_view.dart | 35 ++++++++++--------- .../screens/browsing_settings.dart | 31 +++++++++++++--- .../small_web_mode_controller.dart | 2 +- .../small_web_mode_controller.g.dart | 2 +- .../user/data/models/general_settings.dart | 17 ++++++++- .../user/data/models/general_settings.g.dart | 1 + 7 files changed, 66 insertions(+), 26 deletions(-) diff --git a/apps/weblibre/lib/features/geckoview/features/browser/presentation/utils/tab_view_reorder.dart b/apps/weblibre/lib/features/geckoview/features/browser/presentation/utils/tab_view_reorder.dart index 31b0c5e5..54f68383 100644 --- a/apps/weblibre/lib/features/geckoview/features/browser/presentation/utils/tab_view_reorder.dart +++ b/apps/weblibre/lib/features/geckoview/features/browser/presentation/utils/tab_view_reorder.dart @@ -88,9 +88,7 @@ TabViewReorderResult? buildTabViewReorderResult({ ? withoutMovingItem[insertIndex].tabId : null; if (targetBeforeId != null && moveBlockIds.contains(targetBeforeId)) { - logger.t( - 'reorder refused: drop target is inside the moving subtree', - ); + logger.t('reorder refused: drop target is inside the moving subtree'); return null; } diff --git a/apps/weblibre/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart b/apps/weblibre/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart index 6a3a496e..34e41c98 100644 --- a/apps/weblibre/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart +++ b/apps/weblibre/lib/features/geckoview/features/browser/presentation/widgets/browser_modules/browser_view.dart @@ -392,30 +392,37 @@ class _BrowserViewState extends ConsumerState next.whenData((sharedContent) async { final settings = ref.read(generalSettingsWithDefaultsProvider); - switch (settings.tabIntentOpenSetting) { + switch (settings.effectiveTabIntentOpenSetting) { case TabIntentOpenSetting.regular: case TabIntentOpenSetting.private: + case TabIntentOpenSetting.isolated: await ref .read(engineReadyStateProvider.notifier) .waitUntilReady(); + final tabMode = switch (settings.effectiveTabIntentOpenSetting) { + TabIntentOpenSetting.private => TabMode.private, + TabIntentOpenSetting.isolated => TabMode.newIsolated(), + _ => TabMode.regular, + }; + switch (sharedContent) { case SharedUrl(): - final containerSelection = await _resolveContainerSelection( - ref, - sharedContent.contextId, - sharedContent.containerMode, - ); + final containerSelection = + settings.effectiveTabIntentOpenSetting == + TabIntentOpenSetting.isolated + ? const TabContainerSelection.unassigned() + : await _resolveContainerSelection( + ref, + sharedContent.contextId, + sharedContent.containerMode, + ); await ref .read(tabRepositoryProvider.notifier) .addTab( url: sharedContent.url, - tabMode: - settings.tabIntentOpenSetting == - TabIntentOpenSetting.private - ? TabMode.private - : TabMode.regular, + tabMode: tabMode, launchedFromIntent: true, selectTab: true, containerSelection: containerSelection, @@ -429,11 +436,7 @@ class _BrowserViewState extends ConsumerState .read(tabRepositoryProvider.notifier) .addTab( url: bang?.getTemplateUrl(sharedContent.text), - tabMode: - settings.tabIntentOpenSetting == - TabIntentOpenSetting.private - ? TabMode.private - : TabMode.regular, + tabMode: tabMode, launchedFromIntent: true, selectTab: true, ); diff --git a/apps/weblibre/lib/features/settings/presentation/screens/browsing_settings.dart b/apps/weblibre/lib/features/settings/presentation/screens/browsing_settings.dart index 98b531fb..d744b2f1 100644 --- a/apps/weblibre/lib/features/settings/presentation/screens/browsing_settings.dart +++ b/apps/weblibre/lib/features/settings/presentation/screens/browsing_settings.dart @@ -198,7 +198,7 @@ class _SmallWebTabDefaultSection extends HookConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final appColors = AppColors.of(context); final settings = ref.watch(generalSettingsWithDefaultsProvider); - final smallWebTabType = settings.smallWebTabType; + final smallWebTabType = settings.effectiveSmallWebTabType; return Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8), @@ -276,9 +276,8 @@ class _ExternalLinkHandlingSection extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final appColors = AppColors.of(context); - final tabIntentOpenSetting = ref.watch( - generalSettingsWithDefaultsProvider.select((s) => s.tabIntentOpenSetting), - ); + final settings = ref.watch(generalSettingsWithDefaultsProvider); + final tabIntentOpenSetting = settings.tabIntentOpenSetting; return Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8), @@ -316,6 +315,18 @@ class _ExternalLinkHandlingSection extends HookConsumerWidget { : appColors.privateTabPurple, ), ), + if (settings.showIsolatedTabUi) + ButtonSegment( + value: TabIntentOpenSetting.isolated, + label: const Text('Isolated'), + icon: Icon( + MdiIcons.snowflake, + color: + tabIntentOpenSetting == TabIntentOpenSetting.isolated + ? null + : appColors.isolatedTabTeal, + ), + ), ], selected: {tabIntentOpenSetting}, onSelectionChanged: (value) async { @@ -331,6 +342,9 @@ class _ExternalLinkHandlingSection extends HookConsumerWidget { TabIntentOpenSetting.private => SegmentedButton.styleFrom( selectedBackgroundColor: appColors.privateSelectionOverlay, ), + TabIntentOpenSetting.isolated => SegmentedButton.styleFrom( + selectedBackgroundColor: appColors.isolatedSelectionOverlay, + ), TabIntentOpenSetting.ask => null, }, ), @@ -546,6 +560,15 @@ class _ShowIsolatedTabUiTile extends HookConsumerWidget { TabType.regular, ); } + if (!value && + updated.tabIntentOpenSetting == TabIntentOpenSetting.isolated) { + updated = updated.copyWith.tabIntentOpenSetting( + TabIntentOpenSetting.ask, + ); + } + if (!value && updated.smallWebTabType == TabType.isolated) { + updated = updated.copyWith.smallWebTabType(TabType.private); + } return updated; }); }, diff --git a/apps/weblibre/lib/features/small_web/presentation/controllers/small_web_mode_controller.dart b/apps/weblibre/lib/features/small_web/presentation/controllers/small_web_mode_controller.dart index 1f1a758c..a74cab8d 100644 --- a/apps/weblibre/lib/features/small_web/presentation/controllers/small_web_mode_controller.dart +++ b/apps/weblibre/lib/features/small_web/presentation/controllers/small_web_mode_controller.dart @@ -65,7 +65,7 @@ class SmallWebModeController extends _$SmallWebModeController { } final settings = ref.read(generalSettingsWithDefaultsProvider); - final tabMode = TabMode.fromTabType(settings.smallWebTabType); + final tabMode = TabMode.fromTabType(settings.effectiveSmallWebTabType); final newTabId = await ref .read(tabRepositoryProvider.notifier) diff --git a/apps/weblibre/lib/features/small_web/presentation/controllers/small_web_mode_controller.g.dart b/apps/weblibre/lib/features/small_web/presentation/controllers/small_web_mode_controller.g.dart index 7710699e..fae68421 100644 --- a/apps/weblibre/lib/features/small_web/presentation/controllers/small_web_mode_controller.g.dart +++ b/apps/weblibre/lib/features/small_web/presentation/controllers/small_web_mode_controller.g.dart @@ -42,7 +42,7 @@ final class SmallWebModeControllerProvider } String _$smallWebModeControllerHash() => - r'26fb84c9ce60562738f7d9523f74aebfb19ad84b'; + r'a012c3735309e0ace448369e2bf41e2671b7d9b9'; abstract class _$SmallWebModeController extends $Notifier { String? build(); diff --git a/apps/weblibre/lib/features/user/data/models/general_settings.dart b/apps/weblibre/lib/features/user/data/models/general_settings.dart index 418ca28c..dc728cf0 100644 --- a/apps/weblibre/lib/features/user/data/models/general_settings.dart +++ b/apps/weblibre/lib/features/user/data/models/general_settings.dart @@ -44,7 +44,7 @@ enum TabBarSwipeAction { switchLastOpened, navigateOrderedTabs } enum QuickTabSwitcherMode { lastUsedTabs, containerTabs } -enum TabIntentOpenSetting { regular, private, ask } +enum TabIntentOpenSetting { regular, private, isolated, ask } enum TabListDirection { newestFirst, oldestFirst } @@ -328,6 +328,21 @@ class GeneralSettings with FastEquatable { return storedDefaultCreateTabType; } + TabType get effectiveSmallWebTabType { + if (!showIsolatedTabUi && smallWebTabType == TabType.isolated) { + return TabType.private; + } + return smallWebTabType; + } + + TabIntentOpenSetting get effectiveTabIntentOpenSetting { + if (!showIsolatedTabUi && + tabIntentOpenSetting == TabIntentOpenSetting.isolated) { + return TabIntentOpenSetting.ask; + } + return tabIntentOpenSetting; + } + QuickTabSwitcherMode effectiveUiQuickTabSwitcherMode() { if (!showContainerUi && quickTabSwitcherMode == QuickTabSwitcherMode.containerTabs) { diff --git a/apps/weblibre/lib/features/user/data/models/general_settings.g.dart b/apps/weblibre/lib/features/user/data/models/general_settings.g.dart index 7e40f051..b0718ee8 100644 --- a/apps/weblibre/lib/features/user/data/models/general_settings.g.dart +++ b/apps/weblibre/lib/features/user/data/models/general_settings.g.dart @@ -1044,6 +1044,7 @@ const _$TabBarDirectionEnumMap = { const _$TabIntentOpenSettingEnumMap = { TabIntentOpenSetting.regular: 'regular', TabIntentOpenSetting.private: 'private', + TabIntentOpenSetting.isolated: 'isolated', TabIntentOpenSetting.ask: 'ask', };