mirror of
https://github.com/fanchenio/DawnLauncher.git
synced 2025-09-14 13:56:46 +08:00
Compare commits
63 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
5800cbbdaa | ||
![]() |
56517f059c | ||
![]() |
342d8939ab | ||
![]() |
92270def83 | ||
![]() |
881fbc9f56 | ||
![]() |
2cd721263e | ||
![]() |
ea851c652c | ||
![]() |
9243140d3b | ||
![]() |
36b77ce32b | ||
![]() |
d51a5404ee | ||
![]() |
018bd91931 | ||
![]() |
d4520eef0c | ||
![]() |
0c2ae8ae5b | ||
![]() |
07912ea276 | ||
![]() |
bebe8272cf | ||
![]() |
4e3947ab7e | ||
![]() |
5c791874c6 | ||
![]() |
a2ccd8670b | ||
![]() |
78cf39bec7 | ||
![]() |
62a1780197 | ||
![]() |
dd3cf64f5d | ||
![]() |
ed77cc4fb4 | ||
![]() |
0327dfc0cc | ||
![]() |
0ad813a315 | ||
![]() |
2ba01403a5 | ||
![]() |
f365005bd8 | ||
![]() |
3ffbd110dc | ||
![]() |
7ec78fef08 | ||
![]() |
b9ac69cf22 | ||
![]() |
c23e4f51f0 | ||
![]() |
a411674e3a | ||
![]() |
e1f896e963 | ||
![]() |
8228495918 | ||
![]() |
bcc5ad1989 | ||
![]() |
dd06149fb4 | ||
![]() |
0cb66ffaa5 | ||
![]() |
6386518171 | ||
![]() |
49124e7eeb | ||
![]() |
ac96cfd6be | ||
![]() |
950cff7a6c | ||
![]() |
f0eeea8483 | ||
![]() |
8c17275169 | ||
![]() |
6f04f8ccbd | ||
![]() |
8c6de3fdc2 | ||
![]() |
c170df8691 | ||
![]() |
2d82702efe | ||
![]() |
acb9231915 | ||
![]() |
fac3bda8f4 | ||
![]() |
333f0888be | ||
![]() |
a94d5a2244 | ||
![]() |
27a32c7eed | ||
![]() |
2cdefb513a | ||
![]() |
c9593f379f | ||
![]() |
df499a0517 | ||
![]() |
4048f4a230 | ||
![]() |
7c866f57b4 | ||
![]() |
e7ce285ae9 | ||
![]() |
d117397dc3 | ||
![]() |
6b71805274 | ||
![]() |
480f88d558 | ||
![]() |
37a62c1cb5 | ||
![]() |
fb0ce7d3ca | ||
![]() |
467f33bc99 |
@ -1,9 +1,5 @@
|
||||
# [简体中文](https://github.com/fanchenio/DawnLauncher) | English
|
||||
|
||||
# Update
|
||||
|
||||
After disappearing for more than three months, I refactored the `Dawn Launcher` code. Because I had no experience in developing `NodeJS` and `Electron` at the beginning, `Vue` was not well written, and the code was a bit sloppy, so I carried out Code refactoring, the new version uses `Electron26 + Vite + Vue3 + TS`, the UI framework uses `Naive`, regarding the native API, I switched from `C++` to `Rust`, and the database switched from `electron-store` With `SQLite3`, the language has also added `English`.
|
||||
|
||||
# Dawn Launcher
|
||||
|
||||
The `Windows` quick launch tool helps you organize your messy desktop, manage your desktop shortcuts by category, and keep your desktop clean and tidy.
|
||||
@ -12,7 +8,7 @@ Supports associated folders (real-time synchronization of folder contents), quic
|
||||
|
||||
# Technology Stack
|
||||
|
||||
`Electron + Vite + Vue3 + TS`
|
||||
`Electron + Vite + Vue3 + TS + Rust`
|
||||
|
||||
# Support Platform
|
||||
|
||||
@ -31,14 +27,6 @@ Supports associated folders (real-time synchronization of folder contents), quic
|
||||
|
||||
[dawnlauncher.com](https://dawnlauncher.com/)
|
||||
|
||||
# Donate(Wechat)
|
||||
|
||||

|
||||
|
||||
# Donate(Alipay)
|
||||
|
||||

|
||||
|
||||
# UI
|
||||
|
||||

|
||||
|
14
README.md
14
README.md
@ -1,9 +1,5 @@
|
||||
# 简体中文 | [English](https://github.com/fanchenio/DawnLauncher/blob/main/README-ENGLISH.md)
|
||||
|
||||
# 更新
|
||||
|
||||
消失了三个多月,我将`Dawn Launcher`代码进行重构,因为一开始没有开发`NodeJS`和`Electron`的经验,`Vue`也写的不好,代码写的有些潦草,所以进行了代码重构,新版使用了`Electron26 + Vite + Vue3 + TS`,UI 框架使用了`Naive`,关于原生 API 方面,我从`C++`切换到了 `Rust`,数据库从`electron-store`切换到了`SQLite3`,语言也新增了`英语`。
|
||||
|
||||
# Dawn Launcher
|
||||
|
||||
`Windows`快捷启动工具,帮助您整理杂乱无章的桌面,分门别类管理您的桌面快捷方式,让您的桌面保持干净整洁。
|
||||
@ -12,7 +8,7 @@
|
||||
|
||||
# 技术栈
|
||||
|
||||
`Electron + Vite + Vue3 + TS`
|
||||
`Electron + Vite + Vue3 + TS + Rust`
|
||||
|
||||
# 支持平台
|
||||
|
||||
@ -35,14 +31,6 @@
|
||||
|
||||
369652112
|
||||
|
||||
# 捐赠(微信)
|
||||
|
||||

|
||||
|
||||
# 捐赠(支付宝)
|
||||
|
||||

|
||||
|
||||
# 界面
|
||||
|
||||

|
||||
|
@ -5,8 +5,8 @@ let simplifiedChinese = {
|
||||
address: "地址",
|
||||
aggregateClassification: "聚合分类",
|
||||
aggregateClassificationPrompt1:
|
||||
"聚合分类可以将所有分类下的项目聚合到一起,按照设定的排序方式、项目数量进行排序和显示。",
|
||||
aggregateClassificationPrompt2: "当前分类为父级分类,不能设置聚合分类。",
|
||||
"聚合分类会将所有分类下项目聚合到一起,按照设定的排序方式、项目数量进行显示。",
|
||||
aggregateClassificationPrompt2: "当前分类是父级分类,不能设置为聚合分类。",
|
||||
aggregateClassificationPrompt3:
|
||||
"当前设置排序为按打开次数,需开启设置-项目-记录打开次数。",
|
||||
aggregateClassificationPrompt4:
|
||||
@ -22,7 +22,7 @@ let simplifiedChinese = {
|
||||
associateFolderPrompt1:
|
||||
"关联文件夹可以实时监控指定文件夹内的变化并同步到对应分类中。",
|
||||
associateFolderPrompt2: "需要隐藏的文件/文件夹名称,多个按英文逗号分割",
|
||||
associateFolderPrompt3: "当前分类为父级分类,不能设置关联文件夹。",
|
||||
associateFolderPrompt3: "当前分类是父级分类,不能设置为关联文件夹。",
|
||||
associateFolderPrompt4: "目标路径不存在。",
|
||||
associateFolderPrompt5: "目标路径必须是文件夹。",
|
||||
associateFolderPrompt6:
|
||||
@ -33,15 +33,14 @@ let simplifiedChinese = {
|
||||
backgroundIcon: "背景图标",
|
||||
backgroundImage: "背景图",
|
||||
backgroundImageMode: "背景图模式",
|
||||
backgroundImagePostion: "背景图定位",
|
||||
backgroundImageTransparent: "背景图透明",
|
||||
backgroundTransparent: "背景透明",
|
||||
backgroundImagePosition: "背景图定位",
|
||||
backgroundImageTransparency: "背景图透明度",
|
||||
backup: "备份",
|
||||
backupRestoreData: "备份/还原数据",
|
||||
backupRestoreDataPrompt:
|
||||
"如果要还原1.2.3及之前版本的备份数据,请在还原时选择导入JSON格式的文件。",
|
||||
batchConvertAbsolutePath: "转为绝对路径",
|
||||
batchConvertRelativePath: "转为相对路径",
|
||||
"如果要还原 1.2.3 及之前版本的数据,请在还原时选择导入 JSON 格式的文件。",
|
||||
batchConvertAbsolutePath: "批量转为绝对路径",
|
||||
batchConvertRelativePath: "批量转为相对路径",
|
||||
batchCopyTo: "批量复制到",
|
||||
batchDelete: "批量删除",
|
||||
batchDeletePrompt: "是否批量删除项目?",
|
||||
@ -52,7 +51,7 @@ let simplifiedChinese = {
|
||||
bottom: "底部",
|
||||
byInitialLetter: "按首字母",
|
||||
byLastOpen: "按最后打开",
|
||||
byOpenNumber: "按打开次数",
|
||||
byOpenCount: "按打开次数",
|
||||
calculator: "计算器",
|
||||
cancel: "取消",
|
||||
cancelBatchOperation: "取消批量操作",
|
||||
@ -71,17 +70,19 @@ let simplifiedChinese = {
|
||||
color: "颜色",
|
||||
columnNumber: "列数",
|
||||
commandLine: "命令行",
|
||||
commandLinePrompt1: "使用“> + 空格”进入命令行模式。",
|
||||
commandLinePrompt1: '在"快速搜索"或"搜索"中使用"> + 空格"进入命令行模式。',
|
||||
commandPrompt: "命令提示符",
|
||||
computer: "计算机",
|
||||
computerManagement: "计算机管理",
|
||||
controlPanel: "控制面板",
|
||||
convertAbsolutePath: "转为绝对路径",
|
||||
convertRelativePath: "转为相对路径",
|
||||
copy: "复制",
|
||||
copyFullPath: "复制完整路径",
|
||||
copyTo: "复制到",
|
||||
createShortcut: "创建快捷方式",
|
||||
ctrlNumberKey: "Ctrl + 数字键",
|
||||
cut: "剪切",
|
||||
default: "默认",
|
||||
defaultIcon: "默认图标",
|
||||
delayDisplay: "延迟显示",
|
||||
@ -93,7 +94,7 @@ let simplifiedChinese = {
|
||||
deleteHistory: "删除历史记录",
|
||||
description: "描述",
|
||||
display: "显示",
|
||||
displayMainWindow: "显示主界面",
|
||||
displayMainInterface: "显示主界面",
|
||||
documents: "文档",
|
||||
doubleClickOpen: "双击打开",
|
||||
doubleClickTaskbar: "双击任务栏",
|
||||
@ -108,6 +109,7 @@ let simplifiedChinese = {
|
||||
editSubclassification: "编辑子分类",
|
||||
emptyRecycleBin: "清空回收站",
|
||||
enable: "启用",
|
||||
enableQuickSearch: "启用快速搜索",
|
||||
english: "英语",
|
||||
excludeSearch: "排除搜索",
|
||||
exit: "退出",
|
||||
@ -135,11 +137,12 @@ let simplifiedChinese = {
|
||||
globalShortcutKey: "全局快捷键",
|
||||
hiddenItems: "隐藏项",
|
||||
hideEllipses: "隐藏省略号",
|
||||
hideLoseFocus: "失去焦点后隐藏",
|
||||
hideLoseFocus: "失去焦点隐藏",
|
||||
hideName: "隐藏名称",
|
||||
hideTray: "隐藏托盘图标",
|
||||
hideTaskbar: "隐藏任务栏",
|
||||
hideWindowCollapseSubClassification: "隐藏窗口时收起子分类",
|
||||
hideWindowCollapseSubClassification: "隐藏窗口收起子分类",
|
||||
hideWindowAfterOpen: "打开后隐藏窗口",
|
||||
history: "历史记录",
|
||||
hover: "悬停",
|
||||
icon: "图标",
|
||||
@ -193,29 +196,29 @@ let simplifiedChinese = {
|
||||
"开启勿扰模式后,计算机在游戏、应用全屏模式下不会弹出 Dawn Launcher 窗口。",
|
||||
notFoundFile: "找不到指定的文件",
|
||||
notFoundFolder: "找不到指定的文件夹",
|
||||
notTransparent: "不透明",
|
||||
number: "数量",
|
||||
numberKey: "数字键",
|
||||
officialWebsite: "官方网站",
|
||||
ok: "确定",
|
||||
open: "打开",
|
||||
openAfterHideMainInterface: "打开后隐藏主界面",
|
||||
openAfterHideQuickSearchWindow: "打开后隐藏窗口",
|
||||
openFileLocation: "打开文件所在位置",
|
||||
openNow: "仅剩一项时立即打开",
|
||||
openNumber: "打开次数",
|
||||
openNow: "仅剩一项立即打开",
|
||||
openCount: "打开次数",
|
||||
parameters: "参数",
|
||||
password: "密码",
|
||||
pasteIcon: "粘贴图标",
|
||||
paste: "粘贴",
|
||||
path: "路径",
|
||||
powerOptions: "电源选项",
|
||||
powerShell: "PowerShell",
|
||||
programsFeatures: "程序和功能",
|
||||
proxy: "代理",
|
||||
proxyPrompt:
|
||||
"仅支持HTTP代理,填写“地址”时需要带通信协议和端口,例如:http://127.0.0.1:7890,如果没有用户名和密码,为空即可。",
|
||||
'仅支持 HTTP 代理,填写"地址"时需要带通信协议和端口,例如:http://127.0.0.1:7890,如果没有用户名和密码,为空即可。',
|
||||
prompt: "提示",
|
||||
quickSearch: "快速搜索",
|
||||
recordOpenNumber: "记录打开次数",
|
||||
recordOpenCount: "记录打开次数",
|
||||
recycleBin: "回收站",
|
||||
refreshIcon: "刷新图标",
|
||||
registryEditor: "注册表编辑器",
|
||||
@ -226,7 +229,6 @@ let simplifiedChinese = {
|
||||
restart: "重启",
|
||||
restore: "还原",
|
||||
restoreDataPrompt: "还原数据失败。",
|
||||
rewardSponsor: "打赏&赞助",
|
||||
right: "右侧",
|
||||
roundedCorners: "圆角",
|
||||
runAsAdministrator: "以管理员身份运行",
|
||||
@ -274,10 +276,9 @@ let simplifiedChinese = {
|
||||
startupTray: "启动后最小化到系统托盘",
|
||||
subclassification: "子分类",
|
||||
svgIcon: "SVG图标",
|
||||
svgIconPrompt1: "输入SVG代码后,需要先点击“校验代码”按钮。",
|
||||
svgIconPrompt1: '输入 SVG 代码后,需要先点击"校验代码"按钮。',
|
||||
switch: "切换",
|
||||
switchClassificationCollapseOtherSubClassification:
|
||||
"切换分类时收起其他子分类",
|
||||
switchClassificationCollapseOtherSubClassification: "切换分类收起其他子分类",
|
||||
switchEnglish: "显示窗口时将输入法切换为英文模式",
|
||||
system: "系统",
|
||||
target: "目标",
|
||||
@ -288,14 +289,14 @@ let simplifiedChinese = {
|
||||
title: "标题",
|
||||
top: "顶部",
|
||||
traditionalChinese: "繁体中文",
|
||||
transparent: "透明",
|
||||
turnOffMonitor: "关闭显示器",
|
||||
unlockClassification: "解锁分类",
|
||||
unlockItem: "解锁项目",
|
||||
uploadIcon: "上传图标",
|
||||
url: "网址",
|
||||
useItemOpen: "从程序外拖动文件到项目图标上时用此项目打开文件",
|
||||
useItemOpen: "从程序外拖动文件到项目图标上用此项目打开文件",
|
||||
useProxy: "使用代理",
|
||||
useQuickSearch: "使用快速搜索",
|
||||
username: "用户名",
|
||||
update: "更新",
|
||||
webSearch: "网络搜索",
|
||||
@ -304,6 +305,7 @@ let simplifiedChinese = {
|
||||
webSearchModePrompt2: "{w}为搜索关键字。",
|
||||
width: "宽度",
|
||||
window: "窗口",
|
||||
windowTransparency: "窗口透明度",
|
||||
zoom: "缩放",
|
||||
};
|
||||
|
||||
@ -313,8 +315,8 @@ let traditionalChinese = {
|
||||
address: "地址",
|
||||
aggregateClassification: "聚合分類",
|
||||
aggregateClassificationPrompt1:
|
||||
"聚合分類可以將所有分類下的項目聚合到一起,按照設定的排序方式、項目數量進行排序和顯示。",
|
||||
aggregateClassificationPrompt2: "當前分類為父級分類,不能設置聚合分類。",
|
||||
"聚合分類會將所有分類下項目聚合到一起,按照設定的排序方式、項目數量進行顯示。",
|
||||
aggregateClassificationPrompt2: "當前分類是父級分類,不能設置為聚合分類。",
|
||||
aggregateClassificationPrompt3:
|
||||
"當前設置排序為按打開次數,需開啟設置-項目-記錄打開次數。",
|
||||
aggregateClassificationPrompt4:
|
||||
@ -330,7 +332,7 @@ let traditionalChinese = {
|
||||
associateFolderPrompt1:
|
||||
"關聯文件夾可以實時監控指定文件夾內的變化並同步到對應分類中。",
|
||||
associateFolderPrompt2: "需要隱藏的文件/文件夾名稱,多個按英文逗號分割",
|
||||
associateFolderPrompt3: "當前分類為父級分類,不能設置關聯文件夾。",
|
||||
associateFolderPrompt3: "當前分類是父級分類,不能設置為關聯文件夾。",
|
||||
associateFolderPrompt4: "目標路徑不存在。",
|
||||
associateFolderPrompt5: "目標路徑必須是文件夾。",
|
||||
associateFolderPrompt6:
|
||||
@ -341,15 +343,14 @@ let traditionalChinese = {
|
||||
backgroundIcon: "背景圖標",
|
||||
backgroundImage: "背景圖",
|
||||
backgroundImageMode: "背景圖模式",
|
||||
backgroundImagePostion: "背景圖定位",
|
||||
backgroundImageTransparent: "背景圖透明",
|
||||
backgroundTransparent: "背景透明",
|
||||
backgroundImagePosition: "背景圖定位",
|
||||
backgroundImageTransparency: "背景圖透明度",
|
||||
backup: "備份",
|
||||
backupRestoreData: "備份/還原數據",
|
||||
backupRestoreDataPrompt:
|
||||
"如果要還原1.2.3及之前版本的備份數據,請在還原時選擇導入JSON格式的文件。",
|
||||
batchConvertAbsolutePath: "轉為絕對路徑",
|
||||
batchConvertRelativePath: "轉為相對路徑",
|
||||
"如果要還原 1.2.3 及之前版本的數據,請在還原時選擇導入 JSON 格式的文件。",
|
||||
batchConvertAbsolutePath: "批量轉為絕對路徑",
|
||||
batchConvertRelativePath: "批量轉為相對路徑",
|
||||
batchCopyTo: "批量復製到",
|
||||
batchDelete: "批量刪除",
|
||||
batchDeletePrompt: "是否批量刪除項目?",
|
||||
@ -360,7 +361,7 @@ let traditionalChinese = {
|
||||
bottom: "底部",
|
||||
byInitialLetter: "按首字母",
|
||||
byLastOpen: "按最後打開",
|
||||
byOpenNumber: "按打開次數",
|
||||
byOpenCount: "按打開次數",
|
||||
calculator: "計算器",
|
||||
cancel: "取消",
|
||||
cancelBatchOperation: "取消批量操作",
|
||||
@ -379,17 +380,19 @@ let traditionalChinese = {
|
||||
color: "顏色",
|
||||
columnNumber: "列數",
|
||||
commandLine: "命令行",
|
||||
commandLinePrompt1: "使用「> + 空格」進入命令行模式。",
|
||||
commandLinePrompt1: '在"快速搜索"或"搜索"中使用"> + 空格"進入命令行模式。',
|
||||
commandPrompt: "命令提示符",
|
||||
computer: "計算機",
|
||||
computerManagement: "計算機管理",
|
||||
controlPanel: "控製面板",
|
||||
convertAbsolutePath: "轉為絕對路徑",
|
||||
convertRelativePath: "轉為相對路徑",
|
||||
copy: "復製",
|
||||
copyFullPath: "復製完整路徑",
|
||||
copyTo: "復製到",
|
||||
createShortcut: "創建快捷方式",
|
||||
ctrlNumberKey: "Ctrl + 數字鍵",
|
||||
cut: "剪切",
|
||||
default: "默認",
|
||||
defaultIcon: "默認圖標",
|
||||
delayDisplay: "延遲顯示",
|
||||
@ -401,7 +404,7 @@ let traditionalChinese = {
|
||||
deleteHistory: "刪除歷史記錄",
|
||||
description: "描述",
|
||||
display: "顯示",
|
||||
displayMainWindow: "顯示主界面",
|
||||
displayMainInterface: "顯示主界面",
|
||||
documents: "文檔",
|
||||
doubleClickOpen: "雙擊打開",
|
||||
doubleClickTaskbar: "雙擊任務欄",
|
||||
@ -416,6 +419,7 @@ let traditionalChinese = {
|
||||
editSubclassification: "編輯子分類",
|
||||
emptyRecycleBin: "清空回收站",
|
||||
enable: "啟用",
|
||||
enableQuickSearch: "啟用快速搜索",
|
||||
english: "英語",
|
||||
excludeSearch: "排除搜索",
|
||||
exit: "退出",
|
||||
@ -443,11 +447,12 @@ let traditionalChinese = {
|
||||
globalShortcutKey: "全局快捷鍵",
|
||||
hiddenItems: "隱藏項",
|
||||
hideEllipses: "隱藏省略號",
|
||||
hideLoseFocus: "失去焦點後隱藏",
|
||||
hideLoseFocus: "失去焦點隱藏",
|
||||
hideName: "隱藏名稱",
|
||||
hideTray: "隱藏托盤圖標",
|
||||
hideTaskbar: "隱藏任務欄",
|
||||
hideWindowCollapseSubClassification: "隱藏窗口時收起子分類",
|
||||
hideWindowCollapseSubClassification: "隱藏窗口收起子分類",
|
||||
hideWindowAfterOpen: "打開後隱藏窗口",
|
||||
history: "歷史記錄",
|
||||
hover: "懸停",
|
||||
icon: "圖標",
|
||||
@ -501,29 +506,29 @@ let traditionalChinese = {
|
||||
"開啟勿擾模式後,計算機在遊戲、應用全屏模式下不會彈出 Dawn Launcher 窗口。",
|
||||
notFoundFile: "找不到指定的文件",
|
||||
notFoundFolder: "找不到指定的文件夾",
|
||||
notTransparent: "不透明",
|
||||
number: "數量",
|
||||
numberKey: "數字鍵",
|
||||
officialWebsite: "官方網站",
|
||||
ok: "確定",
|
||||
open: "打開",
|
||||
openAfterHideMainInterface: "打開後隱藏主界面",
|
||||
openAfterHideQuickSearchWindow: "打開後隱藏窗口",
|
||||
openFileLocation: "打開文件所在位置",
|
||||
openNow: "僅剩一項時立即打開",
|
||||
openNumber: "打開次數",
|
||||
openNow: "僅剩一項立即打開",
|
||||
openCount: "打開次數",
|
||||
parameters: "參數",
|
||||
password: "密碼",
|
||||
pasteIcon: "粘貼圖標",
|
||||
paste: "粘貼",
|
||||
path: "路徑",
|
||||
powerOptions: "電源選項",
|
||||
powerShell: "PowerShell",
|
||||
programsFeatures: "程序和功能",
|
||||
proxy: "代理",
|
||||
proxyPrompt:
|
||||
"僅支持HTTP代理,填寫「地址」時需要帶通信協議和端口,例如:http://127.0.0.1:7890,如果沒有用戶名和密碼,為空即可。",
|
||||
'僅支持 HTTP 代理,填寫"地址"時需要帶通信協議和端口,例如:http://127.0.0.1:7890,如果沒有用戶名和密碼,為空即可。',
|
||||
prompt: "提示",
|
||||
quickSearch: "快速搜索",
|
||||
recordOpenNumber: "記錄打開次數",
|
||||
recordOpenCount: "記錄打開次數",
|
||||
recycleBin: "回收站",
|
||||
refreshIcon: "刷新圖標",
|
||||
registryEditor: "註冊表編輯器",
|
||||
@ -534,7 +539,6 @@ let traditionalChinese = {
|
||||
restart: "重啟",
|
||||
restore: "還原",
|
||||
restoreDataPrompt: "還原數據失敗。",
|
||||
rewardSponsor: "打賞&贊助",
|
||||
right: "右側",
|
||||
roundedCorners: "圓角",
|
||||
runAsAdministrator: "以管理員身份運行",
|
||||
@ -582,10 +586,9 @@ let traditionalChinese = {
|
||||
startupTray: "啟動後最小化到系統托盤",
|
||||
subclassification: "子分類",
|
||||
svgIcon: "SVG圖標",
|
||||
svgIconPrompt1: "輸入SVG代碼後,需要先點擊「校驗代碼」按鈕。",
|
||||
svgIconPrompt1: '輸入 SVG 代碼後,需要先點擊"校驗代碼"按鈕。',
|
||||
switch: "切換",
|
||||
switchClassificationCollapseOtherSubClassification:
|
||||
"切換分類時收起其他子分類",
|
||||
switchClassificationCollapseOtherSubClassification: "切換分類收起其他子分類",
|
||||
switchEnglish: "顯示窗口時將輸入法切換為英文模式",
|
||||
system: "系統",
|
||||
target: "目標",
|
||||
@ -596,14 +599,14 @@ let traditionalChinese = {
|
||||
title: "標題",
|
||||
top: "頂部",
|
||||
traditionalChinese: "繁體中文",
|
||||
transparent: "透明",
|
||||
turnOffMonitor: "關閉顯示器",
|
||||
unlockClassification: "解鎖分類",
|
||||
unlockItem: "解鎖項目",
|
||||
uploadIcon: "上傳圖標",
|
||||
url: "網址",
|
||||
useItemOpen: "從程序外拖動文件到項目圖標上時用此項目打開文件",
|
||||
useItemOpen: "從程序外拖動文件到項目圖標上用此項目打開文件",
|
||||
useProxy: "使用代理",
|
||||
useQuickSearch: "使用快速搜索",
|
||||
username: "用戶名",
|
||||
update: "更新",
|
||||
webSearch: "網絡搜索",
|
||||
@ -612,6 +615,7 @@ let traditionalChinese = {
|
||||
webSearchModePrompt2: "{w}為搜索關鍵字。",
|
||||
width: "寬度",
|
||||
window: "窗口",
|
||||
windowTransparency: "窗口透明度",
|
||||
zoom: "縮放",
|
||||
};
|
||||
|
||||
@ -622,44 +626,44 @@ let english = {
|
||||
address: "Address",
|
||||
aggregateClassification: "Aggregate Classification",
|
||||
aggregateClassificationPrompt1:
|
||||
"Aggregation classification can aggregate items under all categories together, sort and display them according to the set sorting method and number of items.",
|
||||
"Aggregate classification will combine items from all classifications and display them according to the set sorting order and item count.",
|
||||
aggregateClassificationPrompt2:
|
||||
"The current classification is the parent classification, and aggregate classification cannot be set.",
|
||||
"The current classification is a parent classification and cannot be set as an aggregate classification.",
|
||||
aggregateClassificationPrompt3:
|
||||
"The current settings are sorted by the number of opens. You need to enable Settings-Item-Open Count the number of opens.",
|
||||
"The current sorting is set to by open count. You need to enable Settings - Item - Record open count.",
|
||||
aggregateClassificationPrompt4:
|
||||
"Setting an aggregation classification will clear all items under the original classification. Please operate with caution. Are you sure?",
|
||||
"Setting an aggregate classification will clear all items under the original classification. Please proceed with caution. Are you sure?",
|
||||
align: "Align",
|
||||
all: "All",
|
||||
altNumberKey: "Alt + Number Key",
|
||||
alwaysCenter: "Always Center",
|
||||
alwaysTop: "Always Top",
|
||||
alwaysTop: "Always on Top",
|
||||
appearance: "Appearance",
|
||||
appx: "Appx",
|
||||
associateFolder: "Associate Folder",
|
||||
associateFolderPrompt1:
|
||||
"Associate folder can monitor changes in the specified folder in real time and synchronize them to the corresponding classification.",
|
||||
"Associate folder can monitor changes in the specified folder in real-time and synchronize them with the corresponding classification.",
|
||||
associateFolderPrompt2:
|
||||
"Name of the file/folder to be hidden, multiple separated by commas",
|
||||
associateFolderPrompt3:
|
||||
"The current classification is the parent classification and associate folder cannot be set.",
|
||||
"The current classification is a parent classification and cannot be set as an associate folder.",
|
||||
associateFolderPrompt4: "The target path does not exist.",
|
||||
associateFolderPrompt5: "The destination path must be a folder.",
|
||||
associateFolderPrompt6:
|
||||
"Setting the associate folder will clear all items under the original classification. Please operate with caution. Are you sure?",
|
||||
"Setting an associate folder will clear all items under the original classification. Please proceed with caution. Are you sure?",
|
||||
associateFolderPrompt7:
|
||||
"The target path is empty. The current classification will be automatically converted to a normal classification. Are you sure?",
|
||||
autoSwitchClassification: "Auto Switch Classification on Scroll",
|
||||
"The target path is empty. The current classification will be automatically converted to a regular classification. Are you sure?",
|
||||
autoSwitchClassification:
|
||||
"Automatically switch classification when the item list scrolls to the bottom or top",
|
||||
backgroundIcon: "Background Icon",
|
||||
backgroundImage: "Background Image",
|
||||
backgroundImageMode: "Background Image Mode",
|
||||
backgroundImagePostion: "Background Image Postion",
|
||||
backgroundImageTransparent: "Background Image Transparent",
|
||||
backgroundTransparent: "Background Transparent",
|
||||
backgroundImagePosition: "Background Image Position",
|
||||
backgroundImageTransparency: "Background Image Transparency",
|
||||
backup: "Backup",
|
||||
backupRestoreData: "Backup/Restore Data",
|
||||
backupRestoreDataPrompt:
|
||||
"If you want to restore the backup data of versions 1.2.3 and earlier, please choose to import a file in JSON format when restoring.",
|
||||
"To restore data from version 1.2.3 and earlier, please choose to import a JSON file during the restoration process.",
|
||||
batchConvertAbsolutePath: "Batch Convert to Absolute Path",
|
||||
batchConvertRelativePath: "Batch Convert to Relative Path",
|
||||
batchCopyTo: "Batch Copy to",
|
||||
@ -670,9 +674,9 @@ let english = {
|
||||
batchRefreshIcon: "Batch Refresh Icon",
|
||||
borderColor: "Border Color",
|
||||
bottom: "Bottom",
|
||||
byInitialLetter: "by Initial Letter",
|
||||
byLastOpen: "by Last Open",
|
||||
byOpenNumber: "by Open Count",
|
||||
byInitialLetter: "By Initial Letter",
|
||||
byLastOpen: "By Last Open",
|
||||
byOpenCount: "By Open Count",
|
||||
calculator: "Calculator",
|
||||
cancel: "Cancel",
|
||||
cancelBatchOperation: "Cancel Batch Operation",
|
||||
@ -681,10 +685,10 @@ let english = {
|
||||
checkInvalidItem: "Check for Invalid Items",
|
||||
checkUpdates: "Check Updates",
|
||||
checkUpdatesPrompt1:
|
||||
'Check that there is a new version, click "OK" to jump to the official website to download the latest version.',
|
||||
checkUpdatesPrompt2: "It is currently the latest version.",
|
||||
"A new version has been detected. Click 'OK' to go to the official website and download the latest version.",
|
||||
checkUpdatesPrompt2: "You are already on the latest version.",
|
||||
checkUpdatesPrompt3:
|
||||
"Failed to check for updates, please confirm the network.",
|
||||
"Update check failed. Please check your network connection.",
|
||||
classification: "Classification",
|
||||
clear: "Clear",
|
||||
close: "Close",
|
||||
@ -693,17 +697,20 @@ let english = {
|
||||
color: "Color",
|
||||
columnNumber: "Column Number",
|
||||
commandLine: "Command Line",
|
||||
commandLinePrompt1: 'Use "> + space" to enter command line mode.',
|
||||
commandLinePrompt1:
|
||||
'Use "> + Space" in "Quick Search" or "Search" to enter command-line mode.',
|
||||
commandPrompt: "Command Prompt",
|
||||
computer: "Computer",
|
||||
computerManagement: "Computer Management",
|
||||
controlPanel: "Control Panel",
|
||||
convertAbsolutePath: "Convert to Absolute Path",
|
||||
convertRelativePath: "Convert to Relative Path",
|
||||
copy: "Copy",
|
||||
copyFullPath: "Copy Full Path",
|
||||
copyTo: "Copy to",
|
||||
createShortcut: "Create Shortcut",
|
||||
ctrlNumberKey: "Ctrl + Number Key",
|
||||
cut: "Cut",
|
||||
default: "Default",
|
||||
defaultIcon: "Default Icon",
|
||||
delayDisplay: "Delay Display",
|
||||
@ -715,14 +722,14 @@ let english = {
|
||||
deleteHistory: "Delete History",
|
||||
description: "Description",
|
||||
display: "Display",
|
||||
displayMainWindow: "Display Main Interface",
|
||||
displayMainInterface: "Display Main Interface",
|
||||
documents: "Documents",
|
||||
doubleClickOpen: "Double Click Open",
|
||||
doubleClickTaskbar: "Double Click Taskbar",
|
||||
downloadImagePrompt1: "Failed to download image.",
|
||||
downloadImagePrompt2: "The link is not in image format.",
|
||||
dontPromptAgain: "Don't prompt again",
|
||||
edgeAutoHide: "Auto Hide at Desktop Edge",
|
||||
edgeAutoHide: "Automatically hide when docked to the edge of the desktop",
|
||||
edgeDock: "Edge Dock",
|
||||
edit: "Edit",
|
||||
editClassification: "Edit Classification",
|
||||
@ -730,6 +737,7 @@ let english = {
|
||||
editSubclassification: "Edit Subclassification",
|
||||
emptyRecycleBin: "Empty Recycle Bin",
|
||||
enable: "Enable",
|
||||
enableQuickSearch: "Enable Quick Search",
|
||||
english: "English",
|
||||
excludeSearch: "Exclude Search",
|
||||
exit: "Exit",
|
||||
@ -757,23 +765,24 @@ let english = {
|
||||
globalShortcutKey: "Global Shortcut Key",
|
||||
hiddenItems: "Hidden Items",
|
||||
hideEllipses: "Hide Ellipses",
|
||||
hideLoseFocus: "Hide After Lose Focus",
|
||||
hideLoseFocus: "Loss of Focus Hide",
|
||||
hideName: "Hide Name",
|
||||
hideTray: "Hide Tray",
|
||||
hideTray: "Hide Tray Icon",
|
||||
hideTaskbar: "Hide Taskbar",
|
||||
hideWindowCollapseSubClassification:
|
||||
"Collapse Subclassification when Hide Window",
|
||||
"Collapse subclassifications when the window is hidden",
|
||||
hideWindowAfterOpen: "Hide Window After Opening",
|
||||
history: "History",
|
||||
hover: "Hover",
|
||||
icon: "Icon",
|
||||
imageLink: "Image Link",
|
||||
item: "Item",
|
||||
itemAddEditPrompt1:
|
||||
"After selecting the fixed icon, the current project will not participate in refreshing the icon.",
|
||||
itemAddEditPrompt2: "Leave it blank if there are no special requirements",
|
||||
"After selecting a fixed icon, the current item will not participate in icon refreshing.",
|
||||
itemAddEditPrompt2: "Leave empty if there are no special requirements",
|
||||
itemAddEditPrompt3: "Add successfully.",
|
||||
itemAddEditPrompt4: "The target does not exist.",
|
||||
itemAddEditPrompt5: "Failed to obtain URL information.",
|
||||
itemAddEditPrompt5: "Failed to retrieve website information.",
|
||||
itemList: "Item List",
|
||||
keyword: "Keyword",
|
||||
keywordSpace: "Leyword + Space",
|
||||
@ -803,7 +812,7 @@ let english = {
|
||||
name: "Name",
|
||||
network: "Network",
|
||||
networkIcon: "Network Icon",
|
||||
networkIconPrompt1: "Supports JPG/JPEG/GIF/PNG/ICO/SVG/WEBP format images.",
|
||||
networkIconPrompt1: "Supports JPG/JPEG/GIF/PNG/ICO/SVG/WEBP image formats.",
|
||||
networkShareCenter: "Network Share Center",
|
||||
newClassification: "New Classification",
|
||||
newClassificationName: "New Classification",
|
||||
@ -814,22 +823,22 @@ let english = {
|
||||
normal: "Normal",
|
||||
notDisturb: "Not Disturb Mode",
|
||||
notDisturbPrompt:
|
||||
"After turning on Do Not Disturb mode, the Dawn Launcher window will not pop up when the computer is in full-screen mode for games or applications.",
|
||||
"After enabling Do Not Disturb mode, Dawn Launcher will not pop up during full-screen games or applications.",
|
||||
notFoundFile: "The file specified cannot be found",
|
||||
notFoundFolder: "The specified folder cannot be found",
|
||||
notTransparent: "Not Transparent",
|
||||
number: "Number",
|
||||
numberKey: "Number Key",
|
||||
officialWebsite: "Official Website",
|
||||
ok: "OK",
|
||||
open: "Open",
|
||||
openAfterHideMainInterface: "Hide Main Interface After Open",
|
||||
openAfterHideQuickSearchWindow: "Hide Window After Open",
|
||||
openFileLocation: "Open File Location",
|
||||
openNow: "Open when Only One Item",
|
||||
openNumber: "Open Count",
|
||||
openNow: "Only one item left to open immediately",
|
||||
openCount: "Open Count",
|
||||
parameters: "Parameters",
|
||||
password: "Password",
|
||||
pasteIcon: "Paste Icon",
|
||||
paste: "Paste",
|
||||
path: "Path",
|
||||
powerOptions: "Power Options",
|
||||
powerShell: "PowerShell",
|
||||
@ -839,7 +848,7 @@ let english = {
|
||||
'Only HTTP proxy is supported. When filling in the "address", you need to include the communication protocol and port, for example: http://127.0.0.1:7890. If there is no username and password, just leave it blank.',
|
||||
prompt: "Prompt",
|
||||
quickSearch: "Quick Search",
|
||||
recordOpenNumber: "Record Open Count",
|
||||
recordOpenCount: "Record Open Count",
|
||||
recycleBin: "Recycle Bin",
|
||||
refreshIcon: "Refresh Icon",
|
||||
registryEditor: "Registry Editor",
|
||||
@ -850,7 +859,6 @@ let english = {
|
||||
restart: "Restart",
|
||||
restore: "Restore",
|
||||
restoreDataPrompt: "Failed to restore data.",
|
||||
rewardSponsor: "Reward&Sponsor",
|
||||
right: "Right",
|
||||
roundedCorners: "Rounded Corners",
|
||||
runAsAdministrator: "Run as Administrator",
|
||||
@ -891,7 +899,7 @@ let english = {
|
||||
'It conflicts with the "Show/Hide" shortcut key in "Settings-Quick Search", please reset it.',
|
||||
shortcutKeyPrompt7: "Invaild symbol.",
|
||||
show: "Show",
|
||||
showFollowMousePosition: "Follows Mouse Position on Display",
|
||||
showFollowMousePosition: "Follow the mouse position when displayed",
|
||||
showHide: "Show/Hide",
|
||||
showOnlyFiles: "Show Only Files",
|
||||
showOnlyFolders: "Show Only Folders",
|
||||
@ -905,15 +913,16 @@ let english = {
|
||||
startLocation: "Start Location",
|
||||
startMenu: "Start Menu",
|
||||
startup: "Startup",
|
||||
startupTray: "Minimize to System Tray on Startup",
|
||||
startupTray: "Minimize to system tray on startup",
|
||||
subclassification: "Subclassification",
|
||||
svgIcon: "SVG Icon",
|
||||
svgIconPrompt1:
|
||||
'After entering the SVG code, you need to click the "Check Code" button first.',
|
||||
'After entering SVG code, you need to click the "Validate Code" button first.',
|
||||
switch: "Switch",
|
||||
switchClassificationCollapseOtherSubClassification:
|
||||
"Collapse Other Subclassification on Classification Switch",
|
||||
switchEnglish: "Switch to English Input on Window Display",
|
||||
"Collapse other subclassifications when switching classifications",
|
||||
switchEnglish:
|
||||
"Switch the input method to English mode when the window is displayed",
|
||||
system: "System",
|
||||
target: "Target",
|
||||
taskManager: "Task Manager",
|
||||
@ -923,14 +932,15 @@ let english = {
|
||||
title: "Title",
|
||||
top: "Top",
|
||||
traditionalChinese: "Traditional Chinese",
|
||||
transparent: "Transparent",
|
||||
turnOffMonitor: "Turn Off Monitor",
|
||||
unlockClassification: "Unlock Classification",
|
||||
unlockItem: "Unlock Item",
|
||||
uploadIcon: "Upload Icon",
|
||||
url: "URL",
|
||||
useItemOpen: "Use This Item to Open Dragged Files",
|
||||
useItemOpen:
|
||||
"Open files with this item when dragging files from outside the program to the item icon",
|
||||
useProxy: "Use Proxy",
|
||||
useQuickSearch: "Use Quick Search",
|
||||
username: "Username",
|
||||
update: "Update",
|
||||
webSearch: "Web Search",
|
||||
@ -939,6 +949,7 @@ let english = {
|
||||
webSearchModePrompt2: "{w} is the search keyword.",
|
||||
width: "Width",
|
||||
window: "Window",
|
||||
windowTransparency: "Window Transparency",
|
||||
zoom: "Zoom",
|
||||
};
|
||||
|
||||
|
@ -3,83 +3,83 @@ import { Theme } from "../../types/setting";
|
||||
const themeList: Array<Theme> = [
|
||||
{
|
||||
name: "#FFFFFF",
|
||||
mainFontColor: "#505050FF",
|
||||
secondFontColor: "#505050FF",
|
||||
mainBackgroundColor: "#FFFFFFFF",
|
||||
secondBackgroundColor: "#DCDEDFFF",
|
||||
borderColor: "#F0F0F0FF",
|
||||
mainFontColor: "#505050",
|
||||
secondFontColor: "#505050",
|
||||
mainBackgroundColor: "#FFFFFF",
|
||||
secondBackgroundColor: "#DCDEDF",
|
||||
borderColor: "#F0F0F0",
|
||||
},
|
||||
{
|
||||
name: "#2B2B2B",
|
||||
mainFontColor: "#BBBBBBFF",
|
||||
secondFontColor: "#BBBBBBFF",
|
||||
mainBackgroundColor: "#2B2B2BFF",
|
||||
secondBackgroundColor: "#3C3F41FF",
|
||||
borderColor: "#373737FF",
|
||||
mainFontColor: "#BBBBBB",
|
||||
secondFontColor: "#BBBBBB",
|
||||
mainBackgroundColor: "#2B2B2B",
|
||||
secondBackgroundColor: "#3C3F41",
|
||||
borderColor: "#373737",
|
||||
},
|
||||
{
|
||||
name: "#508CC8",
|
||||
mainFontColor: "#FFFFFFFF",
|
||||
secondFontColor: "#FFFFFFFF",
|
||||
mainBackgroundColor: "#508CC8FF",
|
||||
secondBackgroundColor: "#6FA0D2FF",
|
||||
borderColor: "#5A94CDFF",
|
||||
mainFontColor: "#FFFFFF",
|
||||
secondFontColor: "#FFFFFF",
|
||||
mainBackgroundColor: "#508CC8",
|
||||
secondBackgroundColor: "#6FA0D2",
|
||||
borderColor: "#5A94CD",
|
||||
},
|
||||
{
|
||||
name: "#024351",
|
||||
mainFontColor: "#FFFFFFFF",
|
||||
secondFontColor: "#FFFFFFFF",
|
||||
mainBackgroundColor: "#024351FF",
|
||||
secondBackgroundColor: "#025A6CFF",
|
||||
borderColor: "#064D5CFF",
|
||||
mainFontColor: "#FFFFFF",
|
||||
secondFontColor: "#FFFFFF",
|
||||
mainBackgroundColor: "#024351",
|
||||
secondBackgroundColor: "#025A6C",
|
||||
borderColor: "#064D5C",
|
||||
},
|
||||
{
|
||||
name: "#516FA3",
|
||||
mainFontColor: "#FFFFFFFF",
|
||||
secondFontColor: "#FFFFFFFF",
|
||||
mainBackgroundColor: "#516FA3FF",
|
||||
secondBackgroundColor: "#91A8D0FF",
|
||||
borderColor: "#5D78A7FF",
|
||||
mainFontColor: "#FFFFFF",
|
||||
secondFontColor: "#FFFFFF",
|
||||
mainBackgroundColor: "#516FA3",
|
||||
secondBackgroundColor: "#91A8D0",
|
||||
borderColor: "#5D78A7",
|
||||
},
|
||||
{
|
||||
name: "#45326E",
|
||||
mainFontColor: "#FFFFFFFF",
|
||||
secondFontColor: "#FFFFFFFF",
|
||||
mainBackgroundColor: "#45326EFF",
|
||||
secondBackgroundColor: "#5F4B8BFF",
|
||||
borderColor: "#4C3A73FF",
|
||||
mainFontColor: "#FFFFFF",
|
||||
secondFontColor: "#FFFFFF",
|
||||
mainBackgroundColor: "#45326E",
|
||||
secondBackgroundColor: "#5F4B8B",
|
||||
borderColor: "#4C3A73",
|
||||
},
|
||||
{
|
||||
name: "#693030",
|
||||
mainFontColor: "#FFFFFFFF",
|
||||
secondFontColor: "#FFFFFFFF",
|
||||
mainBackgroundColor: "#693030FF",
|
||||
secondBackgroundColor: "#955151FF",
|
||||
borderColor: "#733535FF",
|
||||
mainFontColor: "#FFFFFF",
|
||||
secondFontColor: "#FFFFFF",
|
||||
mainBackgroundColor: "#693030",
|
||||
secondBackgroundColor: "#955151",
|
||||
borderColor: "#733535",
|
||||
},
|
||||
{
|
||||
name: "#9F2F4A",
|
||||
mainFontColor: "#FFFFFFFF",
|
||||
secondFontColor: "#FFFFFFFF",
|
||||
mainBackgroundColor: "#9F2F4AFF",
|
||||
secondBackgroundColor: "#EA6F8CFF",
|
||||
borderColor: "#AD3350FF",
|
||||
mainFontColor: "#FFFFFF",
|
||||
secondFontColor: "#FFFFFF",
|
||||
mainBackgroundColor: "#9F2F4A",
|
||||
secondBackgroundColor: "#EA6F8C",
|
||||
borderColor: "#AD3350",
|
||||
},
|
||||
{
|
||||
name: "#000000,#FFDB00",
|
||||
mainFontColor: "#B3B3B3FF",
|
||||
secondFontColor: "#000000FF",
|
||||
mainBackgroundColor: "#000000FF",
|
||||
secondBackgroundColor: "#FFDB00FF",
|
||||
borderColor: "#1D1D1DFF",
|
||||
mainFontColor: "#B3B3B3",
|
||||
secondFontColor: "#000000",
|
||||
mainBackgroundColor: "#000000",
|
||||
secondBackgroundColor: "#FFDB00",
|
||||
borderColor: "#1D1D1D",
|
||||
},
|
||||
{
|
||||
name: "#000000,#FFFFFF",
|
||||
mainFontColor: "#B3B3B3FF",
|
||||
secondFontColor: "#000000FF",
|
||||
mainBackgroundColor: "#000000FF",
|
||||
secondBackgroundColor: "#FFFFFFFF",
|
||||
borderColor: "#1D1D1DFF",
|
||||
mainFontColor: "#B3B3B3",
|
||||
secondFontColor: "#000000",
|
||||
mainBackgroundColor: "#000000",
|
||||
secondBackgroundColor: "#FFFFFF",
|
||||
borderColor: "#1D1D1D",
|
||||
},
|
||||
];
|
||||
|
||||
|
@ -14,7 +14,7 @@ function convert<F, T>(from: F): T {
|
||||
* @returns
|
||||
*/
|
||||
function isAbsolutePath(path: string) {
|
||||
const regex = /^[a-zA-Z]:\\/;
|
||||
const regex = /^[a-zA-Z]:\\|^\\\\/;
|
||||
return regex.test(path);
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,8 @@
|
||||
import { resolve, dirname, parse } from "node:path";
|
||||
import { resolve, dirname, parse, join } from "node:path";
|
||||
import { isAbsolutePath } from "../../commons/utils/common";
|
||||
import mime from "mime";
|
||||
import { readFileSync } from "node:fs";
|
||||
import icojs from "icojs";
|
||||
|
||||
// 图标格式
|
||||
const iconExts = ["jpg", "jpeg", "png", "gif", "ico", "svg", "webp"];
|
||||
@ -59,12 +60,21 @@ function getURLParams(paramsMap: Map<string, any>) {
|
||||
function parseEnvPath(path: string) {
|
||||
// 尝试解析路径中的环境变量
|
||||
let parsedPath = parse(path);
|
||||
let isBase = false;
|
||||
// 路径数组
|
||||
let pathArr: Array<string> = [];
|
||||
// 判断是否是网络路径,以\\开头
|
||||
let isNetwork = false;
|
||||
if (path.indexOf("\\\\") === 0) {
|
||||
isNetwork = true;
|
||||
}
|
||||
// 是否是一级路径
|
||||
let isBase = false;
|
||||
if (!parsedPath.dir || parsedPath.dir.trim() === "") {
|
||||
// 如果为空代表路径只有一级,也就是当前文件本身,比如C:/1.txt
|
||||
pathArr = parsedPath.base.split("\\");
|
||||
isBase = true;
|
||||
} else {
|
||||
// 不为空代表有父级目录
|
||||
pathArr = parsedPath.dir.split("\\");
|
||||
}
|
||||
// 新路径
|
||||
@ -93,22 +103,24 @@ function parseEnvPath(path: string) {
|
||||
if (!isBase) {
|
||||
newPathArr.push(parsedPath.base);
|
||||
}
|
||||
// 拼接并返回
|
||||
return newPathArr.join("\\");
|
||||
// 拼接
|
||||
let newPath = join(...newPathArr);
|
||||
// 如果是网络路径,在最前面加\\
|
||||
if (isNetwork) {
|
||||
newPath = "\\\\" + newPath;
|
||||
}
|
||||
return newPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取绝对路径
|
||||
* @param path
|
||||
* 解析路径
|
||||
* @returns
|
||||
*/
|
||||
function getAbsolutePath(path: string) {
|
||||
if (!isAbsolutePath(path)) {
|
||||
function parsePath(path: string) {
|
||||
// 尝试解析环境变量
|
||||
let newPath = parseEnvPath(path);
|
||||
// 判断解析之后的路径是否是绝对路径
|
||||
if (isAbsolutePath(newPath)) {
|
||||
return newPath;
|
||||
} else {
|
||||
path = parseEnvPath(path);
|
||||
// 是否是相对路径
|
||||
if (!isAbsolutePath(path)) {
|
||||
return resolve(
|
||||
process.env.NODE_ENV === "development"
|
||||
? resolve(".")
|
||||
@ -116,7 +128,6 @@ function getAbsolutePath(path: string) {
|
||||
path
|
||||
);
|
||||
}
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
@ -124,7 +135,7 @@ function getAbsolutePath(path: string) {
|
||||
* 获取文件图标
|
||||
* @param filePath
|
||||
*/
|
||||
function getFileIcon(filePath: string | null) {
|
||||
async function getFileIcon(filePath: string | null) {
|
||||
// 图标
|
||||
let icon: string | null = null;
|
||||
if (filePath) {
|
||||
@ -133,6 +144,16 @@ function getFileIcon(filePath: string | null) {
|
||||
if (iconExts.includes(ext)) {
|
||||
// 读取文件
|
||||
let buffer = readFileSync(filePath);
|
||||
if (ext === "ico") {
|
||||
let images = await icojs.parseICO(buffer);
|
||||
const largestImage = images.reduce((max, current) => {
|
||||
if (current.width * current.height > max.width * max.height) {
|
||||
return current;
|
||||
}
|
||||
return max;
|
||||
});
|
||||
buffer = Buffer.from(largestImage.buffer);
|
||||
}
|
||||
icon =
|
||||
"data:" +
|
||||
mime.getType(filePath) +
|
||||
@ -146,10 +167,4 @@ function getFileIcon(filePath: string | null) {
|
||||
return icon;
|
||||
}
|
||||
|
||||
export {
|
||||
getURLParams,
|
||||
getAbsolutePath,
|
||||
getFileIcon,
|
||||
iconExts,
|
||||
getRandomUserAgent,
|
||||
};
|
||||
export { getURLParams, parsePath, getFileIcon, iconExts, getRandomUserAgent };
|
||||
|
@ -24,7 +24,11 @@ function createWindow() {
|
||||
fullscreenable: false,
|
||||
focusable: true,
|
||||
show: false,
|
||||
backgroundColor: getMainBackgorunColor(),
|
||||
transparent: global.setting.appearance.transparency < 1,
|
||||
backgroundColor:
|
||||
global.setting.appearance.transparency === 1
|
||||
? getMainBackgorunColor()
|
||||
: null,
|
||||
webPreferences: {
|
||||
spellcheck: false,
|
||||
preload: join(__dirname, "../preload/index.js"),
|
||||
|
@ -49,7 +49,11 @@ function createAddEditWindow(id: number | null, parentId: number | null) {
|
||||
fullscreenable: false,
|
||||
focusable: true,
|
||||
show: false,
|
||||
backgroundColor: getMainBackgorunColor(),
|
||||
transparent: global.setting.appearance.transparency < 1,
|
||||
backgroundColor:
|
||||
global.setting.appearance.transparency === 1
|
||||
? getMainBackgorunColor()
|
||||
: null,
|
||||
webPreferences: {
|
||||
spellcheck: false,
|
||||
preload: join(__dirname, "../preload/index.js"),
|
||||
@ -113,7 +117,11 @@ function createSetIconWindow(id: number) {
|
||||
fullscreenable: false,
|
||||
focusable: true,
|
||||
show: false,
|
||||
backgroundColor: getMainBackgorunColor(),
|
||||
transparent: global.setting.appearance.transparency < 1,
|
||||
backgroundColor:
|
||||
global.setting.appearance.transparency === 1
|
||||
? getMainBackgorunColor()
|
||||
: null,
|
||||
webPreferences: {
|
||||
spellcheck: false,
|
||||
preload: join(__dirname, "../preload/index.js"),
|
||||
@ -172,7 +180,11 @@ function createAssociateFolderWindow(id: number) {
|
||||
fullscreenable: false,
|
||||
focusable: true,
|
||||
show: false,
|
||||
backgroundColor: getMainBackgorunColor(),
|
||||
transparent: global.setting.appearance.transparency < 1,
|
||||
backgroundColor:
|
||||
global.setting.appearance.transparency === 1
|
||||
? getMainBackgorunColor()
|
||||
: null,
|
||||
webPreferences: {
|
||||
spellcheck: false,
|
||||
preload: join(__dirname, "../preload/index.js"),
|
||||
@ -236,7 +248,11 @@ function createAggregateWindow(id: number) {
|
||||
fullscreenable: false,
|
||||
focusable: true,
|
||||
show: false,
|
||||
backgroundColor: getMainBackgorunColor(),
|
||||
transparent: global.setting.appearance.transparency < 1,
|
||||
backgroundColor:
|
||||
global.setting.appearance.transparency === 1
|
||||
? getMainBackgorunColor()
|
||||
: null,
|
||||
webPreferences: {
|
||||
spellcheck: false,
|
||||
preload: join(__dirname, "../preload/index.js"),
|
||||
@ -528,7 +544,7 @@ function getItemSortMenu(classification: Classification) {
|
||||
if (global.setting.item.openNumber) {
|
||||
submenus.push(
|
||||
new MenuItem({
|
||||
label: global.language.byOpenNumber,
|
||||
label: global.language.byOpenCount,
|
||||
icon:
|
||||
classification.data.itemSort === "openNumber" && !hasChild
|
||||
? getDot()
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { Menu, MenuItem, ipcMain, dialog } from "electron";
|
||||
import { Menu, MenuItem, ipcMain } from "electron";
|
||||
import { Classification } from "../../../types/classification";
|
||||
import {
|
||||
createAddEditWindow,
|
||||
@ -27,7 +27,12 @@ import {
|
||||
batchUpdateFixed,
|
||||
} from "./data";
|
||||
import { setShortcutKey } from "../setting";
|
||||
import { closeWindow, getDot, sendToWebContent } from "../commons/index";
|
||||
import {
|
||||
closeWindow,
|
||||
getDot,
|
||||
sendToWebContent,
|
||||
showMessageBoxSync,
|
||||
} from "../commons/index";
|
||||
|
||||
export default function () {
|
||||
// 获取分类列表
|
||||
@ -248,13 +253,12 @@ export default function () {
|
||||
new MenuItem({
|
||||
label: global.language.delete,
|
||||
click: () => {
|
||||
let res = dialog.showMessageBoxSync(global.mainWindow, {
|
||||
message: global.language.deleteClassificationPrompt,
|
||||
buttons: [global.language.ok, global.language.cancel],
|
||||
type: "question",
|
||||
noLink: true,
|
||||
cancelId: 1,
|
||||
});
|
||||
let res = showMessageBoxSync(
|
||||
"mainWindow",
|
||||
global.language.deleteClassificationPrompt,
|
||||
"question",
|
||||
[global.language.ok, global.language.cancel]
|
||||
);
|
||||
if (res === 0) {
|
||||
// 删除数据
|
||||
if (del(classification.id)) {
|
||||
|
@ -9,6 +9,8 @@ import { isAbsolutePath } from "../../../commons/utils/common";
|
||||
import {
|
||||
BrowserWindow,
|
||||
Display,
|
||||
OpenDialogOptions,
|
||||
SaveDialogOptions,
|
||||
app,
|
||||
dialog,
|
||||
nativeImage,
|
||||
@ -81,6 +83,8 @@ function downloadImage(windowName: string, url: string) {
|
||||
headers: {
|
||||
"User-Agent": getRandomUserAgent(),
|
||||
},
|
||||
maxRedirects: 5,
|
||||
jar: true,
|
||||
},
|
||||
function (error, response, body) {
|
||||
if (operation.retry(error)) {
|
||||
@ -147,6 +151,8 @@ function getURLInfo(windowName: string, url: string, redirect: boolean) {
|
||||
headers: {
|
||||
"User-Agent": getRandomUserAgent(),
|
||||
},
|
||||
maxRedirects: 5,
|
||||
jar: true,
|
||||
},
|
||||
function (error, response, body) {
|
||||
if (operation.retry(error)) {
|
||||
@ -203,6 +209,9 @@ function analysisHTML(windowName: string, url: string, data: string) {
|
||||
let $ = cheerio.load(data);
|
||||
// 获取标题
|
||||
result.name = $("head").find("title").text();
|
||||
if (!result.name || result.name.trim() === "") {
|
||||
result.name = $("title").text();
|
||||
}
|
||||
// 获取图标URL
|
||||
let iconURL: string | null = null;
|
||||
let icon = $("link[rel='icon']");
|
||||
@ -245,6 +254,8 @@ function analysisHTML(windowName: string, url: string, data: string) {
|
||||
headers: {
|
||||
"User-Agent": getRandomUserAgent(),
|
||||
},
|
||||
maxRedirects: 5,
|
||||
jar: true,
|
||||
},
|
||||
function (error, response, body) {
|
||||
if (operation.retry(error)) {
|
||||
@ -264,6 +275,9 @@ function analysisHTML(windowName: string, url: string, data: string) {
|
||||
result.status = true;
|
||||
sendUrlInfo(windowName, result);
|
||||
} else {
|
||||
if (result.name && result.name.trim() !== "") {
|
||||
result.status = true;
|
||||
}
|
||||
sendUrlInfo(windowName, result);
|
||||
}
|
||||
}
|
||||
@ -422,20 +436,6 @@ function openAfterHideWindow(type: string) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 错误提示框
|
||||
* @param windowName
|
||||
* @param message
|
||||
*/
|
||||
function showErrorMessageBox(windowName: string, message: string) {
|
||||
dialog.showMessageBoxSync(getWindow(windowName), {
|
||||
message: message,
|
||||
buttons: [global.language.ok],
|
||||
type: "error",
|
||||
noLink: true,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 重启
|
||||
*/
|
||||
@ -494,6 +494,80 @@ function getWindowInScreen(window: BrowserWindow) {
|
||||
return inDisplays;
|
||||
}
|
||||
|
||||
/**
|
||||
* 通用对话框
|
||||
*/
|
||||
function showMessageBoxSync(
|
||||
windowName: string,
|
||||
message: string,
|
||||
type: "error" | "question" | "info",
|
||||
buttons: Array<string> | null
|
||||
) {
|
||||
// 记录状态
|
||||
if (windowName === "mainWindow") {
|
||||
global.mainWindowShowDialog = true;
|
||||
}
|
||||
let res = dialog.showMessageBoxSync(getWindow(windowName), {
|
||||
title: "Dawn Launcher",
|
||||
message: message,
|
||||
buttons: buttons,
|
||||
type: type,
|
||||
noLink: true,
|
||||
cancelId: 1,
|
||||
});
|
||||
// 删除状态
|
||||
if (windowName === "mainWindow") {
|
||||
global.mainWindowShowDialog = false;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
/**
|
||||
* 错误对话框
|
||||
*/
|
||||
function showErrorMessageBox(windowName: string, message: string) {
|
||||
showMessageBoxSync(windowName, message, "error", [global.language.ok]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 文件保存对话框
|
||||
*/
|
||||
function showSaveDialogSync(windowName: string, options: SaveDialogOptions) {
|
||||
// 记录状态
|
||||
if (windowName === "mainWindow") {
|
||||
global.mainWindowShowDialog = true;
|
||||
}
|
||||
let path = dialog.showSaveDialogSync(getWindow(windowName), options);
|
||||
// 删除状态
|
||||
if (windowName === "mainWindow") {
|
||||
global.mainWindowShowDialog = false;
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
/**
|
||||
* 选择文件/文件夹对话框
|
||||
*/
|
||||
function showOpenDialogSync(windowName: string, options: OpenDialogOptions) {
|
||||
// 记录状态
|
||||
if (windowName === "mainWindow") {
|
||||
global.mainWindowShowDialog = true;
|
||||
}
|
||||
let pathList = dialog.showOpenDialogSync(getWindow(windowName), options);
|
||||
// 删除状态
|
||||
if (windowName === "mainWindow") {
|
||||
global.mainWindowShowDialog = false;
|
||||
}
|
||||
return pathList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 窗口是否存在
|
||||
*/
|
||||
function mainWindowExist() {
|
||||
return global.mainWindow && !global.mainWindow.isDestroyed();
|
||||
}
|
||||
|
||||
export {
|
||||
downloadImage,
|
||||
getURLInfo,
|
||||
@ -505,9 +579,13 @@ export {
|
||||
sendToWebContent,
|
||||
closeAllChildProcess,
|
||||
openAfterHideWindow,
|
||||
showErrorMessageBox,
|
||||
relaunch,
|
||||
getUserDataPath,
|
||||
getMainBackgorunColor,
|
||||
getWindowInScreen,
|
||||
showMessageBoxSync,
|
||||
showErrorMessageBox,
|
||||
showSaveDialogSync,
|
||||
showOpenDialogSync,
|
||||
mainWindowExist,
|
||||
};
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { app, dialog, ipcMain, OpenDialogSyncOptions, shell } from "electron";
|
||||
import { app, ipcMain, Menu, OpenDialogSyncOptions, shell } from "electron";
|
||||
import { getFileIcon } from "../../commons/utils";
|
||||
import mime from "mime";
|
||||
import { ShortcutInfo } from "../../../types/common";
|
||||
@ -8,9 +8,10 @@ import {
|
||||
getURLInfo,
|
||||
sendToWebContent,
|
||||
showErrorMessageBox,
|
||||
showMessageBoxSync,
|
||||
showOpenDialogSync,
|
||||
} from ".";
|
||||
import { statSync } from "node:fs";
|
||||
import { getWindow } from "../commons/index";
|
||||
|
||||
export default function () {
|
||||
// emit
|
||||
@ -23,23 +24,17 @@ export default function () {
|
||||
});
|
||||
// 信息提示框
|
||||
ipcMain.on("showInfoMessageBox", (event, args) => {
|
||||
dialog.showMessageBoxSync(getWindow(args.windowName), {
|
||||
message: args.message,
|
||||
buttons: [global.language.ok],
|
||||
type: "info",
|
||||
noLink: true,
|
||||
});
|
||||
showMessageBoxSync(args.windowName, args.message, "info", [
|
||||
global.language.ok,
|
||||
]);
|
||||
});
|
||||
// 对话框
|
||||
ipcMain.on("showConfirmBox", (event, args) => {
|
||||
// 弹出对话框
|
||||
let res = dialog.showMessageBoxSync(getWindow(args.windowName), {
|
||||
message: args.message,
|
||||
buttons: [global.language.ok, global.language.cancel],
|
||||
type: "question",
|
||||
noLink: true,
|
||||
cancelId: 1,
|
||||
});
|
||||
let res = showMessageBoxSync(args.windowName, args.message, "question", [
|
||||
global.language.ok,
|
||||
global.language.cancel,
|
||||
]);
|
||||
event.returnValue = res === 0;
|
||||
});
|
||||
// 选择文件
|
||||
@ -57,10 +52,7 @@ export default function () {
|
||||
} else {
|
||||
options.defaultPath = app.getPath("desktop");
|
||||
}
|
||||
let filePathList = dialog.showOpenDialogSync(
|
||||
getWindow(windowName),
|
||||
options
|
||||
);
|
||||
let filePathList = showOpenDialogSync(windowName, options);
|
||||
if (filePathList && filePathList.length > 0) {
|
||||
let filePath = filePathList[0];
|
||||
if (target) {
|
||||
@ -94,7 +86,7 @@ export default function () {
|
||||
} else {
|
||||
options.defaultPath = app.getPath("desktop");
|
||||
}
|
||||
let dirPathList = dialog.showOpenDialogSync(getWindow(windowName), options);
|
||||
let dirPathList = showOpenDialogSync(windowName, options);
|
||||
if (dirPathList && dirPathList.length > 0) {
|
||||
let dirPath = dirPathList[0];
|
||||
event.returnValue = dirPath;
|
||||
@ -103,14 +95,14 @@ export default function () {
|
||||
}
|
||||
});
|
||||
// 获取图标
|
||||
ipcMain.on("getFileIcon", (event, args) => {
|
||||
ipcMain.on("getFileIcon", async (event, args) => {
|
||||
// 窗口名称
|
||||
let windowName: string = args.windowName;
|
||||
// 路径
|
||||
let filePath: string | null = args.path;
|
||||
if (filePath) {
|
||||
// 图标
|
||||
let icon: string | null = getFileIcon(filePath);
|
||||
let icon: string | null = await getFileIcon(filePath);
|
||||
// 发送到页面
|
||||
sendToWebContent(windowName, "onGetFileIcon", icon);
|
||||
}
|
||||
@ -172,4 +164,24 @@ export default function () {
|
||||
app.getPath("home")
|
||||
);
|
||||
});
|
||||
// 文本框菜单
|
||||
ipcMain.on("textRightMenu", (event, args) => {
|
||||
// 菜单
|
||||
let menu = Menu.buildFromTemplate([
|
||||
{
|
||||
role: "cut",
|
||||
label: global.language.cut,
|
||||
},
|
||||
{
|
||||
role: "copy",
|
||||
label: global.language.copy,
|
||||
},
|
||||
{
|
||||
role: "paste",
|
||||
label: global.language.paste,
|
||||
},
|
||||
]);
|
||||
// 显示
|
||||
menu.popup();
|
||||
});
|
||||
}
|
||||
|
@ -25,7 +25,11 @@ function createBackupRestoreDataWindow() {
|
||||
fullscreenable: false,
|
||||
focusable: true,
|
||||
show: false,
|
||||
backgroundColor: getMainBackgorunColor(),
|
||||
transparent: global.setting.appearance.transparency < 1,
|
||||
backgroundColor:
|
||||
global.setting.appearance.transparency === 1
|
||||
? getMainBackgorunColor()
|
||||
: null,
|
||||
webPreferences: {
|
||||
spellcheck: false,
|
||||
preload: join(__dirname, "../preload/index.js"),
|
||||
|
@ -1,6 +1,12 @@
|
||||
import { dialog, ipcMain } from "electron";
|
||||
import { ipcMain } from "electron";
|
||||
import { backupData, createBackupRestoreDataWindow } from ".";
|
||||
import { closeWindow, relaunch, showErrorMessageBox } from "../commons";
|
||||
import {
|
||||
closeWindow,
|
||||
relaunch,
|
||||
showErrorMessageBox,
|
||||
showOpenDialogSync,
|
||||
showSaveDialogSync,
|
||||
} from "../commons";
|
||||
import { restore } from "./data";
|
||||
import { rmSync } from "node:fs";
|
||||
|
||||
@ -22,7 +28,7 @@ export default function () {
|
||||
// 备份数据
|
||||
ipcMain.on("backupData", () => {
|
||||
try {
|
||||
let filePath = dialog.showSaveDialogSync(global.backupRestoreDataWindow, {
|
||||
let filePath = showSaveDialogSync("backupRestoreDataWindow", {
|
||||
defaultPath: "Data",
|
||||
filters: [{ name: "DB", extensions: ["db"] }],
|
||||
});
|
||||
@ -48,12 +54,9 @@ export default function () {
|
||||
// 恢复数据
|
||||
ipcMain.on("restoreData", () => {
|
||||
try {
|
||||
let filePathList = dialog.showOpenDialogSync(
|
||||
global.backupRestoreDataWindow,
|
||||
{
|
||||
let filePathList = showOpenDialogSync("backupRestoreDataWindow", {
|
||||
filters: [{ name: "Data", extensions: ["db", "json"] }],
|
||||
}
|
||||
);
|
||||
});
|
||||
if (filePathList && filePathList.length > 0) {
|
||||
let filePath = filePathList[0];
|
||||
if (restore(filePath)) {
|
||||
|
@ -1,6 +1,5 @@
|
||||
import { app, BrowserWindow, dialog } from "electron";
|
||||
import { release } from "node:os";
|
||||
import { join, dirname } from "node:path";
|
||||
import { join, dirname, basename } from "node:path";
|
||||
import indexIpcEvent from "./main/ipcEvent";
|
||||
import classificationIpcEvent from "./classification/ipcEvent";
|
||||
import { init as classificationDataInit } from "./classification/data";
|
||||
@ -9,7 +8,10 @@ import { initSystemItem } from "./item/commons/data";
|
||||
import commonIpcEvent from "./commons/ipcEvent";
|
||||
import itemIpcEvent from "./item/ipcEvent";
|
||||
import settingIpcEvent from "./setting/ipcEvent";
|
||||
import { init as settingDataInit } from "./setting/data";
|
||||
import {
|
||||
init as settingDataInit,
|
||||
update as updateSetting,
|
||||
} from "./setting/data";
|
||||
import { setShortcutKey } from "./setting";
|
||||
import searchIpcEvent from "./search/ipcEvent";
|
||||
import { createMainWindow } from "./main";
|
||||
@ -38,8 +40,13 @@ process.env.VITE_PUBLIC = process.env.VITE_DEV_SERVER_URL
|
||||
// 解决透明窗口闪烁
|
||||
app.commandLine.appendSwitch("wm-window-animations-disabled");
|
||||
|
||||
// Disable GPU Acceleration for Windows 7
|
||||
if (release().startsWith("6.1")) app.disableHardwareAcceleration();
|
||||
// 初始化设置数据
|
||||
settingDataInit();
|
||||
// 如果主窗口是非透明窗口的话,禁止GPU加速,解决白屏问题。
|
||||
// 如果主窗口是透明窗口的话,将除主窗口外的窗口都改为透明度0.99,解决解决白屏问题。
|
||||
if (global.setting.appearance.transparency === 1) {
|
||||
app.disableHardwareAcceleration();
|
||||
}
|
||||
|
||||
// Set application name for Windows 10+ notifications
|
||||
if (process.platform === "win32") app.setAppUserModelId(app.getName());
|
||||
@ -63,8 +70,18 @@ app.whenReady().then(() => {
|
||||
}
|
||||
// addon
|
||||
global.addon = require("../../native/addon.node");
|
||||
// 初始化数据
|
||||
settingDataInit();
|
||||
if (global.first) {
|
||||
// 首次添加,判断系统语言
|
||||
if (app.getLocale().toLowerCase().indexOf("zh-") === 0) {
|
||||
// 简体中文
|
||||
global.setting.general.language = "SimplifiedChinese";
|
||||
} else {
|
||||
// 英文
|
||||
global.setting.general.language = "English";
|
||||
}
|
||||
// 修改
|
||||
updateSetting(global.setting);
|
||||
}
|
||||
// 获取语言
|
||||
global.language = getLanguage(global.setting.general.language);
|
||||
// 禁用debugtron
|
||||
@ -74,7 +91,7 @@ app.whenReady().then(() => {
|
||||
arg.indexOf("--inspect") !== -1 ||
|
||||
arg.indexOf("--remote-debugging-port") !== -1
|
||||
) {
|
||||
dialog.showMessageBoxSync(null, {
|
||||
dialog.showMessageBoxSync({
|
||||
message: "达咩呦达咩达咩~",
|
||||
buttons: [global.language.ok],
|
||||
type: "error",
|
||||
@ -105,6 +122,16 @@ app.whenReady().then(() => {
|
||||
}
|
||||
// 设置快捷键
|
||||
setShortcutKey();
|
||||
// 每次开启软件时都设置一次开机启动选项
|
||||
if (process.env.NODE_ENV !== "development") {
|
||||
const exeName = basename(process.execPath);
|
||||
app.setLoginItemSettings({
|
||||
openAtLogin: global.setting.general.startup,
|
||||
openAsHidden: false,
|
||||
path: process.execPath,
|
||||
args: ["--processStart", `"${exeName}"`],
|
||||
});
|
||||
}
|
||||
} catch (e) {
|
||||
if (process.env.NODE_ENV === "development") {
|
||||
console.log(e);
|
||||
|
@ -323,6 +323,34 @@ function del(id: number) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除
|
||||
*/
|
||||
function batchDel(idList: Array<number>) {
|
||||
// 批量查询
|
||||
let itemList = selectByIdList(true, idList);
|
||||
// 参数
|
||||
let params = itemList.map((item) => item.id).join(",");
|
||||
// SQL
|
||||
let sql = `DELETE FROM ${tableName} WHERE id in (${params})`;
|
||||
// 运行
|
||||
let res = db.prepare(sql).run().changes > 0;
|
||||
if (res) {
|
||||
// 提取分类ID
|
||||
let classificationIdList = new Set<number>();
|
||||
itemList.forEach((item) => {
|
||||
classificationIdList.add(item.classificationId);
|
||||
});
|
||||
// 更新序号
|
||||
classificationIdList.forEach((classificationId) => {
|
||||
reorder(classificationId);
|
||||
});
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除
|
||||
* @param classificationId
|
||||
@ -419,6 +447,7 @@ export {
|
||||
batchAdd,
|
||||
update,
|
||||
del,
|
||||
batchDel,
|
||||
selectById,
|
||||
selectByIdList,
|
||||
deleteByClassificationId,
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { BrowserWindow, shell, dialog, app } from "electron";
|
||||
import { join } from "node:path";
|
||||
import { getAbsolutePath, getURLParams } from "../../commons/utils";
|
||||
import { BrowserWindow, shell, app } from "electron";
|
||||
import { extname, join } from "node:path";
|
||||
import { parsePath, getURLParams, getFileIcon } from "../../commons/utils";
|
||||
import { Item } from "../../../types/item";
|
||||
import {
|
||||
batchAdd,
|
||||
@ -11,12 +11,14 @@ import {
|
||||
updateData,
|
||||
updateOrder,
|
||||
} from "./data";
|
||||
import { accessSync, writeFile, statSync, readFileSync } from "node:fs";
|
||||
import { writeFile, statSync, readFileSync, accessSync } from "node:fs";
|
||||
import mime from "mime";
|
||||
import {
|
||||
deleteExtname,
|
||||
getFileName,
|
||||
getItemName,
|
||||
isAbsolutePath,
|
||||
newItem,
|
||||
} from "../../../commons/utils/common";
|
||||
import { iconExts } from "../../commons/utils";
|
||||
import { addAssociateFolderWatcher } from "../classification";
|
||||
@ -25,8 +27,11 @@ import {
|
||||
convertPath,
|
||||
getMainBackgorunColor,
|
||||
sendToWebContent,
|
||||
showMessageBoxSync,
|
||||
showSaveDialogSync,
|
||||
} from "../commons/index";
|
||||
import { fork } from "../../commons/utilityProcessUtils";
|
||||
import { ShortcutInfo } from "../../../types/common";
|
||||
|
||||
// 窗口
|
||||
let itemAddEditWindow: BrowserWindow | null = null;
|
||||
@ -57,7 +62,11 @@ async function createAddEditWindow(
|
||||
fullscreenable: false,
|
||||
focusable: true,
|
||||
show: false,
|
||||
backgroundColor: getMainBackgorunColor(),
|
||||
transparent: global.setting.appearance.transparency < 1,
|
||||
backgroundColor:
|
||||
global.setting.appearance.transparency === 1
|
||||
? getMainBackgorunColor()
|
||||
: null,
|
||||
webPreferences: {
|
||||
spellcheck: false,
|
||||
preload: join(__dirname, "../preload/index.js"),
|
||||
@ -117,7 +126,11 @@ async function createNetworkIconWindow() {
|
||||
fullscreenable: false,
|
||||
focusable: true,
|
||||
show: false,
|
||||
backgroundColor: getMainBackgorunColor(),
|
||||
transparent: global.setting.appearance.transparency < 1,
|
||||
backgroundColor:
|
||||
global.setting.appearance.transparency === 1
|
||||
? getMainBackgorunColor()
|
||||
: null,
|
||||
webPreferences: {
|
||||
spellcheck: false,
|
||||
preload: join(__dirname, "../preload/index.js"),
|
||||
@ -168,7 +181,11 @@ async function createSVGIconWindow() {
|
||||
fullscreenable: false,
|
||||
focusable: true,
|
||||
show: false,
|
||||
backgroundColor: getMainBackgorunColor(),
|
||||
transparent: global.setting.appearance.transparency < 1,
|
||||
backgroundColor:
|
||||
global.setting.appearance.transparency === 1
|
||||
? getMainBackgorunColor()
|
||||
: null,
|
||||
webPreferences: {
|
||||
spellcheck: false,
|
||||
preload: join(__dirname, "../preload/index.js"),
|
||||
@ -210,7 +227,7 @@ function copy(idList: Array<number>, toClassificationId: number) {
|
||||
let itemList = selectByIdList(false, idList);
|
||||
if (itemList.length > 0) {
|
||||
// 清空打开信息
|
||||
resultList.forEach((item) => clearOpenInfo(item));
|
||||
itemList.forEach((item) => clearOpenInfo(item));
|
||||
// 批量添加
|
||||
resultList = batchAdd(toClassificationId, itemList);
|
||||
}
|
||||
@ -246,14 +263,9 @@ function move(idList: Array<number>, toClassificationId: number) {
|
||||
* @param classificationId
|
||||
* @param pathList
|
||||
*/
|
||||
function drop(classificationId: number, pathList: Array<string>) {
|
||||
fork(
|
||||
"getDropItemInfo",
|
||||
{
|
||||
classificationId,
|
||||
pathList,
|
||||
},
|
||||
(resultList: Array<Item>) => {
|
||||
async function drop(classificationId: number, pathList: Array<string>) {
|
||||
// 获取项目信息
|
||||
let resultList = await getDropItemInfo(classificationId, pathList);
|
||||
// 添加项目
|
||||
let itemList = batchAdd(classificationId, resultList);
|
||||
// 发送消息到页面
|
||||
@ -263,8 +275,6 @@ function drop(classificationId: number, pathList: Array<string>) {
|
||||
classificationId: null,
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新项目打开信息
|
||||
@ -309,10 +319,15 @@ function updateOpenInfo(type: string, id: number) {
|
||||
*/
|
||||
function run(
|
||||
type: string,
|
||||
operation: "open" | "runas" | "openFileLocation",
|
||||
operation: "open" | "runas" | "openFileLocation" | "explore",
|
||||
item: Item
|
||||
) {
|
||||
if (item.data) {
|
||||
if (operation === "open" && item.data.runAsAdmin) {
|
||||
operation = "runas";
|
||||
} else if (operation === "open" && item.type === 1) {
|
||||
operation = "explore";
|
||||
}
|
||||
// 更新打开信息
|
||||
updateOpenInfo(type, item.id);
|
||||
// 判断类型
|
||||
@ -326,7 +341,7 @@ function run(
|
||||
// 获取绝对路径
|
||||
if (item.type === 0 || item.type === 1) {
|
||||
// 获取路径
|
||||
item.data.target = getAbsolutePath(item.data.target);
|
||||
item.data.target = parsePath(item.data.target);
|
||||
}
|
||||
try {
|
||||
// 判断文件或文件夹是否存在
|
||||
@ -352,13 +367,9 @@ function run(
|
||||
message = global.language.notFoundFolder;
|
||||
}
|
||||
message += '"' + item.data.target + '"';
|
||||
dialog.showMessageBox(global.mainWindow, {
|
||||
title: "Dawn Launcher",
|
||||
message: message,
|
||||
buttons: [global.language.ok],
|
||||
type: "error",
|
||||
noLink: true,
|
||||
});
|
||||
showMessageBoxSync("mainWindow", message, "error", [
|
||||
global.language.ok,
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -429,7 +440,7 @@ function exportIcon(item: Item) {
|
||||
}
|
||||
// 弹出文件对话框保存
|
||||
if (extensionName && content) {
|
||||
let path = dialog.showSaveDialogSync(global.mainWindow, {
|
||||
let path = showSaveDialogSync("mainWindow", {
|
||||
defaultPath: "icon",
|
||||
filters: [
|
||||
{
|
||||
@ -496,7 +507,7 @@ async function createShortcut(item: Item) {
|
||||
let target = item.data.target;
|
||||
if (item.type === 0 || item.type === 1) {
|
||||
// 获取绝对路径
|
||||
target = getAbsolutePath(target);
|
||||
target = parsePath(target);
|
||||
}
|
||||
// 保存路径
|
||||
let savePath =
|
||||
@ -693,6 +704,90 @@ function deleteQuickSearchHistory(itemId: number) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过路径获取项目信息
|
||||
* @param classificationId
|
||||
* @param pathList
|
||||
*/
|
||||
async function getDropItemInfo(
|
||||
classificationId: number,
|
||||
pathList: Array<string>
|
||||
) {
|
||||
// 项目列表
|
||||
let itemList: Array<Item> = [];
|
||||
// 解析文件信息并添加项目
|
||||
for (const path of pathList) {
|
||||
try {
|
||||
// item
|
||||
let item = newItem({ classificationId });
|
||||
// 目标
|
||||
item.data.target = path;
|
||||
// 名称
|
||||
item.name = getFileName(item.data.target);
|
||||
// 判断是否是快捷方式,如果是的话,需要获取真实路径
|
||||
if (mime.getType(path) === "application/x-ms-shortcut") {
|
||||
// 快捷方式
|
||||
// 获取真实文件路径和参数
|
||||
let shortcutInfo: ShortcutInfo | null =
|
||||
global.addon.getShortcutFileInfo(path);
|
||||
if (shortcutInfo) {
|
||||
// 路径
|
||||
if (shortcutInfo.target) {
|
||||
item.data.target = shortcutInfo.target;
|
||||
}
|
||||
// 参数
|
||||
if (shortcutInfo.arguments) {
|
||||
item.data.params = shortcutInfo.arguments;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 获取图标
|
||||
item.data.icon = await getFileIcon(item.data.target);
|
||||
// 获取后缀,判断是否是url
|
||||
let ext = extname(item.data.target);
|
||||
if (ext && ext.toLowerCase() === ".url") {
|
||||
// url
|
||||
let url = parseUrlFileContent(readFileSync(item.data.target, "utf-8"));
|
||||
if (url && url.trim() !== "") {
|
||||
item.data.target = url;
|
||||
item.type = 2;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
// 文件类型
|
||||
let stats = statSync(item.data.target);
|
||||
item.type = stats.isFile() ? 0 : 1;
|
||||
}
|
||||
// 去掉后缀
|
||||
if (item.type === 0 || item.type === 2) {
|
||||
item.name = deleteExtname(item.name);
|
||||
}
|
||||
// push
|
||||
itemList.push(item);
|
||||
} catch (e) {}
|
||||
}
|
||||
return itemList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析.url文件内容以获取URL
|
||||
* @param content
|
||||
* @returns
|
||||
*/
|
||||
function parseUrlFileContent(content: string) {
|
||||
if (content) {
|
||||
const lines = content.split("\n");
|
||||
for (const line of lines) {
|
||||
if (line.startsWith("URL=")) {
|
||||
const url = line.substring(4).trim();
|
||||
return url;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
export {
|
||||
createAddEditWindow,
|
||||
createNetworkIconWindow,
|
||||
|
@ -1,13 +1,11 @@
|
||||
import {
|
||||
Menu,
|
||||
MenuItem,
|
||||
dialog,
|
||||
ipcMain,
|
||||
clipboard,
|
||||
MenuItemConstructorOptions,
|
||||
screen,
|
||||
} from "electron";
|
||||
import { getAbsolutePath } from "../../commons/utils";
|
||||
import { parsePath } from "../../commons/utils";
|
||||
import {
|
||||
convertTarget,
|
||||
createAddEditWindow,
|
||||
@ -30,7 +28,15 @@ import {
|
||||
getStartMenuItemList,
|
||||
getSystemItemList,
|
||||
} from "./commons";
|
||||
import { add, del, list, selectById, update, updateOrder } from "./data";
|
||||
import {
|
||||
add,
|
||||
batchDel,
|
||||
del,
|
||||
list,
|
||||
selectById,
|
||||
update,
|
||||
updateOrder,
|
||||
} from "./data";
|
||||
import { Item } from "../../../types/item";
|
||||
import { getFileExtname, isAbsolutePath } from "../../../commons/utils/common";
|
||||
import {
|
||||
@ -52,6 +58,7 @@ import {
|
||||
closeWindow,
|
||||
openAfterHideWindow,
|
||||
sendToWebContent,
|
||||
showMessageBoxSync,
|
||||
} from "../commons/index";
|
||||
|
||||
/**
|
||||
@ -180,6 +187,13 @@ export default function () {
|
||||
// 组装菜单
|
||||
if (!batchOperation) {
|
||||
if (item) {
|
||||
// 查询页面分类信息
|
||||
let pageClassification = selectClassificationById(
|
||||
args.pageClassificationId
|
||||
);
|
||||
if (!pageClassification && type === "main") {
|
||||
return;
|
||||
}
|
||||
// 后缀
|
||||
let ext: string | null = null;
|
||||
// 排除
|
||||
@ -189,8 +203,9 @@ export default function () {
|
||||
// "打开"菜单
|
||||
let openMenu = false;
|
||||
if (
|
||||
(item.type === 0 && ext && (ext === "exe" || ext === "bat")) ||
|
||||
item.type === 4
|
||||
item.type === 0 ||
|
||||
item.type === 4 ||
|
||||
(item.type === 3 && item.data.target === "cmd.exe")
|
||||
) {
|
||||
menuList.push(
|
||||
new MenuItem({
|
||||
@ -267,7 +282,7 @@ export default function () {
|
||||
.getNativeWindowHandle()
|
||||
.readInt32LE(0),
|
||||
item.type === 0 || item.type === 1
|
||||
? getAbsolutePath(item.data.target)
|
||||
? parsePath(item.data.target)
|
||||
: item.data.target,
|
||||
point[0],
|
||||
point[1]
|
||||
@ -296,7 +311,7 @@ export default function () {
|
||||
click: () => {
|
||||
clipboard.writeText(
|
||||
item.type === 0 || item.type === 1
|
||||
? getAbsolutePath(item.data.target)
|
||||
? parsePath(item.data.target)
|
||||
: item.data.target
|
||||
);
|
||||
},
|
||||
@ -307,7 +322,8 @@ export default function () {
|
||||
if (
|
||||
type === "main" &&
|
||||
(item.type === 0 || item.type === 1) &&
|
||||
classification.type === 0
|
||||
classification.type === 0 &&
|
||||
pageClassification.type === 0
|
||||
) {
|
||||
menuList.push(
|
||||
new MenuItem({
|
||||
@ -338,7 +354,11 @@ export default function () {
|
||||
if (pathMenu) {
|
||||
menuList.push(new MenuItem({ type: "separator" }));
|
||||
}
|
||||
if (type === "main") {
|
||||
if (
|
||||
type === "main" &&
|
||||
classification.type === 0 &&
|
||||
pageClassification.type === 0
|
||||
) {
|
||||
// "图标"菜单
|
||||
let existPasteIcon = false;
|
||||
// 获取剪切板图片文件
|
||||
@ -374,7 +394,9 @@ export default function () {
|
||||
if (
|
||||
type === "main" &&
|
||||
(item.type === 0 || item.type === 1) &&
|
||||
!item.data.fixedIcon
|
||||
!item.data.fixedIcon &&
|
||||
classification.type === 0 &&
|
||||
pageClassification.type === 0
|
||||
) {
|
||||
menuList.push(
|
||||
new MenuItem({
|
||||
@ -385,7 +407,11 @@ export default function () {
|
||||
})
|
||||
);
|
||||
}
|
||||
if (type === "main" && classification.type === 0) {
|
||||
if (
|
||||
type === "main" &&
|
||||
classification.type === 0 &&
|
||||
pageClassification.type === 0
|
||||
) {
|
||||
menuList.push(new MenuItem({ type: "separator" }));
|
||||
menuList.push(
|
||||
new MenuItem({
|
||||
@ -412,13 +438,12 @@ export default function () {
|
||||
new MenuItem({
|
||||
label: global.language.delete,
|
||||
click: () => {
|
||||
let res = dialog.showMessageBoxSync(global.mainWindow, {
|
||||
message: global.language.deleteItemPrompt,
|
||||
buttons: [global.language.ok, global.language.cancel],
|
||||
type: "question",
|
||||
noLink: true,
|
||||
cancelId: 1,
|
||||
});
|
||||
let res = showMessageBoxSync(
|
||||
"mainWindow",
|
||||
global.language.deleteItemPrompt,
|
||||
"question",
|
||||
[global.language.ok, global.language.cancel]
|
||||
);
|
||||
if (res === 0) {
|
||||
// 删除数据
|
||||
del(item.id);
|
||||
@ -554,20 +579,17 @@ export default function () {
|
||||
new MenuItem({
|
||||
label: global.language.batchDelete,
|
||||
click: () => {
|
||||
let res = dialog.showMessageBoxSync(global.mainWindow, {
|
||||
message: global.language.batchDeletePrompt,
|
||||
buttons: [global.language.ok, global.language.cancel],
|
||||
type: "question",
|
||||
noLink: true,
|
||||
cancelId: 1,
|
||||
});
|
||||
let res = showMessageBoxSync(
|
||||
"mainWindow",
|
||||
global.language.batchDeletePrompt,
|
||||
"question",
|
||||
[global.language.ok, global.language.cancel]
|
||||
);
|
||||
if (res === 0) {
|
||||
for (const id of batchSelectedIdList) {
|
||||
// 删除数据
|
||||
del(id);
|
||||
// 批量删除
|
||||
batchDel(batchSelectedIdList);
|
||||
// 快捷键
|
||||
setShortcutKey();
|
||||
}
|
||||
// 通知前端删除数据
|
||||
sendToWebContent(
|
||||
"mainWindow",
|
||||
@ -679,7 +701,7 @@ export default function () {
|
||||
}
|
||||
let icon = join(process.env.VITE_PUBLIC, "drag-and-drop.png");
|
||||
event.sender.startDrag({
|
||||
file: getAbsolutePath(item.data.target),
|
||||
file: parsePath(item.data.target),
|
||||
icon: icon,
|
||||
});
|
||||
} finally {
|
||||
|
@ -13,6 +13,7 @@ import cacheData from "../commons/cacheData";
|
||||
import {
|
||||
getMainBackgorunColor,
|
||||
getWindowInScreen,
|
||||
mainWindowExist,
|
||||
sendToWebContent,
|
||||
} from "../commons";
|
||||
import { release } from "node:os";
|
||||
@ -65,11 +66,6 @@ function createMainWindow() {
|
||||
global.addon.removeWindowAnimation(
|
||||
mainWindow.getNativeWindowHandle().readInt32LE(0)
|
||||
);
|
||||
// 恢复上一次的位置
|
||||
let bounds = cacheData.cacheStore.get("mainWindowBounds");
|
||||
if (bounds) {
|
||||
mainWindow.setBounds(bounds);
|
||||
}
|
||||
// 永远居中不可移动
|
||||
if (global.setting.general.alwaysCenter) {
|
||||
mainWindow.setMovable(false);
|
||||
@ -80,9 +76,38 @@ function createMainWindow() {
|
||||
if (global.setting.general.alwaysTop) {
|
||||
mainWindow.setAlwaysOnTop(true, "screen-saver");
|
||||
}
|
||||
// 恢复上一次的位置
|
||||
let bounds: any = cacheData.cacheStore.get("mainWindowBounds");
|
||||
// 锁定尺寸
|
||||
if (!global.setting.general.lockSize) {
|
||||
mainWindow.setResizable(!global.setting.general.lockSize);
|
||||
// 如果是锁定尺寸的话,使用锁定尺寸来设置窗口尺寸
|
||||
if (global.setting.general.lockSize) {
|
||||
let lockSizeBounds: any = cacheData.cacheStore.get(
|
||||
"mainWindowLockSizeBounds"
|
||||
);
|
||||
if (lockSizeBounds) {
|
||||
if (bounds) {
|
||||
bounds.width = lockSizeBounds.width;
|
||||
bounds.height = lockSizeBounds.height;
|
||||
} else {
|
||||
bounds = {
|
||||
width: lockSizeBounds.width,
|
||||
height: lockSizeBounds.height,
|
||||
};
|
||||
}
|
||||
} else {
|
||||
if (bounds) {
|
||||
cacheData.cacheStore.set("mainWindowLockSizeBounds", bounds);
|
||||
} else {
|
||||
cacheData.cacheStore.set(
|
||||
"mainWindowLockSizeBounds",
|
||||
mainWindow.getBounds()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (bounds) {
|
||||
mainWindow.setBounds(bounds);
|
||||
}
|
||||
// 托盘
|
||||
createTray(!global.setting.general.hideTray);
|
||||
@ -123,7 +148,10 @@ function createMainWindow() {
|
||||
!global.setting.general.alwaysTop
|
||||
) {
|
||||
// 如果当前还有打开的子窗口就不执行失去焦点隐藏
|
||||
if (mainWindow.getChildWindows().length === 0) {
|
||||
if (
|
||||
mainWindow.getChildWindows().length === 0 &&
|
||||
!global.mainWindowShowDialog
|
||||
) {
|
||||
hideMainWindow();
|
||||
}
|
||||
}
|
||||
@ -153,6 +181,10 @@ function createMainWindow() {
|
||||
sendToWebContent("mainWindow", "onCollapseSubClassification", {});
|
||||
}
|
||||
});
|
||||
// 主窗口关闭事件
|
||||
mainWindow.on("closed", () => {
|
||||
app.quit();
|
||||
});
|
||||
// 创建鼠标hook
|
||||
let mousedownClassName = null;
|
||||
addon.createMouseHook((...args: any[]) => {
|
||||
@ -186,6 +218,8 @@ function createMainWindow() {
|
||||
// 中间单击
|
||||
showHideMouseWheelClick();
|
||||
}
|
||||
// 失去焦点隐藏
|
||||
onBlurHide();
|
||||
}
|
||||
});
|
||||
// 禁用标题栏右键
|
||||
@ -200,6 +234,50 @@ function createMainWindow() {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 失去焦点隐藏
|
||||
*/
|
||||
function onBlurHide() {
|
||||
if (
|
||||
mainWindowExist() &&
|
||||
global.mainWindow.isVisible() &&
|
||||
global.setting.general.hideLoseFocus &&
|
||||
!global.setting.general.alwaysTop &&
|
||||
global.mainWindow.getChildWindows().length === 0 &&
|
||||
!global.mainWindowShowDialog &&
|
||||
!hasCursorPosWindow(global.mainWindow)
|
||||
) {
|
||||
// 隐藏窗口
|
||||
hideMainWindow();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断鼠标是否在置顶的窗口范围内
|
||||
*/
|
||||
function hasCursorPosWindow(window: BrowserWindow) {
|
||||
if (window && !window.isDestroyed() && window.isVisible()) {
|
||||
// 获取鼠标位置
|
||||
let point = screen.getCursorScreenPoint();
|
||||
// 窗口位置信息
|
||||
let bounds = window.getBounds();
|
||||
// 判断鼠标是否在窗口以外
|
||||
if (
|
||||
point.x < bounds.x ||
|
||||
point.x > bounds.x + bounds.width ||
|
||||
point.y < bounds.y ||
|
||||
point.y > bounds.y + bounds.height
|
||||
) {
|
||||
// 窗口以外
|
||||
return false;
|
||||
} else {
|
||||
// 窗口以内
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示窗口之前
|
||||
* @param blurHide
|
||||
@ -225,6 +303,9 @@ function showMainWindowBefore(
|
||||
* @param autoHide
|
||||
*/
|
||||
function showMainWindow(blurHide: boolean, autoHide = false) {
|
||||
if (!mainWindowExist()) {
|
||||
return;
|
||||
}
|
||||
// flag
|
||||
let flag = true;
|
||||
// 是否开启勿扰模式
|
||||
@ -238,14 +319,15 @@ function showMainWindow(blurHide: boolean, autoHide = false) {
|
||||
showFollowMousePosition();
|
||||
}
|
||||
if (flag) {
|
||||
if (!global.setting.general.alwaysTop) {
|
||||
global.mainWindow.setAlwaysOnTop(true, "screen-saver");
|
||||
}
|
||||
global.mainWindow.show();
|
||||
global.mainWindow.focus();
|
||||
global.blurHide = blurHide;
|
||||
if (blurHide) {
|
||||
global.blurHide = true;
|
||||
} else {
|
||||
global.blurHide = false;
|
||||
if (!global.setting.general.alwaysTop) {
|
||||
global.mainWindow.setAlwaysOnTop(false);
|
||||
}
|
||||
global.blurHide = blurHide;
|
||||
}
|
||||
}
|
||||
|
||||
@ -253,7 +335,7 @@ function showMainWindow(blurHide: boolean, autoHide = false) {
|
||||
* 隐藏窗口
|
||||
*/
|
||||
function hideMainWindow() {
|
||||
if (global.mainWindow.isVisible()) {
|
||||
if (mainWindowExist() && global.mainWindow.isVisible()) {
|
||||
global.mainWindow.hide();
|
||||
global.blurHide = false;
|
||||
}
|
||||
@ -314,10 +396,13 @@ function createTray(show: boolean) {
|
||||
* @returns
|
||||
*/
|
||||
function edgeAdsorb(display: Display | null, workArea = false) {
|
||||
if (!mainWindowExist()) {
|
||||
return;
|
||||
}
|
||||
// 如果勾选停靠在桌面边缘时自动隐藏,放行
|
||||
if (
|
||||
global.mainWindow.isDestroyed() ||
|
||||
(!global.setting.general.edgeAdsorb && !global.setting.general.edgeAutoHide)
|
||||
!global.setting.general.edgeAdsorb &&
|
||||
!global.setting.general.edgeAutoHide
|
||||
) {
|
||||
return;
|
||||
}
|
||||
@ -325,7 +410,7 @@ function edgeAdsorb(display: Display | null, workArea = false) {
|
||||
// 清空方向
|
||||
global.mainWindowDirection = null;
|
||||
// 屏幕
|
||||
let displays = display ? [display] : getWindowInScreen(mainWindow);
|
||||
let displays = display ? [display] : getWindowInScreen(global.mainWindow);
|
||||
if (displays.length > 1 || displays.length === 0) {
|
||||
return;
|
||||
}
|
||||
@ -414,6 +499,9 @@ function edgeAdsorb(display: Display | null, workArea = false) {
|
||||
* 显示时跟随鼠标位置
|
||||
*/
|
||||
function showFollowMousePosition() {
|
||||
if (!mainWindowExist()) {
|
||||
return;
|
||||
}
|
||||
// 当永远居中、固定位置勾选后不能使用显示时跟随鼠标位置
|
||||
if (
|
||||
!global.setting.general.alwaysCenter &&
|
||||
@ -444,6 +532,9 @@ function showFollowMousePosition() {
|
||||
* 中间单击显示/隐藏窗口
|
||||
*/
|
||||
function showHideMouseWheelClick() {
|
||||
if (!mainWindowExist()) {
|
||||
return;
|
||||
}
|
||||
if (global.setting.general.showHideMouseWheelClick) {
|
||||
if (global.mainWindow.isVisible()) {
|
||||
hideMainWindow();
|
||||
@ -457,8 +548,11 @@ function showHideMouseWheelClick() {
|
||||
* 永远居中
|
||||
*/
|
||||
function alwaysCenter() {
|
||||
if (!mainWindowExist()) {
|
||||
return;
|
||||
}
|
||||
if (global.setting.general.alwaysCenter) {
|
||||
mainWindow.center();
|
||||
global.mainWindow.center();
|
||||
}
|
||||
}
|
||||
|
||||
@ -469,26 +563,32 @@ function alwaysCenter() {
|
||||
* @returns
|
||||
*/
|
||||
function autoHide(size: number, timer: boolean) {
|
||||
if (global.mainWindow.isDestroyed() || !global.setting.general.edgeAutoHide) {
|
||||
if (!mainWindowExist()) {
|
||||
return;
|
||||
}
|
||||
if (!global.setting.general.edgeAutoHide) {
|
||||
return;
|
||||
}
|
||||
// 当有子窗口时不自动隐藏
|
||||
if (mainWindow.getChildWindows().length > 0) {
|
||||
if (
|
||||
global.mainWindow.getChildWindows().length > 0 ||
|
||||
global.mainWindowShowDialog
|
||||
) {
|
||||
return;
|
||||
}
|
||||
let x = screen.getCursorScreenPoint().x;
|
||||
let y = screen.getCursorScreenPoint().y;
|
||||
try {
|
||||
// 屏幕
|
||||
let displays = getWindowInScreen(mainWindow);
|
||||
let displays = getWindowInScreen(global.mainWindow);
|
||||
if (displays.length > 1 || displays.length === 0) {
|
||||
return;
|
||||
}
|
||||
// 屏幕区域
|
||||
let displayBounds = displays[0].bounds;
|
||||
// 窗口位置信息
|
||||
let bounds = mainWindow.getBounds();
|
||||
if (mainWindow.isVisible()) {
|
||||
let bounds = global.mainWindow.getBounds();
|
||||
if (global.mainWindow.isVisible()) {
|
||||
let flag = false;
|
||||
if (bounds.x === displayBounds.x && bounds.y === displayBounds.y) {
|
||||
// 左上角
|
||||
@ -663,12 +763,15 @@ function doubleClickTaskbar(
|
||||
mousedownClassName: string | null,
|
||||
className: string | null
|
||||
) {
|
||||
if (!mainWindowExist()) {
|
||||
return;
|
||||
}
|
||||
// 必须开启设置
|
||||
if (!global.setting.general.showHideDoubleClickTaskbar) {
|
||||
return;
|
||||
}
|
||||
// 获取屏幕
|
||||
let displays = getWindowInScreen(mainWindow);
|
||||
let displays = getWindowInScreen(global.mainWindow);
|
||||
if (
|
||||
displays.length > 1 ||
|
||||
displays.length === 0 ||
|
||||
@ -704,7 +807,7 @@ function doubleClickTaskbar(
|
||||
// 清空计数
|
||||
global.doubleClickTaskbarCounter = 0;
|
||||
// 显示或隐藏
|
||||
if (mainWindow.isVisible()) {
|
||||
if (global.mainWindow.isVisible()) {
|
||||
hideMainWindow();
|
||||
} else {
|
||||
showMainWindowBefore(false);
|
||||
|
@ -1,6 +1,10 @@
|
||||
import { BrowserWindow, shell, screen } from "electron";
|
||||
import { join } from "node:path";
|
||||
import { getWindowInScreen, sendToWebContent } from "../commons";
|
||||
import {
|
||||
getMainBackgorunColor,
|
||||
getWindowInScreen,
|
||||
sendToWebContent,
|
||||
} from "../commons";
|
||||
import cacheData from "../commons/cacheData";
|
||||
|
||||
// 窗口
|
||||
@ -24,7 +28,11 @@ function createQuickSearchWindow() {
|
||||
fullscreenable: false,
|
||||
resizable: false,
|
||||
alwaysOnTop: true,
|
||||
backgroundColor: global.setting.appearance.theme.mainBackgroundColor,
|
||||
transparent: global.setting.appearance.transparency < 1,
|
||||
backgroundColor:
|
||||
global.setting.appearance.transparency === 1
|
||||
? getMainBackgorunColor()
|
||||
: null,
|
||||
webPreferences: {
|
||||
spellcheck: false,
|
||||
backgroundThrottling: false,
|
||||
@ -113,6 +121,15 @@ function showQuickSearchWindowBefore() {
|
||||
* 显示快速搜索窗口
|
||||
*/
|
||||
function showQuickSearchWindow() {
|
||||
// flag
|
||||
let flag = true;
|
||||
// 是否开启勿扰模式
|
||||
if (global.setting.general.notDisturb) {
|
||||
if (global.addon.isFullscreen()) {
|
||||
flag = false;
|
||||
}
|
||||
}
|
||||
if (flag) {
|
||||
// 获取鼠标所在的屏幕
|
||||
let currentDisplay = screen.getDisplayNearestPoint(
|
||||
screen.getCursorScreenPoint()
|
||||
@ -123,20 +140,24 @@ function showQuickSearchWindow() {
|
||||
// 代表窗口的位置不再任一屏幕内,将窗口位置移动到主窗口
|
||||
quickSearchWindow.center();
|
||||
} else if (
|
||||
(windowDisplay.length === 1 && currentDisplay.id !== windowDisplay[0].id) ||
|
||||
(windowDisplay.length === 1 &&
|
||||
currentDisplay.id !== windowDisplay[0].id) ||
|
||||
windowDisplay.length > 1
|
||||
) {
|
||||
// 在鼠标所在的屏幕显示
|
||||
let workArea = currentDisplay.workArea;
|
||||
let bounds = quickSearchWindow.getBounds();
|
||||
let x = workArea.x + workArea.width / 2 - bounds.width / 2;
|
||||
let y = workArea.y + workArea.height / 2 - 44 / 2;
|
||||
let x = Math.round(workArea.x + workArea.width / 2 - bounds.width / 2);
|
||||
let y = Math.round(workArea.y + workArea.height / 2 - 44 / 2);
|
||||
quickSearchWindow.setPosition(x, y);
|
||||
for (let i = 0; i < 10; i++) {
|
||||
quickSearchWindow.setSize(global.setting.quickSearch.width, 44);
|
||||
}
|
||||
}
|
||||
// 显示
|
||||
quickSearchWindow.setBounds({ width: global.setting.quickSearch.width });
|
||||
quickSearchWindow.show();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { Setting } from "../../../types/setting";
|
||||
import { getSetting } from "../../../commons/utils/setting";
|
||||
import { getDataSqlite3 } from "../../commons/betterSqlite3";
|
||||
import { app } from "electron";
|
||||
|
||||
// 获取数据库
|
||||
let db = getDataSqlite3();
|
||||
@ -58,6 +59,8 @@ function add(setting: Setting) {
|
||||
let id = db.prepare(sql).run(1, JSON.stringify(setting)).lastInsertRowid;
|
||||
if (id) {
|
||||
global.setting = setting;
|
||||
// 添加设置被视为首次打开软件
|
||||
global.first = true;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -5,7 +5,11 @@ import { hideMainWindow, showMainWindowBefore } from "../main/index";
|
||||
import { list as selectClassificationList } from "../classification/data";
|
||||
import { list as selectItemList } from "../item/data";
|
||||
import { run } from "../item";
|
||||
import { closeWindow, getMainBackgorunColor } from "../commons/index";
|
||||
import {
|
||||
closeWindow,
|
||||
getMainBackgorunColor,
|
||||
mainWindowExist,
|
||||
} from "../commons/index";
|
||||
import {
|
||||
createQuickSearchWindow,
|
||||
hideQuickSearchWindow,
|
||||
@ -34,7 +38,11 @@ function createSettingWindow() {
|
||||
fullscreenable: false,
|
||||
skipTaskbar: true,
|
||||
show: false,
|
||||
backgroundColor: getMainBackgorunColor(),
|
||||
transparent: global.setting.appearance.transparency < 1,
|
||||
backgroundColor:
|
||||
global.setting.appearance.transparency === 1
|
||||
? getMainBackgorunColor()
|
||||
: null,
|
||||
webPreferences: {
|
||||
spellcheck: false,
|
||||
preload: join(__dirname, "../preload/index.js"),
|
||||
@ -79,12 +87,14 @@ function setShortcutKey(setting: Setting = global.setting) {
|
||||
globalShortcut.register(
|
||||
setting.general.showHideShortcutKey.replace("Win", "Super"),
|
||||
() => {
|
||||
if (mainWindowExist()) {
|
||||
if (global.mainWindow.isVisible()) {
|
||||
hideMainWindow();
|
||||
} else {
|
||||
showMainWindowBefore(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
} catch (e) {
|
||||
if (process.env.NODE_ENV === "development") {
|
||||
@ -100,9 +110,11 @@ function setShortcutKey(setting: Setting = global.setting) {
|
||||
globalShortcut.register(
|
||||
classification.shortcutKey.replace("Win", "Super"),
|
||||
() => {
|
||||
if (mainWindowExist()) {
|
||||
// 分类
|
||||
showMainWindowBefore(true, false, classification.id);
|
||||
}
|
||||
}
|
||||
);
|
||||
} catch (e) {
|
||||
if (process.env.NODE_ENV === "development") {
|
||||
@ -119,9 +131,21 @@ function setShortcutKey(setting: Setting = global.setting) {
|
||||
globalShortcut.register(
|
||||
item.shortcutKey.replace("Win", "Super"),
|
||||
() => {
|
||||
if (mainWindowExist()) {
|
||||
// flag
|
||||
let flag = true;
|
||||
// 是否开启勿扰模式
|
||||
if (global.setting.general.notDisturb) {
|
||||
if (global.addon.isFullscreen()) {
|
||||
flag = false;
|
||||
}
|
||||
}
|
||||
if (flag) {
|
||||
// 项目
|
||||
run("main", "open", item);
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
} catch (e) {
|
||||
if (process.env.NODE_ENV === "development") {
|
||||
@ -132,6 +156,7 @@ function setShortcutKey(setting: Setting = global.setting) {
|
||||
}
|
||||
// 快速搜索
|
||||
if (
|
||||
setting.quickSearch.enable &&
|
||||
setting.quickSearch.showHideShortcutKey &&
|
||||
setting.quickSearch.showHideShortcutKey.trim() !== ""
|
||||
) {
|
||||
|
@ -1,9 +1,10 @@
|
||||
import { app, dialog, ipcMain } from "electron";
|
||||
import { app, ipcMain } from "electron";
|
||||
import {
|
||||
closeWindow,
|
||||
getUserDataPath,
|
||||
relaunch,
|
||||
sendToWebContent,
|
||||
showOpenDialogSync,
|
||||
} from "../commons/index";
|
||||
import { createSettingWindow, setFixedPosition, setShortcutKey } from ".";
|
||||
import { add, select, update } from "./data";
|
||||
@ -15,6 +16,7 @@ import { statSync, mkdirSync, copyFileSync, readFileSync } from "node:fs";
|
||||
import mime from "mime";
|
||||
import { checkInvalid } from "../item";
|
||||
import { updateItemOpenNumberSortToDefualt } from "../classification";
|
||||
import cacheData from "../commons/cacheData";
|
||||
|
||||
export default function () {
|
||||
// 创建设置窗口
|
||||
@ -90,6 +92,13 @@ export default function () {
|
||||
// 锁定尺寸
|
||||
ipcMain.on("setLockSize", (event, args) => {
|
||||
global.mainWindow.setResizable(!args);
|
||||
if (args) {
|
||||
// 存储主窗口尺寸
|
||||
cacheData.cacheStore.set(
|
||||
"mainWindowLockSizeBounds",
|
||||
global.mainWindow.getBounds()
|
||||
);
|
||||
}
|
||||
});
|
||||
// 固定位置
|
||||
ipcMain.on("setFixedPosition", (event, args) => {
|
||||
@ -114,7 +123,7 @@ export default function () {
|
||||
// 上传背景图
|
||||
ipcMain.on("uploadBackgrounImage", (event, args) => {
|
||||
// 打开文件对话框
|
||||
let filePathList = dialog.showOpenDialogSync(global.settingWindow, {
|
||||
let filePathList = showOpenDialogSync("settingWindow", {
|
||||
filters: [
|
||||
{
|
||||
name: "Images",
|
||||
|
@ -5,13 +5,12 @@ import {
|
||||
newItem,
|
||||
} from "../../commons/utils/common";
|
||||
import { CommonItem, Item } from "../../types/item";
|
||||
import { parse, join, extname } from "node:path";
|
||||
import { parse, join } from "node:path";
|
||||
import { readdirSync, readFileSync, statSync, writeFileSync } from "node:fs";
|
||||
import { execSync } from "node:child_process";
|
||||
import xml2js from "xml2js";
|
||||
import { newCommonItem, newCommonItemData } from "../../commons/utils/common";
|
||||
import { ShortcutInfo } from "../../types/common";
|
||||
import { getAbsolutePath, getFileIcon } from "../commons/utils";
|
||||
import { parsePath, getFileIcon } from "../commons/utils";
|
||||
|
||||
// AppxInfo
|
||||
export interface AppxInfo {
|
||||
@ -44,11 +43,6 @@ process.parentPort.once("message", async (event) => {
|
||||
res = await getStartMenuItemList(dataParam);
|
||||
} else if (params.name === "getAppxItemList") {
|
||||
res = await getAppxItemList();
|
||||
} else if (params.name === "getDropItemInfo") {
|
||||
res = await getDropItemInfo(
|
||||
dataParam.classificationId,
|
||||
dataParam.pathList
|
||||
);
|
||||
} else if (params.name === "refreshItemIcon") {
|
||||
res = await refreshItemIcon(dataParam);
|
||||
} else if (params.name === "getDirectoryItemList") {
|
||||
@ -166,7 +160,7 @@ async function getStartMenuItemList(cacheList: Array<CommonItem>) {
|
||||
name,
|
||||
data: newCommonItemData({
|
||||
target: filePath,
|
||||
icon: getFileIcon(filePath),
|
||||
icon: await getFileIcon(filePath),
|
||||
params,
|
||||
}),
|
||||
});
|
||||
@ -559,90 +553,6 @@ function getPropertiesIcon(installLocation: string, result: any) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过路径获取项目信息
|
||||
* @param classificationId
|
||||
* @param pathList
|
||||
*/
|
||||
async function getDropItemInfo(
|
||||
classificationId: number,
|
||||
pathList: Array<string>
|
||||
) {
|
||||
// 项目列表
|
||||
let itemList: Array<Item> = [];
|
||||
// 解析文件信息并添加项目
|
||||
for (const path of pathList) {
|
||||
try {
|
||||
// item
|
||||
let item = newItem({ classificationId });
|
||||
// 目标
|
||||
item.data.target = path;
|
||||
// 名称
|
||||
item.name = getFileName(item.data.target);
|
||||
// 判断是否是快捷方式,如果是的话,需要获取真实路径
|
||||
if (mime.getType(path) === "application/x-ms-shortcut") {
|
||||
// 快捷方式
|
||||
// 获取真实文件路径和参数
|
||||
let shortcutInfo: ShortcutInfo | null =
|
||||
global.addon.getShortcutFileInfo(path);
|
||||
if (shortcutInfo) {
|
||||
// 路径
|
||||
if (shortcutInfo.target) {
|
||||
item.data.target = shortcutInfo.target;
|
||||
}
|
||||
// 参数
|
||||
if (shortcutInfo.arguments) {
|
||||
item.data.params = shortcutInfo.arguments;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 获取图标
|
||||
item.data.icon = getFileIcon(item.data.target);
|
||||
// 获取后缀,判断是否是url
|
||||
let ext = extname(item.data.target);
|
||||
if (ext && ext.toLowerCase() === ".url") {
|
||||
// url
|
||||
let url = parseUrlFileContent(readFileSync(item.data.target, "utf-8"));
|
||||
if (url && url.trim() !== "") {
|
||||
item.data.target = url;
|
||||
item.type = 2;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
// 文件类型
|
||||
let stats = statSync(item.data.target);
|
||||
item.type = stats.isFile() ? 0 : 1;
|
||||
}
|
||||
// 去掉后缀
|
||||
if (item.type === 0 || item.type === 2) {
|
||||
item.name = deleteExtname(item.name);
|
||||
}
|
||||
// push
|
||||
itemList.push(item);
|
||||
} catch (e) {}
|
||||
}
|
||||
return itemList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析.url文件内容以获取URL
|
||||
* @param content
|
||||
* @returns
|
||||
*/
|
||||
function parseUrlFileContent(content: string) {
|
||||
if (content) {
|
||||
const lines = content.split("\n");
|
||||
for (const line of lines) {
|
||||
if (line.startsWith("URL=")) {
|
||||
const url = line.substring(4).trim();
|
||||
return url;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 刷新项目图标
|
||||
* @param itemList
|
||||
@ -656,7 +566,7 @@ async function refreshItemIcon(itemList: Array<Item>) {
|
||||
// 刷新图标
|
||||
for (const item of itemList) {
|
||||
if (item.type === 0 || item.type === 1) {
|
||||
let icon: string | null = getFileIcon(item.data.target);
|
||||
let icon: string | null = await getFileIcon(item.data.target);
|
||||
if (icon) {
|
||||
resultList.push({
|
||||
id: item.id,
|
||||
@ -731,7 +641,7 @@ async function getDirectoryItemList(
|
||||
item.name =
|
||||
type === 0 ? deleteExtname(getFileName(path)) : getFileName(path);
|
||||
item.data.target = path;
|
||||
item.data.icon = getFileIcon(path);
|
||||
item.data.icon = await getFileIcon(path);
|
||||
}
|
||||
// push
|
||||
resultList.push(item);
|
||||
@ -753,7 +663,7 @@ function checkInvalidItem(itemList: Array<Item>) {
|
||||
// 只校验文件和文件夹
|
||||
if (item.type === 0 || item.type === 1) {
|
||||
// 获取绝对路径
|
||||
let path = getAbsolutePath(item.data.target);
|
||||
let path = parsePath(item.data.target);
|
||||
try {
|
||||
statSync(path);
|
||||
} catch (e) {
|
||||
|
@ -114,6 +114,10 @@ contextBridge.exposeInMainWorld("api", {
|
||||
) => {
|
||||
ipcRenderer.send("run", { operation, target, params, startLocation });
|
||||
},
|
||||
// 文本框菜单
|
||||
textRightMenu: () => {
|
||||
ipcRenderer.send("textRightMenu");
|
||||
},
|
||||
});
|
||||
|
||||
contextBridge.exposeInMainWorld("main", {
|
||||
|
4
electron/types/global.d.ts
vendored
4
electron/types/global.d.ts
vendored
@ -5,6 +5,8 @@ import { Setting } from "../../types/setting";
|
||||
declare global {
|
||||
// addon
|
||||
var addon: any;
|
||||
// 是否是首次打开软件
|
||||
var first: boolean;
|
||||
// 语言
|
||||
var language: any;
|
||||
// 主窗口
|
||||
@ -57,6 +59,8 @@ declare global {
|
||||
var classificationRightMenu: boolean | null;
|
||||
// 项目右键菜单显示
|
||||
var itemRightMenu: boolean | null;
|
||||
// 存储主窗口当前是否有弹出对话框
|
||||
var mainWindowShowDialog: boolean;
|
||||
}
|
||||
|
||||
export interface ChildProcessInfo {
|
||||
|
11
package.json
11
package.json
@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "dawn-launcher",
|
||||
"productName": "Dawn Launcher",
|
||||
"version": "1.3.7",
|
||||
"version": "1.5.1",
|
||||
"main": "dist-electron/main/index.js",
|
||||
"description": "Windows 快捷启动工具,帮助您整理杂乱无章的桌面,分门别类管理您的桌面快捷方式,让您的桌面保持干净整洁。",
|
||||
"author": "FanChenIO",
|
||||
@ -29,17 +29,17 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@napi-rs/cli": "^2.16.3",
|
||||
"@vicons/material": "^0.12.0",
|
||||
"@vicons/ionicons5": "^0.12.0",
|
||||
"@vicons/material": "^0.12.0",
|
||||
"@vicons/utils": "^0.1.4",
|
||||
"@vitejs/plugin-vue": "^4.4.0",
|
||||
"autoprefixer": "^10.4.16",
|
||||
"better-sqlite3-multiple-ciphers": "^9.0.0",
|
||||
"electron": "^26.4.2",
|
||||
"better-sqlite3-multiple-ciphers": "^9.4.1",
|
||||
"electron": "^28.3.1",
|
||||
"electron-builder": "^24.6.5",
|
||||
"less": "^4.2.0",
|
||||
"less-loader": "^11.1.3",
|
||||
"naive-ui": "^2.35.0",
|
||||
"naive-ui": "^2.36.0",
|
||||
"postcss": "^8.4.31",
|
||||
"tailwindcss": "^3.3.5",
|
||||
"typescript": "^5.2.2",
|
||||
@ -60,6 +60,7 @@
|
||||
"dompurify": "^3.0.6",
|
||||
"electron-log": "^5.0.0",
|
||||
"electron-store": "^8.1.0",
|
||||
"icojs": "^0.19.3",
|
||||
"mime": "^3.0.0",
|
||||
"pinia": "^2.1.7",
|
||||
"pinyin-pro": "^3.17.0",
|
||||
|
45
rust/lib.rs
45
rust/lib.rs
@ -31,24 +31,6 @@ fn get_shortcut_file_info(path: String) -> Option<HashMap<String, String>> {
|
||||
windows::get_shortcut_file_info(&path)
|
||||
}
|
||||
|
||||
/**
|
||||
* 运行
|
||||
*/
|
||||
#[allow(dead_code)]
|
||||
#[napi]
|
||||
fn shell_execute(operation: String, file: String, params: String, start_location: Option<String>) {
|
||||
windows::shell_execute(operation, file, params, start_location)
|
||||
}
|
||||
|
||||
/**
|
||||
* 运行系统项目
|
||||
*/
|
||||
#[allow(dead_code)]
|
||||
#[napi]
|
||||
fn system_item_execute(target: String, params: Option<String>) {
|
||||
windows::system_item_execute(&target, params.as_deref())
|
||||
}
|
||||
|
||||
/**
|
||||
* 打开文件所在位置
|
||||
*/
|
||||
@ -192,3 +174,30 @@ fn get_appx_list() -> Vec<HashMap<String, String>> {
|
||||
fn get_cursor_point() -> [i32; 2] {
|
||||
windows::get_cursor_point()
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭显示器
|
||||
*/
|
||||
#[allow(dead_code)]
|
||||
#[napi]
|
||||
pub fn turn_off_monitor() {
|
||||
windows::turn_off_monitor()
|
||||
}
|
||||
|
||||
/**
|
||||
* 运行
|
||||
*/
|
||||
#[allow(dead_code)]
|
||||
#[napi]
|
||||
fn shell_execute(operation: String, file: String, params: String, start_location: Option<String>) {
|
||||
windows::shell_execute(operation, file, params, start_location)
|
||||
}
|
||||
|
||||
/**
|
||||
* 运行系统项目
|
||||
*/
|
||||
#[allow(dead_code)]
|
||||
#[napi]
|
||||
fn system_item_execute(target: String, params: Option<String>) {
|
||||
windows::system_item_execute(&target, params.as_deref())
|
||||
}
|
||||
|
198
rust/windows.rs
198
rust/windows.rs
@ -14,9 +14,8 @@ use std::{
|
||||
process::Command,
|
||||
sync::atomic::{AtomicBool, Ordering},
|
||||
};
|
||||
use windows::Management::Deployment::PackageManager;
|
||||
use windows::{
|
||||
core::{ComInterface, HSTRING, PCSTR, PCWSTR},
|
||||
core::{ComInterface, HSTRING, PCSTR, PCWSTR, PSTR},
|
||||
w,
|
||||
Win32::{
|
||||
Foundation::{HWND, LPARAM, LRESULT, MAX_PATH, POINT, RECT, SIZE, WPARAM},
|
||||
@ -34,7 +33,6 @@ use windows::{
|
||||
CLSCTX_INPROC_SERVER, COINIT_APARTMENTTHREADED, STGM_READ,
|
||||
},
|
||||
Environment::GetEnvironmentVariableW,
|
||||
SystemInformation::GetSystemDirectoryW,
|
||||
},
|
||||
UI::{
|
||||
Input::Ime::{
|
||||
@ -44,23 +42,29 @@ use windows::{
|
||||
Shell::{
|
||||
BHID_SFUIObject, IContextMenu, IShellItem, IShellItemImageFactory, IShellLinkW,
|
||||
SHCreateItemFromParsingName, SHEmptyRecycleBinW, SHQueryUserNotificationState,
|
||||
ShellExecuteW, ShellLink, CMF_NORMAL, CMINVOKECOMMANDINFO,
|
||||
QUNS_ACCEPTS_NOTIFICATIONS, QUNS_APP, QUNS_BUSY, QUNS_NOT_PRESENT,
|
||||
QUNS_PRESENTATION_MODE, QUNS_QUIET_TIME, QUNS_RUNNING_D3D_FULL_SCREEN,
|
||||
SHERB_NOSOUND, SIIGBF_ICONONLY, SLGP_UNCPRIORITY,
|
||||
ShellLink, CMF_NORMAL, CMINVOKECOMMANDINFO, QUNS_ACCEPTS_NOTIFICATIONS, QUNS_APP,
|
||||
QUNS_BUSY, QUNS_NOT_PRESENT, QUNS_PRESENTATION_MODE, QUNS_QUIET_TIME,
|
||||
QUNS_RUNNING_D3D_FULL_SCREEN, SHERB_NOSOUND, SIIGBF_ICONONLY, SLGP_UNCPRIORITY,
|
||||
},
|
||||
WindowsAndMessaging::{
|
||||
CallNextHookEx, CreatePopupMenu, DestroyMenu, FindWindowW, GetClassNameW,
|
||||
GetCursorPos, GetForegroundWindow, GetSystemMetrics, GetWindowRect, SendMessageW,
|
||||
SetForegroundWindow, SetWindowsHookExW, TrackPopupMenu, WindowFromPoint, HHOOK,
|
||||
MSLLHOOKSTRUCT, SC_MONITORPOWER, SM_CXSCREEN, SM_CYSCREEN, SW_NORMAL,
|
||||
SW_SHOWDEFAULT, TPM_NONOTIFY, TPM_RETURNCMD, WH_MOUSE_LL, WM_LBUTTONDOWN,
|
||||
WM_LBUTTONUP, WM_MBUTTONDOWN, WM_MBUTTONUP, WM_MOUSEHWHEEL, WM_MOUSEMOVE,
|
||||
WM_MOUSEWHEEL, WM_RBUTTONDOWN, WM_RBUTTONUP, WM_SYSCOMMAND,
|
||||
MSLLHOOKSTRUCT, SC_MONITORPOWER, SM_CXSCREEN, SM_CYSCREEN, SW_NORMAL, TPM_NONOTIFY,
|
||||
TPM_RETURNCMD, WH_MOUSE_LL, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MBUTTONDOWN,
|
||||
WM_MBUTTONUP, WM_MOUSEHWHEEL, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN,
|
||||
WM_RBUTTONUP, WM_SYSCOMMAND,
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
use windows::{
|
||||
Management::Deployment::PackageManager,
|
||||
Win32::{
|
||||
System::SystemInformation::GetSystemDirectoryW,
|
||||
UI::{Shell::ShellExecuteW, WindowsAndMessaging::SW_SHOWDEFAULT},
|
||||
},
|
||||
};
|
||||
|
||||
// 获取图标并转为BASE64
|
||||
pub fn get_file_icon(path: &str) -> Option<String> {
|
||||
@ -177,45 +181,6 @@ fn image_buffer_to_base64(image_buffer: ImageBuffer<Rgba<u8>, Vec<u8>>) -> Strin
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* 运行
|
||||
*/
|
||||
pub fn shell_execute(
|
||||
operation: String,
|
||||
file: String,
|
||||
params: String,
|
||||
start_location: Option<String>,
|
||||
) {
|
||||
thread::spawn(move || {
|
||||
// dir
|
||||
let dir = start_location.unwrap_or_else(|| {
|
||||
// 判断是否是文件夹
|
||||
let path = Path::new(&file);
|
||||
if path.is_dir() {
|
||||
// 文件夹
|
||||
file.clone()
|
||||
} else {
|
||||
// 文件 获取上一级目录
|
||||
path.parent().unwrap().display().to_string()
|
||||
}
|
||||
});
|
||||
// HSTRING
|
||||
let operation = HSTRING::from(operation.as_str());
|
||||
let file = HSTRING::from(file.as_str());
|
||||
let params = HSTRING::from(params.as_str());
|
||||
let dir = HSTRING::from(dir.as_str());
|
||||
// PCWSTR
|
||||
let operation = PCWSTR(operation.as_ptr());
|
||||
let file = PCWSTR(file.as_ptr());
|
||||
let params = PCWSTR(params.as_ptr());
|
||||
let dir = PCWSTR(dir.as_ptr());
|
||||
unsafe {
|
||||
// execute
|
||||
ShellExecuteW(None, operation, file, params, dir, SW_SHOWDEFAULT);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取快捷方式信息
|
||||
*/
|
||||
@ -265,45 +230,6 @@ pub fn get_shortcut_file_info(path: &str) -> Option<HashMap<String, String>> {
|
||||
None
|
||||
}
|
||||
|
||||
/**
|
||||
* 运行命令
|
||||
*/
|
||||
pub fn system_item_execute(target: &str, params: Option<&str>) {
|
||||
if target == "static:TurnOffMonitor" {
|
||||
// 关闭显示器
|
||||
turn_off_monitor()
|
||||
} else {
|
||||
let mut file = target.to_string();
|
||||
if !target.starts_with("shell:") {
|
||||
// 如果不是shell开头,就查询路径
|
||||
file = search_path(target).unwrap_or(target.to_string());
|
||||
}
|
||||
let file = HSTRING::from(file);
|
||||
let params = match params {
|
||||
Some(p) => HSTRING::from(p),
|
||||
_ => HSTRING::new(),
|
||||
};
|
||||
// 获取系统盘路径当作工作目录
|
||||
let mut buffer = [0u16; MAX_PATH as usize];
|
||||
unsafe {
|
||||
GetSystemDirectoryW(Some(&mut buffer));
|
||||
}
|
||||
let dir = u16_to_string(&buffer);
|
||||
let dir = HSTRING::from(dir);
|
||||
// execute
|
||||
unsafe {
|
||||
ShellExecuteW(
|
||||
None,
|
||||
w!("open"),
|
||||
PCWSTR(file.as_ptr()),
|
||||
PCWSTR(params.as_ptr()),
|
||||
PCWSTR(dir.as_ptr()),
|
||||
SW_SHOWDEFAULT,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 关闭显示器
|
||||
*/
|
||||
@ -784,3 +710,97 @@ pub fn get_cursor_point() -> [i32; 2] {
|
||||
};
|
||||
[point.x, point.y]
|
||||
}
|
||||
|
||||
/**
|
||||
* 运行
|
||||
*/
|
||||
pub fn shell_execute(
|
||||
operation: String,
|
||||
file: String,
|
||||
params: String,
|
||||
start_location: Option<String>,
|
||||
) {
|
||||
thread::spawn(move || {
|
||||
// 是否是打开文件夹
|
||||
let is_dir = operation == "explore";
|
||||
// dir
|
||||
let dir = start_location.unwrap_or_else(|| {
|
||||
// 判断是否是文件夹
|
||||
let path = Path::new(&file);
|
||||
if path.is_dir() {
|
||||
// 文件夹
|
||||
file.clone()
|
||||
} else {
|
||||
// 文件 获取上一级目录
|
||||
path.parent().unwrap().display().to_string()
|
||||
}
|
||||
});
|
||||
// 文件夹
|
||||
let dir_param = format!("\"{}\"", file.to_string());
|
||||
let dir_param = HSTRING::from(dir_param.as_str());
|
||||
let dir_param = PCWSTR(dir_param.as_ptr());
|
||||
// HSTRING
|
||||
let operation = HSTRING::from(operation.as_str());
|
||||
let file = HSTRING::from(file.as_str());
|
||||
let params = HSTRING::from(params.as_str());
|
||||
let dir = HSTRING::from(dir.as_str());
|
||||
// PCWSTR
|
||||
let operation = PCWSTR(operation.as_ptr());
|
||||
let file = PCWSTR(file.as_ptr());
|
||||
let params = PCWSTR(params.as_ptr());
|
||||
let dir = PCWSTR(dir.as_ptr());
|
||||
unsafe {
|
||||
if is_dir {
|
||||
ShellExecuteW(
|
||||
None,
|
||||
w!("open"),
|
||||
w!("explorer.exe"),
|
||||
dir_param,
|
||||
None,
|
||||
SW_SHOWDEFAULT,
|
||||
);
|
||||
} else {
|
||||
ShellExecuteW(None, operation, file, params, dir, SW_SHOWDEFAULT);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 运行命令
|
||||
*/
|
||||
pub fn system_item_execute(target: &str, params: Option<&str>) {
|
||||
if target == "static:TurnOffMonitor" {
|
||||
// 关闭显示器
|
||||
turn_off_monitor()
|
||||
} else {
|
||||
let mut file = target.to_string();
|
||||
if !target.starts_with("shell:") {
|
||||
// 如果不是shell开头,就查询路径
|
||||
file = search_path(target).unwrap_or(target.to_string());
|
||||
}
|
||||
let file = HSTRING::from(file);
|
||||
let params = match params {
|
||||
Some(p) => HSTRING::from(p),
|
||||
_ => HSTRING::new(),
|
||||
};
|
||||
// 获取系统盘路径当作工作目录
|
||||
let mut buffer = [0u16; MAX_PATH as usize];
|
||||
unsafe {
|
||||
GetSystemDirectoryW(Some(&mut buffer));
|
||||
}
|
||||
let dir = u16_to_string(&buffer);
|
||||
let dir = HSTRING::from(dir);
|
||||
// execute
|
||||
unsafe {
|
||||
ShellExecuteW(
|
||||
None,
|
||||
w!("open"),
|
||||
PCWSTR(file.as_ptr()),
|
||||
PCWSTR(params.as_ptr()),
|
||||
PCWSTR(dir.as_ptr()),
|
||||
SW_SHOWDEFAULT,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
55
src/App.vue
55
src/App.vue
@ -91,10 +91,35 @@ function setTheme() {
|
||||
padding: "6px",
|
||||
},
|
||||
Checkbox: {
|
||||
color: store.setting.appearance.theme.mainBackgroundColor,
|
||||
textColor: store.setting.appearance.theme.mainFontColor,
|
||||
borderChecked: "1px solid " + store.setting.appearance.theme.borderColor,
|
||||
colorChecked: store.setting.appearance.theme.secondBackgroundColor,
|
||||
color: hexToRGBA(store.setting.appearance.theme.mainBackgroundColor, 1),
|
||||
textColor: hexToRGBA(store.setting.appearance.theme.mainFontColor, 1),
|
||||
border:
|
||||
"1px solid " + hexToRGBA(store.setting.appearance.theme.borderColor, 1),
|
||||
borderChecked:
|
||||
"1px solid " +
|
||||
hexToRGBA(store.setting.appearance.theme.mainFontColor, 1),
|
||||
colorChecked: "none",
|
||||
checkMarkColor: hexToRGBA(
|
||||
store.setting.appearance.theme.mainFontColor,
|
||||
1
|
||||
),
|
||||
},
|
||||
Radio: {
|
||||
boxShadowActive:
|
||||
"inset 0 0 0 1px " +
|
||||
hexToRGBA(store.setting.appearance.theme.mainFontColor, 1),
|
||||
boxShadowFocus:
|
||||
"inset 0 0 0 1px " +
|
||||
hexToRGBA(store.setting.appearance.theme.mainFontColor, 1),
|
||||
boxShadowHover:
|
||||
"inset 0 0 0 1px " +
|
||||
hexToRGBA(store.setting.appearance.theme.mainFontColor, 1),
|
||||
dotColorActive: hexToRGBA(
|
||||
store.setting.appearance.theme.mainFontColor,
|
||||
1
|
||||
),
|
||||
color: hexToRGBA(store.setting.appearance.theme.mainBackgroundColor, 1),
|
||||
textColor: hexToRGBA(store.setting.appearance.theme.mainFontColor, 1),
|
||||
},
|
||||
Form: {
|
||||
labelTextColor: store.setting.appearance.theme.mainFontColor,
|
||||
@ -280,6 +305,24 @@ function keydown(e: any) {
|
||||
}
|
||||
}
|
||||
}
|
||||
// 监听鼠标右键
|
||||
function contextmenu(e: MouseEvent) {
|
||||
let target = e.target as HTMLInputElement;
|
||||
if (target) {
|
||||
if (
|
||||
(target.nodeName != null &&
|
||||
target.nodeName.toLowerCase() == "input" &&
|
||||
target.type != null &&
|
||||
target.type.toLowerCase() == "text") ||
|
||||
(target.nodeName != null && target.nodeName.toLowerCase() == "textarea")
|
||||
) {
|
||||
window.api.textRightMenu();
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 监听
|
||||
let onUpdateSettingUnListen: Function | null = null;
|
||||
// mounted
|
||||
@ -288,6 +331,8 @@ onMounted(() => {
|
||||
createStyle();
|
||||
// 监听键盘
|
||||
window.addEventListener("keydown", keydown, true);
|
||||
// 监听右键
|
||||
window.addEventListener("contextmenu", contextmenu, true);
|
||||
// 监听更新项目
|
||||
onUpdateSettingUnListen = window.setting.onUpdate((data) => {
|
||||
store.setting = data;
|
||||
@ -297,6 +342,8 @@ onMounted(() => {
|
||||
onUnmounted(() => {
|
||||
// 监听键盘
|
||||
window.removeEventListener("keydown", keydown, true);
|
||||
// 监听右键
|
||||
window.removeEventListener("contextmenu", contextmenu, true);
|
||||
// 删除监听
|
||||
if (onUpdateSettingUnListen) {
|
||||
onUpdateSettingUnListen();
|
||||
|
1
src/index.d.ts
vendored
1
src/index.d.ts
vendored
@ -37,6 +37,7 @@ declare global {
|
||||
params: string | null,
|
||||
startLocation: string | null
|
||||
) => void;
|
||||
textRightMenu: () => void;
|
||||
};
|
||||
main: {
|
||||
showWindow: (blurHide: boolean, autoHide: boolean) => void;
|
||||
|
@ -4,6 +4,11 @@
|
||||
:style="{
|
||||
backgroundColor: store.setting.appearance.theme.mainBackgroundColor,
|
||||
color: store.setting.appearance.theme.mainFontColor,
|
||||
borderRadius:
|
||||
store.setting.appearance.transparency < 1 &&
|
||||
store.setting.appearance.windowRounded
|
||||
? '8px'
|
||||
: undefined,
|
||||
}"
|
||||
>
|
||||
<div class="flex items-center px-2 app-region-drag">
|
||||
@ -29,7 +34,7 @@
|
||||
/>
|
||||
<p class="mt-4">Dawn Launcher {{ version }}</p>
|
||||
<p class="mt-2">
|
||||
Copyright © 2022-2023 Dawn Launcher. All Rights Reserved
|
||||
Copyright © 2022-2025 Dawn Launcher. All Rights Reserved
|
||||
</p>
|
||||
<p class="mt-2">
|
||||
{{ store.language.officialWebsite }}{{ store.language.colon
|
||||
|
@ -4,6 +4,11 @@
|
||||
:style="{
|
||||
backgroundColor: store.setting.appearance.theme.mainBackgroundColor,
|
||||
color: store.setting.appearance.theme.mainFontColor,
|
||||
borderRadius:
|
||||
store.setting.appearance.transparency < 1 &&
|
||||
store.setting.appearance.windowRounded
|
||||
? '8px'
|
||||
: undefined,
|
||||
}"
|
||||
>
|
||||
<div class="flex items-center app-region-drag">
|
||||
|
@ -4,6 +4,11 @@
|
||||
:style="{
|
||||
backgroundColor: store.setting.appearance.theme.mainBackgroundColor,
|
||||
color: store.setting.appearance.theme.mainFontColor,
|
||||
borderRadius:
|
||||
store.setting.appearance.transparency < 1 &&
|
||||
store.setting.appearance.windowRounded
|
||||
? '8px'
|
||||
: undefined,
|
||||
}"
|
||||
>
|
||||
<div class="flex items-center app-region-drag">
|
||||
@ -131,7 +136,7 @@ let sortOptions = ref([
|
||||
value: "initial",
|
||||
},
|
||||
{
|
||||
label: store.language.byOpenNumber,
|
||||
label: store.language.byOpenCount,
|
||||
value: "openNumber",
|
||||
},
|
||||
{
|
||||
|
@ -4,6 +4,11 @@
|
||||
:style="{
|
||||
backgroundColor: store.setting.appearance.theme.mainBackgroundColor,
|
||||
color: store.setting.appearance.theme.mainFontColor,
|
||||
borderRadius:
|
||||
store.setting.appearance.transparency < 1 &&
|
||||
store.setting.appearance.windowRounded
|
||||
? '8px'
|
||||
: undefined,
|
||||
}"
|
||||
>
|
||||
<div class="flex items-center app-region-drag">
|
||||
|
@ -4,6 +4,11 @@
|
||||
:style="{
|
||||
backgroundColor: store.setting.appearance.theme.mainBackgroundColor,
|
||||
color: store.setting.appearance.theme.mainFontColor,
|
||||
borderRadius:
|
||||
store.setting.appearance.transparency < 1 &&
|
||||
store.setting.appearance.windowRounded
|
||||
? '8px'
|
||||
: undefined,
|
||||
}"
|
||||
>
|
||||
<div class="flex items-center px-2 app-region-drag">
|
||||
|
@ -78,7 +78,7 @@
|
||||
@dragleave="clearMouseOverChangeClassificationSetTimeout"
|
||||
>
|
||||
<span
|
||||
class="overflow-hidden text-ellipsis whitespace-nowrap"
|
||||
class="overflow-hidden whitespace-nowrap"
|
||||
:style="{
|
||||
filter: store.setting.appearance.fontShadow
|
||||
? 'drop-shadow(1px 1px 1px ' +
|
||||
@ -130,20 +130,20 @@
|
||||
<KeyboardArrowDownRound></KeyboardArrowDownRound>
|
||||
</Icon>
|
||||
</div>
|
||||
<ul
|
||||
<div
|
||||
v-show="
|
||||
classification.childList &&
|
||||
classification.childList.length > 0 &&
|
||||
classificationChildShowHiddenMap.has(classification.id)
|
||||
"
|
||||
class="classification-child-list"
|
||||
:class="[
|
||||
`${
|
||||
store.setting.classification.layout === 'top'
|
||||
? 'fixed z-[10000] rounded drop-shadow-[0_0_6px_rgba(0,0,0,0.2)] origin-top-left pt-1 mt-1'
|
||||
? '!fixed !z-[10000] !rounded-lg !origin-top-left !pt-1 !mt-1'
|
||||
: ''
|
||||
}`,
|
||||
]"
|
||||
:data-simplebar="store.setting.classification.layout === 'top'"
|
||||
:style="{
|
||||
backgroundColor:
|
||||
store.setting.classification.layout === 'top'
|
||||
@ -156,7 +156,16 @@
|
||||
store.setting.classification.layout === 'top'
|
||||
? classificationWidth + 'px'
|
||||
: '',
|
||||
maxHeight:
|
||||
store.setting.classification.layout === 'top' ? '300px' : 'auto',
|
||||
'box-shadow':
|
||||
store.setting.classification.layout === 'top'
|
||||
? '0 3px 6px -4px rgba(0, 0, 0, .12), 0 6px 16px 0 rgba(0, 0, 0, .08), 0 9px 28px 8px rgba(0, 0, 0, .05'
|
||||
: '',
|
||||
}"
|
||||
>
|
||||
<ul
|
||||
class="classification-child-list h-full"
|
||||
:classification-parent-id="classification.id"
|
||||
>
|
||||
<li
|
||||
@ -183,7 +192,9 @@
|
||||
`${
|
||||
store.setting.classification.layout !== 'top' ? 'rounded' : ''
|
||||
}`,
|
||||
`${store.setting.classification.mode === 'normal' ? 'px-2' : ''}`,
|
||||
`${
|
||||
store.setting.classification.mode === 'normal' ? 'px-2' : ''
|
||||
}`,
|
||||
]"
|
||||
:style="{
|
||||
color:
|
||||
@ -213,7 +224,7 @@
|
||||
@dragleave="clearMouseOverChangeClassificationSetTimeout"
|
||||
>
|
||||
<span
|
||||
class="overflow-hidden text-ellipsis whitespace-nowrap"
|
||||
class="overflow-hidden whitespace-nowrap"
|
||||
:style="{
|
||||
filter: store.setting.appearance.fontShadow
|
||||
? 'drop-shadow(1px 1px 1px ' +
|
||||
@ -237,6 +248,7 @@
|
||||
}"
|
||||
></li>
|
||||
</ul>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
@ -299,10 +311,17 @@ watch(
|
||||
() => {
|
||||
// +1
|
||||
count.value = count.value + 1;
|
||||
classificationChildShowHiddenMap.value = new Map();
|
||||
// 刷新DOM完毕执行
|
||||
nextTick(() => {
|
||||
// 滚动条
|
||||
createSimpleBar();
|
||||
// 设置分类宽度
|
||||
setClassificationWidth();
|
||||
// 创建父级分类拖拽对象;
|
||||
createClassificationParentSortable();
|
||||
// 创建子级分类拖拽对象
|
||||
createClassificationChildSortable();
|
||||
});
|
||||
}
|
||||
);
|
||||
@ -787,6 +806,8 @@ function createClassificationParentSortable() {
|
||||
setClassificationWidth();
|
||||
// 页面高度 - 34(标题栏固定高度)
|
||||
height.value = document.documentElement.clientHeight - 34;
|
||||
// 创建子级分类拖拽对象
|
||||
createClassificationChildSortable();
|
||||
});
|
||||
}
|
||||
},
|
||||
@ -862,6 +883,8 @@ function createClassificationChildSortable() {
|
||||
nextTick(() => {
|
||||
// 分类宽度
|
||||
setClassificationWidth();
|
||||
// 创建子级分类拖拽对象
|
||||
createClassificationChildSortable();
|
||||
});
|
||||
},
|
||||
})
|
||||
|
@ -4,6 +4,11 @@
|
||||
:style="{
|
||||
backgroundColor: store.setting.appearance.theme.mainBackgroundColor,
|
||||
color: store.setting.appearance.theme.mainFontColor,
|
||||
borderRadius:
|
||||
store.setting.appearance.transparency < 1 &&
|
||||
store.setting.appearance.windowRounded
|
||||
? '8px'
|
||||
: undefined,
|
||||
}"
|
||||
>
|
||||
<div class="flex items-center px-2 app-region-drag">
|
||||
|
@ -300,15 +300,6 @@ let topRightMenuOptions = ref<Array<any>>([
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
label: store.language.rewardSponsor,
|
||||
key: "RewardSponsor",
|
||||
props: {
|
||||
onclick: () => {
|
||||
window.api.openURL("https://dawnlauncher.com/sponsor");
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
label: store.language.feedback,
|
||||
key: "Feedback",
|
||||
@ -532,6 +523,8 @@ onMounted(() => {
|
||||
// 监听显示窗口之前
|
||||
listens.push(
|
||||
window.main.onShowWindowBefore((data) => {
|
||||
// 隐藏搜索
|
||||
store.search = false;
|
||||
if (classificationContentRef.value) {
|
||||
// 如果分类ID不为空的话选择分类ID
|
||||
let selectedClassificationId: number | null =
|
||||
|
@ -5,6 +5,11 @@
|
||||
backgroundColor: store.setting.appearance.theme.mainBackgroundColor,
|
||||
color: store.setting.appearance.theme.mainFontColor,
|
||||
height: height + 'px',
|
||||
borderRadius:
|
||||
store.setting.appearance.transparency < 1 &&
|
||||
store.setting.appearance.windowRounded
|
||||
? '8px'
|
||||
: undefined,
|
||||
}"
|
||||
>
|
||||
<div class="flex items-center px-2 app-region-drag">
|
||||
@ -324,9 +329,7 @@
|
||||
v-if="
|
||||
selectedMenuId === 0 &&
|
||||
form.data.target &&
|
||||
form.data.target.trim() !== '' &&
|
||||
(getFileExtname(form.data.target) === 'exe' ||
|
||||
getFileExtname(form.data.target) === 'bat')
|
||||
form.data.target.trim() !== ''
|
||||
"
|
||||
v-model:checked="form.data.runAsAdmin"
|
||||
:focusable="false"
|
||||
@ -454,7 +457,6 @@ import {
|
||||
isAbsolutePath,
|
||||
deleteExtname,
|
||||
getFileName,
|
||||
getFileExtname,
|
||||
} from "../../../commons/utils/common";
|
||||
import SystemItemList from "./components/SystemItemList.vue";
|
||||
import StartMenuItemList from "./components/StartMenuItemList.vue";
|
||||
@ -651,12 +653,6 @@ async function confirm() {
|
||||
if (!success) {
|
||||
return;
|
||||
}
|
||||
// 后缀
|
||||
let ext = getFileExtname(form.data.target);
|
||||
// 如果选中按管理员运行,但是文件类型不是exe和bat就修改为false
|
||||
if (form.data.runAsAdmin && (!ext || (ext !== "exe" && ext !== "bat"))) {
|
||||
form.data.runAsAdmin = false;
|
||||
}
|
||||
if (!id) {
|
||||
// 添加
|
||||
await addItem();
|
||||
@ -833,8 +829,10 @@ onMounted(() => {
|
||||
getURLInfoLoading.value = false;
|
||||
let res: Result = data;
|
||||
if (res.status) {
|
||||
if (res.icon && res.icon.trim() !== "") {
|
||||
form.data.icon = res.icon;
|
||||
form.data.htmlIcon = null;
|
||||
}
|
||||
form.name = res.name ?? "";
|
||||
} else {
|
||||
window.api.showErrorMessageBox(
|
||||
|
@ -4,6 +4,11 @@
|
||||
:style="{
|
||||
backgroundColor: store.setting.appearance.theme.mainBackgroundColor,
|
||||
color: store.setting.appearance.theme.mainFontColor,
|
||||
borderRadius:
|
||||
store.setting.appearance.transparency < 1 &&
|
||||
store.setting.appearance.windowRounded
|
||||
? '8px'
|
||||
: undefined,
|
||||
}"
|
||||
>
|
||||
<div class="flex items-center px-2 app-region-drag">
|
||||
|
@ -4,6 +4,11 @@
|
||||
:style="{
|
||||
backgroundColor: store.setting.appearance.theme.mainBackgroundColor,
|
||||
color: store.setting.appearance.theme.mainFontColor,
|
||||
borderRadius:
|
||||
store.setting.appearance.transparency < 1 &&
|
||||
store.setting.appearance.windowRounded
|
||||
? '8px'
|
||||
: undefined,
|
||||
}"
|
||||
>
|
||||
<div class="flex items-center px-2 app-region-drag">
|
||||
|
@ -65,6 +65,19 @@
|
||||
: 'item-name-tile-1'
|
||||
}`,
|
||||
]"
|
||||
:style="{
|
||||
fontSize: store.setting.item.fontSize + 'px',
|
||||
fontWeight: store.setting.item.fontWeight,
|
||||
lineHeight: store.setting.item.fontLineHeight + 'rem',
|
||||
maxHeight:
|
||||
store.setting.item.itemNameRowCount == 2
|
||||
? store.setting.item.hideEllipsis
|
||||
? store.setting.item.fontLineHeight * 2 + 'rem'
|
||||
: undefined
|
||||
: store.setting.item.hideEllipsis
|
||||
? store.setting.item.fontLineHeight * 1 + 'rem'
|
||||
: undefined,
|
||||
}"
|
||||
>
|
||||
{{ item.name }}
|
||||
</p>
|
||||
|
@ -130,6 +130,7 @@ import {
|
||||
setItemWidth,
|
||||
run,
|
||||
removeInvalidItem,
|
||||
showItemList,
|
||||
} from "../js";
|
||||
import ItemList from "./List.vue";
|
||||
import { Item } from "../../../../types/item";
|
||||
@ -154,6 +155,12 @@ watch(
|
||||
nextTick(() => {
|
||||
// 监听页面大小
|
||||
resize();
|
||||
// 设置项目宽度
|
||||
setItemWidth();
|
||||
// 创建项目拖拽对象
|
||||
createItemSortable();
|
||||
// 清除批量操作
|
||||
clearBatchOperation();
|
||||
// 滚动到顶部
|
||||
scrollToTop(itemContentSimpleBar);
|
||||
});
|
||||
@ -309,12 +316,21 @@ function createItemSortable() {
|
||||
let fromClassificationId = parseInt(
|
||||
event.from.getAttribute("classification-id")!
|
||||
);
|
||||
// 当前项目
|
||||
const currentItem =
|
||||
getItemListByClassificationId(fromClassificationId)[
|
||||
event.oldIndex
|
||||
];
|
||||
let fromClassification =
|
||||
getClassificationById(fromClassificationId);
|
||||
if (fromClassification) {
|
||||
let itemList =
|
||||
getItemListByClassificationId(fromClassificationId);
|
||||
if (itemList) {
|
||||
let copyItemList = JSON.parse(JSON.stringify(itemList));
|
||||
// 可能会存在自定义排序的情况,所以需要按照指定的排序方式获取项目
|
||||
const currentItem = showItemList(
|
||||
copyItemList,
|
||||
fromClassification
|
||||
)[event.oldIndex];
|
||||
fromIdList.push(currentItem.id);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// 批量操作
|
||||
for (const value of store.itemBatchOperationDataArray) {
|
||||
@ -536,7 +552,7 @@ function drop(e: any, classificationId: number | null) {
|
||||
) {
|
||||
// 如果不是同一个项目就可以使用某个程序打开此文件
|
||||
if (item.id !== store.itemDragOutData.id) {
|
||||
let params = store.itemDragOutData.data.target;
|
||||
let params = '"' + store.itemDragOutData.data.target + '"';
|
||||
if (item.data.params) {
|
||||
params += " " + item.data.params;
|
||||
}
|
||||
@ -617,6 +633,14 @@ async function contextmenu(e: any) {
|
||||
// 记录右键选中的ID
|
||||
store.itemRightMenuItemId = id;
|
||||
}
|
||||
// 获取当前项目在页面的所属分类
|
||||
let pageClassificationId = null;
|
||||
let itemListElement = getClassElement(e, "item-list");
|
||||
if (itemListElement) {
|
||||
pageClassificationId = parseInt(
|
||||
itemListElement.getAttribute("classification-id")
|
||||
);
|
||||
}
|
||||
// 弹出菜单
|
||||
window.item.showRightMenu({
|
||||
classificationId: getSelectedClassificationId(),
|
||||
@ -627,6 +651,7 @@ async function contextmenu(e: any) {
|
||||
x: e.screenX,
|
||||
y: e.screenY,
|
||||
type: "main",
|
||||
pageClassificationId,
|
||||
});
|
||||
}
|
||||
// beforeMount
|
||||
|
@ -37,7 +37,7 @@
|
||||
<p
|
||||
class="text-center mx-2"
|
||||
:class="[
|
||||
`${getLayout(classificationId) === 'tile' ? 'mt-2' : ''}`,
|
||||
`${getLayout(classificationId) === 'tile' ? 'mt-2 text-center' : ''}`,
|
||||
`${
|
||||
getLayout(classificationId) === 'list'
|
||||
? store.setting.item.hideEllipsis
|
||||
@ -60,6 +60,18 @@
|
||||
: undefined,
|
||||
fontWeight: store.setting.item.fontWeight,
|
||||
lineHeight: store.setting.item.fontLineHeight + 'rem',
|
||||
maxHeight:
|
||||
getLayout(classificationId) === 'list'
|
||||
? store.setting.item.hideEllipsis
|
||||
? store.setting.item.fontLineHeight * 1 + 'rem'
|
||||
: undefined
|
||||
: store.setting.item.itemNameRowCount === 2
|
||||
? store.setting.item.hideEllipsis
|
||||
? store.setting.item.fontLineHeight * 2 + 'rem'
|
||||
: undefined
|
||||
: store.setting.item.hideEllipsis
|
||||
? store.setting.item.fontLineHeight * 1 + 'rem'
|
||||
: undefined,
|
||||
}"
|
||||
v-if="!store.setting.item.hideItemName"
|
||||
>
|
||||
@ -228,9 +240,9 @@ function runItem(e: any, dbclick: boolean) {
|
||||
let item = getItemById(itemId);
|
||||
if (item && item.data) {
|
||||
if (dbclick && store.setting.item.doubleClickOpen) {
|
||||
run("main", item.data.runAsAdmin ? "runas" : "open", item);
|
||||
run("main", "open", item);
|
||||
} else if (!dbclick && !store.setting.item.doubleClickOpen) {
|
||||
run("main", item.data.runAsAdmin ? "runas" : "open", item);
|
||||
run("main", "open", item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -65,6 +65,19 @@
|
||||
: 'item-name-tile-1'
|
||||
}`,
|
||||
]"
|
||||
:style="{
|
||||
fontSize: store.setting.item.fontSize + 'px',
|
||||
fontWeight: store.setting.item.fontWeight,
|
||||
lineHeight: store.setting.item.fontLineHeight + 'rem',
|
||||
maxHeight:
|
||||
store.setting.item.itemNameRowCount == 2
|
||||
? store.setting.item.hideEllipsis
|
||||
? store.setting.item.fontLineHeight * 2 + 'rem'
|
||||
: undefined
|
||||
: store.setting.item.hideEllipsis
|
||||
? store.setting.item.fontLineHeight * 1 + 'rem'
|
||||
: undefined,
|
||||
}"
|
||||
>
|
||||
{{ item.name }}
|
||||
</p>
|
||||
|
@ -66,6 +66,19 @@
|
||||
: 'item-name-tile-1'
|
||||
}`,
|
||||
]"
|
||||
:style="{
|
||||
fontSize: store.setting.item.fontSize + 'px',
|
||||
fontWeight: store.setting.item.fontWeight,
|
||||
lineHeight: store.setting.item.fontLineHeight + 'rem',
|
||||
maxHeight:
|
||||
store.setting.item.itemNameRowCount == 2
|
||||
? store.setting.item.hideEllipsis
|
||||
? store.setting.item.fontLineHeight * 2 + 'rem'
|
||||
: undefined
|
||||
: store.setting.item.hideEllipsis
|
||||
? store.setting.item.fontLineHeight * 1 + 'rem'
|
||||
: undefined,
|
||||
}"
|
||||
>
|
||||
{{ item.name }}
|
||||
</p>
|
||||
|
@ -36,7 +36,7 @@ function setItemWidth() {
|
||||
// 获取项目数量
|
||||
let itemList = itemListElement.getElementsByClassName("item");
|
||||
// 每行数量
|
||||
let num = null;
|
||||
let num = 1;
|
||||
// 布局
|
||||
let layout = getLayout(
|
||||
classificationId ? parseInt(classificationId) : null
|
||||
@ -69,20 +69,10 @@ function setItemWidth() {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (
|
||||
num !== null &&
|
||||
((layout === "tile" && itemList.length >= num) || layout === "list")
|
||||
) {
|
||||
for (let i = 0; i < itemList.length; i++) {
|
||||
let itemElement = itemList[i] as HTMLElement;
|
||||
itemElement.style.width = (width - num * 4) / num + "px";
|
||||
}
|
||||
} else {
|
||||
for (let i = 0; i < itemList.length; i++) {
|
||||
let itemElement = itemList[i] as HTMLElement;
|
||||
itemElement.style.width = minWidth + "px";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -750,15 +740,24 @@ function getName(name: string | null) {
|
||||
* @param item
|
||||
* @returns
|
||||
*/
|
||||
function getItemTitle(item: Item) {
|
||||
function getItemTitle(item: Item, quickSearch: boolean = false) {
|
||||
let name =
|
||||
store.language.name +
|
||||
store.language.colon +
|
||||
(item.name ? item.name.replace(/\\n/g, " ") : "");
|
||||
if (store.setting.item.openNumber) {
|
||||
if (
|
||||
quickSearch &&
|
||||
store.setting.quickSearch.showHistorySort === "openNumber"
|
||||
) {
|
||||
name +=
|
||||
"\n" +
|
||||
store.language.openNumber +
|
||||
store.language.openCount +
|
||||
store.language.colon +
|
||||
(item.data.quickSearchOpenNumber ?? 0);
|
||||
} else if (store.setting.item.openNumber) {
|
||||
name +=
|
||||
"\n" +
|
||||
store.language.openCount +
|
||||
store.language.colon +
|
||||
(item.data.openNumber ?? 0);
|
||||
}
|
||||
|
@ -4,6 +4,11 @@
|
||||
:style="{
|
||||
color: store.setting.appearance.theme.mainFontColor,
|
||||
backgroundColor: store.setting.appearance.theme.mainBackgroundColor,
|
||||
borderRadius:
|
||||
store.setting.appearance.transparency < 1 &&
|
||||
store.setting.appearance.windowRounded
|
||||
? '8px'
|
||||
: undefined,
|
||||
}"
|
||||
>
|
||||
<div
|
||||
@ -68,20 +73,25 @@
|
||||
)
|
||||
: undefined,
|
||||
}"
|
||||
:title="getItemTitle(item as Item)"
|
||||
:title="getItemTitle(item as Item, true)"
|
||||
:index="index"
|
||||
:target="item.data.target"
|
||||
>
|
||||
<CustomItemIcon :item="(item as Item)" :icon-size="28"></CustomItemIcon>
|
||||
<span
|
||||
class="text-sm ml-[10px] overflow-hidden text-ellipsis whitespace-nowrap h-[20px] flex-1 pr-[10px]"
|
||||
>{{ getName(item.name)
|
||||
}}<span v-if="mode === 'search'" class="text-xs ml-2">{{
|
||||
class="text-sm ml-[10px] overflow-hidden text-ellipsis whitespace-nowrap h-[20px]"
|
||||
>{{ getName(item.name) }}</span
|
||||
>
|
||||
<span
|
||||
v-if="mode === 'search'"
|
||||
class="text-xs ml-2 max-w-[100px] flex-shrink-0 pr-[10px]"
|
||||
>{{
|
||||
getSearchItemClassificationName((item as Item).classificationId)
|
||||
}}</span></span
|
||||
}}</span
|
||||
>
|
||||
<!-- 快捷键 -->
|
||||
<template
|
||||
<div
|
||||
class="ml-auto max-w-[100px] flex-shrink-0"
|
||||
v-if="
|
||||
store.setting.quickSearch.openShortcutKey !== 'none' && index <= 9
|
||||
"
|
||||
@ -121,7 +131,7 @@
|
||||
:text="(index + 1 === 10 ? 0 : index + 1).toString()"
|
||||
></keyText>
|
||||
</template>
|
||||
</template>
|
||||
</div>
|
||||
<!-- 删除历史记录 -->
|
||||
<Icon
|
||||
v-if="showHistory"
|
||||
|
@ -84,10 +84,14 @@
|
||||
<CustomItemIcon :item="(item as Item)" :icon-size="32"></CustomItemIcon>
|
||||
<span
|
||||
class="text-sm ml-2 overflow-hidden text-ellipsis whitespace-nowrap h-[20px]"
|
||||
>{{ getName(item.name)
|
||||
}}<span v-if="mode === 'search'" class="text-xs ml-2">{{
|
||||
>{{ getName(item.name) }}</span
|
||||
>
|
||||
<span
|
||||
v-if="mode === 'search'"
|
||||
class="text-xs ml-2 max-w-[100px] flex-shrink-0"
|
||||
>{{
|
||||
getSearchItemClassificationName((item as Item).classificationId)
|
||||
}}</span></span
|
||||
}}</span
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
|
@ -5,6 +5,11 @@
|
||||
backgroundColor: store.setting.appearance.theme.mainBackgroundColor,
|
||||
color: store.setting.appearance.theme.mainFontColor,
|
||||
height: height + 'px',
|
||||
borderRadius:
|
||||
store.setting.appearance.transparency < 1 &&
|
||||
store.setting.appearance.windowRounded
|
||||
? '8px'
|
||||
: undefined,
|
||||
}"
|
||||
>
|
||||
<div class="flex items-center px-2 app-region-drag">
|
||||
@ -401,47 +406,95 @@
|
||||
<span class="block font-semibold">{{
|
||||
store.language.color
|
||||
}}</span>
|
||||
<NFormItem class="mt-1" :label="store.language.mainColor">
|
||||
<div
|
||||
:class="[
|
||||
`${
|
||||
store.setting.general.language !== 'English'
|
||||
? 'flex items-center'
|
||||
: ''
|
||||
}`,
|
||||
]"
|
||||
>
|
||||
<NFormItem
|
||||
class="mt-1 flex-1"
|
||||
:label="store.language.mainColor"
|
||||
>
|
||||
<NColorPicker
|
||||
:modes="['hex']"
|
||||
v-model:value="mainBackgroundColor"
|
||||
@complete="changeMainBackgroundColor"
|
||||
:to="false"
|
||||
:show-alpha="false"
|
||||
></NColorPicker>
|
||||
</NFormItem>
|
||||
<NFormItem class="mt-1" :label="store.language.secondaryColor">
|
||||
<NColorPicker
|
||||
:modes="['hex']"
|
||||
v-model:value="secondBackgroundColor"
|
||||
@complete="changeSecondBackgroundColor"
|
||||
:to="false"
|
||||
></NColorPicker>
|
||||
</NFormItem>
|
||||
<NFormItem class="mt-1" :label="store.language.fontMainColor">
|
||||
<NFormItem
|
||||
class="mt-1 flex-1"
|
||||
:label="store.language.fontMainColor"
|
||||
:class="[
|
||||
`${
|
||||
store.setting.general.language !== 'English'
|
||||
? 'ml-[10px]'
|
||||
: ''
|
||||
}`,
|
||||
]"
|
||||
>
|
||||
<NColorPicker
|
||||
:modes="['hex']"
|
||||
v-model:value="mainFontColor"
|
||||
@complete="changeMainFontColor"
|
||||
:to="false"
|
||||
:show-alpha="false"
|
||||
></NColorPicker>
|
||||
</NFormItem>
|
||||
</div>
|
||||
<div
|
||||
:class="[
|
||||
`${
|
||||
store.setting.general.language !== 'English'
|
||||
? 'flex items-center'
|
||||
: ''
|
||||
}`,
|
||||
]"
|
||||
>
|
||||
<NFormItem
|
||||
class="mt-1 flex-1"
|
||||
:label="store.language.secondaryColor"
|
||||
>
|
||||
<NColorPicker
|
||||
:modes="['hex']"
|
||||
v-model:value="secondBackgroundColor"
|
||||
@complete="changeSecondBackgroundColor"
|
||||
:to="false"
|
||||
:show-alpha="false"
|
||||
></NColorPicker>
|
||||
</NFormItem>
|
||||
<NFormItem
|
||||
class="mt-1"
|
||||
class="mt-1 flex-1"
|
||||
:label="store.language.fontSecondaryColor"
|
||||
:class="[
|
||||
`${
|
||||
store.setting.general.language !== 'English'
|
||||
? 'ml-[10px]'
|
||||
: ''
|
||||
}`,
|
||||
]"
|
||||
>
|
||||
<NColorPicker
|
||||
:modes="['hex']"
|
||||
v-model:value="secondFontColor"
|
||||
@complete="changeSecondFontColor"
|
||||
:to="false"
|
||||
:show-alpha="false"
|
||||
></NColorPicker>
|
||||
</NFormItem>
|
||||
</div>
|
||||
<NFormItem class="mt-1" :label="store.language.borderColor">
|
||||
<NColorPicker
|
||||
:modes="['hex']"
|
||||
v-model:value="borderColor"
|
||||
@complete="changeBorderColor"
|
||||
:to="false"
|
||||
:show-alpha="false"
|
||||
></NColorPicker>
|
||||
</NFormItem>
|
||||
</NForm>
|
||||
@ -451,28 +504,39 @@
|
||||
size="small"
|
||||
class="mt-3"
|
||||
>
|
||||
<span class="block font-semibold"
|
||||
>{{ store.language.backgroundTransparent }}({{
|
||||
transparency
|
||||
}})</span
|
||||
<span class="block font-semibold">{{
|
||||
store.language.backgroundTransparent
|
||||
}}</span>
|
||||
<NFormItem class="mt-1">
|
||||
<NRadio
|
||||
:checked="setting.appearance.transparency === 1"
|
||||
:value="false"
|
||||
@change="changeTransparency"
|
||||
>{{ store.language.notTransparent }}</NRadio
|
||||
>
|
||||
<NRadio
|
||||
:checked="setting.appearance.transparency < 1"
|
||||
:value="true"
|
||||
@change="changeTransparency"
|
||||
>{{ store.language.transparent }}</NRadio
|
||||
>
|
||||
<NFormItem>
|
||||
<input
|
||||
type="range"
|
||||
v-model="transparency"
|
||||
min="0.1"
|
||||
max="1.0"
|
||||
step="0.01"
|
||||
class="mt-2 w-full range"
|
||||
@change="setTransparency"
|
||||
/>
|
||||
</NFormItem>
|
||||
<NSlider
|
||||
v-if="setting.appearance.transparency < 1"
|
||||
class="mt-1"
|
||||
v-model:value="transparency"
|
||||
:step="0.01"
|
||||
:min="0.1"
|
||||
:max="0.99"
|
||||
:on-dragend="setTransparency"
|
||||
:keyboard="false"
|
||||
></NSlider>
|
||||
</NForm>
|
||||
<NForm
|
||||
label-placement="left"
|
||||
:show-feedback="false"
|
||||
size="small"
|
||||
class="mt-1"
|
||||
class="mt-3"
|
||||
>
|
||||
<span class="block font-semibold">{{
|
||||
store.language.backgroundImage
|
||||
@ -507,21 +571,18 @@
|
||||
class="mt-3"
|
||||
v-if="setting.appearance.backgroundImage && store.backgroundImage"
|
||||
>
|
||||
<span class="block font-semibold"
|
||||
>{{ store.language.backgroundImageTransparent }}({{
|
||||
setting.appearance.backgroundImageTransparency
|
||||
}})</span
|
||||
>
|
||||
<span class="block font-semibold">{{
|
||||
store.language.backgroundImageTransparent
|
||||
}}</span>
|
||||
<NFormItem>
|
||||
<input
|
||||
type="range"
|
||||
v-model="backgroundImageTransparency"
|
||||
min="0.1"
|
||||
max="1.0"
|
||||
step="0.01"
|
||||
class="mt-2 w-full range"
|
||||
@change="setBackgroundImageTransparency"
|
||||
/>
|
||||
<NSlider
|
||||
v-model:value="backgroundImageTransparency"
|
||||
:step="0.01"
|
||||
:min="0.1"
|
||||
:max="1.0"
|
||||
:on-dragend="setBackgroundImageTransparency"
|
||||
:keyboard="false"
|
||||
></NSlider>
|
||||
</NFormItem>
|
||||
</NForm>
|
||||
<NForm
|
||||
@ -550,7 +611,7 @@
|
||||
v-if="setting.appearance.backgroundImage && store.backgroundImage"
|
||||
>
|
||||
<span class="block font-semibold">{{
|
||||
store.language.backgroundImagePostion
|
||||
store.language.backgroundImagePosition
|
||||
}}</span>
|
||||
<NFormItem class="mt-2">
|
||||
<NSelect
|
||||
@ -872,21 +933,18 @@
|
||||
size="small"
|
||||
class="mt-3"
|
||||
>
|
||||
<span class="block font-semibold"
|
||||
>{{ store.language.columnNumber }}({{
|
||||
setting.item.columnNumber
|
||||
}})</span
|
||||
>
|
||||
<span class="block font-semibold">{{
|
||||
store.language.columnNumber
|
||||
}}</span>
|
||||
<NFormItem>
|
||||
<input
|
||||
type="range"
|
||||
v-model="columnNumber"
|
||||
min="1"
|
||||
max="20"
|
||||
step="1"
|
||||
class="mt-2 w-full range"
|
||||
@change="setColumnNumber"
|
||||
/>
|
||||
<NSlider
|
||||
v-model:value="columnNumber"
|
||||
:step="1"
|
||||
:min="1"
|
||||
:max="20"
|
||||
:on-dragend="setColumnNumber"
|
||||
:keyboard="false"
|
||||
></NSlider>
|
||||
</NFormItem>
|
||||
<Desc
|
||||
class="mt-1"
|
||||
@ -983,7 +1041,7 @@
|
||||
v-model:checked="setting.item.openNumber"
|
||||
:focusable="false"
|
||||
@update:checked="setOpenNumber"
|
||||
>{{ store.language.recordOpenNumber }}</NCheckbox
|
||||
>{{ store.language.recordOpenCount }}</NCheckbox
|
||||
>
|
||||
</NFormItem>
|
||||
</NForm>
|
||||
@ -1032,6 +1090,7 @@
|
||||
<NCheckbox
|
||||
v-model:checked="setting.quickSearch.enable"
|
||||
:focusable="false"
|
||||
@update:checked="setEnable"
|
||||
>{{ store.language.useQuickSearch }}</NCheckbox
|
||||
>
|
||||
</NFormItem>
|
||||
@ -1518,6 +1577,8 @@ import {
|
||||
NColorPicker,
|
||||
NInputNumber,
|
||||
NSelect,
|
||||
NRadio,
|
||||
NSlider,
|
||||
} from "naive-ui";
|
||||
import SimpleBar from "simplebar";
|
||||
import "simplebar/dist/simplebar.css";
|
||||
@ -2063,6 +2124,14 @@ function changeFontShadowColor(value: string) {
|
||||
}
|
||||
// 修改背景色透明
|
||||
let transparency = ref(setting.value.appearance.transparency);
|
||||
function changeTransparency(e: Event) {
|
||||
let val = (e.target as HTMLInputElement).value;
|
||||
if (val === "true") {
|
||||
setting.value.appearance.transparency = 0.9;
|
||||
} else {
|
||||
setting.value.appearance.transparency = 1;
|
||||
}
|
||||
}
|
||||
function setTransparency() {
|
||||
setting.value.appearance.transparency = Number(transparency.value);
|
||||
}
|
||||
@ -2110,6 +2179,11 @@ function setCheckInvalidItem(value: boolean) {
|
||||
function setOpenNumber(value: boolean) {
|
||||
window.setting.setOpenNumber(value);
|
||||
}
|
||||
// 启用
|
||||
function setEnable() {
|
||||
// 设置快捷键
|
||||
window.setting.setShortcutKey(convert(setting.value));
|
||||
}
|
||||
// 快速搜索打开快捷键
|
||||
let quickSearchShortcutKeyOpenOptions = ref([
|
||||
{
|
||||
@ -2136,7 +2210,7 @@ let quickSearchHistorySortOptions = ref([
|
||||
value: "lastOpen",
|
||||
},
|
||||
{
|
||||
label: store.language.byOpenNumber,
|
||||
label: store.language.byOpenCount,
|
||||
value: "openNumber",
|
||||
},
|
||||
]);
|
||||
|
@ -75,7 +75,7 @@ input::-webkit-inner-spin-button {
|
||||
}
|
||||
|
||||
.item-name-tile-2 {
|
||||
word-break: break-all;
|
||||
word-break: break-word;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
display: -webkit-box;
|
||||
@ -85,8 +85,7 @@ input::-webkit-inner-spin-button {
|
||||
}
|
||||
|
||||
.item-name-tile-2-no-ellipsis {
|
||||
max-height: 40px;
|
||||
word-break: break-all;
|
||||
word-break: break-word;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
@ -101,7 +100,6 @@ input::-webkit-inner-spin-button {
|
||||
}
|
||||
|
||||
.item-name-tile-1-no-ellipsis {
|
||||
max-height: 20px;
|
||||
word-break: break-all;
|
||||
overflow: hidden;
|
||||
}
|
||||
@ -117,7 +115,6 @@ input::-webkit-inner-spin-button {
|
||||
}
|
||||
|
||||
.item-name-list-no-ellipsis {
|
||||
max-height: 20px;
|
||||
word-break: break-all;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
454
yarn.lock
454
yarn.lock
@ -2,10 +2,10 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"7zip-bin@~5.1.1":
|
||||
version "5.1.1"
|
||||
resolved "https://registry.npmmirror.com/7zip-bin/-/7zip-bin-5.1.1.tgz#9274ec7460652f9c632c59addf24efb1684ef876"
|
||||
integrity sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==
|
||||
"7zip-bin@~5.2.0":
|
||||
version "5.2.0"
|
||||
resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.2.0.tgz#7a03314684dd6572b7dfa89e68ce31d60286854d"
|
||||
integrity sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==
|
||||
|
||||
"@alloc/quick-lru@^5.2.0":
|
||||
version "5.2.0"
|
||||
@ -17,6 +17,11 @@
|
||||
resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719"
|
||||
integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==
|
||||
|
||||
"@babel/parser@^7.24.4":
|
||||
version "7.24.5"
|
||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790"
|
||||
integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==
|
||||
|
||||
"@babel/runtime@^7.21.0":
|
||||
version "7.23.2"
|
||||
resolved "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885"
|
||||
@ -24,6 +29,11 @@
|
||||
dependencies:
|
||||
regenerator-runtime "^0.14.0"
|
||||
|
||||
"@canvas/image-data@^1.0.0":
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmmirror.com/@canvas/image-data/-/image-data-1.0.0.tgz#3bd2cd856e13fc9e2c25feff360a4056857b0367"
|
||||
integrity sha512-BxOqI5LgsIQP1odU5KMwV9yoijleOPzHL18/YvNqF9KFSGF2K/DLlYAbDQsWqd/1nbaFuSkYD/191dpMtNh4vw==
|
||||
|
||||
"@css-render/plugin-bem@^0.15.12":
|
||||
version "0.15.12"
|
||||
resolved "https://registry.npmmirror.com/@css-render/plugin-bem/-/plugin-bem-0.15.12.tgz#cd88e46a388e4786436bd622414da0aa6019af3b"
|
||||
@ -66,10 +76,10 @@
|
||||
optionalDependencies:
|
||||
global-agent "^3.0.0"
|
||||
|
||||
"@electron/notarize@2.1.0":
|
||||
version "2.1.0"
|
||||
resolved "https://registry.npmmirror.com/@electron/notarize/-/notarize-2.1.0.tgz#76aaec10c8687225e8d0a427cc9df67611c46ff3"
|
||||
integrity sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA==
|
||||
"@electron/notarize@2.2.1":
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/@electron/notarize/-/notarize-2.2.1.tgz#d0aa6bc43cba830c41bfd840b85dbe0e273f59fe"
|
||||
integrity sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==
|
||||
dependencies:
|
||||
debug "^4.1.1"
|
||||
fs-extra "^9.0.1"
|
||||
@ -87,10 +97,10 @@
|
||||
minimist "^1.2.6"
|
||||
plist "^3.0.5"
|
||||
|
||||
"@electron/universal@1.4.1":
|
||||
version "1.4.1"
|
||||
resolved "https://registry.npmmirror.com/@electron/universal/-/universal-1.4.1.tgz#3fbda2a5ed9ff9f3304c8e8316b94c1e3a7b3785"
|
||||
integrity sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==
|
||||
"@electron/universal@1.5.1":
|
||||
version "1.5.1"
|
||||
resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.5.1.tgz#f338bc5bcefef88573cf0ab1d5920fac10d06ee5"
|
||||
integrity sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==
|
||||
dependencies:
|
||||
"@electron/asar" "^3.2.1"
|
||||
"@malept/cross-spawn-promise" "^1.1.0"
|
||||
@ -215,6 +225,21 @@
|
||||
resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d"
|
||||
integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==
|
||||
|
||||
"@jimp/bmp@^0.22.10":
|
||||
version "0.22.12"
|
||||
resolved "https://registry.npmmirror.com/@jimp/bmp/-/bmp-0.22.12.tgz#0316044dc7b1a90274aef266d50349347fb864d4"
|
||||
integrity sha512-aeI64HD0npropd+AR76MCcvvRaa+Qck6loCOS03CkkxGHN5/r336qTM5HPUdHKMDOGzqknuVPA8+kK1t03z12g==
|
||||
dependencies:
|
||||
"@jimp/utils" "^0.22.12"
|
||||
bmp-js "^0.1.0"
|
||||
|
||||
"@jimp/utils@^0.22.12":
|
||||
version "0.22.12"
|
||||
resolved "https://registry.npmmirror.com/@jimp/utils/-/utils-0.22.12.tgz#8ffaed8f2dc2962539ccaf14727ac60793c7a537"
|
||||
integrity sha512-yJ5cWUknGnilBq97ZXOyOS0HhsHOyAyjHwYfHxGbSyMTohgQI6sVyE8KPgDwH8HHW/nMKXk8TrSwAE71zt716Q==
|
||||
dependencies:
|
||||
regenerator-runtime "^0.13.3"
|
||||
|
||||
"@jridgewell/gen-mapping@^0.3.2":
|
||||
version "0.3.3"
|
||||
resolved "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
|
||||
@ -307,6 +332,11 @@
|
||||
dependencies:
|
||||
defer-to-connect "^2.0.0"
|
||||
|
||||
"@tokenizer/token@^0.3.0":
|
||||
version "0.3.0"
|
||||
resolved "https://registry.npmmirror.com/@tokenizer/token/-/token-0.3.0.tgz#fe98a93fe789247e998c75e74e9c7c63217aa276"
|
||||
integrity sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==
|
||||
|
||||
"@tootallnate/once@2":
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf"
|
||||
@ -529,7 +559,26 @@
|
||||
estree-walker "^2.0.2"
|
||||
source-map-js "^1.0.2"
|
||||
|
||||
"@vue/compiler-dom@3.3.7", "@vue/compiler-dom@^3.3.0":
|
||||
"@vue/compiler-core@3.4.26":
|
||||
version "3.4.26"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.4.26.tgz#d507886520e83a6f8339ed55ed0b2b5d84b44b73"
|
||||
integrity sha512-N9Vil6Hvw7NaiyFUFBPXrAyETIGlQ8KcFMkyk6hW1Cl6NvoqvP+Y8p1Eqvx+UdqsnrnI9+HMUEJegzia3mhXmQ==
|
||||
dependencies:
|
||||
"@babel/parser" "^7.24.4"
|
||||
"@vue/shared" "3.4.26"
|
||||
entities "^4.5.0"
|
||||
estree-walker "^2.0.2"
|
||||
source-map-js "^1.2.0"
|
||||
|
||||
"@vue/compiler-dom@3.4.26":
|
||||
version "3.4.26"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.4.26.tgz#acc7b788b48152d087d4bb9e655b795e3dbec554"
|
||||
integrity sha512-4CWbR5vR9fMg23YqFOhr6t6WB1Fjt62d6xdFPyj8pxrYub7d+OgZaObMsoxaF9yBUHPMiPFK303v61PwAuGvZA==
|
||||
dependencies:
|
||||
"@vue/compiler-core" "3.4.26"
|
||||
"@vue/shared" "3.4.26"
|
||||
|
||||
"@vue/compiler-dom@^3.3.0":
|
||||
version "3.3.7"
|
||||
resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.3.7.tgz#a245aa03f9bfcdb537a239bf02842072de0644c9"
|
||||
integrity sha512-0LwkyJjnUPssXv/d1vNJ0PKfBlDoQs7n81CbO6Q0zdL7H1EzqYRrTVXDqdBVqro0aJjo/FOa1qBAPVI4PGSHBw==
|
||||
@ -537,29 +586,28 @@
|
||||
"@vue/compiler-core" "3.3.7"
|
||||
"@vue/shared" "3.3.7"
|
||||
|
||||
"@vue/compiler-sfc@3.3.7":
|
||||
version "3.3.7"
|
||||
resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.3.7.tgz#219d04b3013c7b15fbc536e2279e07810b731cc2"
|
||||
integrity sha512-7pfldWy/J75U/ZyYIXRVqvLRw3vmfxDo2YLMwVtWVNew8Sm8d6wodM+OYFq4ll/UxfqVr0XKiVwti32PCrruAw==
|
||||
"@vue/compiler-sfc@3.4.26":
|
||||
version "3.4.26"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.4.26.tgz#c679f206829954c3c078d8a9be76d0098b8377ae"
|
||||
integrity sha512-It1dp+FAOCgluYSVYlDn5DtZBxk1NCiJJfu2mlQqa/b+k8GL6NG/3/zRbJnHdhV2VhxFghaDq5L4K+1dakW6cw==
|
||||
dependencies:
|
||||
"@babel/parser" "^7.23.0"
|
||||
"@vue/compiler-core" "3.3.7"
|
||||
"@vue/compiler-dom" "3.3.7"
|
||||
"@vue/compiler-ssr" "3.3.7"
|
||||
"@vue/reactivity-transform" "3.3.7"
|
||||
"@vue/shared" "3.3.7"
|
||||
"@babel/parser" "^7.24.4"
|
||||
"@vue/compiler-core" "3.4.26"
|
||||
"@vue/compiler-dom" "3.4.26"
|
||||
"@vue/compiler-ssr" "3.4.26"
|
||||
"@vue/shared" "3.4.26"
|
||||
estree-walker "^2.0.2"
|
||||
magic-string "^0.30.5"
|
||||
postcss "^8.4.31"
|
||||
source-map-js "^1.0.2"
|
||||
magic-string "^0.30.10"
|
||||
postcss "^8.4.38"
|
||||
source-map-js "^1.2.0"
|
||||
|
||||
"@vue/compiler-ssr@3.3.7":
|
||||
version "3.3.7"
|
||||
resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.3.7.tgz#eff4a70f7ceb800d60e68d208b96a030c0f1b636"
|
||||
integrity sha512-TxOfNVVeH3zgBc82kcUv+emNHo+vKnlRrkv8YvQU5+Y5LJGJwSNzcmLUoxD/dNzv0bhQ/F0s+InlgV0NrApJZg==
|
||||
"@vue/compiler-ssr@3.4.26":
|
||||
version "3.4.26"
|
||||
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.4.26.tgz#22842d8adfff972d87bb798b8d496111f7f814b5"
|
||||
integrity sha512-FNwLfk7LlEPRY/g+nw2VqiDKcnDTVdCfBREekF8X74cPLiWHUX6oldktf/Vx28yh4STNy7t+/yuLoMBBF7YDiQ==
|
||||
dependencies:
|
||||
"@vue/compiler-dom" "3.3.7"
|
||||
"@vue/shared" "3.3.7"
|
||||
"@vue/compiler-dom" "3.4.26"
|
||||
"@vue/shared" "3.4.26"
|
||||
|
||||
"@vue/devtools-api@^6.5.0":
|
||||
version "6.5.1"
|
||||
@ -580,54 +628,48 @@
|
||||
muggle-string "^0.3.1"
|
||||
vue-template-compiler "^2.7.14"
|
||||
|
||||
"@vue/reactivity-transform@3.3.7":
|
||||
version "3.3.7"
|
||||
resolved "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.3.7.tgz#eb9f5110af5085079b851d162205394bc790d539"
|
||||
integrity sha512-APhRmLVbgE1VPGtoLQoWBJEaQk4V8JUsqrQihImVqKT+8U6Qi3t5ATcg4Y9wGAPb3kIhetpufyZ1RhwbZCIdDA==
|
||||
"@vue/reactivity@3.4.26":
|
||||
version "3.4.26"
|
||||
resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.4.26.tgz#1191f543809d4c93e5b3e842ba83022350a3f205"
|
||||
integrity sha512-E/ynEAu/pw0yotJeLdvZEsp5Olmxt+9/WqzvKff0gE67tw73gmbx6tRkiagE/eH0UCubzSlGRebCbidB1CpqZQ==
|
||||
dependencies:
|
||||
"@babel/parser" "^7.23.0"
|
||||
"@vue/compiler-core" "3.3.7"
|
||||
"@vue/shared" "3.3.7"
|
||||
estree-walker "^2.0.2"
|
||||
magic-string "^0.30.5"
|
||||
"@vue/shared" "3.4.26"
|
||||
|
||||
"@vue/reactivity@3.3.7":
|
||||
version "3.3.7"
|
||||
resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.3.7.tgz#48b6671a45ba33039da2c0eb25ae702f924486a9"
|
||||
integrity sha512-cZNVjWiw00708WqT0zRpyAgduG79dScKEPYJXq2xj/aMtk3SKvL3FBt2QKUlh6EHBJ1m8RhBY+ikBUzwc7/khg==
|
||||
"@vue/runtime-core@3.4.26":
|
||||
version "3.4.26"
|
||||
resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.4.26.tgz#51ee971cb700370a67e5a510c4a84eff7491d658"
|
||||
integrity sha512-AFJDLpZvhT4ujUgZSIL9pdNcO23qVFh7zWCsNdGQBw8ecLNxOOnPcK9wTTIYCmBJnuPHpukOwo62a2PPivihqw==
|
||||
dependencies:
|
||||
"@vue/shared" "3.3.7"
|
||||
"@vue/reactivity" "3.4.26"
|
||||
"@vue/shared" "3.4.26"
|
||||
|
||||
"@vue/runtime-core@3.3.7":
|
||||
version "3.3.7"
|
||||
resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.3.7.tgz#c1eece1c98f936dc69dd0667d11b464579b128fd"
|
||||
integrity sha512-LHq9du3ubLZFdK/BP0Ysy3zhHqRfBn80Uc+T5Hz3maFJBGhci1MafccnL3rpd5/3wVfRHAe6c+PnlO2PAavPTQ==
|
||||
"@vue/runtime-dom@3.4.26":
|
||||
version "3.4.26"
|
||||
resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.4.26.tgz#179aa7c8dc964112e6d096bc8ec5f361111009a1"
|
||||
integrity sha512-UftYA2hUXR2UOZD/Fc3IndZuCOOJgFxJsWOxDkhfVcwLbsfh2CdXE2tG4jWxBZuDAs9J9PzRTUFt1PgydEtItw==
|
||||
dependencies:
|
||||
"@vue/reactivity" "3.3.7"
|
||||
"@vue/shared" "3.3.7"
|
||||
"@vue/runtime-core" "3.4.26"
|
||||
"@vue/shared" "3.4.26"
|
||||
csstype "^3.1.3"
|
||||
|
||||
"@vue/runtime-dom@3.3.7":
|
||||
version "3.3.7"
|
||||
resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.3.7.tgz#e7cf88cc01591fdf6e3164825554fdadc3137ffc"
|
||||
integrity sha512-PFQU1oeJxikdDmrfoNQay5nD4tcPNYixUBruZzVX/l0eyZvFKElZUjW4KctCcs52nnpMGO6UDK+jF5oV4GT5Lw==
|
||||
"@vue/server-renderer@3.4.26":
|
||||
version "3.4.26"
|
||||
resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.4.26.tgz#6d0c6b0366bfe0232579aea00e3ff6784e5a1c60"
|
||||
integrity sha512-xoGAqSjYDPGAeRWxeoYwqJFD/gw7mpgzOvSxEmjWaFO2rE6qpbD1PC172YRpvKhrihkyHJkNDADFXTfCyVGhKw==
|
||||
dependencies:
|
||||
"@vue/runtime-core" "3.3.7"
|
||||
"@vue/shared" "3.3.7"
|
||||
csstype "^3.1.2"
|
||||
|
||||
"@vue/server-renderer@3.3.7":
|
||||
version "3.3.7"
|
||||
resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.3.7.tgz#0cc3dc6ad39a54693e6e8f853caa3c7bb43b0364"
|
||||
integrity sha512-UlpKDInd1hIZiNuVVVvLgxpfnSouxKQOSE2bOfQpBuGwxRV/JqqTCyyjXUWiwtVMyeRaZhOYYqntxElk8FhBhw==
|
||||
dependencies:
|
||||
"@vue/compiler-ssr" "3.3.7"
|
||||
"@vue/shared" "3.3.7"
|
||||
"@vue/compiler-ssr" "3.4.26"
|
||||
"@vue/shared" "3.4.26"
|
||||
|
||||
"@vue/shared@3.3.7", "@vue/shared@^3.3.0":
|
||||
version "3.3.7"
|
||||
resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.3.7.tgz#0091852fe5cc4237c8440fe32f3ab6bc920ae6d9"
|
||||
integrity sha512-N/tbkINRUDExgcPTBvxNkvHGu504k8lzlNQRITVnm6YjOjwa4r0nnbd4Jb01sNpur5hAllyRJzSK5PvB9PPwRg==
|
||||
|
||||
"@vue/shared@3.4.26":
|
||||
version "3.4.26"
|
||||
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.4.26.tgz#f17854fb1faf889854aed4b23b60e86a8cab6403"
|
||||
integrity sha512-Fg4zwR0GNnjzodMt3KRy2AWGMKQXByl56+4HjN87soxLNU9P5xcJkstAlIeEF3cU6UYOzmJl1tV0dVPGIljCnQ==
|
||||
|
||||
"@xicons/utils@^0.1.4":
|
||||
version "0.1.4"
|
||||
resolved "https://registry.npmmirror.com/@xicons/utils/-/utils-0.1.4.tgz#cece50613b34d4b4c71e73bb0be92981067e11e1"
|
||||
@ -709,26 +751,25 @@ app-builder-bin@4.0.0:
|
||||
resolved "https://registry.npmmirror.com/app-builder-bin/-/app-builder-bin-4.0.0.tgz#1df8e654bd1395e4a319d82545c98667d7eed2f0"
|
||||
integrity sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==
|
||||
|
||||
app-builder-lib@24.6.4:
|
||||
version "24.6.4"
|
||||
resolved "https://registry.npmmirror.com/app-builder-lib/-/app-builder-lib-24.6.4.tgz#5bf77dd89d3ee557bc615b9ddfaf383f3e51577b"
|
||||
integrity sha512-m9931WXb83teb32N0rKg+ulbn6+Hl8NV5SUpVDOVz9MWOXfhV6AQtTdftf51zJJvCQnQugGtSqoLvgw6mdF/Rg==
|
||||
app-builder-lib@24.13.3:
|
||||
version "24.13.3"
|
||||
resolved "https://registry.yarnpkg.com/app-builder-lib/-/app-builder-lib-24.13.3.tgz#36e47b65fecb8780bb73bff0fee4e0480c28274b"
|
||||
integrity sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==
|
||||
dependencies:
|
||||
"7zip-bin" "~5.1.1"
|
||||
"@develar/schema-utils" "~2.6.5"
|
||||
"@electron/notarize" "2.1.0"
|
||||
"@electron/notarize" "2.2.1"
|
||||
"@electron/osx-sign" "1.0.5"
|
||||
"@electron/universal" "1.4.1"
|
||||
"@electron/universal" "1.5.1"
|
||||
"@malept/flatpak-bundler" "^0.4.0"
|
||||
"@types/fs-extra" "9.0.13"
|
||||
async-exit-hook "^2.0.1"
|
||||
bluebird-lst "^1.0.9"
|
||||
builder-util "24.5.0"
|
||||
builder-util-runtime "9.2.1"
|
||||
builder-util "24.13.1"
|
||||
builder-util-runtime "9.2.4"
|
||||
chromium-pickle-js "^0.2.0"
|
||||
debug "^4.3.4"
|
||||
ejs "^3.1.8"
|
||||
electron-publish "24.5.0"
|
||||
electron-publish "24.13.1"
|
||||
form-data "^4.0.0"
|
||||
fs-extra "^10.1.0"
|
||||
hosted-git-info "^4.1.0"
|
||||
@ -839,10 +880,10 @@ bcrypt-pbkdf@^1.0.0:
|
||||
dependencies:
|
||||
tweetnacl "^0.14.3"
|
||||
|
||||
better-sqlite3-multiple-ciphers@^9.0.0:
|
||||
version "9.0.0"
|
||||
resolved "https://registry.npmmirror.com/better-sqlite3-multiple-ciphers/-/better-sqlite3-multiple-ciphers-9.0.0.tgz#ce6f10dd5950a508c2bd1596e2863fd5faa3b0bc"
|
||||
integrity sha512-bM0gv20exF1X1Q8/Rz0PasxCYcgb8VIbQKOhYe3Js35uFAmrvnX8AUqW6c/eq+i8WRtAoRw4yAOBs5Nxx7qaXw==
|
||||
better-sqlite3-multiple-ciphers@^9.4.1:
|
||||
version "9.5.0"
|
||||
resolved "https://registry.yarnpkg.com/better-sqlite3-multiple-ciphers/-/better-sqlite3-multiple-ciphers-9.5.0.tgz#15948374ee42cf5c7deeb56d7c4693faa33f2d2e"
|
||||
integrity sha512-6A9xBRvssONJW07Lur6pmkaUwlCGz1bnjFmXrrAR3qXETUBk92OI4C/+LhMOatn5wQ8AQzLScFZC/CKUpxkTaw==
|
||||
dependencies:
|
||||
bindings "^1.5.0"
|
||||
prebuild-install "^7.1.1"
|
||||
@ -880,6 +921,11 @@ bluebird@^3.5.5:
|
||||
resolved "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
|
||||
integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
|
||||
|
||||
bmp-js@^0.1.0:
|
||||
version "0.1.0"
|
||||
resolved "https://registry.npmmirror.com/bmp-js/-/bmp-js-0.1.0.tgz#e05a63f796a6c1ff25f4771ec7adadc148c07233"
|
||||
integrity sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==
|
||||
|
||||
boolbase@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
|
||||
@ -945,24 +991,24 @@ buffer@^5.1.0, buffer@^5.5.0:
|
||||
base64-js "^1.3.1"
|
||||
ieee754 "^1.1.13"
|
||||
|
||||
builder-util-runtime@9.2.1:
|
||||
version "9.2.1"
|
||||
resolved "https://registry.npmmirror.com/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz#3184dcdf7ed6c47afb8df733813224ced4f624fd"
|
||||
integrity sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==
|
||||
builder-util-runtime@9.2.4:
|
||||
version "9.2.4"
|
||||
resolved "https://registry.yarnpkg.com/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz#13cd1763da621e53458739a1e63f7fcba673c42a"
|
||||
integrity sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==
|
||||
dependencies:
|
||||
debug "^4.3.4"
|
||||
sax "^1.2.4"
|
||||
|
||||
builder-util@24.5.0:
|
||||
version "24.5.0"
|
||||
resolved "https://registry.npmmirror.com/builder-util/-/builder-util-24.5.0.tgz#8683c9a7a1c5c9f9a4c4d2789ecca0e47dddd3f9"
|
||||
integrity sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ==
|
||||
builder-util@24.13.1:
|
||||
version "24.13.1"
|
||||
resolved "https://registry.yarnpkg.com/builder-util/-/builder-util-24.13.1.tgz#4a4c4f9466b016b85c6990a0ea15aa14edec6816"
|
||||
integrity sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==
|
||||
dependencies:
|
||||
"7zip-bin" "~5.1.1"
|
||||
"7zip-bin" "~5.2.0"
|
||||
"@types/debug" "^4.1.6"
|
||||
app-builder-bin "4.0.0"
|
||||
bluebird-lst "^1.0.9"
|
||||
builder-util-runtime "9.2.1"
|
||||
builder-util-runtime "9.2.4"
|
||||
chalk "^4.1.2"
|
||||
cross-spawn "^7.0.3"
|
||||
debug "^4.3.4"
|
||||
@ -1239,10 +1285,10 @@ cssesc@^3.0.0:
|
||||
resolved "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee"
|
||||
integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
|
||||
|
||||
csstype@^3.1.2:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
|
||||
integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
|
||||
csstype@^3.1.3:
|
||||
version "3.1.3"
|
||||
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
|
||||
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
|
||||
|
||||
csstype@~3.0.5:
|
||||
version "3.0.11"
|
||||
@ -1294,6 +1340,23 @@ debug@^3.2.6:
|
||||
dependencies:
|
||||
ms "^2.1.1"
|
||||
|
||||
decode-bmp@^0.2.0:
|
||||
version "0.2.1"
|
||||
resolved "https://registry.npmmirror.com/decode-bmp/-/decode-bmp-0.2.1.tgz#cec3e0197ec3b6c60f02220f50e8757030ff2427"
|
||||
integrity sha512-NiOaGe+GN0KJqi2STf24hfMkFitDUaIoUU3eKvP/wAbLe8o6FuW5n/x7MHPR0HKvBokp6MQY/j7w8lewEeVCIA==
|
||||
dependencies:
|
||||
"@canvas/image-data" "^1.0.0"
|
||||
to-data-view "^1.1.0"
|
||||
|
||||
decode-ico@^0.4.1:
|
||||
version "0.4.1"
|
||||
resolved "https://registry.npmmirror.com/decode-ico/-/decode-ico-0.4.1.tgz#e0f7373081532c7b8495bd51fb225d354e14de25"
|
||||
integrity sha512-69NZfbKIzux1vBOd31al3XnMnH+2mqDhEgLdpygErm4d60N+UwA5Sq5WFjmEDQzumgB9fElojGwWG0vybVfFmA==
|
||||
dependencies:
|
||||
"@canvas/image-data" "^1.0.0"
|
||||
decode-bmp "^0.2.0"
|
||||
to-data-view "^1.1.0"
|
||||
|
||||
decompress-response@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
|
||||
@ -1362,14 +1425,14 @@ dlv@^1.1.3:
|
||||
resolved "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
|
||||
integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==
|
||||
|
||||
dmg-builder@24.6.4:
|
||||
version "24.6.4"
|
||||
resolved "https://registry.npmmirror.com/dmg-builder/-/dmg-builder-24.6.4.tgz#e19b8305f7e1ea0b4faaa30382c81b9d6de39863"
|
||||
integrity sha512-BNcHRc9CWEuI9qt0E655bUBU/j/3wUCYBVKGu1kVpbN5lcUdEJJJeiO0NHK3dgKmra6LUUZlo+mWqc+OCbi0zw==
|
||||
dmg-builder@24.13.3:
|
||||
version "24.13.3"
|
||||
resolved "https://registry.yarnpkg.com/dmg-builder/-/dmg-builder-24.13.3.tgz#95d5b99c587c592f90d168a616d7ec55907c7e55"
|
||||
integrity sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==
|
||||
dependencies:
|
||||
app-builder-lib "24.6.4"
|
||||
builder-util "24.5.0"
|
||||
builder-util-runtime "9.2.1"
|
||||
app-builder-lib "24.13.3"
|
||||
builder-util "24.13.1"
|
||||
builder-util-runtime "9.2.4"
|
||||
fs-extra "^10.1.0"
|
||||
iconv-lite "^0.6.2"
|
||||
js-yaml "^4.1.0"
|
||||
@ -1457,16 +1520,16 @@ ejs@^3.1.8:
|
||||
dependencies:
|
||||
jake "^10.8.5"
|
||||
|
||||
electron-builder@^24.6.4:
|
||||
version "24.6.4"
|
||||
resolved "https://registry.npmmirror.com/electron-builder/-/electron-builder-24.6.4.tgz#c51271e49b9a02c9a3ec444f866b6008c4d98a1d"
|
||||
integrity sha512-uNWQoU7pE7qOaIQ6CJHpBi44RJFVG8OHRBIadUxrsDJVwLLo8Nma3K/EEtx5/UyWAQYdcK4nVPYKoRqBb20hbA==
|
||||
electron-builder@^24.6.5:
|
||||
version "24.13.3"
|
||||
resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-24.13.3.tgz#c506dfebd36d9a50a83ee8aa32d803d83dbe4616"
|
||||
integrity sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==
|
||||
dependencies:
|
||||
app-builder-lib "24.6.4"
|
||||
builder-util "24.5.0"
|
||||
builder-util-runtime "9.2.1"
|
||||
app-builder-lib "24.13.3"
|
||||
builder-util "24.13.1"
|
||||
builder-util-runtime "9.2.4"
|
||||
chalk "^4.1.2"
|
||||
dmg-builder "24.6.4"
|
||||
dmg-builder "24.13.3"
|
||||
fs-extra "^10.1.0"
|
||||
is-ci "^3.0.0"
|
||||
lazy-val "^1.0.5"
|
||||
@ -1479,14 +1542,14 @@ electron-log@^5.0.0:
|
||||
resolved "https://registry.npmmirror.com/electron-log/-/electron-log-5.0.0.tgz#b5fab83500fce1c61ec7493701f5e228b752d2e2"
|
||||
integrity sha512-vB3akupmQvA8jAyNL9rULZtf6WoP8vsabjXsRtiqXS6/D37SwN/4LEyj4JD+9Bv6xoTcx/LrVnsIKEEWdq5ClQ==
|
||||
|
||||
electron-publish@24.5.0:
|
||||
version "24.5.0"
|
||||
resolved "https://registry.npmmirror.com/electron-publish/-/electron-publish-24.5.0.tgz#492a4d7caa232e88ee3c18f5c3b4dc637e5e1b3a"
|
||||
integrity sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA==
|
||||
electron-publish@24.13.1:
|
||||
version "24.13.1"
|
||||
resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-24.13.1.tgz#57289b2f7af18737dc2ad134668cdd4a1b574a0c"
|
||||
integrity sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==
|
||||
dependencies:
|
||||
"@types/fs-extra" "^9.0.11"
|
||||
builder-util "24.5.0"
|
||||
builder-util-runtime "9.2.1"
|
||||
builder-util "24.13.1"
|
||||
builder-util-runtime "9.2.4"
|
||||
chalk "^4.1.2"
|
||||
fs-extra "^10.1.0"
|
||||
lazy-val "^1.0.5"
|
||||
@ -1505,10 +1568,10 @@ electron-to-chromium@^1.4.535:
|
||||
resolved "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.569.tgz#1298b67727187ffbaac005a7425490d157f3ad03"
|
||||
integrity sha512-LsrJjZ0IbVy12ApW3gpYpcmHS3iRxH4bkKOW98y1/D+3cvDUWGcbzbsFinfUS8knpcZk/PG/2p/RnkMCYN7PVg==
|
||||
|
||||
electron@^26.4.2:
|
||||
version "26.4.2"
|
||||
resolved "https://registry.npmmirror.com/electron/-/electron-26.4.2.tgz#2f976a3c30558f09ced3f5876862b4c21172c02c"
|
||||
integrity sha512-BOfQUOIvsq5NnssWOMqcZnA5M0ull620wvQoJq3WhXN1wJAsWu+cdjHvREyxnHbArPkV+F+x3YAi5Dt+UKoqhw==
|
||||
electron@^28.3.1:
|
||||
version "28.3.3"
|
||||
resolved "https://registry.npmmirror.com/electron/-/electron-28.3.3.tgz#2df898f653c4f77b66b4cf3eeba79d8bea6d03c0"
|
||||
integrity sha512-ObKMLSPNhomtCOBAxFS8P2DW/4umkh72ouZUlUKzXGtYuPzgr1SYhskhFWgzAsPtUzhL2CzyV2sfbHcEW4CXqw==
|
||||
dependencies:
|
||||
"@electron/get" "^2.0.0"
|
||||
"@types/node" "^18.11.18"
|
||||
@ -1526,7 +1589,7 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1:
|
||||
dependencies:
|
||||
once "^1.4.0"
|
||||
|
||||
entities@^4.2.0, entities@^4.4.0:
|
||||
entities@^4.2.0, entities@^4.4.0, entities@^4.5.0:
|
||||
version "4.5.0"
|
||||
resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
|
||||
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
|
||||
@ -1667,6 +1730,15 @@ fd-slicer@~1.1.0:
|
||||
dependencies:
|
||||
pend "~1.2.0"
|
||||
|
||||
file-type@^18.7.0:
|
||||
version "18.7.0"
|
||||
resolved "https://registry.npmmirror.com/file-type/-/file-type-18.7.0.tgz#cddb16f184d6b94106cfc4bb56978726b25cb2a2"
|
||||
integrity sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==
|
||||
dependencies:
|
||||
readable-web-to-node-stream "^3.0.2"
|
||||
strtok3 "^7.0.0"
|
||||
token-types "^5.0.1"
|
||||
|
||||
file-uri-to-path@1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
|
||||
@ -2013,6 +2085,18 @@ https-proxy-agent@^5.0.1:
|
||||
agent-base "6"
|
||||
debug "4"
|
||||
|
||||
icojs@^0.19.3:
|
||||
version "0.19.3"
|
||||
resolved "https://registry.npmmirror.com/icojs/-/icojs-0.19.3.tgz#1c0a4e593c8cb3ce61aee4aa4f4a3befb3165527"
|
||||
integrity sha512-Q6syRxwoEACLRl7uTiee72038vDbq4gF6ot7JFsXmxj0WtkgGQiUxCdEJtwxd8nfADr9mPmGtpmbORJursaOsQ==
|
||||
dependencies:
|
||||
"@jimp/bmp" "^0.22.10"
|
||||
decode-ico "^0.4.1"
|
||||
file-type "^18.7.0"
|
||||
jpeg-js "^0.4.4"
|
||||
pngjs "^7.0.0"
|
||||
to-data-view "^2.0.0"
|
||||
|
||||
iconv-corefoundation@^1.1.7:
|
||||
version "1.1.7"
|
||||
resolved "https://registry.npmmirror.com/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz#31065e6ab2c9272154c8b0821151e2c88f1b002a"
|
||||
@ -2028,7 +2112,7 @@ iconv-lite@^0.6.2, iconv-lite@^0.6.3:
|
||||
dependencies:
|
||||
safer-buffer ">= 2.1.2 < 3.0.0"
|
||||
|
||||
ieee754@^1.1.13:
|
||||
ieee754@^1.1.13, ieee754@^1.2.1:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
|
||||
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
|
||||
@ -2149,6 +2233,11 @@ jiti@^1.19.1:
|
||||
resolved "https://registry.npmmirror.com/jiti/-/jiti-1.20.0.tgz#2d823b5852ee8963585c8dd8b7992ffc1ae83b42"
|
||||
integrity sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==
|
||||
|
||||
jpeg-js@^0.4.4:
|
||||
version "0.4.4"
|
||||
resolved "https://registry.npmmirror.com/jpeg-js/-/jpeg-js-0.4.4.tgz#a9f1c6f1f9f0fa80cdb3484ed9635054d28936aa"
|
||||
integrity sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==
|
||||
|
||||
js-yaml@^4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
|
||||
@ -2296,10 +2385,10 @@ lru-cache@^6.0.0:
|
||||
dependencies:
|
||||
yallist "^4.0.0"
|
||||
|
||||
magic-string@^0.30.5:
|
||||
version "0.30.5"
|
||||
resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9"
|
||||
integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==
|
||||
magic-string@^0.30.10:
|
||||
version "0.30.10"
|
||||
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e"
|
||||
integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==
|
||||
dependencies:
|
||||
"@jridgewell/sourcemap-codec" "^1.4.15"
|
||||
|
||||
@ -2458,10 +2547,10 @@ mz@^2.7.0:
|
||||
object-assign "^4.0.1"
|
||||
thenify-all "^1.0.0"
|
||||
|
||||
naive-ui@^2.35.0:
|
||||
version "2.35.0"
|
||||
resolved "https://registry.npmmirror.com/naive-ui/-/naive-ui-2.35.0.tgz#fe1fc2404694b4114486fa31e609e35714e8ed25"
|
||||
integrity sha512-PdnLpOip1LQaKs5+rXLZoPDPQkTq26TnHWeABvUA2eOQjtHxE4+TQvj0Jq/W8clM2On/7jptoGmenLt48G3Bhg==
|
||||
naive-ui@^2.36.0:
|
||||
version "2.39.0"
|
||||
resolved "https://registry.npmmirror.com/naive-ui/-/naive-ui-2.39.0.tgz#f0d47d30ce86b178242ad5de9de4066eb8a3f0c9"
|
||||
integrity sha512-5oUJzRG+rtLSH8eRU+fJvVYiQids2BxF9jp+fwGoAqHOptEINrBlgBu9uy+95RHE5FLJ7Q/z41o+qkoGnUrKxQ==
|
||||
dependencies:
|
||||
"@css-render/plugin-bem" "^0.15.12"
|
||||
"@css-render/vue3-ssr" "^0.15.12"
|
||||
@ -2470,23 +2559,29 @@ naive-ui@^2.35.0:
|
||||
"@types/lodash-es" "^4.17.9"
|
||||
async-validator "^4.2.5"
|
||||
css-render "^0.15.12"
|
||||
csstype "^3.1.3"
|
||||
date-fns "^2.30.0"
|
||||
date-fns-tz "^2.0.0"
|
||||
evtd "^0.2.4"
|
||||
highlight.js "^11.8.0"
|
||||
lodash "^4.17.21"
|
||||
lodash-es "^4.17.21"
|
||||
seemly "^0.3.6"
|
||||
seemly "^0.3.8"
|
||||
treemate "^0.3.11"
|
||||
vdirs "^0.1.8"
|
||||
vooks "^0.2.12"
|
||||
vueuc "^0.4.51"
|
||||
vueuc "^0.4.58"
|
||||
|
||||
nanoid@^3.3.6:
|
||||
version "3.3.6"
|
||||
resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
|
||||
integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
|
||||
|
||||
nanoid@^3.3.7:
|
||||
version "3.3.7"
|
||||
resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
|
||||
integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
|
||||
|
||||
napi-build-utils@^1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.npmmirror.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806"
|
||||
@ -2643,6 +2738,11 @@ path-parse@^1.0.7:
|
||||
resolved "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
|
||||
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
|
||||
|
||||
peek-readable@^5.0.0:
|
||||
version "5.1.1"
|
||||
resolved "https://registry.npmmirror.com/peek-readable/-/peek-readable-5.1.1.tgz#7dbeafa1ce271a3eba3fba808883bdb03769b822"
|
||||
integrity sha512-4hEOSH7KeEaZpMDF/xfm1W9fS5rT7Ett3BkXWHqAEzRLLwLaHkwOL+GvvpIEh9UrvX9BDhzfkvteslgraoH69w==
|
||||
|
||||
pend@~1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.npmmirror.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
|
||||
@ -2707,6 +2807,11 @@ plist@^3.0.4, plist@^3.0.5:
|
||||
base64-js "^1.5.1"
|
||||
xmlbuilder "^15.1.1"
|
||||
|
||||
pngjs@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.npmmirror.com/pngjs/-/pngjs-7.0.0.tgz#a8b7446020ebbc6ac739db6c5415a65d17090e26"
|
||||
integrity sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==
|
||||
|
||||
postcss-import@^15.1.0:
|
||||
version "15.1.0"
|
||||
resolved "https://registry.npmmirror.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70"
|
||||
@ -2760,6 +2865,15 @@ postcss@^8.4.23, postcss@^8.4.27, postcss@^8.4.31:
|
||||
picocolors "^1.0.0"
|
||||
source-map-js "^1.0.2"
|
||||
|
||||
postcss@^8.4.38:
|
||||
version "8.4.38"
|
||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e"
|
||||
integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
|
||||
dependencies:
|
||||
nanoid "^3.3.7"
|
||||
picocolors "^1.0.0"
|
||||
source-map-js "^1.2.0"
|
||||
|
||||
prebuild-install@^7.1.1:
|
||||
version "7.1.1"
|
||||
resolved "https://registry.npmmirror.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45"
|
||||
@ -2858,7 +2972,7 @@ read-config-file@6.3.2:
|
||||
json5 "^2.2.0"
|
||||
lazy-val "^1.0.4"
|
||||
|
||||
readable-stream@^3.1.1, readable-stream@^3.4.0:
|
||||
readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
|
||||
version "3.6.2"
|
||||
resolved "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
|
||||
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
|
||||
@ -2867,6 +2981,13 @@ readable-stream@^3.1.1, readable-stream@^3.4.0:
|
||||
string_decoder "^1.1.1"
|
||||
util-deprecate "^1.0.1"
|
||||
|
||||
readable-web-to-node-stream@^3.0.2:
|
||||
version "3.0.2"
|
||||
resolved "https://registry.npmmirror.com/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz#5d52bb5df7b54861fd48d015e93a2cb87b3ee0bb"
|
||||
integrity sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==
|
||||
dependencies:
|
||||
readable-stream "^3.6.0"
|
||||
|
||||
readdirp@~3.6.0:
|
||||
version "3.6.0"
|
||||
resolved "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7"
|
||||
@ -2874,6 +2995,11 @@ readdirp@~3.6.0:
|
||||
dependencies:
|
||||
picomatch "^2.2.1"
|
||||
|
||||
regenerator-runtime@^0.13.3:
|
||||
version "0.13.11"
|
||||
resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9"
|
||||
integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==
|
||||
|
||||
regenerator-runtime@^0.14.0:
|
||||
version "0.14.0"
|
||||
resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"
|
||||
@ -3011,6 +3137,11 @@ seemly@^0.3.6:
|
||||
resolved "https://registry.npmmirror.com/seemly/-/seemly-0.3.6.tgz#7ef97e8083dea00804965e2662f572a5df9cb18e"
|
||||
integrity sha512-lEV5VB8BUKTo/AfktXJcy+JeXns26ylbMkIUco8CYREsQijuz4mrXres2Q+vMLdwkuLxJdIPQ8IlCIxLYm71Yw==
|
||||
|
||||
seemly@^0.3.8:
|
||||
version "0.3.8"
|
||||
resolved "https://registry.npmmirror.com/seemly/-/seemly-0.3.8.tgz#42879d8375d73126a04dc16b1bf92a773d2e5974"
|
||||
integrity sha512-MW8Qs6vbzo0pHmDpFSYPna+lwpZ6Zk1ancbajw/7E8TKtHdV+1DfZZD+kKJEhG/cAoB/i+LiT+5msZOqj0DwRA==
|
||||
|
||||
semver-compare@^1.0.0:
|
||||
version "1.0.0"
|
||||
resolved "https://registry.npmmirror.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
|
||||
@ -3115,6 +3246,11 @@ source-map-js@^1.0.2:
|
||||
resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
|
||||
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
|
||||
|
||||
source-map-js@^1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
|
||||
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
|
||||
|
||||
source-map-support@^0.5.19:
|
||||
version "0.5.21"
|
||||
resolved "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
|
||||
@ -3181,6 +3317,14 @@ strip-json-comments@~2.0.1:
|
||||
resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
|
||||
integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
|
||||
|
||||
strtok3@^7.0.0:
|
||||
version "7.0.0"
|
||||
resolved "https://registry.npmmirror.com/strtok3/-/strtok3-7.0.0.tgz#868c428b4ade64a8fd8fee7364256001c1a4cbe5"
|
||||
integrity sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==
|
||||
dependencies:
|
||||
"@tokenizer/token" "^0.3.0"
|
||||
peek-readable "^5.0.0"
|
||||
|
||||
sucrase@^3.32.0:
|
||||
version "3.34.0"
|
||||
resolved "https://registry.npmmirror.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f"
|
||||
@ -3310,6 +3454,16 @@ tmp@^0.2.0:
|
||||
dependencies:
|
||||
rimraf "^3.0.0"
|
||||
|
||||
to-data-view@^1.1.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.npmmirror.com/to-data-view/-/to-data-view-1.1.0.tgz#08d6492b0b8deb9b29bdf1f61c23eadfa8994d00"
|
||||
integrity sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ==
|
||||
|
||||
to-data-view@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmmirror.com/to-data-view/-/to-data-view-2.0.0.tgz#4cc3f5c9eb59514a7436fc54c587c3c34c9b1d60"
|
||||
integrity sha512-RGEM5KqlPHr+WVTPmGNAXNeFEmsBnlkxXaIfEpUYV0AST2Z5W1EGq9L/MENFrMMmL2WQr1wjkmZy/M92eKhjYA==
|
||||
|
||||
to-regex-range@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
|
||||
@ -3317,6 +3471,14 @@ to-regex-range@^5.0.1:
|
||||
dependencies:
|
||||
is-number "^7.0.0"
|
||||
|
||||
token-types@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.npmmirror.com/token-types/-/token-types-5.0.1.tgz#aa9d9e6b23c420a675e55413b180635b86a093b4"
|
||||
integrity sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==
|
||||
dependencies:
|
||||
"@tokenizer/token" "^0.3.0"
|
||||
ieee754 "^1.2.1"
|
||||
|
||||
tough-cookie@~2.5.0:
|
||||
version "2.5.0"
|
||||
resolved "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
|
||||
@ -3506,21 +3668,21 @@ vue-tsc@^1.8.22:
|
||||
"@vue/language-core" "1.8.22"
|
||||
semver "^7.5.4"
|
||||
|
||||
vue@^3.3.7:
|
||||
version "3.3.7"
|
||||
resolved "https://registry.npmmirror.com/vue/-/vue-3.3.7.tgz#972a218682443a3819d121261b2bff914417f4f0"
|
||||
integrity sha512-YEMDia1ZTv1TeBbnu6VybatmSteGOS3A3YgfINOfraCbf85wdKHzscD6HSS/vB4GAtI7sa1XPX7HcQaJ1l24zA==
|
||||
vue@^3.4.13:
|
||||
version "3.4.26"
|
||||
resolved "https://registry.yarnpkg.com/vue/-/vue-3.4.26.tgz#936c97e37672c737705d7bdfa62c31af18742269"
|
||||
integrity sha512-bUIq/p+VB+0xrJubaemrfhk1/FiW9iX+pDV+62I/XJ6EkspAO9/DXEjbDFoe8pIfOZBqfk45i9BMc41ptP/uRg==
|
||||
dependencies:
|
||||
"@vue/compiler-dom" "3.3.7"
|
||||
"@vue/compiler-sfc" "3.3.7"
|
||||
"@vue/runtime-dom" "3.3.7"
|
||||
"@vue/server-renderer" "3.3.7"
|
||||
"@vue/shared" "3.3.7"
|
||||
"@vue/compiler-dom" "3.4.26"
|
||||
"@vue/compiler-sfc" "3.4.26"
|
||||
"@vue/runtime-dom" "3.4.26"
|
||||
"@vue/server-renderer" "3.4.26"
|
||||
"@vue/shared" "3.4.26"
|
||||
|
||||
vueuc@^0.4.51:
|
||||
version "0.4.51"
|
||||
resolved "https://registry.npmmirror.com/vueuc/-/vueuc-0.4.51.tgz#35cd5364db4b71fc791a9823748711b91d910d49"
|
||||
integrity sha512-pLiMChM4f+W8czlIClGvGBYo656lc2Y0/mXFSCydcSmnCR1izlKPGMgiYBGjbY9FDkFG8a2HEVz7t0DNzBWbDw==
|
||||
vueuc@^0.4.58:
|
||||
version "0.4.58"
|
||||
resolved "https://registry.npmmirror.com/vueuc/-/vueuc-0.4.58.tgz#03ee2ea6febf360ca9cbe490841fce91742eea12"
|
||||
integrity sha512-Wnj/N8WbPRSxSt+9ji1jtDHPzda5h2OH/0sFBhvdxDRuyCZbjGg3/cKMaKqEoe+dErTexG2R+i6Q8S/Toq1MYg==
|
||||
dependencies:
|
||||
"@css-render/vue3-ssr" "^0.15.10"
|
||||
"@juggle/resize-observer" "^3.3.1"
|
||||
|
Loading…
Reference in New Issue
Block a user