Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
gitcode_dev
quicker
提交
74e49560
quicker
项目概览
gitcode_dev
/
quicker
上一次同步 2 年多
通知
6
Star
2
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
quicker
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
74e49560
编写于
10月 08, 2021
作者:
木
木偶
提交者:
GitHub
10月 08, 2021
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #62 from tcsnzh/dev-tcsnzh
失焦隐藏or不隐藏小按钮 + 优化代码
上级
80476aad
ba45c627
变更
14
隐藏空白更改
内联
并排
Showing
14 changed file
with
589 addition
and
488 deletion
+589
-488
src/main/browsers/main.js
src/main/browsers/main.js
+35
-30
src/main/browsers/picker.js
src/main/browsers/picker.js
+14
-14
src/main/browsers/separate.js
src/main/browsers/separate.js
+31
-26
src/main/browsers/superPanel.js
src/main/browsers/superPanel.js
+7
-7
src/main/common/common.js
src/main/common/common.js
+10
-9
src/main/common/config.js
src/main/common/config.js
+54
-87
src/main/common/utils.js
src/main/common/utils.js
+14
-16
src/renderer/App.vue
src/renderer/App.vue
+53
-12
src/renderer/assets/common/utils.js
src/renderer/assets/common/utils.js
+52
-33
src/renderer/main.js
src/renderer/main.js
+19
-19
src/renderer/pages/search/subpages/settings.vue
src/renderer/pages/search/subpages/settings.vue
+170
-130
src/renderer/store/modules/main.js
src/renderer/store/modules/main.js
+1
-1
static/preload.js
static/preload.js
+111
-88
static/utils.js
static/utils.js
+18
-16
未找到文件。
src/main/browsers/main.js
浏览文件 @
74e49560
const
{
BrowserWindow
,
protocol
}
=
require
(
"
electron
"
)
const
{
BrowserWindow
,
protocol
}
=
require
(
"
electron
"
)
;
module
.
exports
=
()
=>
{
let
win
let
win
;
let
init
=
(
opts
)
=>
{
createWindow
(
opts
)
}
createWindow
(
opts
)
;
}
;
let
createWindow
=
(
opts
)
=>
{
const
winURL
=
process
.
env
.
NODE_ENV
===
'
development
'
?
`http://localhost:9080`
:
`file://
${
__dirname
}
/index.html`
const
winURL
=
process
.
env
.
NODE_ENV
===
"
development
"
?
`http://localhost:9080`
:
`file://
${
__dirname
}
/index.html`
;
win
=
new
BrowserWindow
({
height
:
60
,
...
...
@@ -17,7 +18,7 @@ module.exports = () => {
resizable
:
true
,
width
:
800
,
frame
:
false
,
title
:
'
拉比克
'
,
title
:
"
拉比克
"
,
show
:
false
,
skipTaskbar
:
true
,
webPreferences
:
{
...
...
@@ -26,31 +27,35 @@ module.exports = () => {
backgroundThrottling
:
false
,
contextIsolation
:
false
,
webviewTag
:
true
,
nodeIntegration
:
true
// 在网页中集成Node
nodeIntegration
:
true
,
// 在网页中集成Node
},
});
win
.
loadURL
(
winURL
);
protocol
.
interceptFileProtocol
(
"
image
"
,
(
req
,
callback
)
=>
{
const
url
=
req
.
url
.
substr
(
8
);
callback
(
decodeURI
(
url
));
},
(
error
)
=>
{
if
(
error
)
{
console
.
error
(
"
Failed to register protocol
"
);
}
}
})
);
win
.
loadURL
(
winURL
)
protocol
.
interceptFileProtocol
(
'
image
'
,
(
req
,
callback
)
=>
{
const
url
=
req
.
url
.
substr
(
8
)
callback
(
decodeURI
(
url
))
},
(
error
)
=>
{
if
(
error
)
{
console
.
error
(
'
Failed to register protocol
'
)
}
})
win
.
once
(
'
ready-to-show
'
,
()
=>
win
.
show
())
win
.
once
(
"
ready-to-show
"
,
()
=>
win
.
show
());
win
.
on
(
"
closed
"
,
()
=>
{
win
=
undefined
})
}
win
=
undefined
;
})
;
}
;
let
getWindow
=
()
=>
win
let
getWindow
=
()
=>
win
;
return
{
init
:
init
,
getWindow
:
getWindow
,
}
}
init
,
getWindow
,
}
;
}
;
src/main/browsers/picker.js
浏览文件 @
74e49560
const
{
BrowserWindow
,
nativeImage
}
=
require
(
"
electron
"
)
const
{
BrowserWindow
,
nativeImage
}
=
require
(
"
electron
"
)
;
module
.
exports
=
()
=>
{
let
win
let
win
;
let
init
=
(
x
,
y
)
=>
{
if
(
win
===
null
||
win
===
undefined
)
{
createWindow
()
createWindow
()
;
}
}
}
;
let
createWindow
=
()
=>
{
win
=
new
BrowserWindow
({
...
...
@@ -25,18 +25,18 @@ module.exports = () => {
contextIsolation
:
false
,
devTools
:
false
,
},
})
})
;
win
.
loadURL
(
`file://
${
__static
}
/plugins/picker/index.html`
)
win
.
loadURL
(
`file://
${
__static
}
/plugins/picker/index.html`
)
;
win
.
on
(
"
closed
"
,
()
=>
{
win
=
undefined
})
}
win
=
undefined
;
})
;
}
;
let
getWindow
=
()
=>
win
let
getWindow
=
()
=>
win
;
return
{
init
:
init
,
getWindow
:
getWindow
,
}
}
init
,
getWindow
,
}
;
}
;
src/main/browsers/separate.js
浏览文件 @
74e49560
const
{
BrowserWindow
}
=
require
(
"
electron
"
)
const
{
BrowserWindow
}
=
require
(
"
electron
"
)
;
module
.
exports
=
()
=>
{
let
win
let
win
;
let
init
=
(
opts
)
=>
{
createWindow
(
opts
)
}
createWindow
(
opts
)
;
}
;
let
createWindow
=
(
opts
)
=>
{
const
winURL
=
process
.
env
.
NODE_ENV
===
'
development
'
?
`http://localhost:9080/#/plugin`
:
`
${
__dirname
}
/index.html`
const
winURL
=
process
.
env
.
NODE_ENV
===
"
development
"
?
`http://localhost:9080/#/plugin`
:
`
${
__dirname
}
/index.html`
;
win
=
new
BrowserWindow
({
height
:
600
,
useContentSize
:
true
,
width
:
800
,
titleBarStyle
:
'
hiddenInset
'
,
title
:
'
拉比克
'
,
titleBarStyle
:
"
hiddenInset
"
,
title
:
"
拉比克
"
,
show
:
false
,
webPreferences
:
{
webSecurity
:
false
,
...
...
@@ -24,26 +25,30 @@ module.exports = () => {
backgroundThrottling
:
false
,
contextIsolation
:
false
,
webviewTag
:
true
,
nodeIntegration
:
true
// 在网页中集成Node
}
})
process
.
env
.
NODE_ENV
===
'
development
'
?
win
.
loadURL
(
winURL
)
:
win
.
loadFile
(
winURL
,
{
hash
:
`#/plugin`
,
})
nodeIntegration
:
true
,
// 在网页中集成Node
},
});
process
.
env
.
NODE_ENV
===
"
development
"
?
win
.
loadURL
(
winURL
)
:
win
.
loadFile
(
winURL
,
{
hash
:
`#/plugin`
,
});
win
.
webContents
.
executeJavaScript
(
`window.setPluginInfo(
${
opts
}
)`
).
then
(()
=>
{
win
.
show
()
})
win
.
webContents
.
executeJavaScript
(
`window.setPluginInfo(
${
opts
}
)`
)
.
then
(()
=>
{
win
.
show
();
});
win
.
on
(
"
closed
"
,
()
=>
{
win
=
undefined
})
}
win
=
undefined
;
})
;
}
;
let
getWindow
=
()
=>
win
let
getWindow
=
()
=>
win
;
return
{
init
:
init
,
getWindow
:
getWindow
,
}
}
init
,
getWindow
,
}
;
}
;
src/main/browsers/superPanel.js
浏览文件 @
74e49560
...
...
@@ -6,14 +6,14 @@ module.exports = () => {
let
init
=
(
mainWindow
)
=>
{
if
(
win
===
null
||
win
===
undefined
)
{
createWindow
();
ipcMain
.
on
(
'
superPanel-hidden
'
,
()
=>
{
ipcMain
.
on
(
"
superPanel-hidden
"
,
()
=>
{
win
.
hide
();
});
ipcMain
.
on
(
'
superPanel-setSize
'
,
(
e
,
height
)
=>
{
ipcMain
.
on
(
"
superPanel-setSize
"
,
(
e
,
height
)
=>
{
win
.
setSize
(
250
,
height
);
});
ipcMain
.
on
(
'
superPanel-openPlugin
'
,
(
e
,
args
)
=>
{
mainWindow
.
webContents
.
send
(
'
superPanel-openPlugin
'
,
args
);
ipcMain
.
on
(
"
superPanel-openPlugin
"
,
(
e
,
args
)
=>
{
mainWindow
.
webContents
.
send
(
"
superPanel-openPlugin
"
,
args
);
});
}
};
...
...
@@ -39,7 +39,7 @@ module.exports = () => {
win
=
undefined
;
});
// 打包后,失焦隐藏
win
.
on
(
'
blur
'
,
()
=>
{
win
.
on
(
"
blur
"
,
()
=>
{
win
.
hide
();
});
};
...
...
@@ -47,7 +47,7 @@ module.exports = () => {
let
getWindow
=
()
=>
win
;
return
{
init
:
init
,
getWindow
:
getWindow
,
init
,
getWindow
,
};
};
src/main/common/common.js
浏览文件 @
74e49560
import
{
app
}
from
'
electron
'
;
import
'
./config
'
;
import
Listener
from
'
./listener
'
;
import
{
app
}
from
"
electron
"
;
import
"
./config
"
;
import
Listener
from
"
./listener
"
;
import
{
remote
}
from
"
electron
"
;
export
default
function
init
(
mainWindow
)
{
const
listener
=
new
Listener
();
...
...
@@ -16,11 +17,11 @@ export default function init(mainWindow) {
}
});
// 打包后,失焦隐藏
mainWindow
.
on
(
'
blur
'
,
()
=>
{
app
.
isPackaged
&&
mainWindow
.
hide
();
// 判断失焦是否隐藏
mainWindow
.
on
(
"
blur
"
,
()
=>
{
const
config
=
{
...
opConfig
.
get
()
};
if
(
config
.
perf
.
common
.
hideOnBlur
)
{
mainWindow
.
hide
();
}
});
}
src/main/common/config.js
浏览文件 @
74e49560
import
path
from
"
path
"
import
fs
from
'
fs
'
import
{
getlocalDataFile
}
from
"
./utils
"
import
os
from
'
os
'
import
path
from
"
path
"
;
import
fs
from
"
fs
"
;
import
{
getLocalDataFile
}
from
"
./utils
"
;
import
os
from
"
os
"
;
import
{
app
}
from
"
electron
"
;
const
configPath
=
path
.
join
(
get
localDataFile
(),
'
./rubick-config.json
'
)
const
configPath
=
path
.
join
(
get
LocalDataFile
(),
"
./rubick-config.json
"
);
let
defaultConfig
=
{
Darwin
:
{
version
:
3
,
perf
:
{
shortCut
:
{
showAndHidden
:
'
Option+R
'
,
separate
:
'
Ctrl+D
'
,
quit
:
'
Shift+Escape
'
},
common
:
{
start
:
true
,
space
:
true
,
},
local
:
{
search
:
true
,
}
const
defaultConfigForAnyPlatform
=
{
version
:
3
,
perf
:
{
shortCut
:
{
showAndHidden
:
"
Option+R
"
,
separate
:
"
Ctrl+D
"
,
quit
:
"
Shift+Escape
"
,
},
superPanel
:
{
baiduAPI
:
{
key
:
''
,
appid
:
''
,
},
mouseDownTime
:
500
common
:
{
start
:
true
,
space
:
true
,
// 是否失焦隐藏。默认在dev环境不隐藏,在打包后隐藏。
hideOnBlur
:
app
.
isPackaged
,
},
global
:
[]
},
Windows_NT
:
{
version
:
3
,
perf
:
{
shortCut
:
{
showAndHidden
:
'
Option+R
'
,
separate
:
'
Ctrl+D
'
,
quit
:
'
Shift+Escape
'
},
common
:
{
start
:
true
,
space
:
true
,
},
local
:
{
search
:
true
,
}
local
:
{
search
:
true
,
},
superPanel
:
{
baiduAPI
:
{
key
:
''
,
appid
:
''
,
},
mouseDownTime
:
500
},
superPanel
:
{
baiduAPI
:
{
key
:
""
,
appid
:
""
,
},
global
:
[]
mouseDownTime
:
500
,
},
global
:
[],
};
let
defaultConfig
=
{
Darwin
:
{
...
defaultConfigForAnyPlatform
,
},
Windows_NT
:
{
...
defaultConfigForAnyPlatform
,
},
Linux
:
{
version
:
3
,
perf
:
{
shortCut
:
{
showAndHidden
:
'
Option+R
'
,
separate
:
'
Ctrl+D
'
,
quit
:
'
Shift+Escape
'
},
common
:
{
start
:
true
,
space
:
true
,
},
local
:
{
search
:
true
,
}
},
superPanel
:
{
baiduAPI
:
{
key
:
''
,
appid
:
''
,
},
mouseDownTime
:
500
},
global
:
[]
}
}
...
defaultConfigForAnyPlatform
,
},
};
global
.
opConfig
=
{
config
:
null
,
get
()
{
const
platform
=
os
.
type
();
try
{
if
(
!
opConfig
.
config
)
{
opConfig
.
config
=
JSON
.
parse
(
fs
.
readFileSync
(
configPath
)
||
JSON
.
stringify
(
defaultConfig
[
platform
]))
opConfig
.
config
=
JSON
.
parse
(
fs
.
readFileSync
(
configPath
)
||
JSON
.
stringify
(
defaultConfig
[
platform
])
);
}
// 重置
if
(
!
opConfig
.
config
.
version
||
opConfig
.
config
.
version
<
defaultConfig
[
platform
].
version
)
{
opConfig
.
config
=
defaultConfig
[
platform
]
fs
.
writeFileSync
(
configPath
,
JSON
.
stringify
(
opConfig
.
config
))
if
(
!
opConfig
.
config
.
version
||
opConfig
.
config
.
version
<
defaultConfig
[
platform
].
version
)
{
opConfig
.
config
=
defaultConfig
[
platform
];
fs
.
writeFileSync
(
configPath
,
JSON
.
stringify
(
opConfig
.
config
));
}
return
opConfig
.
config
return
opConfig
.
config
;
}
catch
(
e
)
{
opConfig
.
config
=
defaultConfig
[
platform
]
return
opConfig
.
config
opConfig
.
config
=
defaultConfig
[
platform
]
;
return
opConfig
.
config
;
}
},
set
(
key
,
value
)
{
opConfig
.
config
[
key
]
=
value
;
fs
.
writeFileSync
(
configPath
,
JSON
.
stringify
(
opConfig
.
config
))
}
}
fs
.
writeFileSync
(
configPath
,
JSON
.
stringify
(
opConfig
.
config
));
},
};
src/main/common/utils.js
浏览文件 @
74e49560
import
fs
from
"
fs
"
;
export
const
get
l
ocalDataFile
=
()
=>
{
export
const
get
L
ocalDataFile
=
()
=>
{
let
localDataFile
=
process
.
env
.
HOME
;
if
(
!
localDataFile
)
{
localDataFile
=
process
.
env
.
LOCALAPPDATA
;
...
...
@@ -14,13 +14,13 @@ export function saveData(path, value) {
export
function
getData
(
path
,
defaultValue
)
{
try
{
return
JSON
.
parse
(
fs
.
readFileSync
(
path
,
'
utf8
'
));
return
JSON
.
parse
(
fs
.
readFileSync
(
path
,
"
utf8
"
));
}
catch
(
e
)
{
return
defaultValue
||
undefined
;
}
}
export
function
throttle
(
func
,
wait
,
options
)
{
export
function
throttle
(
func
,
wait
,
options
)
{
let
context
,
args
,
result
;
let
timeout
=
null
;
let
previous
=
0
;
...
...
@@ -54,21 +54,19 @@ export function throttle (func, wait, options) {
}
export
const
commonConst
=
{
linux
:
function
()
{
return
process
.
platform
===
'
linux
'
linux
:
function
()
{
return
process
.
platform
===
"
linux
"
;
},
macOS
()
{
return
process
.
platform
===
'
darwin
'
;
macOS
()
{
return
process
.
platform
===
"
darwin
"
;
},
windows
()
{
return
process
.
platform
===
'
win32
'
windows
()
{
return
process
.
platform
===
"
win32
"
;
},
production
:
function
()
{
return
process
.
env
.
NODE_ENV
!==
'
development
'
;
production
:
function
()
{
return
process
.
env
.
NODE_ENV
!==
"
development
"
;
},
dev
:
function
()
{
return
process
.
env
.
NODE_ENV
===
'
development
'
;
dev
:
function
()
{
return
process
.
env
.
NODE_ENV
===
"
development
"
;
},
}
};
src/renderer/App.vue
浏览文件 @
74e49560
...
...
@@ -2,7 +2,7 @@
<div
@
mousedown=
"drag"
>
<a-layout
id=
"components-layout"
>
<div
v-if=
"!searchType"
class=
"rubick-select"
>
<div
class=
"tag-container"
v-if=
"selected
"
>
<div
v-if=
"selected"
class=
"tag-container
"
>
<a-tag
:key=
"selected.key"
@
close=
"closeTag"
...
...
@@ -59,7 +59,7 @@
</div>
</div>
</a-input>
<div
class=
"options"
v-show=
"showO
ptions"
>
<div
v-show=
"showOptions"
class=
"o
ptions"
>
<a-list
item-layout=
"horizontal"
:data-source=
"options"
>
<a-list-item
@
click=
"() => item.click($router)"
...
...
@@ -80,8 +80,20 @@
</a-list-item>
</a-list>
</div>
<span
v-show=
"selected"
class=
"button-hide-on-blur"
@
click=
"changeHideOnBlur"
>
<a-icon
type=
"pushpin"
:style=
"
{
color: config.perf.common.hideOnBlur ? 'grey' : '#ea68a2',
}"
>
</a-icon>
</span>
</div>
<div
class=
"rubick-select-subMenu"
v-else
>
<div
v-else
class=
"rubick-select-subMenu"
>
<div>
<img
class=
"icon-tool-sub"
...
...
@@ -135,11 +147,10 @@ export default {
return
{
query
:
this
.
$route
.
query
,
searchFn
:
null
,
config
:
opConfig
.
get
()
,
config
:
{
...
opConfig
.
get
()
}
,
currentSelect
:
0
,
};
},
created
()
{
window
.
setPluginInfo
=
(
pluginInfo
)
=>
{
this
.
commonUpdate
({
...
...
@@ -147,7 +158,6 @@ export default {
});
};
},
mounted
()
{
ipcRenderer
.
on
(
"
init-rubick
"
,
this
.
closeTag
);
ipcRenderer
.
on
(
"
new-window
"
,
this
.
newWindow
);
...
...
@@ -319,10 +329,14 @@ export default {
}
},
changePath
({
key
})
{
this
.
$router
.
push
({
path
:
`/home/
${
key
}
`
});
this
.
commonUpdate
({
current
:
[
key
],
});
const
path
=
`/home/
${
key
}
`
;
// 避免重复点击导致跳转相同路由而爆红
if
(
this
.
$router
.
history
.
current
.
fullPath
!=
path
)
{
this
.
$router
.
push
({
path
});
this
.
commonUpdate
({
current
:
[
key
],
});
}
},
closeTag
(
v
)
{
this
.
commonUpdate
({
...
...
@@ -330,6 +344,7 @@ export default {
showMain
:
false
,
options
:
[],
});
this
.
setHideOnBlur
(
true
);
ipcRenderer
.
send
(
"
changeWindowSize-rubick
"
,
{
height
:
getWindowHeight
([]),
});
...
...
@@ -392,10 +407,20 @@ export default {
ipcRenderer
.
send
(
"
window-move
"
);
},
dragWhenInput
(
e
)
{
if
(
this
.
searchValue
==
""
)
{
if
(
this
.
searchValue
==
=
""
)
{
ipcRenderer
.
send
(
"
window-move
"
);
}
},
changeHideOnBlur
(
e
)
{
let
cfg
=
{
...
this
.
config
};
cfg
.
perf
.
common
.
hideOnBlur
=
!
cfg
.
perf
.
common
.
hideOnBlur
;
this
.
config
=
cfg
;
},
setHideOnBlur
(
v
)
{
let
cfg
=
{
...
this
.
config
};
cfg
.
perf
.
common
.
hideOnBlur
=
v
;
this
.
config
=
cfg
;
},
},
computed
:
{
...
mapState
(
"
main
"
,
[
...
...
@@ -410,7 +435,7 @@ export default {
"
pluginLoading
"
,
]),
showOptions
()
{
// 有选项值,且不在显示主页
// 有选项值,且不在显示主页
。(即出现下方选项框)
if
(
this
.
options
.
length
&&
!
this
.
showMain
)
{
return
true
;
}
...
...
@@ -419,6 +444,17 @@ export default {
return
this
.
pluginInfo
.
searchType
?
"
subWindow
"
:
""
;
},
},
watch
:
{
config
:
{
deep
:
true
,
handler
()
{
opConfig
.
set
(
"
perf
"
,
this
.
config
.
perf
);
opConfig
.
set
(
"
superPanel
"
,
this
.
config
.
superPanel
);
opConfig
.
set
(
"
global
"
,
this
.
config
.
global
);
ipcRenderer
.
send
(
"
re-register
"
);
},
},
},
};
</
script
>
<
style
lang=
"less"
>
...
...
@@ -538,4 +574,9 @@ export default {
left: 0;
}
}
.button-hide-on-blur {
padding: 0px 3px 0px 0px;
// 小按钮只会在碰到1/3处时被认为点击。
height: 33%;
}
</
style
>
src/renderer/assets/common/utils.js
浏览文件 @
74e49560
import
{
WINDOW_MAX_HEIGHT
,
WINDOW_MIN_HEIGHT
,
PRE_ITEM_HEIGHT
,
SYSTEM_PLUGINS
}
from
'
./constans
'
;
import
path
from
'
path
'
;
import
fs
from
'
fs
'
;
import
Store
from
'
electron-store
'
;
import
downloadFile
from
'
download
'
;
import
{
ipcRenderer
}
from
'
electron
'
;
import
{
getlocalDataFile
}
from
'
../../../main/common/utils
'
;
import
shell
from
'
shelljs
'
;
const
getApp
=
process
.
platform
===
'
win32
'
?
require
(
'
./win-app
'
).
getApp
:
require
(
'
./darwin-app
'
).
getApp
;
import
{
WINDOW_MAX_HEIGHT
,
WINDOW_MIN_HEIGHT
,
PRE_ITEM_HEIGHT
,
SYSTEM_PLUGINS
,
}
from
"
./constans
"
;
import
path
from
"
path
"
;
import
fs
from
"
fs
"
;
import
Store
from
"
electron-store
"
;
import
downloadFile
from
"
download
"
;
import
{
ipcRenderer
}
from
"
electron
"
;
import
{
getLocalDataFile
}
from
"
../../../main/common/utils
"
;
import
shell
from
"
shelljs
"
;
const
getApp
=
process
.
platform
===
"
win32
"
?
require
(
"
./win-app
"
).
getApp
:
require
(
"
./darwin-app
"
).
getApp
;
const
store
=
new
Store
();
...
...
@@ -17,14 +25,16 @@ const fileLists = getApp.fileLists;
function
getWindowHeight
(
searchList
)
{
if
(
!
searchList
)
return
WINDOW_MAX_HEIGHT
;
if
(
!
searchList
.
length
)
return
WINDOW_MIN_HEIGHT
;
return
searchList
.
length
*
PRE_ITEM_HEIGHT
+
WINDOW_MIN_HEIGHT
+
5
>
WINDOW_MAX_HEIGHT
return
searchList
.
length
*
PRE_ITEM_HEIGHT
+
WINDOW_MIN_HEIGHT
+
5
>
WINDOW_MAX_HEIGHT
?
WINDOW_MAX_HEIGHT
:
searchList
.
length
*
PRE_ITEM_HEIGHT
+
WINDOW_MIN_HEIGHT
+
5
;
}
function
searchKeyValues
(
lists
,
value
)
{
return
lists
.
filter
((
item
)
=>
{
if
(
typeof
item
===
'
string
'
)
return
item
.
toLowerCase
().
indexOf
(
value
.
toLowerCase
())
>=
0
;
if
(
typeof
item
===
"
string
"
)
return
item
.
toLowerCase
().
indexOf
(
value
.
toLowerCase
())
>=
0
;
return
item
.
type
.
toLowerCase
().
indexOf
(
value
.
toLowerCase
())
>=
0
;
});
}
...
...
@@ -41,7 +51,7 @@ function existOrNot(path) {
});
}
const
appPath
=
get
l
ocalDataFile
();
const
appPath
=
get
L
ocalDataFile
();
async
function
downloadZip
(
downloadRepoUrl
,
name
)
{
try
{
...
...
@@ -50,7 +60,7 @@ async function downloadZip(downloadRepoUrl, name) {
const
temp_dest
=
`
${
plugin_path
}
/
${
name
}
`
;
// 下载模板
if
(
await
existOrNot
(
temp_dest
))
{
shell
.
rm
(
'
-rf
'
,
temp_dest
);
shell
.
rm
(
"
-rf
"
,
temp_dest
);
}
await
downloadFile
(
downloadRepoUrl
,
plugin_path
,
{
extract
:
true
});
...
...
@@ -63,7 +73,7 @@ async function downloadZip(downloadRepoUrl, name) {
const
sysFile
=
{
savePlugins
(
plugins
)
{
ipcRenderer
.
send
(
'
optionPlugin
'
,
{
ipcRenderer
.
send
(
"
optionPlugin
"
,
{
plugins
:
plugins
.
filter
((
plugin
)
=>
{
let
hasOption
=
false
;
plugin
.
features
.
forEach
((
fe
)
=>
{
...
...
@@ -74,20 +84,20 @@ const sysFile = {
});
});
return
hasOption
;
})
})
,
});
store
.
set
(
'
user-plugins
'
,
plugins
);
store
.
set
(
"
user-plugins
"
,
plugins
);
},
getUserPlugins
()
{
try
{
return
store
.
get
(
'
user-plugins
'
);
return
store
.
get
(
"
user-plugins
"
);
}
catch
(
e
)
{
return
[];
}
},
removeAllPlugins
()
{
store
.
delete
(
'
user-plugins
'
);
}
store
.
delete
(
"
user-plugins
"
);
}
,
};
function
mergePlugins
(
plugins
)
{
...
...
@@ -97,10 +107,10 @@ function mergePlugins(plugins) {
return
{
...
plugin
,
status
:
true
,
sourceFile
:
''
,
type
:
'
system
'
sourceFile
:
""
,
type
:
"
system
"
,
};
})
})
,
];
const
target
=
[];
...
...
@@ -108,7 +118,7 @@ function mergePlugins(plugins) {
result
.
forEach
((
item
,
i
)
=>
{
let
targetIndex
=
-
1
;
target
.
forEach
((
tg
,
j
)
=>
{
if
(
tg
.
tag
===
item
.
tag
&&
tg
.
type
===
'
system
'
)
{
if
(
tg
.
tag
===
item
.
tag
&&
tg
.
type
===
"
system
"
)
{
targetIndex
=
j
;
}
});
...
...
@@ -117,7 +127,7 @@ function mergePlugins(plugins) {
}
});
ipcRenderer
&&
ipcRenderer
.
send
(
'
optionPlugin
'
,
{
ipcRenderer
.
send
(
"
optionPlugin
"
,
{
plugins
:
target
.
filter
((
plugin
)
=>
{
let
hasOption
=
false
;
plugin
.
features
.
forEach
((
fe
)
=>
{
...
...
@@ -128,25 +138,25 @@ function mergePlugins(plugins) {
});
});
return
hasOption
;
})
})
,
});
ipcRenderer
&&
ipcRenderer
.
send
(
'
pluginInit
'
,
{
plugins
:
target
});
ipcRenderer
.
send
(
"
pluginInit
"
,
{
plugins
:
target
,
});
return
target
;
}
function
find
(
p
,
target
=
'
plugin.json
'
)
{
function
find
(
p
,
target
=
"
plugin.json
"
)
{
try
{
let
result
;
const
fileList
=
fs
.
readdirSync
(
p
);
for
(
let
i
=
0
;
i
<
fileList
.
length
;
i
++
)
{
let
thisPath
=
p
+
'
/
'
+
fileList
[
i
];
let
thisPath
=
p
+
"
/
"
+
fileList
[
i
];
const
data
=
fs
.
statSync
(
thisPath
);
if
(
data
.
isFile
()
&&
fileList
[
i
]
===
target
)
{
result
=
path
.
join
(
thisPath
,
'
../
'
);
result
=
path
.
join
(
thisPath
,
"
../
"
);
return
result
;
}
if
(
data
.
isDirectory
())
{
...
...
@@ -172,4 +182,13 @@ function debounce(fn, delay) {
};
}
export
{
getWindowHeight
,
searchKeyValues
,
sysFile
,
mergePlugins
,
find
,
downloadZip
,
fileLists
,
debounce
};
export
{
getWindowHeight
,
searchKeyValues
,
sysFile
,
mergePlugins
,
find
,
downloadZip
,
fileLists
,
debounce
,
};
src/renderer/main.js
浏览文件 @
74e49560
import
Vue
from
'
vue
'
import
axios
from
'
axios
'
import
ioHook
from
'
iohook
'
;
import
{
ipcRenderer
,
remote
}
from
'
electron
'
;
import
App
from
'
./App
'
import
router
from
'
./router
'
import
store
from
'
./store
'
import
Antd
from
'
ant-design-vue
'
;
import
Vue
from
"
vue
"
;
import
axios
from
"
axios
"
;
import
ioHook
from
"
iohook
"
;
import
{
ipcRenderer
,
remote
}
from
"
electron
"
;
import
App
from
"
./App
"
;
import
router
from
"
./router
"
;
import
store
from
"
./store
"
;
import
Antd
from
"
ant-design-vue
"
;
import
'
./assets/ant-reset.less
'
;
import
"
./assets/ant-reset.less
"
;
const
opConfig
=
remote
.
getGlobal
(
'
opConfig
'
);
const
opConfig
=
remote
.
getGlobal
(
"
opConfig
"
);
if
(
!
process
.
env
.
IS_WEB
)
Vue
.
use
(
require
(
'
vue-electron
'
))
Vue
.
http
=
Vue
.
prototype
.
$http
=
axios
if
(
!
process
.
env
.
IS_WEB
)
Vue
.
use
(
require
(
"
vue-electron
"
));
Vue
.
http
=
Vue
.
prototype
.
$http
=
axios
;
Vue
.
config
.
productionTip
=
false
;
Vue
.
use
(
Antd
);
...
...
@@ -22,25 +22,25 @@ new Vue({
components
:
{
App
},
router
,
store
,
template
:
'
<App/>
'
}).
$mount
(
'
#app
'
);
template
:
"
<App/>
"
,
}).
$mount
(
"
#app
"
);
ioHook
.
start
(
false
);
let
down_time
=
0
;
let
isPress
=
false
;
ioHook
.
on
(
'
mousedown
'
,
(
e
)
=>
{
ioHook
.
on
(
"
mousedown
"
,
(
e
)
=>
{
if
(
e
.
button
===
1
)
return
;
isPress
=
true
;
down_time
=
Date
.
now
();
const
config
=
opConfig
.
get
();
setTimeout
(
async
()
=>
{
if
(
isPress
)
{
ipcRenderer
.
send
(
'
right-down
'
);
ipcRenderer
.
send
(
"
right-down
"
);
}
},
config
.
superPanel
.
mouseDownTime
);
})
ioHook
.
on
(
'
mouseup
'
,
(
e
)
=>
{
if
(
e
.
button
===
1
)
return
;
})
;
ioHook
.
on
(
"
mouseup
"
,
(
e
)
=>
{
if
(
e
.
button
===
1
)
return
;
isPress
=
false
;
});
src/renderer/pages/search/subpages/settings.vue
浏览文件 @
74e49560
<
template
>
<div
class=
"pg-settings"
>
<div
class=
"dev-detail"
>
<a-menu
v-model=
"currentSelect"
style=
"width: 256px; height: 100%"
mode=
"vertical"
>
<a-menu
v-model=
"currentSelect"
style=
"width: 256px; height: 100%"
mode=
"vertical"
>
<a-menu-item
:key=
"0"
>
偏好设置
</a-menu-item>
...
...
@@ -15,40 +19,72 @@
<div
class=
"settings-detail"
>
<div
v-if=
"currentSelect[0] === 0"
>
<div
class=
"setting-item"
>
<div
class=
"title"
>
快捷键(需要使用 option/ctrl/shift/command 键修饰)
</div>
<div
class=
"title"
>
快捷键(需要使用 option/ctrl/shift/command 键修饰)
</div>
<div
class=
"settings-item-li"
>
<div
class=
"label"
>
显示/隐藏快捷键
</div>
<div
class=
"value"
tabIndex=
-1
@
keyup=
"(e) => changeShortCut(e, 'showAndHidden')"
>
{{
config
.
perf
.
shortCut
.
showAndHidden
}}
</div>
<div
class=
"value"
tabIndex=
"-1"
@
keyup=
"(e) => changeShortCut(e, 'showAndHidden')"
>
{{
config
.
perf
.
shortCut
.
showAndHidden
}}
</div>
</div>
<div
class=
"settings-item-li"
>
<div
class=
"label"
>
插件分离快捷键
</div>
<div
class=
"value"
tabIndex=
-1
@
keyup=
"(e) => changeShortCut(e, 'separate')"
>
{{
config
.
perf
.
shortCut
.
separate
}}
</div>
<div
class=
"value"
tabIndex=
"-1"
@
keyup=
"(e) => changeShortCut(e, 'separate')"
>
{{
config
.
perf
.
shortCut
.
separate
}}
</div>
</div>
<div
class=
"settings-item-li"
>
<div
class=
"label"
>
返回主界面
</div>
<div
class=
"value"
tabIndex=
-1
@
keyup=
"(e) => changeShortCut(e, 'quit')"
>
{{
config
.
perf
.
shortCut
.
quit
}}
</div>
<div
class=
"value"
tabIndex=
"-1"
@
keyup=
"(e) => changeShortCut(e, 'quit')"
>
{{
config
.
perf
.
shortCut
.
quit
}}
</div>
</div>
</div>
<div
class=
"setting-item"
>
<div
class=
"title"
>
通用
</div>
<div
class=
"settings-item-li"
>
<div
class=
"label"
>
开机启动
</div>
<a-switch
v-model:checked=
"config.perf.common.start"
checked-children=
"开"
un-checked-children=
"关"
></a-switch>
<a-switch
v-model:checked=
"config.perf.common.start"
checked-children=
"开"
un-checked-children=
"关"
></a-switch>
</div>
<div
class=
"settings-item-li"
>
<div
class=
"label"
>
空格执行
</div>
<a-switch
v-model:checked=
"config.perf.common.space"
checked-children=
"开"
un-checked-children=
"关"
></a-switch>
<a-switch
v-model:checked=
"config.perf.common.space"
checked-children=
"开"
un-checked-children=
"关"
></a-switch>
</div>
</div>
<div
class=
"setting-item"
>
<div
class=
"title"
>
本地搜索启动
</div>
<div
class=
"settings-item-li"
>
<div
class=
"label"
>
搜索启动应用
&
文件
</div>
<a-switch
v-model:checked=
"config.perf.local.search"
checked-children=
"开"
un-checked-children=
"关"
></a-switch>
<a-switch
v-model:checked=
"config.perf.local.search"
checked-children=
"开"
un-checked-children=
"关"
></a-switch>
</div>
</div>
</div>
<div
v-if=
"currentSelect[0] === 1"
>
<div
v-if=
"currentSelect[0] === 1"
>
<div
class=
"setting-item"
>
<div
class=
"title"
>
弹出面板
</div>
<a-select
value=
"mouseRight"
style=
"width: 200px"
disabled
>
...
...
@@ -57,20 +93,25 @@
</div>
<div
class=
"setting-item"
>
<div
class=
"title"
>
长按以下设置的毫秒响应
</div>
<a-slider
:step=
"100"
v-model:value=
"config.superPanel.mouseDownTime"
:min=
"200"
:max=
"1000"
/>
<a-slider
:step=
"100"
v-model:value=
"config.superPanel.mouseDownTime"
:min=
"200"
:max=
"1000"
/>
</div>
</div>
<div
v-if=
"currentSelect[0] === 2"
>
<a-collapse>
<a-collapse-panel
key=
"1"
header=
"说明及示例"
>
<div>
按下快捷键,自动搜索对应关键字,当关键字结果完全匹配,且结果唯一时,会直接指向该功能。
</div>
<div>
按下快捷键,自动搜索对应关键字,当关键字结果完全匹配,且结果唯一时,会直接指向该功能。
</div>
<h3
style=
"margin-top: 10px;"
>
示例
</h3>
<a-divider
style=
"margin: 5px 0;"
/>
<a-list
item-layout=
"horizontal"
:data-source=
"examples"
>
<a-list-item
slot=
"renderItem"
slot-scope=
"item, index"
>
<a-list-item-meta
:description=
"item.desc"
>
<a-list-item-meta
:description=
"item.desc"
>
<div
slot=
"title"
>
{{
item
.
title
}}
</div>
</a-list-item-meta>
</a-list-item>
...
...
@@ -82,80 +123,81 @@
<div>
快捷键
</div>
<a-tooltip
placement=
"top"
trigger=
"click"
>
<template
slot=
"title"
>
<span>
先按功能键(Ctrl、Shift、Alt、Option、Command),再按其他普通键。或按 F1-F12 单键
</span>
<span
>
先按功能键(Ctrl、Shift、Alt、Option、Command),再按其他普通键。或按
F1-F12 单键
</span
>
</
template
>
<div
v-for=
"(item, index) in config.global"
class=
"value"
tabIndex=
-1
@
keyup=
"(e) => changeGlobalKey(e, index)"
v-for=
"(item, index) in config.global"
class=
"value"
tabIndex=
"-1"
@
keyup=
"(e) => changeGlobalKey(e, index)"
>
{{ item.key }}
</div>
</a-tooltip>
</div>
<div
class=
"short-cut item"
>
<div>
功能关键字
</div>
<a-input
:value=
"item.value"
v-for=
"(item, index) in config.global"
class=
"value"
:disabled=
"!item.key"
@
change=
"(e) => changeGlobalValue(index, e.target.value)"
:value=
"item.value"
v-for=
"(item, index) in config.global"
class=
"value"
:disabled=
"!item.key"
@
change=
"(e) => changeGlobalValue(index, e.target.value)"
/>
</div>
</div>
<div
@
click=
"addConfig"
class=
"add-global"
>
+
新增全局快捷功能
</div>
<div
@
click=
"addConfig"
class=
"add-global"
>
+
新增全局快捷功能
</div>
</div>
</div>
</div>
</div>
</template>
<
script
>
import
keycodes
from
'
../../../assets/keycode
'
;
import
{
ipcRenderer
,
remote
}
from
'
electron
'
;
import
keycodes
from
"
../../../assets/keycode
"
;
import
{
ipcRenderer
,
remote
}
from
"
electron
"
;
const
opConfig
=
remote
.
getGlobal
(
'
opConfig
'
);
const
opConfig
=
remote
.
getGlobal
(
"
opConfig
"
);
export
default
{
data
()
{
return
{
currentSelect
:
[
0
],
config
:
JSON
.
parse
(
JSON
.
stringify
(
opConfig
.
get
()))
,
config
:
{
...
opConfig
.
get
()
}
,
examples
:
[
{
title
:
'
快捷键 「 Alt + W」 关键字 「 微信」
'
,
desc
:
'
按下Alt + W 直接打开本地微信应用
'
title
:
"
快捷键 「 Alt + W」 关键字 「 微信」
"
,
desc
:
"
按下Alt + W 直接打开本地微信应用
"
,
},
{
title
:
'
快捷键 「 Alt + Q」 关键字 「 取色」
'
,
desc
:
'
按下Alt + Q 直接打开屏幕取色功能
'
}
]
}
title
:
"
快捷键 「 Alt + Q」 关键字 「 取色」
"
,
desc
:
"
按下Alt + Q 直接打开屏幕取色功能
"
,
}
,
]
,
}
;
},
methods
:
{
changeShortCut
(
e
,
key
)
{
let
change
=
false
;
if
(
e
.
altKey
&&
e
.
keyCode
!==
18
)
{
if
(
e
.
altKey
&&
e
.
keyCode
!==
18
)
{
const
compose
=
`Option+
${
keycodes
[
e
.
keyCode
].
toUpperCase
()}
`
;
this
.
config
.
perf
.
shortCut
[
key
]
=
compose
;
change
=
true
;
}
if
(
e
.
ctrlKey
&&
e
.
keyCode
!==
17
)
{
if
(
e
.
ctrlKey
&&
e
.
keyCode
!==
17
)
{
const
compose
=
`Ctrl+
${
keycodes
[
e
.
keyCode
].
toUpperCase
()}
`
;
this
.
config
.
perf
.
shortCut
[
key
]
=
compose
;
change
=
true
;
}
if
(
e
.
shiftKey
&&
e
.
keyCode
!==
16
)
{
if
(
e
.
shiftKey
&&
e
.
keyCode
!==
16
)
{
const
compose
=
`Shift+
${
keycodes
[
e
.
keyCode
].
toUpperCase
()}
`
;
this
.
config
.
perf
.
shortCut
[
key
]
=
compose
;
change
=
true
;
}
if
(
e
.
metaKey
&&
e
.
keyCode
!==
93
)
{
if
(
e
.
metaKey
&&
e
.
keyCode
!==
93
)
{
const
compose
=
`Command+
${
keycodes
[
e
.
keyCode
].
toUpperCase
()}
`
;
this
.
config
.
perf
.
shortCut
[
key
]
=
compose
;
change
=
true
;
...
...
@@ -163,131 +205,129 @@ export default {
},
addConfig
()
{
this
.
config
.
global
.
push
({
key
:
''
,
value
:
''
key
:
""
,
value
:
""
,
});
},
changeGlobalKey
(
e
,
index
)
{
let
compose
;
if
(
e
.
altKey
&&
e
.
keyCode
!==
18
)
{
if
(
e
.
altKey
&&
e
.
keyCode
!==
18
)
{
compose
=
`Alt+
${
keycodes
[
e
.
keyCode
].
toUpperCase
()}
`
;
}
if
(
e
.
ctrlKey
&&
e
.
keyCode
!==
17
)
{
if
(
e
.
ctrlKey
&&
e
.
keyCode
!==
17
)
{
compose
=
`Ctrl+
${
keycodes
[
e
.
keyCode
].
toUpperCase
()}
`
;
}
if
(
e
.
shiftKey
&&
e
.
keyCode
!==
16
)
{
if
(
e
.
shiftKey
&&
e
.
keyCode
!==
16
)
{
compose
=
`Shift+
${
keycodes
[
e
.
keyCode
].
toUpperCase
()}
`
;
}
if
(
e
.
metaKey
&&
e
.
keyCode
!==
93
)
{
if
(
e
.
metaKey
&&
e
.
keyCode
!==
93
)
{
compose
=
`Command+
${
keycodes
[
e
.
keyCode
].
toUpperCase
()}
`
;
}
if
(
compose
)
{
this
.
$set
(
this
.
config
.
global
[
index
],
'
key
'
,
compose
);
this
.
$set
(
this
.
config
.
global
[
index
],
"
key
"
,
compose
);
}
// f1 - f12
if
(
e
.
keyCode
>=
112
&&
e
.
keyCode
<=
123
)
{
compose
=
keycodes
[
e
.
keyCode
].
toUpperCase
();
}
if
(
compose
)
{
this
.
$set
(
this
.
config
.
global
[
index
],
'
key
'
,
compose
);
this
.
$set
(
this
.
config
.
global
[
index
],
"
key
"
,
compose
);
}
},
changeGlobalValue
(
index
,
value
)
{
this
.
$set
(
this
.
config
.
global
[
index
],
'
value
'
,
value
);
}
this
.
$set
(
this
.
config
.
global
[
index
],
"
value
"
,
value
);
}
,
},
watch
:
{
config
:
{
deep
:
true
,
handler
()
{
opConfig
.
set
(
'
perf
'
,
this
.
config
.
perf
);
opConfig
.
set
(
'
superPanel
'
,
this
.
config
.
superPanel
);
opConfig
.
set
(
'
global
'
,
this
.
config
.
global
);
ipcRenderer
.
send
(
'
re-register
'
);
}
}
}
}
opConfig
.
set
(
"
perf
"
,
this
.
config
.
perf
);
opConfig
.
set
(
"
superPanel
"
,
this
.
config
.
superPanel
);
opConfig
.
set
(
"
global
"
,
this
.
config
.
global
);
ipcRenderer
.
send
(
"
re-register
"
);
}
,
}
,
}
,
}
;
</
script
>
<
style
lang=
"less"
>
.pg-settings {
height: calc(~'100vh - 110px');
.pg-settings {
height: calc(~"100vh - 110px");
overflow: auto;
.dev-detail {
height: 100%;
display: flex;
align-items: flex-start;
background: #fff;
}
.settings-detail {
padding: 20px;
box-sizing: border-box;
flex: 1;
overflow: auto;
.dev-detail {
height: 100%;
display: flex;
align-items: flex-start;
background: #fff;
}
.settings-detail {
padding: 20px;
box-sizing: border-box;
flex: 1;
overflow: auto;
height: 100%;
.setting-item {
margin-bottom: 20px;
.ant-form-item {
margin-bottom: 0;
}
.title {
color: #6C9FE2;
font-size: 15px;
margin-bottom: 10px;
height: 100%;
.setting-item {
margin-bottom: 20px;
.ant-form-item {
margin-bottom: 0;
}
.title {
color: #6c9fe2;
font-size: 15px;
margin-bottom: 10px;
}
.settings-item-li {
padding-left: 20px;
display: flex;
width: 100%;
align-items: center;
justify-content: space-between;
margin-bottom: 10px;
.label {
color: #646464;
}
.settings-item-li {
padding-left: 20px;
display: flex;
width: 100%;
align-items: center;
justify-content: space-between;
margin-bottom: 10px;
.label {
color: #646464;
}
.value {
width: 300px;
text-align: center;
border: 1px solid #ddd;
color: #6C9FE2;
font-size: 14px;
height: 24px;
font-weight: lighter;
}
.value {
width: 300px;
text-align: center;
border: 1px solid #ddd;
color: #6c9fe2;
font-size: 14px;
height: 24px;
font-weight: lighter;
}
}
}
.feature-container {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 10px;
font-size: 14px;
.item {
flex: 1;
}
.short-cut {
margin-left: 20px;
}
.value {
text-align: center;
border: 1px solid #ddd;
color: #6C9FE2;
font-size: 14px;
height: 24px;
font-weight: lighter;
margin-top: 10px;
}
}
.feature-container {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 10px;
font-size: 14px;
.item {
flex: 1;
}
.
add-global
{
color: #6C9FE2
;
margin-top: 20px;
width: 100%;
.
short-cut
{
margin-left: 20px
;
}
.value {
text-align: center;
cursor: pointer;
border: 1px solid #ddd;
color: #6c9fe2;
font-size: 14px;
height: 24px;
font-weight: lighter;
margin-top: 10px;
}
}
.add-global {
color: #6c9fe2;
margin-top: 20px;
width: 100%;
text-align: center;
cursor: pointer;
}
}
</
style
>
src/renderer/store/modules/main.js
浏览文件 @
74e49560
...
...
@@ -67,7 +67,7 @@ const mutations = {
};
const
actions
=
{
showMainUI
({
commit
,
state
},
payl
p
ad
)
{
showMainUI
({
commit
,
state
},
payl
o
ad
)
{
ipcRenderer
.
send
(
"
changeWindowSize-rubick
"
,
{
height
:
getWindowHeight
(),
});
...
...
static/preload.js
浏览文件 @
74e49560
const
{
getData
,
getlocalDataFile
,
saveData
}
=
require
(
"
./utils
"
);
const
axios
=
require
(
'
axios
'
);
const
{
getData
,
getLocalDataFile
,
saveData
}
=
require
(
"
./utils
"
);
const
axios
=
require
(
"
axios
"
);
const
marked
=
require
(
"
marked
"
);
const
rendererMD
=
new
marked
.
Renderer
();
const
path
=
require
(
'
path
'
);
const
os
=
require
(
'
os
'
);
const
path
=
require
(
"
path
"
);
const
os
=
require
(
"
os
"
);
const
appPath
=
path
.
join
(
get
l
ocalDataFile
());
const
dbPath
=
path
.
join
(
appPath
,
'
./db.json
'
);
const
appPath
=
path
.
join
(
get
L
ocalDataFile
());
const
dbPath
=
path
.
join
(
appPath
,
"
./db.json
"
);
let
filePath
=
''
;
let
filePath
=
""
;
function
getQueryVariable
(
variable
)
{
var
query
=
window
.
location
.
search
.
substring
(
1
);
var
vars
=
query
.
split
(
"
&
"
);
for
(
var
i
=
0
;
i
<
vars
.
length
;
i
++
)
{
for
(
var
i
=
0
;
i
<
vars
.
length
;
i
++
)
{
var
pair
=
vars
[
i
].
split
(
"
=
"
);
if
(
pair
[
0
]
==
variable
){
return
pair
[
1
];}
if
(
pair
[
0
]
==
variable
)
{
return
pair
[
1
];
}
}
return
(
false
)
;
return
false
;
}
if
(
location
.
href
.
indexOf
(
'
targetFile
'
)
>
-
1
)
{
filePath
=
decodeURIComponent
(
getQueryVariable
(
'
targetFile
'
));
if
(
location
.
href
.
indexOf
(
"
targetFile
"
)
>
-
1
)
{
filePath
=
decodeURIComponent
(
getQueryVariable
(
"
targetFile
"
));
}
else
{
filePath
=
process
.
platform
===
'
win32
'
?
location
.
pathname
.
replace
(
'
/
'
,
''
)
:
location
.
pathname
.
replace
(
'
file://
'
,
''
);
filePath
=
process
.
platform
===
"
win32
"
?
location
.
pathname
.
replace
(
"
/
"
,
""
)
:
location
.
pathname
.
replace
(
"
file://
"
,
""
);
}
const
{
ipcRenderer
,
nativeImage
,
clipboard
,
remote
,
shell
}
=
require
(
'
electron
'
);
const
{
ipcRenderer
,
nativeImage
,
clipboard
,
remote
,
shell
,
}
=
require
(
"
electron
"
);
const
currentWindow
=
remote
.
getCurrentWindow
();
const
winId
=
currentWindow
.
id
;
const
BrowserWindow
=
remote
.
BrowserWindow
;
function
convertImgToBase64
(
url
,
callback
,
outputFormat
){
var
canvas
=
document
.
createElement
(
'
CANVAS
'
),
ctx
=
canvas
.
getContext
(
'
2d
'
),
img
=
new
Image
;
img
.
crossOrigin
=
'
Anonymous
'
;
img
.
onload
=
function
(){
function
convertImgToBase64
(
url
,
callback
,
outputFormat
)
{
var
canvas
=
document
.
createElement
(
"
CANVAS
"
),
ctx
=
canvas
.
getContext
(
"
2d
"
),
img
=
new
Image
()
;
img
.
crossOrigin
=
"
Anonymous
"
;
img
.
onload
=
function
()
{
canvas
.
height
=
img
.
height
;
canvas
.
width
=
img
.
width
;
ctx
.
drawImage
(
img
,
0
,
0
);
var
dataURL
=
canvas
.
toDataURL
(
outputFormat
||
'
image/png
'
);
ctx
.
drawImage
(
img
,
0
,
0
);
var
dataURL
=
canvas
.
toDataURL
(
outputFormat
||
"
image/png
"
);
callback
.
call
(
this
,
dataURL
);
canvas
=
null
;
};
...
...
@@ -49,58 +60,67 @@ function convertImgToBase64(url, callback, outputFormat){
window
.
rubick
=
{
// 事件
onPluginEnter
(
cb
)
{
ipcRenderer
.
on
(
'
onPluginEnter
'
,
(
e
,
message
)
=>
{
ipcRenderer
.
on
(
"
onPluginEnter
"
,
(
e
,
message
)
=>
{
const
feature
=
message
.
detail
;
cb
({...
feature
,
type
:
message
.
cmd
.
type
?
message
.
cmd
.
type
:
'
text
'
,
payload
:
message
.
payload
})
})
cb
({
...
feature
,
type
:
message
.
cmd
.
type
?
message
.
cmd
.
type
:
"
text
"
,
payload
:
message
.
payload
,
});
});
},
onPluginReady
(
cb
)
{
ipcRenderer
.
once
(
'
onPluginReady
'
,
(
e
,
message
)
=>
{
const
feature
=
message
.
detail
cb
({...
feature
,
type
:
message
.
cmd
.
type
?
message
.
cmd
.
type
:
'
text
'
,
payload
:
message
.
payload
})
})
ipcRenderer
.
once
(
"
onPluginReady
"
,
(
e
,
message
)
=>
{
const
feature
=
message
.
detail
;
cb
({
...
feature
,
type
:
message
.
cmd
.
type
?
message
.
cmd
.
type
:
"
text
"
,
payload
:
message
.
payload
,
});
});
},
onPluginOut
(
cb
)
{
ipcRenderer
.
once
(
'
onPluginOut
'
,
(
e
,
message
)
=>
{
const
feature
=
JSON
.
parse
(
message
.
detail
)
cb
({
...
feature
,
type
:
'
text
'
})
})
ipcRenderer
.
once
(
"
onPluginOut
"
,
(
e
,
message
)
=>
{
const
feature
=
JSON
.
parse
(
message
.
detail
)
;
cb
({
...
feature
,
type
:
"
text
"
});
})
;
},
// 窗口交互
hideMainWindow
()
{
ipcRenderer
.
send
(
'
msg-trigger
'
,
{
type
:
'
hideMainWindow
'
,
ipcRenderer
.
send
(
"
msg-trigger
"
,
{
type
:
"
hideMainWindow
"
,
});
},
showMainWindow
()
{
ipcRenderer
.
send
(
'
msg-trigger
'
,
{
type
:
'
showMainWindow
'
,
ipcRenderer
.
send
(
"
msg-trigger
"
,
{
type
:
"
showMainWindow
"
,
});
},
setExpendHeight
(
height
)
{
ipcRenderer
.
send
(
'
msg-trigger
'
,
{
type
:
'
setExpendHeight
'
,
ipcRenderer
.
send
(
"
msg-trigger
"
,
{
type
:
"
setExpendHeight
"
,
height
,
winId
winId
,
});
},
setSubInput
(
onChange
,
placeHolder
,
isFocus
)
{
ipcRenderer
.
sendToHost
(
'
setSubInput
'
,
{
placeHolder
,
isFocus
ipcRenderer
.
sendToHost
(
"
setSubInput
"
,
{
placeHolder
,
isFocus
,
});
ipcRenderer
.
on
(
`msg-back-setSubInput`
,
(
e
,
result
)
=>
{
onChange
({
text
:
result
});
onChange
({
text
:
result
});
});
},
removeSubInput
()
{
ipcRenderer
.
sendToHost
(
'
removeSubInput
'
);
ipcRenderer
.
sendToHost
(
"
removeSubInput
"
);
},
setSubInputValue
(
text
)
{
ipcRenderer
.
sendToHost
(
'
setSubInputValue
'
,
{
text
ipcRenderer
.
sendToHost
(
"
setSubInputValue
"
,
{
text
,
});
},
...
...
@@ -109,41 +129,41 @@ window.rubick = {
},
showNotification
(
body
,
clickFeatureCode
)
{
const
myNotification
=
new
Notification
(
'
Rubick 通知
'
,
{
body
const
myNotification
=
new
Notification
(
"
Rubick 通知
"
,
{
body
,
});
return
myNotification
;
// todo 实现 clickFeatureCode
},
showOpenDialog
(
options
)
{
ipcRenderer
.
send
(
'
msg-trigger
'
,
{
type
:
'
showOpenDialog
'
,
options
:
{
...
options
},
ipcRenderer
.
send
(
"
msg-trigger
"
,
{
type
:
"
showOpenDialog
"
,
options
:
{
...
options
},
});
return
new
Promise
((
resolve
,
reject
)
=>
{
ipcRenderer
.
once
(
`msg-back-showOpenDialog`
,
(
e
,
result
)
=>
{
result
?
resolve
(
result
)
:
reject
();
});
})
})
;
},
copyImage
(
img
)
{
convertImgToBase64
(
img
,
function
(
base64Image
)
{
const
image
=
nativeImage
.
createFromDataURL
(
base64Image
)
clipboard
.
writeImage
(
image
)
})
convertImgToBase64
(
img
,
function
(
base64Image
)
{
const
image
=
nativeImage
.
createFromDataURL
(
base64Image
)
;
clipboard
.
writeImage
(
image
)
;
})
;
},
copyText
(
text
)
{
clipboard
.
writeText
(
text
);
},
db
:
{
put
(
data
)
{
data
.
_rev
=
''
;
data
.
_rev
=
""
;
let
dbData
=
getData
(
dbPath
)
||
[];
let
target
=
[];
dbData
.
some
((
d
,
i
)
=>
{
if
(
d
.
_id
===
data
.
_id
)
{
target
=
[
d
,
i
]
target
=
[
d
,
i
]
;
return
true
;
}
return
false
;
...
...
@@ -159,15 +179,15 @@ window.rubick = {
return
{
id
:
data
.
_id
,
ok
:
true
,
rev
:
''
,
}
rev
:
""
,
}
;
},
get
(
key
)
{
const
dbData
=
getData
(
dbPath
)
||
[];
return
dbData
.
find
(
d
=>
d
.
_id
===
key
)
||
''
;
return
dbData
.
find
(
(
d
)
=>
d
.
_id
===
key
)
||
""
;
},
remove
(
key
)
{
key
=
typeof
key
===
'
object
'
?
key
.
_id
:
key
;
key
=
typeof
key
===
"
object
"
?
key
.
_id
:
key
;
let
dbData
=
getData
(
dbPath
);
let
find
=
false
;
dbData
.
some
((
d
,
i
)
=>
{
...
...
@@ -183,52 +203,52 @@ window.rubick = {
return
{
id
:
key
,
ok
:
true
,
rev
:
''
,
}
rev
:
""
,
}
;
}
else
{
return
{
id
:
key
,
ok
:
false
,
rev
:
''
,
}
rev
:
""
,
}
;
}
},
bulkDocs
(
docs
)
{
const
dbData
=
getData
(
dbPath
);
dbData
.
forEach
((
d
,
i
)
=>
{
const
result
=
docs
.
find
(
data
=>
data
.
_id
===
d
.
_id
);
const
result
=
docs
.
find
(
(
data
)
=>
data
.
_id
===
d
.
_id
);
if
(
result
)
{
dbData
[
i
]
=
result
;
}
});
saveData
(
dbPath
,
dbData
);
return
docs
.
map
(
d
=>
({
return
docs
.
map
(
(
d
)
=>
({
id
:
d
.
_id
,
success
:
true
,
rev
:
''
,
}))
rev
:
""
,
}))
;
},
allDocs
(
key
)
{
const
dbData
=
getData
(
dbPath
);
if
(
!
key
)
{
return
dbData
;
}
if
(
typeof
key
===
'
string
'
)
{
return
dbData
.
filter
(
d
=>
d
.
_id
.
indexOf
(
key
)
>=
0
);
if
(
typeof
key
===
"
string
"
)
{
return
dbData
.
filter
(
(
d
)
=>
d
.
_id
.
indexOf
(
key
)
>=
0
);
}
if
(
Array
.
isArray
(
key
))
{
return
dbData
.
filter
(
d
=>
key
.
indexOf
(
d
.
_id
)
>=
0
);
return
dbData
.
filter
(
(
d
)
=>
key
.
indexOf
(
d
.
_id
)
>=
0
);
}
return
[];
}
}
,
},
isDarkColors
()
{
return
false
;
},
features
:
[],
getFeatures
()
{
ipcRenderer
.
sendToHost
(
'
getFeatures
'
);
return
new
Promise
(
resolve
=>
{
ipcRenderer
.
sendToHost
(
"
getFeatures
"
);
return
new
Promise
(
(
resolve
)
=>
{
ipcRenderer
.
on
(
`msg-back-getFeatures`
,
(
e
,
result
)
=>
{
rubick
.
features
=
result
;
resolve
(
result
);
...
...
@@ -236,12 +256,12 @@ window.rubick = {
});
},
setFeature
(
feature
)
{
ipcRenderer
.
sendToHost
(
'
setFeature
'
,
{
feature
});
ipcRenderer
.
sendToHost
(
"
setFeature
"
,
{
feature
});
},
removeFeature
(
code
)
{
ipcRenderer
.
sendToHost
(
'
removeFeature
'
,
{
code
});
return
!!
rubick
.
features
.
filter
(
fe
=>
fe
.
code
===
code
).
length
;
ipcRenderer
.
sendToHost
(
"
removeFeature
"
,
{
code
});
return
!!
rubick
.
features
.
filter
(
(
fe
)
=>
fe
.
code
===
code
).
length
;
},
// 系统
shellOpenExternal
(
url
)
{
...
...
@@ -249,19 +269,19 @@ window.rubick = {
},
isMacOs
()
{
return
os
.
type
()
===
'
Darwin
'
;
return
os
.
type
()
===
"
Darwin
"
;
},
isWindows
()
{
return
os
.
type
()
===
'
Windows_NT
'
;
return
os
.
type
()
===
"
Windows_NT
"
;
},
isLinux
()
{
return
os
.
type
()
===
'
Linux
'
;
return
os
.
type
()
===
"
Linux
"
;
},
shellOpenPath
(
path
)
{
shell
.
openPath
(
path
)
shell
.
openPath
(
path
)
;
},
request
(
config
=
{})
{
...
...
@@ -270,10 +290,13 @@ window.rubick = {
withCredentials
:
true
,
...
config
,
});
}
}
const
preloadPath
=
getQueryVariable
(
'
preloadPath
'
)
||
'
./preload.js
'
;
}
,
}
;
const
preloadPath
=
getQueryVariable
(
"
preloadPath
"
)
||
"
./preload.js
"
;
require
(
path
.
join
(
filePath
,
'
../
'
,
preloadPath
));
window
.
exports
&&
ipcRenderer
.
sendToHost
(
'
templateConfig
'
,
{
config
:
JSON
.
parse
(
JSON
.
stringify
(
window
.
exports
))});
require
(
path
.
join
(
filePath
,
"
../
"
,
preloadPath
));
window
.
exports
&&
ipcRenderer
.
sendToHost
(
"
templateConfig
"
,
{
config
:
JSON
.
parse
(
JSON
.
stringify
(
window
.
exports
)),
});
window
.
ipcRenderer
=
ipcRenderer
;
static/utils.js
浏览文件 @
74e49560
const
fs
=
require
(
"
fs
"
);
const
get
l
ocalDataFile
=
()
=>
{
const
get
L
ocalDataFile
=
()
=>
{
let
localDataFile
=
process
.
env
.
HOME
;
if
(
!
localDataFile
)
{
localDataFile
=
process
.
env
.
LOCALAPPDATA
;
...
...
@@ -14,37 +14,39 @@ function saveData(path, value) {
function
getData
(
path
,
defaultValue
)
{
try
{
return
JSON
.
parse
(
fs
.
readFileSync
(
path
,
'
utf8
'
));
return
JSON
.
parse
(
fs
.
readFileSync
(
path
,
"
utf8
"
));
}
catch
(
e
)
{
return
defaultValue
||
undefined
;
}
}
const
isArray
=
Array
.
isArray
||
function
(
object
){
return
object
instanceof
Array
}
const
isArray
=
Array
.
isArray
||
function
(
object
)
{
return
object
instanceof
Array
;
};
function
isPlainObject
(
obj
)
{
return
isObject
(
obj
)
&&
Object
.
getPrototypeOf
(
obj
)
==
Object
.
prototype
return
isObject
(
obj
)
&&
Object
.
getPrototypeOf
(
obj
)
==
Object
.
prototype
;
}
function
isObject
(
obj
)
{
return
typeof
obj
==
"
object
"
}
function
isObject
(
obj
)
{
return
typeof
obj
==
"
object
"
;
}
function
extend
(
target
,
source
,
deep
)
{
for
(
let
key
in
source
)
if
(
deep
&&
(
isPlainObject
(
source
[
key
])
||
isArray
(
source
[
key
])))
{
if
(
isPlainObject
(
source
[
key
])
&&
!
isPlainObject
(
target
[
key
]))
target
[
key
]
=
{}
if
(
isArray
(
source
[
key
])
&&
!
isArray
(
target
[
key
]))
target
[
key
]
=
[]
extend
(
target
[
key
],
source
[
key
],
deep
)
}
else
if
(
source
[
key
]
!==
undefined
)
target
[
key
]
=
source
[
key
]
target
[
key
]
=
{};
if
(
isArray
(
source
[
key
])
&&
!
isArray
(
target
[
key
]))
target
[
key
]
=
[];
extend
(
target
[
key
],
source
[
key
],
deep
);
}
else
if
(
source
[
key
]
!==
undefined
)
target
[
key
]
=
source
[
key
];
}
module
.
exports
=
{
get
l
ocalDataFile
,
get
L
ocalDataFile
,
saveData
,
getData
,
extend
}
extend
,
}
;
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录