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

@@ -13,8 +13,10 @@ 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/image_grid/image_grid_view.dart';
import 'package:PiliPlus/common/widgets/pendant_avatar.dart';
import 'package:PiliPlus/common/widgets/scroll_physics.dart'
show ClampingScrollPhysicsExt;
import 'package:PiliPlus/grpc/bilibili/main/community/reply/v1.pb.dart'
show ReplyInfo, ReplyControl, Content, Url, ReplyControl_VoteOption;
show ReplyInfo, ReplyControl, Content, Url, ReplyControl_VoteOption, Emote;
import 'package:PiliPlus/grpc/reply.dart';
import 'package:PiliPlus/http/loading_state.dart';
import 'package:PiliPlus/http/reply.dart';
@@ -34,6 +36,8 @@ import 'package:PiliPlus/utils/danmaku_utils.dart';
import 'package:PiliPlus/utils/date_utils.dart';
import 'package:PiliPlus/utils/duration_utils.dart';
import 'package:PiliPlus/utils/extension/context_ext.dart';
import 'package:PiliPlus/utils/extension/editable_text_ext.dart';
import 'package:PiliPlus/utils/extension/iterable_ext.dart';
import 'package:PiliPlus/utils/extension/num_ext.dart';
import 'package:PiliPlus/utils/extension/theme_ext.dart';
import 'package:PiliPlus/utils/feed_back.dart';
@@ -47,6 +51,7 @@ import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:PiliPlus/utils/url_utils.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:cached_network_image_ce/cached_network_image.dart';
import 'package:collection/collection.dart' show IterableExtension;
import 'package:fixnum/fixnum.dart';
import 'package:flutter/foundation.dart' show kDebugMode;
import 'package:flutter/material.dart';
@@ -54,6 +59,8 @@ import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:protobuf/protobuf.dart';
part 'package:PiliPlus/common/widgets/context_menu/reply_menu_helper.dart';
class ReplyItemGrpc extends StatelessWidget {
const ReplyItemGrpc({
super.key,
@@ -1183,20 +1190,7 @@ class ReplyItemGrpc extends StatelessWidget {
ListTile(
onTap: () {
Get.back();
showDialog(
context: context,
builder: (context) => Dialog(
child: Padding(
padding: const .symmetric(horizontal: 20, vertical: 16),
child: SelectableText(
message,
style: const TextStyle(fontSize: 15, height: 1.7),
contextMenuBuilder: (_, editableTextState) =>
_filterMenuBuilder(context, editableTextState),
),
),
),
);
showReplyCopyDialog(context, message, item.content.emotes);
},
minLeadingWidth: 0,
leading: const Icon(Icons.copy_outlined, size: 19),
@@ -1225,56 +1219,4 @@ class ReplyItemGrpc extends StatelessWidget {
),
);
}
static Widget _filterMenuBuilder(
BuildContext context,
EditableTextState editableTextState,
) {
final items = editableTextState.contextMenuButtonItems;
if (!editableTextState.textEditingValue.selection.isCollapsed) {
items.add(
ContextMenuButtonItem(
onPressed: () {
Navigator.of(context).pop();
final select = editableTextState.textEditingValue;
String text = RegExp.escape(
select.selection.textInside(select.text),
);
if (ReplyGrpc.enableFilter) text = '|$text';
showConfirmDialog(
context: context,
title: const Text('是否确认评论过滤的变更:'),
content: Text.rich(
TextSpan(
text: ReplyGrpc.replyRegExp.pattern,
children: [
TextSpan(
text: text,
style: const TextStyle(
color: Colors.green,
fontWeight: .bold,
),
),
],
),
),
onConfirm: () {
final filter = ReplyGrpc.replyRegExp.pattern + text;
ReplyGrpc.replyRegExp = RegExp(filter, caseSensitive: true);
ReplyGrpc.enableFilter = true;
GStorage.setting.put(SettingBoxKey.banWordForReply, filter);
SmartDialog.showToast('已保存');
},
);
},
label: '加入过滤',
),
);
}
return AdaptiveTextSelectionToolbar.buttonItems(
buttonItems: items,
anchors: editableTextState.contextMenuAnchors,
);
}
}