From 2cc9324f08bcdb85f0d9f822e97064f5fe2321c5 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Wed, 16 Apr 2025 07:33:10 +0800 Subject: [PATCH] mod: show `RICH_TEXT_NODE_TYPE_VIEW_PICTURE` Closes #691 Signed-off-by: bggRGjQaUbCoE --- lib/http/msg.dart | 7 ++-- lib/models/dynamics/result.dart | 6 ++++ lib/pages/dynamics/widgets/content_panel.dart | 32 +++++++++---------- .../dynamics/widgets/rich_node_panel.dart | 32 ++++++++++++++++++- 4 files changed, 54 insertions(+), 23 deletions(-) diff --git a/lib/http/msg.dart b/lib/http/msg.dart index ce5df05c..01d47a84 100644 --- a/lib/http/msg.dart +++ b/lib/http/msg.dart @@ -145,8 +145,9 @@ class MsgHttp { } ] }, - if (replyOption != null || publishTime != null) + if (privatePub != null || replyOption != null || publishTime != null) "option": { + if (privatePub != null) 'private_pub': privatePub, if (publishTime != null) "timer_pub_time": publishTime, if (replyOption == ReplyOption.close) "close_comment": 1 @@ -160,10 +161,6 @@ class MsgHttp { : pics != null ? 2 : 1, - if (privatePub != null) - 'create_option': { - 'private_pub': privatePub, - }, if (pics != null) 'pics': pics, "attach_card": null, "upload_id": diff --git a/lib/models/dynamics/result.dart b/lib/models/dynamics/result.dart index 20ed82e6..038f5dc3 100644 --- a/lib/models/dynamics/result.dart +++ b/lib/models/dynamics/result.dart @@ -598,6 +598,7 @@ class RichTextNodeItem { String? text; String? type; String? rid; + List? pics; RichTextNodeItem.fromJson(Map json) { emoji = json['emoji'] != null ? Emoji.fromJson(json['emoji']) : null; @@ -605,6 +606,11 @@ class RichTextNodeItem { text = json['text']; type = json['type']; rid = json['rid']; + pics = json['pics'] == null + ? null + : (json['pics'] as List?) + ?.map((e) => OpusPicsModel.fromJson(e)) + .toList(); } } diff --git a/lib/pages/dynamics/widgets/content_panel.dart b/lib/pages/dynamics/widgets/content_panel.dart index f47e8762..ef123e4d 100644 --- a/lib/pages/dynamics/widgets/content_panel.dart +++ b/lib/pages/dynamics/widgets/content_panel.dart @@ -45,24 +45,22 @@ Widget content(bool isSave, BuildContext context, item, source, callback) { ), ], if (richNodes != null) - IgnorePointer( - // 禁用SelectableRegion的触摸交互功能 - ignoring: source == 'detail' ? false : true, - child: SelectableRegion( - magnifierConfiguration: const TextMagnifierConfiguration(), - focusNode: FocusNode(), - selectionControls: MaterialTextSelectionControls(), - child: Text.rich( - /// fix 默认20px高度 - style: TextStyle( - fontSize: source == 'detail' && !isSave ? 16 : 15, + source == 'detail' + ? SelectableRegion( + magnifierConfiguration: const TextMagnifierConfiguration(), + focusNode: FocusNode(), + selectionControls: MaterialTextSelectionControls(), + child: Text.rich( + style: TextStyle(fontSize: !isSave ? 16 : 15), + richNodes, + ), + ) + : Text.rich( + style: const TextStyle(fontSize: 15), + richNodes, + maxLines: 6, + overflow: TextOverflow.ellipsis, ), - richNodes, - maxLines: source == 'detail' ? null : 6, - overflow: source == 'detail' ? null : TextOverflow.ellipsis, - ), - ), - ), if (item.modules.moduleDynamic.major != null && item.modules.moduleDynamic.major.opus != null && item.modules.moduleDynamic.major.opus.pics.isNotEmpty) diff --git a/lib/pages/dynamics/widgets/rich_node_panel.dart b/lib/pages/dynamics/widgets/rich_node_panel.dart index 7bbe6579..fbd956d5 100644 --- a/lib/pages/dynamics/widgets/rich_node_panel.dart +++ b/lib/pages/dynamics/widgets/rich_node_panel.dart @@ -1,3 +1,4 @@ +import 'package:PiliPlus/common/widgets/image_view.dart'; import 'package:PiliPlus/models/dynamics/result.dart'; import 'package:PiliPlus/utils/utils.dart'; import 'package:flutter/material.dart'; @@ -8,7 +9,7 @@ import 'package:PiliPlus/http/search.dart'; import 'package:PiliPlus/utils/app_scheme.dart'; // 富文本 -InlineSpan? richNode(item, context) { +InlineSpan? richNode(item, BuildContext context) { final spacer = _VerticalSpaceSpan(0.0); try { TextStyle authorStyle = @@ -256,8 +257,37 @@ InlineSpan? richNode(item, context) { ), ), ); + } else if (i.type == 'RICH_TEXT_NODE_TYPE_VIEW_PICTURE') { + if (i.pics?.isNotEmpty == true) { + spanChildren.add( + WidgetSpan( + child: LayoutBuilder( + builder: (context, constraints) { + return imageView( + constraints.maxWidth, + i.pics! + .map((item) => ImageModel( + url: item.src ?? '', + width: item.width, + height: item.height, + )) + .toList(), + ); + }, + ), + ), + ); + } else { + spanChildren.add( + TextSpan( + text: '${i.text}', + style: authorStyle, + ), + ); + } } } + // if (contentType == 'major' && // item.modules.moduleDynamic.major.opus.pics.isNotEmpty) { // // 图片可能跟其他widget重复渲染