opt dyn/reply text menu

Signed-off-by: dom <githubaccount56556@proton.me>
This commit is contained in:
dom
2026-07-16 20:25:21 +08:00
parent f7cd1aa502
commit 177493fe38
31 changed files with 550 additions and 268 deletions

View File

@@ -1,6 +1,8 @@
import 'package:PiliPlus/common/style.dart';
import 'package:PiliPlus/common/widgets/gesture/tap_gesture_recognizer.dart';
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart'
show NeverSelectableScrollPhysics;
import 'package:PiliPlus/http/dynamics.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/models/dynamics/result.dart';
@@ -698,6 +700,7 @@ additional panel error
id: $idStr
type: $type
err: $e''',
scrollPhysics: const NeverSelectableScrollPhysics(),
),
);
}

View File

@@ -1,13 +1,21 @@
// 内容
import 'package:PiliPlus/common/widgets/custom_icon.dart';
import 'package:PiliPlus/common/widgets/flutter/text/text.dart' as custom_text;
import 'package:PiliPlus/common/widgets/image/network_img_layer.dart';
import 'package:PiliPlus/common/widgets/image_grid/image_grid_view.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart'
show ClampingScrollPhysicsExt, NeverSelectableScrollPhysics;
import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/pages/dynamics/widgets/rich_node_panel.dart';
import 'package:PiliPlus/utils/extension/editable_text_ext.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/page_utils.dart';
import 'package:collection/collection.dart' show IterableExtension;
import 'package:flutter/material.dart';
import 'package:get/get.dart';
part 'package:PiliPlus/common/widgets/context_menu/dyn_menu_helper.dart';
Widget content(
BuildContext context, {
required int floor,
@@ -77,7 +85,12 @@ Widget content(
: const TextStyle(fontSize: 16),
contextMenuBuilder: text == null || text.isEmpty
? null
: (_, state) => _contextMenuBuilder(state, text),
: (_, state) => dynTextMenuBuilder(
state,
text,
item.modules.moduleDynamic,
),
scrollPhysics: const NeverSelectableScrollPhysics(),
)
: custom_text.Text.rich(
style: floor == 1
@@ -106,28 +119,3 @@ Widget content(
),
);
}
Widget _contextMenuBuilder(EditableTextState state, String text) {
return AdaptiveTextSelectionToolbar.buttonItems(
buttonItems: state.contextMenuButtonItems
..add(
ContextMenuButtonItem(label: '文本', onPressed: () => _onCopyText(text)),
),
anchors: state.contextMenuAnchors,
);
}
void _onCopyText(String text) {
showDialog(
context: Get.context!,
builder: (context) => Dialog(
child: Padding(
padding: const .symmetric(horizontal: 20, vertical: 16),
child: SelectableText(
text,
style: const TextStyle(fontSize: 15, height: 1.7),
),
),
),
);
}

View File

@@ -27,7 +27,7 @@ TextSpan? richNode(
}) {
try {
late final style = TextStyle(color: theme.colorScheme.primary);
List<InlineSpan> spanChildren = [];
final List<InlineSpan> spanChildren = [];
final moduleDynamic = item.modules.moduleDynamic;
List<RichTextNodeItem>? richTextNodes;