From 63b11f5e1819d9ceb084281bab0f0802d4c546ef Mon Sep 17 00:00:00 2001
From: syuilo <4439005+syuilo@users.noreply.github.com>
Date: Fri, 31 Oct 2025 13:21:48 +0900
Subject: [PATCH] wip
---
.../components/MkImageFrameEditorDialog.vue | 2 +-
.../frontend/src/composables/use-uploader.ts | 54 ++++++++++++++++++-
.../frontend/src/pages/settings/drive.vue | 2 +-
3 files changed, 55 insertions(+), 3 deletions(-)
diff --git a/packages/frontend/src/components/MkImageFrameEditorDialog.vue b/packages/frontend/src/components/MkImageFrameEditorDialog.vue
index 0e8fc011dc..85f53f43e5 100644
--- a/packages/frontend/src/components/MkImageFrameEditorDialog.vue
+++ b/packages/frontend/src/components/MkImageFrameEditorDialog.vue
@@ -14,7 +14,7 @@ SPDX-License-Identifier: AGPL-3.0-only
@ok="save()"
@closed="emit('closed')"
>
- {{ i18n.ts._imageFrameEditor.title }}
+ {{ i18n.ts._imageFrameEditor.title }}
diff --git a/packages/frontend/src/composables/use-uploader.ts b/packages/frontend/src/composables/use-uploader.ts
index 1b14c8cc82..c5881adc72 100644
--- a/packages/frontend/src/composables/use-uploader.ts
+++ b/packages/frontend/src/composables/use-uploader.ts
@@ -85,7 +85,7 @@ export type UploaderItem = {
compressedSize?: number | null;
preprocessedFile?: Blob | null;
file: File;
- watermarkPresetId: string | null;
+ watermarkPresetId: string | null; // そのままpresetを入れてもいいのでは?
isSensitive?: boolean;
caption?: string | null;
abort?: (() => void) | null;
@@ -332,6 +332,58 @@ export function useUploader(options: {
});
}
+ if (
+ uploaderFeatures.value.imageEditing &&
+ IMAGE_EDITING_SUPPORTED_TYPES.includes(item.file.type) &&
+ !item.preprocessing &&
+ !item.uploading &&
+ !item.uploaded
+ ) {
+ function changePreset(presetId: string | null) {
+ item.imageFramePresetId = presetId;
+ preprocess(item).then(() => {
+ triggerRef(items);
+ });
+ }
+
+ menu.push({
+ icon: 'ti ti-device-ipad-horizontal',
+ text: i18n.ts.frame,
+ //caption: computed(() => item.watermarkPresetId == null ? null : prefer.s.watermarkPresets.find(p => p.id === item.watermarkPresetId)?.name),
+ type: 'parent',
+ children: [{
+ type: 'radioOption',
+ text: i18n.ts.none,
+ active: computed(() => item.watermarkPresetId == null),
+ action: () => changePreset(null),
+ }, {
+ type: 'divider',
+ }, ...prefer.s.watermarkPresets.map(preset => ({
+ type: 'radioOption' as const,
+ text: preset.name,
+ active: computed(() => item.watermarkPresetId === preset.id),
+ action: () => changePreset(preset.id),
+ })), ...(prefer.s.watermarkPresets.length > 0 ? [{
+ type: 'divider' as const,
+ }] : []), {
+ type: 'button',
+ icon: 'ti ti-plus',
+ text: i18n.ts.add,
+ action: async () => {
+ const { dispose } = await os.popupAsyncWithDialog(import('@/components/MkImageFrameEditorDialog.vue').then(x => x.default), {
+ image: item.file,
+ }, {
+ ok: (preset) => {
+ prefer.commit('imageFramePresets', [...prefer.s.imageFramePresets, preset]);
+ changePreset(preset.id);
+ },
+ closed: () => dispose(),
+ });
+ },
+ }],
+ });
+ }
+
if (
(IMAGE_COMPRESSION_SUPPORTED_TYPES.includes(item.file.type) || VIDEO_COMPRESSION_SUPPORTED_TYPES.includes(item.file.type)) &&
!item.preprocessing &&
diff --git a/packages/frontend/src/pages/settings/drive.vue b/packages/frontend/src/pages/settings/drive.vue
index d3e5558d07..41953052a6 100644
--- a/packages/frontend/src/pages/settings/drive.vue
+++ b/packages/frontend/src/pages/settings/drive.vue
@@ -126,7 +126,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-
+
{{ i18n.ts.frame }}
{{ i18n.ts._imageFrameEditor.tip }}