From 417dcb08e433359ab93a84f7f2deb898372dda34 Mon Sep 17 00:00:00 2001 From: iven Date: Mon, 1 Jun 2026 21:22:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(app):=20=E6=B7=BB=E5=8A=A0=20JournalElemen?= =?UTF-8?q?t=20=E7=B1=BB=E5=9E=8B=E4=BE=BF=E5=88=A9=E5=B7=A5=E5=8E=82?= =?UTF-8?q?=E6=96=B9=E6=B3=95=20=E2=80=94=20text/image/sticker?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/lib/data/models/journal_element.dart | 62 ++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/app/lib/data/models/journal_element.dart b/app/lib/data/models/journal_element.dart index fc2cfaf..401bc6a 100644 --- a/app/lib/data/models/journal_element.dart +++ b/app/lib/data/models/journal_element.dart @@ -1,6 +1,7 @@ // 日记元素数据模型 — 手写不可变类(避免 build_runner 依赖) import 'dart:collection'; +import 'dart:ui'; import 'package:uuid/uuid.dart'; @@ -153,4 +154,65 @@ class JournalElement { updatedAt: now, ); } + + /// 文字元素便利工厂 + factory JournalElement.createText({ + required String journalId, + required String text, + required Offset position, + double fontSize = 18.0, + String fontColor = '#2D2420', + }) { + return JournalElement.create( + journalId: journalId, + elementType: ElementType.text, + positionX: position.dx, + positionY: position.dy, + content: { + 'text': text, + 'fontSize': fontSize, + 'fontColor': fontColor, + }, + ); + } + + /// 图片元素便利工厂 + factory JournalElement.createImage({ + required String journalId, + required String filePath, + required Offset position, + String? thumbnailPath, + }) { + return JournalElement.create( + journalId: journalId, + elementType: ElementType.image, + positionX: position.dx, + positionY: position.dy, + content: { + 'filePath': filePath, + if (thumbnailPath != null) 'thumbnailPath': thumbnailPath, + }, + ); + } + + /// 贴纸元素便利工厂 + factory JournalElement.createSticker({ + required String journalId, + required String emoji, + required Offset position, + String? stickerPackId, + String? stickerId, + }) { + return JournalElement.create( + journalId: journalId, + elementType: ElementType.sticker, + positionX: position.dx, + positionY: position.dy, + content: { + 'emoji': emoji, + if (stickerPackId != null) 'stickerPackId': stickerPackId, + if (stickerId != null) 'stickerId': stickerId, + }, + ); + } }