Files
PiliPlus/lib/pages/dynamics/widgets/content_panel.dart
2026-03-06 12:05:54 +08:00

139 lines
4.3 KiB
Dart

// 内容
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_grid/image_grid_view.dart';
import 'package:PiliPlus/models/dynamics/result.dart';
import 'package:PiliPlus/pages/dynamics/widgets/rich_node_panel.dart';
import 'package:PiliPlus/utils/page_utils.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
Widget content(
BuildContext context, {
required int floor,
required ThemeData theme,
required DynamicItemModel item,
required bool isSave,
required bool isDetail,
required double maxWidth,
}) {
if (floor == 1) {
maxWidth -= 24;
}
TextSpan? richNodes = richNode(
context,
theme: theme,
item: item,
maxWidth: maxWidth,
);
final moduleDynamic = item.modules.moduleDynamic;
final pics = moduleDynamic?.major?.opus?.pics;
final text =
moduleDynamic?.desc?.text ?? moduleDynamic?.major?.opus?.summary?.text;
return Padding(
padding: floor == 1
? const EdgeInsets.fromLTRB(12, 0, 12, 6)
: const EdgeInsets.only(bottom: 6),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (moduleDynamic?.topic case final topic?)
GestureDetector(
onTap: () => Get.toNamed(
'/dynTopic',
parameters: {
'id': topic.id!.toString(),
'name': topic.name!,
},
),
child: Text.rich(
TextSpan(
children: [
WidgetSpan(
alignment: PlaceholderAlignment.middle,
child: Padding(
padding: const EdgeInsets.only(right: 4),
child: Icon(
size: 18,
CustomIcons.topic_tag,
color: theme.colorScheme.primary,
),
),
),
TextSpan(text: topic.name),
],
),
style: TextStyle(
fontSize: floor != 1
? 14
: isDetail && !isSave
? 16
: 15,
color: theme.colorScheme.primary,
),
),
),
if (richNodes != null)
isDetail && floor == 1
? SelectableText.rich(
richNodes,
style: isSave
? const TextStyle(fontSize: 15)
: const TextStyle(fontSize: 16),
contextMenuBuilder: text == null || text.isEmpty
? null
: (_, state) => _contextMenuBuilder(state, text),
)
: custom_text.Text.rich(
style: floor == 1
? const TextStyle(fontSize: 15)
: const TextStyle(fontSize: 14),
richNodes,
maxLines: isSave ? null : 6,
onShowMore: () => PageUtils.pushDynDetail(item, isPush: true),
primary: theme.colorScheme.primary,
),
if (pics != null && pics.isNotEmpty)
ImageGridView(
picArr: pics
.map(
(item) => ImageModel(
width: item.width,
height: item.height,
url: item.url ?? '',
liveUrl: item.liveUrl,
),
)
.toList(),
fullScreen: true,
),
],
),
);
}
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),
),
),
),
);
}