diff --git a/locales/index.d.ts b/locales/index.d.ts index 07d0694f84..010cb18edc 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -12026,7 +12026,7 @@ export interface Locale extends ILocale { */ "opacity": string; /** - * 大きさ + * サイズ */ "scale": string; /** diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index d0c4d47ed0..b6e8402f8f 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -3221,7 +3221,7 @@ _watermarkEditor: title: "ウォーターマークの編集" repeat: "敷き詰める" opacity: "不透明度" - scale: "大きさ" + scale: "サイズ" text: "テキスト" position: "位置" type: "タイプ" diff --git a/packages/frontend/src/components/MkWatermarkEditorDialog.vue b/packages/frontend/src/components/MkWatermarkEditorDialog.vue index b1ff93d24c..a13d7e0d8f 100644 --- a/packages/frontend/src/components/MkWatermarkEditorDialog.vue +++ b/packages/frontend/src/components/MkWatermarkEditorDialog.vue @@ -56,6 +56,9 @@ import { selectFile } from '@/utility/drive.js'; import { misskeyApi } from '@/utility/misskey-api.js'; import { prefer } from '@/preferences.js'; import { deepClone } from '@/utility/clone.js'; +import { ensureSignin } from '@/i.js'; + +const $i = ensureSignin(); const props = defineProps<{ preset: WatermarkPreset | null; @@ -67,17 +70,17 @@ const preset = reactive(deepClone(props.preset) ?? { layers: [{ id: uuid(), type: 'text', - text: 'sample', + text: `(c) @${$i.username}`, alignX: 'right', alignY: 'bottom', - scale: 0.5, - opacity: 0.5, + scale: 0.3, + opacity: 0.75, repeat: false, }], } satisfies WatermarkPreset); const emit = defineEmits<{ - (ev: 'ok'): void; + (ev: 'ok', preset: WatermarkPreset): void; (ev: 'cancel'): void; (ev: 'closed'): void; }>(); @@ -126,6 +129,24 @@ onUnmounted(() => { renderer = null; } }); + +async function save() { + const { canceled, result: name } = await os.inputText({ + title: i18n.ts.name, + default: preset.name, + }); + if (canceled) return; + + preset.name = name || ''; + + dialog.value?.close(); + if (renderer != null) { + renderer.destroy(); + renderer = null; + } + + emit('ok', preset); +} diff --git a/packages/frontend/src/pages/settings/drive.vue b/packages/frontend/src/pages/settings/drive.vue index b5e45ce579..b66865a408 100644 --- a/packages/frontend/src/pages/settings/drive.vue +++ b/packages/frontend/src/pages/settings/drive.vue @@ -58,7 +58,17 @@ SPDX-License-Identifier: AGPL-3.0-only - +
+ + + +
@@ -93,6 +103,8 @@ SPDX-License-Identifier: AGPL-3.0-only import { computed, defineAsyncComponent, ref } from 'vue'; import * as Misskey from 'misskey-js'; import tinycolor from 'tinycolor2'; +import XWatermarkItem from './drive.WatermarkItem.vue'; +import type { WatermarkPreset } from '@/utility/watermarker.js'; import FormLink from '@/components/form/link.vue'; import MkSwitch from '@/components/MkSwitch.vue'; import FormSection from '@/components/form/section.vue'; @@ -166,10 +178,34 @@ function chooseUploadFolder() { function addWatermarkPreset() { const { dispose } = os.popup(defineAsyncComponent(() => import('@/components/MkWatermarkEditorDialog.vue')), { }, { + ok: (preset: WatermarkPreset) => { + prefer.commit('watermarkPresets', [...prefer.s.watermarkPresets, preset]); + }, closed: () => dispose(), }); } +function onUpdateWatermarkPreset(id: string, preset: WatermarkPreset) { + const index = prefer.s.watermarkPresets.findIndex(p => p.id === id); + if (index !== -1) { + prefer.commit('watermarkPresets', [ + ...prefer.s.watermarkPresets.slice(0, index), + preset, + ...prefer.s.watermarkPresets.slice(index + 1), + ]); + } +} + +function onDeleteWatermarkPreset(id: string) { + const index = prefer.s.watermarkPresets.findIndex(p => p.id === id); + if (index !== -1) { + prefer.commit('watermarkPresets', [ + ...prefer.s.watermarkPresets.slice(0, index), + ...prefer.s.watermarkPresets.slice(index + 1), + ]); + } +} + function saveProfile() { misskeyApi('i/update', { alwaysMarkNsfw: !!alwaysMarkNsfw.value,