From c9b5e66cdb10e040ba9d09e289f596422071e564 Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Tue, 16 Dec 2025 16:50:20 +0900
Subject: [PATCH] wip
---
.../components/MkImageFrameEditorDialog.vue | 26 +++++++++++++++++++
.../ImageFrameRenderer.ts | 13 ++++++++++
.../utility/image-frame-renderer/frame.glsl | 4 +++
.../src/utility/image-frame-renderer/frame.ts | 18 ++++++++++---
4 files changed, 57 insertions(+), 4 deletions(-)
diff --git a/packages/frontend/src/components/MkImageFrameEditorDialog.vue b/packages/frontend/src/components/MkImageFrameEditorDialog.vue
index 2a91c85952..fcdf80ce5d 100644
--- a/packages/frontend/src/components/MkImageFrameEditorDialog.vue
+++ b/packages/frontend/src/components/MkImageFrameEditorDialog.vue
@@ -31,6 +31,8 @@ SPDX-License-Identifier: AGPL-3.0-only
+ {{ i18n.ts.selectFile }}
+
{{ i18n.ts._imageFrameEditor.borderThickness }}
@@ -175,6 +177,7 @@ import { ensureSignin } from '@/i.js';
import { genId } from '@/utility/id.js';
import { useMkSelect } from '@/composables/use-mkselect.js';
import { prefer } from '@/preferences.js';
+import { selectFile } from '@/utility/drive.js';
const $i = ensureSignin();
@@ -216,6 +219,7 @@ const params = reactive(deepClone(props.params) ?? {
bgColor: [1, 1, 1],
fgColor: [0, 0, 0],
font: 'sans-serif',
+ imageUrl: null,
});
const emit = defineEmits<{
@@ -409,6 +413,28 @@ function getRgb(hex: string | number): [number, number, number] | null {
if (m == null) return [0, 0, 0];
return m.map(x => parseInt(x, 16) / 255) as [number, number, number];
}
+
+function chooseFile(ev: MouseEvent) {
+ selectFile({
+ anchorElement: ev.currentTarget ?? ev.target,
+ multiple: false,
+ label: i18n.ts.selectFile,
+ features: {
+ watermark: false,
+ },
+ }).then((file) => {
+ if (!file.type.startsWith('image')) {
+ os.alert({
+ type: 'warning',
+ title: i18n.ts._watermarkEditor.driveFileTypeWarn,
+ text: i18n.ts._watermarkEditor.driveFileTypeWarnDescription,
+ });
+ return;
+ }
+
+ params.imageUrl = file.url;
+ });
+}