feat: show back and forward swipes as visible page transitions
This commit is contained in:
parent
65e693b9c6
commit
204aee899a
4 changed files with 387 additions and 11 deletions
|
|
@ -1,3 +1,5 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:actors/actors.dart';
|
||||
import 'package:drift/drift.dart' show Value;
|
||||
import 'package:signals/signals.dart';
|
||||
|
|
@ -45,6 +47,10 @@ class BrowserController {
|
|||
/// Pages opened this session, so links can show the visited color.
|
||||
final visitedUrls = signal(<String>{});
|
||||
|
||||
/// Titles of the stack's neighboring pages, shown while swiping.
|
||||
final backTitle = signal<String?>(null);
|
||||
final forwardTitle = signal<String?>(null);
|
||||
|
||||
bool get canGoBack => _stackIndex > 0;
|
||||
bool get canGoForward => _stackIndex >= 0 && _stack.length - 1 > _stackIndex;
|
||||
|
||||
|
|
@ -63,18 +69,21 @@ class BrowserController {
|
|||
_stack.removeRange(_stackIndex + 1, _stack.length);
|
||||
_stack.add(url);
|
||||
_stackIndex++;
|
||||
_updatePeeks();
|
||||
await _loadCurrent();
|
||||
}
|
||||
|
||||
Future<void> back() async {
|
||||
if (!canGoBack) return;
|
||||
_stackIndex--;
|
||||
_updatePeeks();
|
||||
await _loadCurrent();
|
||||
}
|
||||
|
||||
Future<void> forward() async {
|
||||
if (!canGoForward) return;
|
||||
_stackIndex++;
|
||||
_updatePeeks();
|
||||
await _loadCurrent();
|
||||
}
|
||||
|
||||
|
|
@ -90,6 +99,7 @@ class BrowserController {
|
|||
_stack.removeRange(_stackIndex + 1, _stack.length);
|
||||
_stack.add(page.url);
|
||||
_stackIndex++;
|
||||
_updatePeeks();
|
||||
_show(page);
|
||||
case _:
|
||||
error.value = const LoadFailed();
|
||||
|
|
@ -102,9 +112,23 @@ class BrowserController {
|
|||
if (url == null) return;
|
||||
_stack.add(url);
|
||||
_stackIndex = 0;
|
||||
_updatePeeks();
|
||||
await _loadCurrent();
|
||||
}
|
||||
|
||||
/// Refreshes the neighboring-page titles from the cache; a page without a
|
||||
/// cached title falls back to its URL.
|
||||
void _updatePeeks() {
|
||||
Future<String?> peek(int index) async {
|
||||
if (index < 0 || index >= _stack.length) return null;
|
||||
final url = _stack[index];
|
||||
return (await _db.cachedPage(url))?.title ?? url;
|
||||
}
|
||||
|
||||
unawaited(peek(_stackIndex - 1).then((t) => backTitle.value = t));
|
||||
unawaited(peek(_stackIndex + 1).then((t) => forwardTitle.value = t));
|
||||
}
|
||||
|
||||
Future<void> _loadCurrent() async {
|
||||
if (_stackIndex < 0) return;
|
||||
final url = _stack[_stackIndex];
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue