container filter for tree view

This commit is contained in:
Fabian Freund
2026-01-04 10:26:57 +01:00
parent a99051235b
commit 77657ffd2d
6 changed files with 213 additions and 162 deletions
@@ -253,11 +253,20 @@ EquatableValue<List<TabEntity>> seamlessFilteredTabEntities(
(value) => EquatableValue(
value.value
?.map(
(tree) => TabTreeEntity(
tabId: tree.latestTabId,
rootId: tree.rootTabId,
totalTabs: tree.totalTabs,
),
(tree) {
// Find the container ID for the latest tab
final containerForTab = availableTabs.value
.where((t) => t.tabId == tree.latestTabId)
.firstOrNull
?.containerId;
return TabTreeEntity(
tabId: tree.latestTabId,
containerId: containerForTab,
rootId: tree.rootTabId,
totalTabs: tree.totalTabs,
);
},
)
.toList() ??
[],
@@ -600,7 +600,7 @@ final class SeamlessFilteredTabEntitiesProvider
}
String _$seamlessFilteredTabEntitiesHash() =>
r'f2bf14737bc03f71fc61252359979b4e901e5df7';
r'590288855aa93162a8f70d37f2b3cd94eabc85e5';
final class SeamlessFilteredTabEntitiesFamily extends $Family
with
@@ -15,6 +15,7 @@ import 'package:weblibre/features/geckoview/features/browser/presentation/widget
import 'package:weblibre/features/geckoview/features/browser/utils/grid_calculations.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/entities/container_filter.dart';
import 'package:weblibre/features/geckoview/features/tabs/data/entities/tab_entity.dart';
import 'package:weblibre/features/geckoview/features/tabs/domain/providers/selected_container.dart';
import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/tab.dart';
import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/tab_search.dart';
import 'package:weblibre/features/user/domain/repositories/general_settings.dart';
@@ -176,12 +177,14 @@ class ViewTabTreesWidget extends HookConsumerWidget {
builder: (context, ref, child) {
final screenWidth = MediaQuery.of(context).size.width;
final containerId = ref.watch(selectedContainerProvider);
final filteredTabEntities = ref.watch(
seamlessFilteredTabEntitiesProvider(
searchPartition: TabSearchPartition.preview,
// ignore: document_ignores using fast equatable
// ignore: provider_parameters
containerFilter: ContainerFilterDisabled(),
containerFilter: ContainerFilterById(containerId: containerId),
groupTrees: true,
),
);
@@ -529,52 +529,55 @@ class TabViewHeader extends HookConsumerWidget {
),
),
),
if (switch (tabsViewMode) {
TabsViewMode.list || TabsViewMode.grid => true,
TabsViewMode.tree => false,
})
Consumer(
builder: (context, ref, child) {
final selectedContainer = ref.watch(
selectedContainerDataProvider.select(
(value) => value.value,
),
);
Consumer(
builder: (context, ref, child) {
final selectedContainer = ref.watch(
selectedContainerDataProvider.select(
(value) => value.value,
),
);
return ContainerChips(
showGroupSuggestions: true,
selectedContainer: selectedContainer,
onSelected: (container) async {
if (container != null) {
final result = await ref
.read(selectedContainerProvider.notifier)
.setContainerId(container.id);
return ContainerChips(
showGroupSuggestions: switch (tabsViewMode) {
TabsViewMode.list || TabsViewMode.grid => true,
TabsViewMode.tree => false,
},
enableDragAndDrop: switch (tabsViewMode) {
TabsViewMode.list || TabsViewMode.grid => true,
TabsViewMode.tree => false,
},
selectedContainer: selectedContainer,
onSelected: (container) async {
if (container != null) {
final result = await ref
.read(selectedContainerProvider.notifier)
.setContainerId(container.id);
if (context.mounted &&
result == SetContainerResult.successHasProxy) {
await ref
.read(startProxyControllerProvider.notifier)
.maybeStartProxy(context);
}
} else {
ref
.read(selectedContainerProvider.notifier)
.clearContainer();
if (context.mounted &&
result == SetContainerResult.successHasProxy) {
await ref
.read(startProxyControllerProvider.notifier)
.maybeStartProxy(context);
}
},
onDeleted: (container) {
} else {
ref
.read(selectedContainerProvider.notifier)
.clearContainer();
},
onLongPress: (container) async {
await ContainerEditRoute(
containerData: jsonEncode(container.toJson()),
).push(context);
},
);
},
),
}
},
onDeleted: (container) {
ref
.read(selectedContainerProvider.notifier)
.clearContainer();
},
onLongPress: (container) async {
await ContainerEditRoute(
containerData: jsonEncode(container.toJson()),
).push(context);
},
);
},
),
const SizedBox(height: 8),
],
),