Compare commits

..

34 Commits

Author SHA1 Message Date
limix
7b55716742 Merge 2307faf31a into 5ca1ba1271 2024-12-12 08:39:31 +08:00
wangwei1240
5ca1ba1271 feat: 为了更好的安装体验,切换到依赖本地 node 环境 2024-12-11 20:06:21 +08:00
wangwei1240
8c3186afef Merge remote-tracking branch 'origin/master' 2024-12-11 20:05:20 +08:00
wangwei1240
de0e9ed8f2 fix: 更新版本 2024-12-11 20:05:00 +08:00
muwoo
ef85084730 Update package.json 2024-10-05 18:41:32 +08:00
muwoo
b4b7c81b60 Update index.ts 2024-10-05 18:41:16 +08:00
muwoo
4b79cce2f4 Update package.json 2024-09-30 21:19:07 +08:00
muwoo
ae10dac5f7 Merge pull request #396 from clevertension/master
fix #395: the plugin windows error with data retrieve
2024-09-30 21:18:23 +08:00
clevertension
1e0babe22d fix #395: the plugin windows error data retrieve 2024-09-30 15:22:13 +08:00
muwoo
5ec18caa72 Update package.json 2024-09-29 09:55:52 +08:00
muwoo
b7d8932291 Update index.ts
ref: 调整插件市场的数据源
2024-09-29 09:55:37 +08:00
limix
2307faf31a Update README.zh-CN.md
添加局限性描述
2024-08-20 23:29:41 +08:00
muwoo
5608a147f7 Update package.json 2024-08-06 18:16:14 +08:00
muwoo
132fb94289 Update main.ts 2024-08-06 18:15:49 +08:00
muwoo
bb1a74b3b9 Update main.yml 2024-07-19 13:49:22 +08:00
layyback
bf9da854c7 release new version 2024-07-18 19:24:32 +08:00
layyback
a2c5bcc90c add new keyboard events 2024-07-18 18:58:34 +08:00
layyback
b9f4333c01 🎨 fix text display issue 2024-07-18 18:47:52 +08:00
layyback
bbeddb3fe6 support #371 2024-07-18 17:53:23 +08:00
layyback
4a2ca33e02 support #371 2024-07-18 17:52:20 +08:00
layyback
0578c7c7eb 🔨 fix #377 2024-07-18 17:41:30 +08:00
layyback
ef34452a4f 🔨 fix #377 2024-07-18 17:40:03 +08:00
layyback
286d9da8d1 🐛 fix hooks triggering issue 2024-07-18 17:25:11 +08:00
layyback
6b9d5182bf 🐛 fix hooks triggering issue 2024-07-18 16:46:33 +08:00
muwoo
2053491782 Update README.md 2024-06-14 19:49:24 +08:00
muwoo
e128d01b81 Merge pull request #184 from qidian99/master
Fix regex match error
2024-06-12 13:52:04 +08:00
木偶
c3bc0bdb9e fix: #352 2024-05-28 20:13:10 +08:00
木偶
f1f4e62177 fix: #352 2024-05-28 20:12:38 +08:00
wangwei1240
c07d4bae55 fix: 更新版本 2024-05-16 20:14:41 +08:00
wangwei1240
c78dd9c4b6 fix: 修复 #364 2024-05-16 20:13:45 +08:00
muwoo
2dd4ed10cc 💚 修复构建报错:https://github.com/electron/electron/issues/41089 2024-02-20 18:16:42 +08:00
muwoo
70ce3dd037 🐛 修复 #338, #345, #340 2024-02-20 18:07:19 +08:00
muwoo
a0644c0ccf 🐛 fix #333, fix #327 2023-12-27 11:34:55 +08:00
Dian Qi
472879f9b2 Fix format regex error that will match all inputs 2023-06-04 20:30:06 +08:00
29 changed files with 194 additions and 204 deletions

View File

@@ -23,7 +23,7 @@ jobs:
strategy:
fail-fast: false
matrix:
os: [macos-11, windows-2019, ubuntu-latest]
os: [macos-latest, windows-2019, ubuntu-latest]
# create steps
steps:

2
.npmrc
View File

@@ -1 +1 @@
electron_mirror=https://npm.taobao.org/mirrors/electron/
electron_mirror=https://npmmirror.com/mirrors/electron/

View File

@@ -109,6 +109,8 @@ Those who are interested in this project or want to exchange and learn can scan
![image](https://user-images.githubusercontent.com/21073039/127327603-9796f246-ee4b-4950-a69d-ce3205ec9569.png)
<a href="https://hellogithub.com/repository/0a3e2484b44e481e9dcf1850e45193cd" target="_blank"><img src="https://api.hellogithub.com/v1/widgets/recommend.svg?rid=0a3e2484b44e481e9dcf1850e45193cd&claim_uid=vXGwjpmYNsBex0C" alt="FeaturedHelloGitHub" style="width: 250px; height: 54px;" width="250" height="54" /></a>
## Contribute
This project exists thanks to all the people who contribute. [[Contribute](https://github.com/rubickCenter/rubick/graphs/contributors)]. <a href="https://github.com/rubickCenter/rubick/graphs/contributors"><img src="https://opencollective.com/rubick/contributors.svg?width=890&button=false" /></a>

View File

@@ -90,6 +90,9 @@
[Rubick Plugin CLI](https://github.com/rubickCenter/rubick-plugin-cli)
## 局限性
npm包最终大小不宜超过100MB,所以插件包大小也不宜超过此大小,建议20MB以内,如果包体积过大,预期会导致推送npm仓库失败
## 赞助
### 1. 加入知识星球
我们在知识星球积累了大量的关于 rubick 的知识和常见问题,您可以付费加入我们的知识星球来一起讨论。我们将随时解答!

View File

@@ -5864,7 +5864,7 @@ lodash.memoize@^4.1.2:
lodash.throttle@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
resolved "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==
lodash.transform@^4.6.0:

View File

@@ -8,37 +8,37 @@
>
<a-menu-item key="finder">
<template #icon>
<StarOutlined style="font-size: 18px;" />
<StarOutlined style="font-size: 16px" />
</template>
{{ $t('feature.market.explore') }}
</a-menu-item>
<a-menu-item key="worker">
<template #icon>
<SendOutlined style="transform: rotate(-45deg); font-size: 18px;" />
<SendOutlined style="transform: rotate(-45deg); font-size: 16px" />
</template>
{{ $t('feature.market.efficiency') }}
</a-menu-item>
<a-menu-item key="tools">
<template #icon>
<SearchOutlined style="font-size: 18px;" />
<SearchOutlined style="font-size: 16px" />
</template>
{{ $t('feature.market.searchTool') }}
</a-menu-item>
<a-menu-item key="image">
<template #icon>
<FileImageOutlined style="font-size: 18px;" />
<FileImageOutlined style="font-size: 16px" />
</template>
{{ $t('feature.market.imageTool') }}
</a-menu-item>
<a-menu-item key="devPlugin">
<template #icon>
<CodeOutlined style="font-size: 18px;" />
<CodeOutlined style="font-size: 16px" />
</template>
{{ $t('feature.market.developTool') }}
</a-menu-item>
<a-menu-item key="system">
<template #icon>
<DatabaseOutlined style="font-size: 18px;" />
<DatabaseOutlined style="font-size: 16px" />
</template>
{{ $t('feature.market.systemTool') }}
</a-menu-item>
@@ -72,7 +72,21 @@
</a-sub-menu>
</a-menu>
</div>
<div :class="['finder', 'result', 'devPlugin', 'image', 'tools', 'worker', 'system'].includes(active[0]) ? 'container' : 'more'">
<div
:class="
[
'finder',
'result',
'devPlugin',
'image',
'tools',
'worker',
'system',
].includes(active[0])
? 'container'
: 'more'
"
>
<keep-alive>
<router-view />
</keep-alive>
@@ -103,14 +117,14 @@ const active = computed(() => store.state.active);
const { perf } = localConfig.getConfig();
const changeMenu = (key: any) => {
store.commit('commonUpdate', {active: [key]})
store.commit('commonUpdate', { active: [key] });
router.push(key);
};
window.rubick.onPluginEnter(({ code }: { code: string }) => {
code = code === '已安装插件' ? 'installed' : code;
changeMenu(code);
store.commit('commonUpdate', {active: [code]})
store.commit('commonUpdate', { active: [code] });
});
window.rubick.setSubInput((e: any) => {
@@ -129,7 +143,7 @@ window.rubick.setSubInput((e: any) => {
store.commit('setSearchValue', e.text);
router.push('result');
} else {
store.commit('commonUpdate', {active: ['finder']})
store.commit('commonUpdate', { active: ['finder'] });
router.push('finder');
}
}
@@ -144,13 +158,16 @@ init();
background: var(--color-body-bg2) !important;
height: 100%;
border-right: none;
.ant-menu-item, .ant-menu-submenu, .ant-menu-submenu-arrow {
.ant-menu-item,
.ant-menu-submenu,
.ant-menu-submenu-arrow {
color: var(--color-text-content);
&:active {
background: none;
}
}
.ant-menu-item-selected, .ant-menu-submenu-selected {
.ant-menu-item-selected,
.ant-menu-submenu-selected {
background-color: var(--color-list-hover);
color: var(--ant-primary-color);
.ant-menu-submenu-arrow {
@@ -203,9 +220,12 @@ init();
background: var(--color-body-bg2);
}
.left-menu {
padding: 24px 16px;
padding: 16px;
position: relative;
height: 100vh;
:deep(.ant-menu) {
width: 100%;
}
:deep(.ant-menu-item) {
padding-left: 12px !important;
display: flex;
@@ -219,7 +239,14 @@ init();
}
:deep(.user-info) {
position: absolute;
bottom: 32px;
bottom: 16px;
width: calc(100% - 32px);
.ant-menu-submenu-title {
padding: 0 32px 0 8px;
.ant-menu-title-content {
margin-left: 8px;
}
}
}
:deep(.ant-avatar) {
background: transparent;

View File

@@ -1,6 +1,6 @@
import axios from 'axios';
let baseURL = 'https://gitcode.net/rubickcenter/rubick-database/-/raw/master';
let baseURL = 'https://gitee.com/monkeyWang/rubickdatabase/raw/master';
let access_token = '';
try {
@@ -14,7 +14,7 @@ try {
const instance = axios.create({
timeout: 4000,
baseURL:
baseURL || 'https://gitcode.net/rubickcenter/rubick-database/-/raw/master',
baseURL || 'https://gitee.com/monkeyWang/rubickdatabase/raw/master',
});
export default {
@@ -23,9 +23,10 @@ export default {
if (access_token) {
targetPath = `${encodeURIComponent(
targetPath
)}/raw?access_token=${access_token}&ref=master`;
)}?access_token=${access_token}&ref=master`;
}
const res = await instance.get(targetPath);
console.log('total plugsin', res);
return res.data;
},
@@ -34,7 +35,7 @@ export default {
if (access_token) {
targetPath = `${encodeURIComponent(
targetPath
)}/raw?access_token=${access_token}&ref=master`;
)}?access_token=${access_token}&ref=master`;
}
const res = await instance.get(targetPath);
return res.data;
@@ -45,7 +46,7 @@ export default {
if (access_token) {
targetPath = `${encodeURIComponent(
targetPath
)}/raw?access_token=${access_token}&ref=master`;
)}?access_token=${access_token}&ref=master`;
}
const res = await instance.get(targetPath);
return res.data;
@@ -55,7 +56,7 @@ export default {
if (access_token) {
targetPath = `${encodeURIComponent(
targetPath
)}/raw?access_token=${access_token}&ref=master`;
)}?access_token=${access_token}&ref=master`;
}
const res = await instance.get(targetPath);
return res.data;
@@ -71,7 +72,7 @@ export default {
if (access_token) {
targetPath = `${encodeURIComponent(
targetPath
)}/raw?access_token=${access_token}&ref=master`;
)}?access_token=${access_token}&ref=master`;
}
const res = await instance.get(targetPath);
return res.data;
@@ -81,7 +82,7 @@ export default {
if (access_token) {
targetPath = `${encodeURIComponent(
targetPath
)}/raw?access_token=${access_token}&ref=master`;
)}?access_token=${access_token}&ref=master`;
}
const res = await instance.get(targetPath);
return res.data;
@@ -91,7 +92,7 @@ export default {
if (access_token) {
targetPath = `${encodeURIComponent(
targetPath
)}/raw?access_token=${access_token}&ref=master`;
)}?access_token=${access_token}&ref=master`;
}
const res = await instance.get(targetPath);
return res.data;

View File

@@ -67,6 +67,7 @@ export default {
changeLang: 'Change Language',
cn: '简体中文',
en: 'English',
history: 'keywords search history',
},
global: {
title: 'Global Shortcut Key',

View File

@@ -65,6 +65,7 @@ export default {
changeLang: '切换语言',
cn: '简体中文',
en: 'English',
history: '关键词搜索记录',
},
global: {
title: '全局快捷键',

View File

@@ -31,9 +31,9 @@ const searchValue = computed(() => store.state.searchValue);
const result = computed(() => {
if (searchValue.value.trim().length > 0) {
const pattern = new RegExp(searchValue.value);
const pattern = new RegExp(searchValue.value.toLowerCase());
return totalPlugins.value.filter((plugin) => {
if (plugin.pluginName.match(pattern)) {
if (plugin.pluginName.toLowerCase().match(pattern)) {
return true;
} else {
return false;

View File

@@ -119,6 +119,16 @@
:un-checked-children="$t('feature.settings.basic.off')"
></a-switch>
</div>
<div class="settings-item-li">
<div class="label">
{{ $t('feature.settings.basic.history') }}
</div>
<a-switch
v-model:checked="common.history"
:checked-children="$t('feature.settings.basic.on')"
:un-checked-children="$t('feature.settings.basic.off')"
></a-switch>
</div>
</div>
<div class="setting-item">
<div class="title">{{ $t('feature.settings.basic.theme') }}</div>
@@ -283,14 +293,15 @@ state.local = perf.local;
state.global = defaultGlobal;
const setConfig = debounce(() => {
const { perf } = localConfig.getConfig();
localConfig.setConfig(
JSON.parse(
JSON.stringify({
perf: {
...perf,
shortCut: state.shortCut,
common: state.common,
local: state.local,
custom: state.custom,
},
global: state.global,
})

View File

@@ -64,6 +64,8 @@ const theme = ref(perf.custom.theme);
state.custom = perf.custom || {};
const setConfig = debounce(() => {
const { perf } = localConfig.getConfig();
localConfig.setConfig(
JSON.parse(
JSON.stringify({

View File

@@ -1,6 +1,6 @@
{
"name": "rubick",
"version": "4.2.0-beta.1",
"version": "4.3.0",
"author": "muwoo <2424880409@qq.com>",
"private": true,
"scripts": {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 15 KiB

BIN
public/icons/shield@2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 828 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 131 KiB

View File

@@ -1,5 +1,5 @@
export default {
version: 6,
version: 7,
perf: {
custom: {
theme: 'SPRING',
@@ -25,6 +25,7 @@ export default {
autoPast: false,
darkMode: false,
guide: false,
history: true,
lang: 'zh-CN',
},
local: {

View File

@@ -32,63 +32,6 @@ const getIconFile = (appFileInput) => {
});
};
// const sortIcons = (icons) => {
// const aWins = -1;
// const bWins = 1;
// const catWins = 0;
// return icons.sort((a, b) => {
// const aSize = parseInt(a.match(/(\d+)x\1/)[1], 10);
// const bSize = parseInt(b.match(/(\d+)x\1/)[1], 10);
// if (aSize === bSize) {
// if (a.indexOf('@2x') > -1) return aWins;
// if (b.indexOf('@2x') > -1) return bWins;
// return catWins;
// }
// if (aSize > bSize) return aWins;
// if (aSize < bSize) return bWins;
// return catWins;
// });
// };
// const icnsToPng = (iconFile, pngFileOutput) => {
// const outputDir = pngFileOutput.split('.')[0] + '.iconset'
// return new Promise((resolve, reject) => {
// exec(`iconutil --convert iconset '${iconFile}' --output '${outputDir}'`, (error) => {
// if (error) return reject(error)
// fs.readdir(outputDir, (error, files) => {
// if (error) {
// return resolve(tiffToPng(iconFile, pngFileOutput))
// }
// const realIcons = files.map((file) => {
// return path.join(outputDir, file)
// })
// const biggestIcon = sortIcons(realIcons).find(Boolean)
// fs.rename(biggestIcon, pngFileOutput, (error) => {
// error ? reject(error) : resolve(realIcons.filter((file) => {
// return file !== biggestIcon
// }))
// })
// })
// })
// }).then((files) => {
// // Cleanup temp icons
// return Promise.all(files.map((file) => {
// return new Promise((resolve, reject) => {
// fs.unlink(file, (error) => {
// error ? reject(error) : resolve()
// })
// })
// }))
// }).then(() => {
// // Cleanup temp directory
// return new Promise((resolve, reject) => {
// fs.rmdir(outputDir, (error) => {
// error ? reject(error) : resolve()
// })
// })
// })
// }
const tiffToPng = (iconFile, pngFileOutput) => {
return new Promise((resolve, reject) => {
exec(

View File

@@ -1,23 +1,23 @@
import { spawn } from "child_process";
import plist from "plist";
import { spawn } from 'child_process';
import plist from 'plist';
export default function getApps(resolve, reject, filterByAppName = false) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
let resultBuffer = new Buffer.from([]);
const profileInstalledApps = spawn("/usr/sbin/system_profiler", [
"-xml",
"-detailLevel",
"mini",
"SPApplicationsDataType",
const profileInstalledApps = spawn('/usr/sbin/system_profiler', [
'-xml',
'-detailLevel',
'mini',
'SPApplicationsDataType',
]);
profileInstalledApps.stdout.on("data", (chunckBuffer) => {
profileInstalledApps.stdout.on('data', (chunckBuffer) => {
resultBuffer = Buffer.concat([resultBuffer, chunckBuffer]);
});
profileInstalledApps.on("exit", (exitCode) => {
profileInstalledApps.on('exit', (exitCode) => {
if (exitCode !== 0) {
reject([]);
return;
@@ -37,7 +37,7 @@ export default function getApps(resolve, reject, filterByAppName = false) {
}
});
profileInstalledApps.on("error", (err) => {
profileInstalledApps.on('error', (err) => {
reject(err);
});
}

View File

@@ -7,11 +7,10 @@ import path from 'path';
import got from 'got';
import fixPath from 'fix-path';
import spawn from 'cross-spawn';
import { ipcRenderer } from 'electron';
import axios from 'axios';
import npm from 'npm';
fixPath();
/**
@@ -42,7 +41,7 @@ class AdapterHandler {
}
this.baseDir = options.baseDir;
let register = options.registry || 'https://registry.npmmirror.com/';
let register = options.registry || 'https://registry.npm.taobao.org';
try {
const dbdata = ipcRenderer.sendSync('msg-trigger', {
@@ -158,67 +157,44 @@ class AdapterHandler {
*/
private async execCommand(cmd: string, modules: string[]): Promise<string> {
return new Promise((resolve: any, reject: any) => {
const module =
let args: string[] = [cmd].concat(
cmd !== 'uninstall' && cmd !== 'link'
? modules.map((m) => `${m}@latest`)
: modules;
const config: any = {
prefix: this.baseDir,
save: true,
cache: path.join(this.baseDir, 'cache'),
};
: modules
);
if (cmd !== 'link') {
config.registry = this.registry;
args = args
.concat('--color=always')
.concat('--save')
.concat(`--registry=${this.registry}`);
}
npm.load(config, function (err) {
npm.commands[cmd](module, function (er, data) {
if (!err) {
console.log(data);
resolve({ code: -1, data });
} else {
reject({ code: -1, data: err });
}
});
npm.on('log', function (message) {
// log installation progress
console.log(message);
});
const npm = spawn('npm', args, {
cwd: this.baseDir,
});
// if (cmd !== 'link') {
// args = args
// .concat('--color=always')
// .concat('--save')
// .concat(`--registry=${this.registry}`);
// }
console.log(args);
// const npm = spawn('npm', args, {
// cwd: this.baseDir,
// });
//
// console.log(args);
//
// let output = '';
// npm.stdout
// .on('data', (data: string) => {
// output += data; // 获取输出日志
// })
// .pipe(process.stdout);
//
// npm.stderr
// .on('data', (data: string) => {
// output += data; // 获取报错日志
// })
// .pipe(process.stderr);
//
// npm.on('close', (code: number) => {
// if (!code) {
// resolve({ code: 0, data: output }); // 如果没有报错就输出正常日志
// } else {
// reject({ code: code, data: output }); // 如果报错就输出报错日志
// }
// });
let output = '';
npm.stdout
.on('data', (data: string) => {
output += data; // 获取输出日志
})
.pipe(process.stdout);
npm.stderr
.on('data', (data: string) => {
output += data; // 获取报错日志
})
.pipe(process.stderr);
npm.on('close', (code: number) => {
if (!code) {
resolve({ code: 0, data: output }); // 如果没有报错就输出正常日志
} else {
reject({ code: code, data: output }); // 如果报错就输出报错日志
}
});
});
}
}

View File

@@ -175,31 +175,29 @@ export default () => {
const removeView = (window: BrowserWindow) => {
if (!view) return;
window.removeBrowserView(view);
if (!view.inDetach) {
window.setBrowserView(null);
view.webContents?.destroy();
}
// window.setSize(800, 60);
executeHooks('PluginOut', null);
window.webContents?.executeJavaScript(`window.initRubick()`);
view = undefined;
setTimeout(() => {
window.removeBrowserView(view);
if (!view.inDetach) {
window.setBrowserView(null);
view.webContents?.destroy();
}
window.webContents?.executeJavaScript(`window.initRubick()`);
view = undefined;
}, 0);
};
const getView = () => view;
const executeHooks = (hook, data) => {
setTimeout(() => {
if (!view) return;
const evalJs = `if(window.rubick && window.rubick.hooks && typeof window.rubick.hooks.on${hook} === 'function' ) {
if (!view) return;
const evalJs = `if(window.rubick && window.rubick.hooks && typeof window.rubick.hooks.on${hook} === 'function' ) {
try {
window.rubick.hooks.on${hook}(${data ? JSON.stringify(data) : ''});
} catch(e) {}
}
`;
view.webContents?.executeJavaScript(evalJs);
}, 300);
view.webContents?.executeJavaScript(evalJs);
};
return {

View File

@@ -128,8 +128,8 @@ class API extends DBInstance {
}
public removePlugin(e, window) {
this.currentPlugin = null;
runnerInstance.removeView(window);
this.currentPlugin = null;
}
public openPluginDevTools() {
@@ -139,6 +139,7 @@ class API extends DBInstance {
public hideMainWindow(arg, window) {
window.hide();
}
public showMainWindow(arg, window) {
window.show();
}
@@ -156,6 +157,15 @@ class API extends DBInstance {
if (!originWindow) return;
const targetHeight = height;
originWindow.setSize(originWindow.getSize()[0], targetHeight);
const screenPoint = screen.getCursorScreenPoint();
const display = screen.getDisplayNearestPoint(screenPoint);
const position =
originWindow.getPosition()[1] + targetHeight > display.bounds.height
? height - 60
: 0;
originWindow.webContents.executeJavaScript(
`window.setPosition && typeof window.setPosition === "function" && window.setPosition(${position})`
);
}
public setSubInput({ data }, window, e) {
@@ -201,11 +211,10 @@ class API extends DBInstance {
if (!Notification.isSupported()) return;
'string' != typeof body && (body = String(body));
const plugin = this.currentPlugin;
if (!plugin) return;
const notify = new Notification({
title: plugin.pluginName,
title: plugin ? plugin.pluginName : null,
body,
icon: plugin.logo,
icon: plugin ? plugin.logo : null,
});
notify.show();
}
@@ -326,6 +335,7 @@ class API extends DBInstance {
shell.showItemInFolder(data.path);
return true;
}
public async getFileIcon({ data }) {
const nativeImage = await app.getFileIcon(data.path, { size: 'normal' });
return nativeImage.toDataURL();

View File

@@ -1,8 +1,5 @@
<template>
<div
id="components-layout"
@mousedown="onMouseDown"
>
<div id="components-layout" @mousedown="onMouseDown">
<Search
:currentPlugin="currentPlugin"
@changeCurrent="changeIndex"
@@ -35,6 +32,7 @@
<script setup lang="ts">
import { watch, ref, toRaw } from 'vue';
import { exec } from 'child_process';
import Result from './components/result.vue';
import Search from './components/search.vue';
import getWindowHeight from '../common/utils/getWindowHeight';
@@ -43,6 +41,7 @@ import useDrag from '../common/utils/dragWindow';
import { getGlobal } from '@electron/remote';
import { PLUGIN_HISTORY } from '@/common/constans/renderer';
import { message } from 'ant-design-vue';
import localConfig from './confOp';
const { onMouseDown } = useDrag();
const remote = window.require('@electron/remote');
@@ -73,6 +72,8 @@ initPlugins();
const currentSelect = ref(0);
const menuPluginInfo: any = ref({});
const config: any = ref(localConfig.getConfig());
getPluginInfo({
pluginName: 'feature',
// eslint-disable-next-line no-undef
@@ -90,7 +91,9 @@ watch(
window.rubick.setExpendHeight(
getWindowHeight(
options.value,
pluginLoading.value ? [] : pluginHistory.value
pluginLoading.value || !config.value.perf.common.history
? []
: pluginHistory.value
)
);
},
@@ -100,26 +103,15 @@ watch(
);
const changeIndex = (index) => {
if (!options.value.length) {
if (!pluginHistory.value.length) return;
if (
currentSelect.value + index > pluginHistory.value.length - 1 ||
currentSelect.value + index < 0
) {
currentSelect.value = 0;
return;
}
currentSelect.value = currentSelect.value + index;
return;
}
if (
currentSelect.value + index > options.value.length - 1 ||
currentSelect.value + index < 0
) {
const len = options.value.length || pluginHistory.value.length;
if (!len) return;
if (currentSelect.value + index > len - 1) {
currentSelect.value = 0;
return;
} else if (currentSelect.value + index < 0) {
currentSelect.value = len - 1;
} else {
currentSelect.value = currentSelect.value + index;
}
currentSelect.value = currentSelect.value + index;
};
const openMenu = (ext) => {
@@ -142,6 +134,12 @@ const choosePlugin = (plugin) => {
const localPlugins = getGlobal('LOCAL_PLUGINS').getLocalPlugins();
const currentChoose = plugin || pluginHistory.value[currentSelect.value];
let hasRemove = true;
if (currentChoose.pluginType === 'app') {
hasRemove = false;
changePluginHistory(currentChoose);
exec(currentChoose.action);
return;
}
localPlugins.find((plugin) => {
if (plugin.name === currentChoose.originName) {
hasRemove = false;
@@ -151,7 +149,9 @@ const choosePlugin = (plugin) => {
});
if (hasRemove) {
const result = window.rubick.db.get(PLUGIN_HISTORY) || {};
const history = result.data.filter(item => item.originName !== currentChoose.originName);
const history = result.data.filter(
(item) => item.originName !== currentChoose.originName
);
setPluginHistory(history);
return message.warning('插件已被卸载!');
}

View File

@@ -1,5 +1,5 @@
<template>
<div v-show="!currentPlugin.name" class="options">
<div v-show="!currentPlugin.name && config.perf.common.history" class="options">
<div
class="history-plugins"
v-if="!options.length || !(searchValue || !!clipboardFile.length)"
@@ -44,12 +44,16 @@
</template>
<script lang="ts" setup>
import {defineEmits, defineProps, reactive, toRaw, watch} from 'vue';
import { defineEmits, defineProps, reactive, ref, toRaw, watch } from 'vue';
import localConfig from '../confOp';
const path = window.require('path');
const remote = window.require('@electron/remote');
declare const __static: string;
const config: any = ref(localConfig.getConfig());
const props: any = defineProps({
searchValue: {
type: [String, Number],

View File

@@ -25,6 +25,8 @@
ref="mainInput"
class="main-input"
@input="(e) => changeValue(e)"
@keydown.left="(e) => keydownEvent(e, 'left')"
@keydown.right="(e) => keydownEvent(e, 'right')"
@keydown.down="(e) => keydownEvent(e, 'down')"
@keydown.tab="(e) => keydownEvent(e, 'down')"
@keydown.up="(e) => keydownEvent(e, 'up')"
@@ -41,10 +43,7 @@
>
<template #suffix>
<div class="suffix-tool">
<MoreOutlined
@click="showSeparate()"
class="icon-more"
/>
<MoreOutlined @click="showSeparate()" class="icon-more" />
</div>
</template>
</a-input>
@@ -96,6 +95,7 @@ const emit = defineEmits([
]);
const keydownEvent = (e, key: string) => {
key !== 'space' && e.preventDefault();
const { ctrlKey, shiftKey, altKey, metaKey } = e;
const modifiers: Array<string> = [];
ctrlKey && modifiers.push('control');
@@ -119,12 +119,19 @@ const keydownEvent = (e, key: string) => {
case 'down':
emit('changeCurrent', 1);
break;
case 'left':
emit('changeCurrent', -1);
break;
case 'right':
emit('changeCurrent', 1);
break;
case 'enter':
if (runPluginDisable) return;
emit('choosePlugin');
break;
case 'space':
if (runPluginDisable || !config.value.perf.common.space) return;
e.preventDefault();
emit('choosePlugin');
break;
default:

View File

@@ -77,6 +77,10 @@ const createPluginManager = (): any => {
};
const openPlugin = async (plugin, option) => {
ipcRenderer.send('msg-trigger', {
type: 'removePlugin',
});
window.initRubick();
if (plugin.pluginType === 'ui' || plugin.pluginType === 'system') {
if (state.currentPlugin && state.currentPlugin.name === plugin.name) {
window.rubick.showMainWindow();
@@ -103,7 +107,6 @@ const createPluginManager = (): any => {
message.error('启动应用出错,请确保启动应用存在!');
}
}
window.initRubick();
changePluginHistory({
...plugin,
...option,

View File

@@ -8,7 +8,7 @@ import useFocus from './clipboardWatch';
function formatReg(regStr) {
const flags = regStr.replace(/.*\/([gimy]*)$/, '$1');
const pattern = flags.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');
const pattern = regStr.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');
return new RegExp(pattern, flags);
}