Skip to content

Commit e7ef8e0

Browse files
committed
added list view; persist tab view ui settings;
1 parent 27e8dfd commit e7ef8e0

35 files changed

+2194
-1227
lines changed

app/lib/features/geckoview/domain/providers/tab_session.g.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/lib/features/geckoview/domain/providers/tab_state.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ Future<bool> isTabTunneled(Ref ref, String? tabId) async {
255255
case TorRegularTabProxyMode.container:
256256
final containerId = await ref
257257
.read(tabDataRepositoryProvider.notifier)
258-
.getContainerTabId(tabState.id);
258+
.getTabContainerId(tabState.id);
259259

260260
final containerData = await containerId.mapNotNull(
261261
(containerId) => ref

app/lib/features/geckoview/domain/providers/tab_state.g.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/lib/features/geckoview/domain/repositories/tab.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ class TabRepository extends _$TabRepository {
188188
Future<bool> selectTab(String tabId) async {
189189
final containerId = await ref
190190
.read(tabDataRepositoryProvider.notifier)
191-
.getContainerTabId(tabId);
191+
.getTabContainerId(tabId);
192192

193193
if (!ref.mounted) return false;
194194

@@ -234,7 +234,7 @@ class TabRepository extends _$TabRepository {
234234

235235
final currentContainerId = await ref
236236
.read(tabDataRepositoryProvider.notifier)
237-
.getContainerTabId(tabId);
237+
.getTabContainerId(tabId);
238238

239239
if (!ref.mounted) return;
240240

@@ -419,7 +419,7 @@ class TabRepository extends _$TabRepository {
419419
} else {
420420
final tabContainerId = await ref
421421
.read(tabDataRepositoryProvider.notifier)
422-
.getContainerTabId(tabState.id);
422+
.getTabContainerId(tabState.id);
423423

424424
if (targetContainerId != tabContainerId) {
425425
if (originUri == null) {

app/lib/features/geckoview/domain/repositories/tab.g.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/lib/features/geckoview/features/browser/domain/providers.dart

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ class SelectedBangData extends _$SelectedBangData {
8383
}
8484

8585
@Riverpod()
86-
EquatableValue<List<String>> availableTabIds(
86+
EquatableValue<List<DefaultTabEntity>> availableTabIds(
8787
Ref ref,
8888
ContainerFilter containerFilter,
8989
) {
@@ -94,10 +94,37 @@ EquatableValue<List<String>> availableTabIds(
9494
);
9595
final tabList = ref.watch(tabListProvider);
9696

97-
return EquatableValue(
98-
containerTabs?.where((tabId) => tabList.value.contains(tabId)).toList() ??
99-
[],
100-
);
97+
final availableTabs =
98+
containerTabs?.where((tabId) => tabList.value.contains(tabId)).toList() ??
99+
[];
100+
101+
switch (containerFilter) {
102+
case ContainerFilterById():
103+
return EquatableValue(
104+
availableTabs
105+
.map(
106+
(t) => DefaultTabEntity(
107+
tabId: t,
108+
containerId: containerFilter.containerId,
109+
),
110+
)
111+
.toList(),
112+
);
113+
case ContainerFilterDisabled():
114+
return ref.watch(
115+
watchTabsContainerIdProvider(EquatableValue(availableTabs)).select(
116+
(value) => EquatableValue(
117+
value.value?.entries
118+
.map(
119+
(e) =>
120+
DefaultTabEntity(tabId: e.key, containerId: e.value),
121+
)
122+
.toList() ??
123+
[],
124+
),
125+
),
126+
);
127+
}
101128
}
102129

103130
@Riverpod()
@@ -109,8 +136,9 @@ EquatableValue<Map<String, TabState>> availableTabStates(
109136
final tabStates = ref.watch(tabStatesProvider);
110137

111138
return EquatableValue({
112-
for (final tabId in availableTabs.value)
113-
if (tabStates.containsKey(tabId)) tabId: tabStates[tabId]!,
139+
for (final tabEntity in availableTabs.value)
140+
if (tabStates.containsKey(tabEntity.tabId))
141+
tabEntity.tabId: tabStates[tabEntity.tabId]!,
114142
});
115143
}
116144

@@ -171,7 +199,12 @@ EquatableValue<List<TabEntity>> suggestedTabEntities(
171199
.whereNot(
172200
(tabId) => excludedTabIds.value?.contains(tabId) ?? false,
173201
)
174-
.map((tabId) => DefaultTabEntity(tabId: tabId))
202+
.map(
203+
(tabId) => DefaultTabEntity(
204+
tabId: tabId,
205+
containerId: containerId,
206+
),
207+
)
175208
.toList(),
176209
) ??
177210
const [],
@@ -198,6 +231,7 @@ EquatableValue<List<TabEntity>> seamlessFilteredTabEntities(
198231
.map(
199232
(tab) => SearchResultTabEntity(
200233
tabId: tab.id,
234+
containerId: tab.containerId,
201235
searchQuery: result.query,
202236
),
203237
)
@@ -208,13 +242,7 @@ EquatableValue<List<TabEntity>> seamlessFilteredTabEntities(
208242
)
209243
.value;
210244

211-
final availableTabs = ref.watch(
212-
availableTabIdsProvider(containerFilter).select(
213-
(value) => EquatableValue(
214-
value.value.map((tab) => DefaultTabEntity(tabId: tab)).toList(),
215-
),
216-
),
217-
);
245+
final availableTabs = ref.watch(availableTabIdsProvider(containerFilter));
218246

219247
if (tabSearchResults == null) {
220248
if (groupTrees) {

app/lib/features/geckoview/features/browser/domain/providers.g.dart

Lines changed: 14 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/lib/features/geckoview/features/browser/presentation/controllers/tab_view_controllers.dart

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,14 @@
1717
* You should have received a copy of the GNU Affero General Public License
1818
* along with this program. If not, see <http://www.gnu.org/licenses/>.
1919
*/
20+
import 'dart:convert';
21+
2022
import 'package:flutter/material.dart';
2123
import 'package:flutter_material_design_icons/flutter_material_design_icons.dart';
24+
import 'package:riverpod/experimental/persist.dart';
25+
import 'package:riverpod_annotation/experimental/persist.dart';
2226
import 'package:riverpod_annotation/riverpod_annotation.dart';
27+
import 'package:weblibre/features/user/data/providers.dart';
2328

2429
part 'tab_view_controllers.g.dart';
2530

@@ -37,11 +42,19 @@ class TabSuggestionsController extends _$TabSuggestionsController {
3742

3843
@override
3944
bool build() {
40-
return false;
45+
persist(
46+
ref.watch(riverpodDatabaseStorageProvider),
47+
key: 'TabSuggestions',
48+
encode: (state) => jsonEncode([state]),
49+
decode: (encoded) => (jsonDecode(encoded) as List<dynamic>).first as bool,
50+
);
51+
52+
return stateOrNull ?? false;
4153
}
4254
}
4355

4456
enum TabsViewMode {
57+
list(MdiIcons.folderTable, 'List'),
4558
grid(MdiIcons.table, 'Grid'),
4659
tree(MdiIcons.familyTree, 'Tree');
4760

@@ -61,7 +74,17 @@ class TabsViewModeController extends _$TabsViewModeController {
6174

6275
@override
6376
TabsViewMode build() {
64-
return TabsViewMode.grid;
77+
persist(
78+
ref.watch(riverpodDatabaseStorageProvider),
79+
key: 'TabsViewMode',
80+
encode: (state) => jsonEncode([state.name]),
81+
decode: (encoded) {
82+
final name = (jsonDecode(encoded) as List<dynamic>).first as String;
83+
return TabsViewMode.values.firstWhere((e) => e.name == name);
84+
},
85+
);
86+
87+
return stateOrNull ?? TabsViewMode.list;
6588
}
6689
}
6790

app/lib/features/geckoview/features/browser/presentation/controllers/tab_view_controllers.g.dart

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/lib/features/geckoview/features/browser/presentation/dialogs/tab_tree.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import 'package:skeletonizer/skeletonizer.dart';
3030
import 'package:weblibre/core/routing/routes.dart';
3131
import 'package:weblibre/features/geckoview/domain/controllers/bottom_sheet.dart';
3232
import 'package:weblibre/features/geckoview/domain/providers/selected_tab.dart';
33-
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/tab_preview.dart';
33+
import 'package:weblibre/features/geckoview/features/browser/presentation/widgets/tab_view/tab_preview.dart';
3434
import 'package:weblibre/features/geckoview/features/tabs/domain/providers.dart';
3535
import 'package:weblibre/features/user/domain/repositories/general_settings.dart';
3636
import 'package:weblibre/utils/ui_helper.dart';
@@ -123,7 +123,7 @@ class TabTreeDialog extends HookConsumerWidget {
123123
final id = node.key!.value as String;
124124
return SizedBox.fromSize(
125125
size: childSize,
126-
child: SingleTabPreview(
126+
child: SingleGridTabPreview(
127127
key: ValueKey(id),
128128
tabId: id,
129129
activeTabId: selectedTabId,

0 commit comments

Comments
 (0)