diff --git a/locales/index.d.ts b/locales/index.d.ts index 010cb18edc..456785e280 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -5473,6 +5473,10 @@ export interface Locale extends ILocale { * 全ての「ヒントとコツ」を非表示 */ "hideAllTips": string; + /** + * デフォルトの画像圧縮度 + */ + "defaultImageCompressionLevel": string; "_chat": { /** * まだメッセージはありません @@ -12008,6 +12012,10 @@ export interface Locale extends ILocale { * ウォーターマーク */ "watermark": string; + /** + * デフォルトのプリセット + */ + "defaultPreset": string; "_watermarkEditor": { /** * 画像にクレジット情報などのウォーターマークを追加することができます。 diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index b6e8402f8f..654921a518 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1363,6 +1363,7 @@ abort: "中止" tip: "ヒントとコツ" redisplayAllTips: "全ての「ヒントとコツ」を再表示" hideAllTips: "全ての「ヒントとコツ」を非表示" +defaultImageCompressionLevel: "デフォルトの画像圧縮度" _chat: noMessagesYet: "まだメッセージはありません" @@ -3216,6 +3217,7 @@ _userLists: tip: "任意のユーザーが含まれるリストを作成できます。作成したリストはタイムラインとして表示可能です。" watermark: "ウォーターマーク" +defaultPreset: "デフォルトのプリセット" _watermarkEditor: tip: "画像にクレジット情報などのウォーターマークを追加することができます。" title: "ウォーターマークの編集" diff --git a/packages/frontend/src/components/MkUploaderDialog.vue b/packages/frontend/src/components/MkUploaderDialog.vue index 4b980ef19b..b43970bb70 100644 --- a/packages/frontend/src/components/MkUploaderDialog.vue +++ b/packages/frontend/src/components/MkUploaderDialog.vue @@ -40,8 +40,8 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ ctx.name }}
{{ ctx.file.type }} - {{ bytes(ctx.file.size) }} ({{ i18n.tsx._uploader.compressedToX({ x: bytes(ctx.compressedSize) }) }} = {{ i18n.tsx._uploader.savedXPercent({ x: Math.round((1 - ctx.compressedSize / ctx.file.size) * 100) }) }}) + {{ bytes(ctx.file.size) }}
@@ -557,8 +557,8 @@ function initializeFile(file: File) { aborted: false, uploaded: null, uploadFailed: false, - compressionLevel: 2 as 0 | 1 | 2 | 3, - watermarkPresetId: null, + compressionLevel: prefer.s.defaultImageCompressionLevel, + watermarkPresetId: prefer.s.defaultWatermarkPresetId, file: markRaw(file), }; items.value.push(item); diff --git a/packages/frontend/src/components/MkWatermarkEditorDialog.vue b/packages/frontend/src/components/MkWatermarkEditorDialog.vue index 61f3181156..c9e9003d66 100644 --- a/packages/frontend/src/components/MkWatermarkEditorDialog.vue +++ b/packages/frontend/src/components/MkWatermarkEditorDialog.vue @@ -52,20 +52,15 @@ import MkModalWindow from '@/components/MkModalWindow.vue'; import MkSelect from '@/components/MkSelect.vue'; import MkButton from '@/components/MkButton.vue'; import MkInput from '@/components/MkInput.vue'; -import MkSwitch from '@/components/MkSwitch.vue'; -import FormSlot from '@/components/form/slot.vue'; import XLayer from '@/components/MkWatermarkEditorDialog.Layer.vue'; import * as os from '@/os.js'; -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; + preset?: WatermarkPreset | null; }>(); const preset = reactive(deepClone(props.preset) ?? { diff --git a/packages/frontend/src/pages/settings/drive.vue b/packages/frontend/src/pages/settings/drive.vue index b66865a408..cd2361c9bf 100644 --- a/packages/frontend/src/pages/settings/drive.vue +++ b/packages/frontend/src/pages/settings/drive.vue @@ -39,62 +39,107 @@ SPDX-License-Identifier: AGPL-3.0-only - -
- - - {{ i18n.ts.uploadFolder }} - - + + + + +
+ + + {{ i18n.ts.uploadFolder }} + + + + + + + {{ i18n.ts.drivecleaner }} - - - {{ i18n.ts.drivecleaner }} - + + + + + + + + - - - - - -
- - - -
-
-
- - - - - - + + + - - + - - - - - + + + + + + +
+
+
- - - - - - -
-
+ + + + +
+ + + + + +
+
+ + + + + + + + + +
+ +
+ + + + + + + + +
+
+
+ + + + + + + + +
+
+
@@ -107,6 +152,7 @@ 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 MkSelect from '@/components/MkSelect.vue'; import FormSection from '@/components/form/section.vue'; import MkKeyValue from '@/components/MkKeyValue.vue'; import FormSplit from '@/components/form/split.vue'; @@ -146,6 +192,22 @@ const meterStyle = computed(() => { }); const keepOriginalFilename = prefer.model('keepOriginalFilename'); +const defaultWatermarkPresetId = prefer.model('defaultWatermarkPresetId'); +const defaultImageCompressionLevel = prefer.model('defaultImageCompressionLevel'); + +const watermarkPresetsSyncEnabled = ref(prefer.isSyncEnabled('watermarkPresets')); + +function changeWatermarkPresetsSyncEnabled(value: boolean) { + if (value) { + prefer.enableSync('watermarkPresets').then((res) => { + if (res == null) return; + if (res.enabled) watermarkPresetsSyncEnabled.value = true; + }); + } else { + prefer.disableSync('watermarkPresets'); + watermarkPresetsSyncEnabled.value = false; + } +} misskeyApi('drive').then(info => { capacity.value = info.capacity; @@ -203,6 +265,10 @@ function onDeleteWatermarkPreset(id: string) { ...prefer.s.watermarkPresets.slice(0, index), ...prefer.s.watermarkPresets.slice(index + 1), ]); + + if (prefer.s.defaultWatermarkPresetId === id) { + prefer.commit('defaultWatermarkPresetId', null); + } } } diff --git a/packages/frontend/src/preferences/def.ts b/packages/frontend/src/preferences/def.ts index 723475d2d5..0012727e7d 100644 --- a/packages/frontend/src/preferences/def.ts +++ b/packages/frontend/src/preferences/def.ts @@ -351,8 +351,16 @@ export const PREF_DEF = { default: [] as string[], }, watermarkPresets: { + accountDependent: true, default: [] as WatermarkPreset[], }, + defaultWatermarkPresetId: { + accountDependent: true, + default: null as WatermarkPreset['id'] | null, + }, + defaultImageCompressionLevel: { + default: 2, + }, 'sound.masterVolume': { default: 0.5,