+
+
+
+
+
+
diff --git a/src/renderer/components/common/settingSection.vue b/src/renderer/components/common/settingSection.vue
new file mode 100644
index 00000000..bce8e4b3
--- /dev/null
+++ b/src/renderer/components/common/settingSection.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
{{ title }}
+
+
+ {{ description }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/renderer/components/common/singleSelect.vue b/src/renderer/components/common/singleSelect.vue
new file mode 100644
index 00000000..a1864a21
--- /dev/null
+++ b/src/renderer/components/common/singleSelect.vue
@@ -0,0 +1,85 @@
+
+
+
+
+
+ {{ title }}
+
+
+
+
+ {{ placeholder || modelValue }}
+
+
+
+
+ {{ key }}
+
+
+
+
+
diff --git a/src/renderer/i18n/locales/en.json b/src/renderer/i18n/locales/en.json
index 8c2c4f42..15e43b71 100644
--- a/src/renderer/i18n/locales/en.json
+++ b/src/renderer/i18n/locales/en.json
@@ -914,6 +914,7 @@
"chooseSecondPicBedMode": "Choose Second Image Bed Mode",
"chooseShowedPicBed": "Please select the image bed to display in the menu",
"clipboardAndNotification": "Clipboard and Notification",
+ "controlShow": "Control Showed PicBeds",
"copySuccess": "Copy Successful: {content}",
"customLinkFormat": "Custom Link Format",
"customLinkFormatDesc": "Set custom link output format",
@@ -936,7 +937,7 @@
"imageProcessing": "Image Processing Settings",
"imageProcessingDesc": "Configure image preprocessing options before upload",
"isAutoListenClipboard": "Automatically listen for clipboard uploads when the software starts.",
- "manualRname": "Manual Rename",
+ "manualRename": "Manual Rename",
"placeholder": {
"categoryFile": "File Related",
"categoryHash": "Hash Related",
@@ -968,7 +969,7 @@
"shortUrlServer": "Short URL Service",
"sinkDomain": "Sink Domain",
"sinkToken": "Sink Token",
- "timestampRname": "Timestamp Rename",
+ "timestampRename": "Timestamp Rename",
"title": "Upload",
"uploadBehavior": "Upload Behavior",
"uploadProcessing": "Upload Processing",
diff --git a/src/renderer/i18n/locales/zh-CN.json b/src/renderer/i18n/locales/zh-CN.json
index 883ffa80..5dd569e6 100644
--- a/src/renderer/i18n/locales/zh-CN.json
+++ b/src/renderer/i18n/locales/zh-CN.json
@@ -914,6 +914,7 @@
"chooseSecondPicBedMode": "选择第二图床模式",
"chooseShowedPicBed": "请选择显示在菜单的图床",
"clipboardAndNotification": "剪贴板和通知",
+ "controlShow": "图床显示控制",
"copySuccess": "复制成功: {content}",
"customLinkFormat": "自定义链接格式",
"customLinkFormatDesc": "设置自定义的链接输出格式",
@@ -936,7 +937,7 @@
"imageProcessing": "图片预处理设置",
"imageProcessingDesc": "配置上传前的图片预处理选项",
"isAutoListenClipboard": "软件启动时自动监听剪贴板上传",
- "manualRname": "手动重命名",
+ "manualRename": "手动重命名",
"placeholder": {
"categoryFile": "文件相关",
"categoryHash": "哈希相关",
@@ -968,7 +969,7 @@
"shortUrlServer": "短链接服务",
"sinkDomain": "Sink 域名",
"sinkToken": "Sink Token",
- "timestampRname": "时间戳重命名",
+ "timestampRename": "时间戳重命名",
"title": "上传",
"uploadBehavior": "上传行为",
"uploadProcessing": "上传处理",
diff --git a/src/renderer/i18n/locales/zh-TW.json b/src/renderer/i18n/locales/zh-TW.json
index 33890bac..474a7838 100644
--- a/src/renderer/i18n/locales/zh-TW.json
+++ b/src/renderer/i18n/locales/zh-TW.json
@@ -914,6 +914,7 @@
"chooseSecondPicBedMode": "選擇第二圖床模式",
"chooseShowedPicBed": "請選擇顯示在菜單的圖床",
"clipboardAndNotification": "剪貼板和通知",
+ "controlShow": "控制顯示的圖床",
"copySuccess": "複製成功: {content}",
"customLinkFormat": "自定義鏈接格式",
"customLinkFormatDesc": "設置自定義的鏈接輸出格式",
@@ -936,7 +937,7 @@
"imageProcessing": "圖片預處理設置",
"imageProcessingDesc": "配置上傳前的圖片預處理選項",
"isAutoListenClipboard": "軟件啟動時自動監聽剪貼板上傳",
- "manualRname": "手動重命名",
+ "manualRename": "手動重命名",
"placeholder": {
"categoryFile": "文件相關",
"categoryHash": "哈希相關",
@@ -968,7 +969,7 @@
"shortUrlServer": "短鏈接服務",
"sinkDomain": "Sink 域名",
"sinkToken": "Sink Token",
- "timestampRname": "時間戳重命名",
+ "timestampRename": "時間戳重命名",
"title": "上傳",
"uploadBehavior": "上傳行為",
"uploadProcessing": "上傳處理",
diff --git a/src/renderer/pages/Gallery.vue b/src/renderer/pages/Gallery.vue
index 00c4ee68..d75f3fec 100644
--- a/src/renderer/pages/Gallery.vue
+++ b/src/renderer/pages/Gallery.vue
@@ -83,31 +83,12 @@
>
-
{{ t('pages.gallery.picBedType') }}
-
-
- {{ t('pages.gallery.chooseShowedPicBed') }}
- {{ choosedPicBed.length }} {{ t('pages.gallery.selected') }}
-
-
-
-
-
- {{ item.name }}
-
-
-
+
@@ -120,55 +101,42 @@
- {{ t('pages.gallery.pasteFormat') }}
-
-
- {{ key }}
-
-
+
+
+ {{ item }}
+
+
- {{ t('pages.gallery.urlType') }}
-
-
- {{ key }}
-
-
+
+
+ {{ item }}
+
+
-
{{ t('pages.gallery.sort') }}
-
-
-
- {{ t(`pages.gallery.sortBy.${currentSortField}`) }}
-
-
-
-
- {{ t(`pages.gallery.sortBy.${key}`) }}
-
-
-
+
+
+ {{ t(`pages.gallery.sortBy.${item}`) }}
+
+
@@ -240,7 +208,7 @@
:key="componentKey"
ref="virtualScrollerRef"
:view-mode="viewMode"
- class="virtual-gallery-scroller min-h-0 w-full flex-1 p-1"
+ class="virtual-gallery-scroller min-h-0 w-full flex-1 p-3"
:items="filterList"
:item-height="300"
:grid-breakpoints="effectiveGridBreakpoints"
@@ -596,7 +564,6 @@ import {
ListIcon,
RefreshCwIcon,
SearchIcon,
- SortAscIcon,
TrashIcon,
XIcon,
} from 'lucide-vue-next'
@@ -615,6 +582,8 @@ import { useI18n } from 'vue-i18n'
import { onBeforeRouteUpdate } from 'vue-router'
import ALLApi from '@/apis/allApi'
+import MultiSelect from '@/components/common/multiSelect.vue'
+import SingleSelect from '@/components/common/singleSelect.vue'
import VirtualScroller from '@/components/VirtualScroller.vue'
import useConfirm from '@/hooks/useConfirm'
import { usePicBed } from '@/hooks/useGlobal'
@@ -663,18 +632,10 @@ const debouncedSearchText = ref
('')
const debouncedSearchTextURL = ref('')
const handleBarActive = useStorage('galleryHandleBarActive', true)
const pasteStyle = ref('')
-const pasteStyleMap = {
- Markdown: 'markdown',
- HTML: 'HTML',
- URL: 'URL',
- UBB: 'UBB',
- Custom: 'Custom',
-}
+const pasteStyleList = ['markdown', 'HTML', 'URL', 'UBB', 'Custom']
const useShortUrl = ref('')
-const shortURLMap = {
- [t('pages.gallery.shortUrl')]: t('pages.gallery.shortUrl'),
- [t('pages.gallery.longUrl')]: t('pages.gallery.longUrl'),
-}
+const shortURLList = [t('pages.gallery.shortUrl'), t('pages.gallery.longUrl')]
+
const fileSortNameReverse = ref(false)
const fileSortTimeReverse = ref(false)
const fileSortExtReverse = ref(false)
@@ -850,41 +811,6 @@ function onPreviewImageLoad() {
})
}
-function togglePicBedDropdown(event?: Event) {
- picBedDropdownOpen.value = !picBedDropdownOpen.value
- if (sortDropdownOpen.value) sortDropdownOpen.value = false
- if (picBedDropdownOpen.value && event) {
- nextTick(() => {
- const trigger = event.target as HTMLElement
- const dropdown = trigger.parentElement?.querySelector('.multiselect-dropdown') as HTMLElement
- if (dropdown && trigger) {
- const rect = trigger.getBoundingClientRect()
- dropdown.style.top = `${rect.bottom + 2}px`
- dropdown.style.left = `${rect.left}px`
- dropdown.style.width = `${Math.max(rect.width, 200)}px`
- }
- })
- }
-}
-
-function toggleSortDropdown(event?: Event) {
- sortDropdownOpen.value = !sortDropdownOpen.value
- if (picBedDropdownOpen.value) picBedDropdownOpen.value = false
-
- if (sortDropdownOpen.value && event) {
- nextTick(() => {
- const trigger = event.target as HTMLElement
- const dropdown = trigger.parentElement?.querySelector('.sort-options') as HTMLElement
- if (dropdown && trigger) {
- const rect = trigger.getBoundingClientRect()
- dropdown.style.top = `${rect.bottom + 2}px`
- dropdown.style.left = `${rect.left}px`
- dropdown.style.width = `${Math.max(rect.width, 160)}px`
- }
- })
- }
-}
-
function navigateImage(direction: number) {
const newIndex = gallerySliderControl.index + direction
if (newIndex >= 0 && newIndex < filterList.value.length) {
@@ -1522,23 +1448,19 @@ function toggleHandleBar() {
handleBarActive.value = !handleBarActive.value
}
-async function handlePasteStyleChange(event: Event) {
- const target = event.target as HTMLSelectElement
- const val = target.value
- saveConfig(configPaths.settings.pasteStyle, val)
- pasteStyle.value = val
-}
+watch(pasteStyle, newVal => {
+ saveConfig(configPaths.settings.pasteStyle, newVal)
+})
-function handleUseShortUrlChange(event: Event) {
- const target = event.target as HTMLSelectElement
- const value = target.value
- saveConfig(configPaths.settings.useShortUrl, value === t('pages.gallery.shortUrl'))
- useShortUrl.value = value
-}
+watch(useShortUrl, newVal => {
+ saveConfig(configPaths.settings.useShortUrl, newVal === t('pages.gallery.shortUrl'))
+})
+
+watch(currentSortField, () => {
+ sortFile(currentSortField.value)
+})
function sortFile(type: 'name' | 'time' | 'ext' | 'check') {
- sortDropdownOpen.value = false
- currentSortField.value = type
switch (type) {
case 'name':
fileSortNameReverse.value = !fileSortNameReverse.value
diff --git a/src/renderer/layouts/Main.vue b/src/renderer/pages/Main.vue
similarity index 90%
rename from src/renderer/layouts/Main.vue
rename to src/renderer/pages/Main.vue
index 7a85efca..85eb1787 100644
--- a/src/renderer/layouts/Main.vue
+++ b/src/renderer/pages/Main.vue
@@ -22,8 +22,8 @@
import { useRouter } from 'vue-router'
import InputBoxDialog from '@/components/InputBoxDialog.vue'
-import Navigation from '@/components/NavigationPage.vue'
-import TitleBar from '@/components/ui/TitleBar.vue'
+import Navigation from '@/pages/NavigationPage.vue'
+import TitleBar from '@/pages/TitleBar.vue'
const $router = useRouter()
const keepAlivePages = $router
diff --git a/src/renderer/components/NavigationPage.vue b/src/renderer/pages/NavigationPage.vue
similarity index 99%
rename from src/renderer/components/NavigationPage.vue
rename to src/renderer/pages/NavigationPage.vue
index f962e938..319adf6c 100644
--- a/src/renderer/components/NavigationPage.vue
+++ b/src/renderer/pages/NavigationPage.vue
@@ -233,6 +233,8 @@ import { computed, nextTick, onBeforeMount, onBeforeUnmount, reactive, Ref, ref,
import { useI18n } from 'vue-i18n'
import { useRoute, useRouter } from 'vue-router'
+import FirstTimeGuide from '@/components/FirstTimeGuide.vue'
+import ThemeSwitcher from '@/components/ui/ThemeSwitcher.vue'
import { usePicBed } from '@/hooks/useGlobal'
import useMessage from '@/hooks/useMessage'
import * as config from '@/router/config'
@@ -240,9 +242,6 @@ import { SHOW_FIRST_TIME_GUIDE, SHOW_MAIN_PAGE_QRCODE } from '@/utils/constant'
import { getConfig } from '@/utils/dataSender'
import { IRPCActionType } from '@/utils/enum'
-import FirstTimeGuide from './FirstTimeGuide.vue'
-import ThemeSwitcher from './ui/ThemeSwitcher.vue'
-
const version = ref(pkg.version)
const isCollapsed = useStorage('navigation-collapsed', false)
diff --git a/src/renderer/pages/PicGoSetting.vue b/src/renderer/pages/PicGoSetting.vue
index 3ab6192b..b6757c04 100644
--- a/src/renderer/pages/PicGoSetting.vue
+++ b/src/renderer/pages/PicGoSetting.vue
@@ -1,995 +1,692 @@
-