opt context menu

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-07-21 20:44:14 +08:00
parent 8f48ddb42a
commit 0164e32b70
6 changed files with 140 additions and 81 deletions

View File

@@ -1,32 +1,52 @@
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/page_utils.dart';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart' show Selectable;
extension SelectableRegionStateExt on SelectableRegionState {
void addLaunchMenuIfNeeded(
List<ContextMenuButtonItem> buttonItems, {
required int index,
}) {
try {
if (selectionEndpoints.first != selectionEndpoints[1]) {
buttonItems.insertOrAdd(
index,
ContextMenuButtonItem(
label: '打开',
onPressed: () {
final text = (this as dynamic).selectable
?.getSelectedContent()
?.plainText
.trim();
hideToolbar();
clearSelection();
if (text != null && text.isNotEmpty) {
PageUtils.launchURL(text);
}
},
),
);
}
} catch (_) {}
if (isUncollapsed) {
buttonItems.insertOrAdd(
index,
ContextMenuButtonItem(
label: '打开',
onPressed: () {
onMenuPressed(
PageUtils.launchURL,
content: () => selectedText?.trim(),
);
},
),
);
}
}
String? get selectedText => ((this as dynamic).selectable as Selectable?)
?.getSelectedContent()
?.plainText;
bool get isUncollapsed =>
((this as dynamic).selectionDelegate as StaticSelectionContainerDelegate)
.value
.status ==
.uncollapsed;
void onMenuPressed(
ValueChanged<String> callback, {
ValueGetter<String?>? content,
}) {
final text = content?.call() ?? selectedText;
hideAndClear();
if (text != null && text.isNotEmpty) {
callback(text);
}
}
void hideAndClear() {
hideToolbar();
clearSelection();
}
}