From fbf0dcc691c184a4a7dbf95aba52c3b1c156df11 Mon Sep 17 00:00:00 2001 From: Kuingsmile <96409857+Kuingsmile@users.noreply.github.com> Date: Wed, 20 Aug 2025 15:34:54 +0800 Subject: [PATCH] :sparkles: Feature(custom): add gallery picbed filter ISSUES CLOSED: #309 --- src/main/utils/configPaths.ts | 2 ++ src/renderer/i18n/locales/en.json | 4 +++- src/renderer/i18n/locales/zh-CN.json | 4 +++- src/renderer/i18n/locales/zh-TW.json | 4 +++- src/renderer/pages/Gallery.vue | 12 +++++++++++- src/renderer/pages/PicGoSetting.vue | 23 +++++++++++++++++++++++ src/renderer/utils/configPaths.ts | 2 ++ 7 files changed, 47 insertions(+), 4 deletions(-) diff --git a/src/main/utils/configPaths.ts b/src/main/utils/configPaths.ts index 010ee375..571d1112 100644 --- a/src/main/utils/configPaths.ts +++ b/src/main/utils/configPaths.ts @@ -103,6 +103,7 @@ export interface IConfigStruct { autoStart: boolean autoImport: boolean autoImportPicBed: string[] + galleryPicBedFilter: string[] } needReload: boolean picgoPlugins: IPicGoPlugins @@ -190,6 +191,7 @@ export const configPaths = { autoStart: 'settings.autoStart', autoImport: 'settings.autoImport', autoImportPicBed: 'settings.autoImportPicBed', + galleryPicBedFilter: 'settings.galleryPicBedFilter', enableSecondUploader: 'settings.enableSecondUploader' }, needReload: 'needReload', diff --git a/src/renderer/i18n/locales/en.json b/src/renderer/i18n/locales/en.json index e1741964..4de6da94 100644 --- a/src/renderer/i18n/locales/en.json +++ b/src/renderer/i18n/locales/en.json @@ -279,7 +279,9 @@ "sinkDomain": "Sink Domain", "sinkToken": "Sink Token", "encodeOutputUrl": "Escape output (copy) URL", - "chooseShowedPicBed": "Please select the image bed to display in the menu" + "chooseShowedPicBed": "Please select the image bed to display in the menu", + "galleryPicBedFilter": "Gallery PicBed Filter", + "galleryPicBedFilterDescription": "Choose which picbeds to show in the gallery. If none are selected, all picbeds will be shown." }, "advanced": { "title": "Advanced", diff --git a/src/renderer/i18n/locales/zh-CN.json b/src/renderer/i18n/locales/zh-CN.json index fc5b5d57..ec1e9c5b 100644 --- a/src/renderer/i18n/locales/zh-CN.json +++ b/src/renderer/i18n/locales/zh-CN.json @@ -274,7 +274,9 @@ "sinkDomain": "Sink 域名", "sinkToken": "Sink Token", "encodeOutputUrl": "输出(复制) URL 时进行转义", - "chooseShowedPicBed": "请选择显示在菜单的图床" + "chooseShowedPicBed": "请选择显示在菜单的图床", + "galleryPicBedFilter": "相册图床过滤器", + "galleryPicBedFilterDescription": "选择在相册中显示的图床类型。如果未选择任何图床,将显示所有图床。" }, "advanced": { "title": "高级", diff --git a/src/renderer/i18n/locales/zh-TW.json b/src/renderer/i18n/locales/zh-TW.json index a2f73464..1c43826b 100644 --- a/src/renderer/i18n/locales/zh-TW.json +++ b/src/renderer/i18n/locales/zh-TW.json @@ -274,7 +274,9 @@ "sinkDomain": "Sink 域名", "sinkToken": "Sink Token", "encodeOutputUrl": "輸出(複製) URL 時進行轉義", - "chooseShowedPicBed": "請選擇顯示在菜單的圖床" + "chooseShowedPicBed": "請選擇顯示在菜單的圖床", + "galleryPicBedFilter": "相簿圖床篩選器", + "galleryPicBedFilterDescription": "選擇在相簿中顯示的圖床類型。如果未選擇任何圖床,將顯示所有圖床。" }, "advanced": { "title": "高級", diff --git a/src/renderer/pages/Gallery.vue b/src/renderer/pages/Gallery.vue index 828c8056..9689f806 100644 --- a/src/renderer/pages/Gallery.vue +++ b/src/renderer/pages/Gallery.vue @@ -531,6 +531,7 @@ const gallerySliderControl = reactive({ const deleteCloud = ref(false) const isAlwaysForceReload = ref(false) const choosedPicBed = ref([]) +const galleryPicBedFilterSetting = ref([]) const lastChoosed = ref(-1) const isShiftKeyPress = ref(false) const searchText = ref('') @@ -907,6 +908,7 @@ async function initConf() { : t('pages.gallery.longUrl') isAlwaysForceReload.value = (await getConfig(configPaths.settings.isAlwaysForceReload)) || false deleteCloud.value = (await getConfig(configPaths.settings.deleteCloudFile)) || false + galleryPicBedFilterSetting.value = (await getConfig(configPaths.settings.galleryPicBedFilter)) || [] } const updateGalleryHandler = () => { @@ -949,7 +951,13 @@ function formatFileName(name: string) { } function getGallery(): IGalleryItem[] { - if (debouncedSearchText.value || choosedPicBed.value.length > 0 || debouncedSearchTextURL.value || dateRange.value) { + if ( + debouncedSearchText.value || + choosedPicBed.value.length > 0 || + debouncedSearchTextURL.value || + dateRange.value || + galleryPicBedFilterSetting.value.length > 0 + ) { return images.value .filter(item => { let isInChoosedPicBed = true @@ -958,6 +966,8 @@ function getGallery(): IGalleryItem[] { let isIncludesDateRange = true if (choosedPicBed.value.length > 0) { isInChoosedPicBed = choosedPicBed.value.some(type => type === item.type) + } else if (galleryPicBedFilterSetting.value.length > 0) { + isInChoosedPicBed = galleryPicBedFilterSetting.value.some(type => type === item.type) } if (debouncedSearchText.value) { isIncludesSearchText = customStrMatch(item.fileName || '', debouncedSearchText.value) diff --git a/src/renderer/pages/PicGoSetting.vue b/src/renderer/pages/PicGoSetting.vue index 91a8adba..dd52f545 100644 --- a/src/renderer/pages/PicGoSetting.vue +++ b/src/renderer/pages/PicGoSetting.vue @@ -533,6 +533,19 @@ + +
+

{{ t('pages.settings.upload.galleryPicBedFilter') }}

+

{{ t('pages.settings.upload.galleryPicBedFilterDescription') }}

+ +
+ +
+
@@ -1271,6 +1284,7 @@ const { confirm } = useConfirm() const message = useMessage() const activeName = ref<'system' | 'sync' | 'upload' | 'advanced' | 'update'>('system') const showPicBedList = ref([]) +const galleryPicBedFilterList = ref([]) // Tab configuration const tabs = computed(() => [ @@ -1534,6 +1548,7 @@ async function initData() { const settings = config.settings || {} const picBed = config.picBed showPicBedList.value = picBedGlobal.value.filter(item => item.visible).map(item => item.name) + galleryPicBedFilterList.value = settings.galleryPicBedFilter || [] formKeys.forEach(key => { ;(formOfSetting.value as any)[key] = settings[key] ?? formOfSetting.value[key] }) @@ -1665,12 +1680,20 @@ watch(showPicBedList, val => { handleShowPicBedListChange(val) }) +watch(galleryPicBedFilterList, val => { + handleGalleryPicBedFilterChange(val) +}) + function handleShowPicBedListChange(val: ICheckBoxValueType[]) { const list = picBedGlobal.value.map(item => ({ ...item, visible: val.includes(item.name) })) saveConfig({ [configPaths.picBed.list]: list }) updatePicBedGlobal() } +function handleGalleryPicBedFilterChange(val: ICheckBoxValueType[]) { + saveConfig({ [configPaths.settings.galleryPicBedFilter]: val }) +} + function handleAutoStartChange(val: ICheckBoxValueType) { saveConfig(configPaths.settings.autoStart, val) window.electron.sendRPC(IRPCActionType.PICLIST_AUTO_START, val) diff --git a/src/renderer/utils/configPaths.ts b/src/renderer/utils/configPaths.ts index cce05c08..8092a19b 100644 --- a/src/renderer/utils/configPaths.ts +++ b/src/renderer/utils/configPaths.ts @@ -104,6 +104,7 @@ export interface IConfigStruct { autoStart: boolean autoImport: boolean autoImportPicBed: string[] + galleryPicBedFilter: string[] } needReload: boolean picgoPlugins: IPicGoPlugins @@ -192,6 +193,7 @@ export const configPaths = { autoStart: 'settings.autoStart', autoImport: 'settings.autoImport', autoImportPicBed: 'settings.autoImportPicBed', + galleryPicBedFilter: 'settings.galleryPicBedFilter', enableSecondUploader: 'settings.enableSecondUploader' }, needReload: 'needReload',