diff --git a/currentVersion.md b/currentVersion.md index 261d3d11..a03e5fbe 100644 --- a/currentVersion.md +++ b/currentVersion.md @@ -8,7 +8,8 @@ - windows下新增便携模式,无需安装即可运行,数据存储在程序目录下的`data`文件夹中,支持自动更新;Linux下新增`rpm`安装包 - 新增自定义主题功能,主题仓库[PicList ThemeHub](https://github.com/Kuingsmile/PicList-ThemeHub) -- 12个内置主题供选择,如bilibili、二次元、极夜紫、gemini等风格 +- 12个内置主题供选择,如bilibili、二次元、极夜紫等风格 +- 重构了几乎全部页面,优化了数十项UI细节问题 - 相册页面多项优化,支持显示已选择图片数量,匹配的url列表和记忆过滤器打开状态 - 插件页面现在可以浏览所有插件列表,查看详情和安装 - 新增教学引导页面,首次运行时会自动弹出 diff --git a/currentVersion_en.md b/currentVersion_en.md index d4e70e23..b302eaaf 100644 --- a/currentVersion_en.md +++ b/currentVersion_en.md @@ -8,7 +8,8 @@ - Added portable mode on Windows, allowing the program to run without installation. Data is stored in the `data` folder within the program directory, and automatic updates are supported. Added `rpm` installation package for Linux - Added custom theme functionality, with a theme repository available at [PicList ThemeHub](https://github.com/Kuingsmile/PicList-ThemeHub) -- 12 built-in themes available, such as bilibili, ACG, Night Purple, gemini styles +- 12 built-in themes available, such as bilibili, ACG, Night Purple styles +- Refactored almost all pages, optimizing dozens of UI detail issues - Multiple optimizations on the album page, supporting display of the number of selected images, matching URL list, and remembering filter open state - Plugin page now allows browsing of all plugin lists, viewing details, and installation - Added tutorial guide page, which automatically pops up on first run diff --git a/src/renderer/components/common/customButton.vue b/src/renderer/components/common/customButton.vue new file mode 100644 index 00000000..09c0c9cb --- /dev/null +++ b/src/renderer/components/common/customButton.vue @@ -0,0 +1,69 @@ + + + diff --git a/src/renderer/components/common/customInput.vue b/src/renderer/components/common/customInput.vue new file mode 100644 index 00000000..89738ac9 --- /dev/null +++ b/src/renderer/components/common/customInput.vue @@ -0,0 +1,45 @@ + + + diff --git a/src/renderer/components/common/customNavCard.vue b/src/renderer/components/common/customNavCard.vue new file mode 100644 index 00000000..ea012bbd --- /dev/null +++ b/src/renderer/components/common/customNavCard.vue @@ -0,0 +1,36 @@ + + + diff --git a/src/renderer/components/common/customSelect.vue b/src/renderer/components/common/customSelect.vue new file mode 100644 index 00000000..b34e1224 --- /dev/null +++ b/src/renderer/components/common/customSelect.vue @@ -0,0 +1,35 @@ + + + diff --git a/src/renderer/components/common/customSwitch.vue b/src/renderer/components/common/customSwitch.vue index 1807d3d7..7df0af41 100644 --- a/src/renderer/components/common/customSwitch.vue +++ b/src/renderer/components/common/customSwitch.vue @@ -1,22 +1,35 @@ diff --git a/src/renderer/components/common/multiSelect.vue b/src/renderer/components/common/multiSelect.vue new file mode 100644 index 00000000..75a1bf5f --- /dev/null +++ b/src/renderer/components/common/multiSelect.vue @@ -0,0 +1,84 @@ + + + diff --git a/src/renderer/components/common/placeholderTable.vue b/src/renderer/components/common/placeholderTable.vue index 5b89d85f..002c0ec9 100644 --- a/src/renderer/components/common/placeholderTable.vue +++ b/src/renderer/components/common/placeholderTable.vue @@ -5,7 +5,7 @@
- {{ $t(titleList[key]) }} + {{ titleList[key] }}
+
+ +
+ + + 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 @@ + + + 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 @@ + + 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 @@ >
- -
- -
- -
-
+
@@ -120,55 +101,42 @@
- - + + +
- - + + +
- -
- -
- -
-
+ + +
@@ -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 @@