mirror of
https://github.com/rubickCenter/rubick
synced 2025-12-26 12:42:34 +08:00
✨ 支持 mac M1 arm 64:#207,#134; 支持右击菜单
This commit is contained in:
84
src/main/common/getSearchFiles.ts
Normal file
84
src/main/common/getSearchFiles.ts
Normal file
@@ -0,0 +1,84 @@
|
||||
import path from 'path';
|
||||
import fs from 'fs-extra';
|
||||
import os from 'os';
|
||||
|
||||
const getSearchFiles = (argv = process.argv, cwd = process.cwd()) => {
|
||||
const files = argv.slice(2); // 过滤['rubick.exe', 'search']这两个参数,直接获取需要上传的图片路径
|
||||
let result: any = [];
|
||||
if (files.length > 0) {
|
||||
// 如果图片列表不为空
|
||||
result = files
|
||||
.map((item) => {
|
||||
if (path.isAbsolute(item)) {
|
||||
// 如果是绝对路径
|
||||
return {
|
||||
path: item,
|
||||
};
|
||||
} else {
|
||||
const tempPath = path.join(cwd, item); // 如果是相对路径,就拼接
|
||||
if (fs.existsSync(tempPath)) {
|
||||
// 判断文件是否存在
|
||||
return {
|
||||
path: tempPath,
|
||||
};
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
})
|
||||
.filter((item) => item !== null); // 排除为null的路径
|
||||
}
|
||||
return result; // 返回结果
|
||||
};
|
||||
|
||||
const putFileToRubick = (webContents, files) => {
|
||||
webContents.executeJavaScript(`window.searchFocus(${JSON.stringify(files)})`);
|
||||
};
|
||||
|
||||
const copyFileOutsideOfElectronAsar = function (
|
||||
sourceInAsarArchive,
|
||||
destOutsideAsarArchive
|
||||
) {
|
||||
if (fs.existsSync(sourceInAsarArchive)) {
|
||||
// file will be copied
|
||||
if (fs.statSync(sourceInAsarArchive).isFile()) {
|
||||
const file = destOutsideAsarArchive;
|
||||
const dir = path.dirname(file);
|
||||
if (!fs.existsSync(dir)) {
|
||||
fs.mkdirSync(dir, { recursive: true });
|
||||
}
|
||||
|
||||
fs.writeFileSync(file, fs.readFileSync(sourceInAsarArchive));
|
||||
}
|
||||
|
||||
// dir is browsed
|
||||
else if (fs.statSync(sourceInAsarArchive).isDirectory()) {
|
||||
fs.readdirSync(sourceInAsarArchive).forEach(function (fileOrFolderName) {
|
||||
copyFileOutsideOfElectronAsar(
|
||||
sourceInAsarArchive + '/' + fileOrFolderName,
|
||||
destOutsideAsarArchive + '/' + fileOrFolderName
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const macBeforeOpen = () => {
|
||||
const dest = `${os.homedir}/Library/Services/rubick.workflow`;
|
||||
if (fs.existsSync(dest)) {
|
||||
// 判断是否存在
|
||||
return true;
|
||||
} else {
|
||||
// 如果不存在就复制过去
|
||||
try {
|
||||
copyFileOutsideOfElectronAsar(
|
||||
path.join(__static, 'rubick.workflow'),
|
||||
dest
|
||||
);
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export { getSearchFiles, putFileToRubick, macBeforeOpen };
|
||||
@@ -13,6 +13,11 @@ import API from './common/api';
|
||||
import createTray from './common/tray';
|
||||
import registerHotKey from './common/registerHotKey';
|
||||
import localConfig from './common/initLocalConfig';
|
||||
import {
|
||||
getSearchFiles,
|
||||
putFileToRubick,
|
||||
macBeforeOpen,
|
||||
} from './common/getSearchFiles';
|
||||
|
||||
import '../common/utils/localPlugin';
|
||||
|
||||
@@ -41,6 +46,7 @@ class App {
|
||||
beforeReady() {
|
||||
// 系统托盘
|
||||
if (commonConst.macOS()) {
|
||||
macBeforeOpen();
|
||||
if (commonConst.production() && !app.isInApplicationsFolder()) {
|
||||
app.moveToApplicationsFolder();
|
||||
} else {
|
||||
@@ -83,14 +89,20 @@ class App {
|
||||
}
|
||||
|
||||
onRunning() {
|
||||
app.on('second-instance', () => {
|
||||
// 当运行第二个实例时,将会聚焦到myWindow这个窗口
|
||||
app.on('second-instance', (event, commandLine, workingDirectory) => {
|
||||
const files = getSearchFiles(commandLine, workingDirectory);
|
||||
const win = this.windowCreator.getWindow();
|
||||
// 当运行第二个实例时,将会聚焦到myWindow这个窗口
|
||||
// 如果有文件列表作为参数,说明是命令行启动
|
||||
if (win) {
|
||||
if (win.isMinimized()) {
|
||||
win.restore();
|
||||
}
|
||||
win.focus();
|
||||
if (files.length > 0) {
|
||||
win.show();
|
||||
putFileToRubick(win.webContents, files);
|
||||
}
|
||||
}
|
||||
});
|
||||
app.on('activate', () => {
|
||||
|
||||
@@ -59,7 +59,7 @@ import { LoadingOutlined, MoreOutlined } from '@ant-design/icons-vue';
|
||||
|
||||
const remote = window.require('@electron/remote');
|
||||
import localConfig from '../confOp';
|
||||
const { Menu } = remote;
|
||||
const { Menu, app } = remote;
|
||||
|
||||
const config: any = ref(localConfig.getConfig());
|
||||
|
||||
@@ -232,9 +232,14 @@ const changeHideOnBlur = () => {
|
||||
|
||||
const getIcon = () => {
|
||||
if (props.clipboardFile[0].dataUrl) return props.clipboardFile[0].dataUrl;
|
||||
return props.clipboardFile[0].isFile
|
||||
? require('../assets/file.png')
|
||||
: require('../assets/folder.png');
|
||||
try {
|
||||
return ipcRenderer.sendSync('msg-trigger', {
|
||||
type: 'getFileIcon',
|
||||
data: { path: props.clipboardFile[0].path },
|
||||
});
|
||||
} catch (e) {
|
||||
return require('../assets/file.png');
|
||||
}
|
||||
};
|
||||
|
||||
const newWindow = () => {
|
||||
|
||||
@@ -8,13 +8,13 @@ import { ref } from 'vue';
|
||||
|
||||
export default ({ currentPlugin, optionsRef, openPlugin, setOptionsRef }) => {
|
||||
const clipboardFile: any = ref([]);
|
||||
const searchFocus = () => {
|
||||
const searchFocus = (files) => {
|
||||
const config: any = localConfig.getConfig();
|
||||
// 未开启自动粘贴
|
||||
if (!config.perf.common.autoPast) return;
|
||||
|
||||
if (currentPlugin.value.name) return;
|
||||
const fileList = getCopyFiles();
|
||||
const fileList = files || getCopyFiles();
|
||||
// 拷贝的是文件
|
||||
if (fileList) {
|
||||
window.setSubInputValue({ value: '' });
|
||||
@@ -43,78 +43,79 @@ export default ({ currentPlugin, optionsRef, openPlugin, setOptionsRef }) => {
|
||||
}
|
||||
|
||||
// 再正则插件
|
||||
localPlugins.forEach((plugin) => {
|
||||
const feature = plugin.features;
|
||||
// 系统插件无 features 的情况,不需要再搜索
|
||||
if (!feature) return;
|
||||
feature.forEach((fe) => {
|
||||
const ext = path.extname(fileList[0].path);
|
||||
fe.cmds.forEach((cmd) => {
|
||||
const regImg = /\.(png|jpg|gif|jpeg|webp)$/;
|
||||
if (
|
||||
cmd.type === 'img' &&
|
||||
regImg.test(ext) &&
|
||||
fileList.length === 1
|
||||
) {
|
||||
const option = {
|
||||
name: cmd.label,
|
||||
value: 'plugin',
|
||||
icon: plugin.logo,
|
||||
desc: fe.explain,
|
||||
type: plugin.pluginType,
|
||||
click: () => {
|
||||
pluginClickEvent({
|
||||
plugin,
|
||||
fe,
|
||||
cmd,
|
||||
ext: {
|
||||
code: fe.code,
|
||||
type: cmd.type || 'text',
|
||||
payload: nativeImage
|
||||
.createFromPath(fileList[0].path)
|
||||
.toDataURL(),
|
||||
},
|
||||
openPlugin,
|
||||
option,
|
||||
});
|
||||
clearClipboardFile();
|
||||
},
|
||||
};
|
||||
options.push(option);
|
||||
}
|
||||
// 如果是文件,且符合文件正则类型
|
||||
if (
|
||||
fileList.length > 1 ||
|
||||
(cmd.type === 'file' && new RegExp(cmd.match).test(ext))
|
||||
) {
|
||||
const option = {
|
||||
name: cmd,
|
||||
value: 'plugin',
|
||||
icon: plugin.logo,
|
||||
desc: fe.explain,
|
||||
type: plugin.pluginType,
|
||||
click: () => {
|
||||
pluginClickEvent({
|
||||
plugin,
|
||||
fe,
|
||||
cmd,
|
||||
option,
|
||||
ext: {
|
||||
code: fe.code,
|
||||
type: cmd.type || 'text',
|
||||
payload: fileList,
|
||||
},
|
||||
openPlugin,
|
||||
});
|
||||
clearClipboardFile();
|
||||
},
|
||||
};
|
||||
options.push(option);
|
||||
}
|
||||
if (fileList.length === 1) {
|
||||
localPlugins.forEach((plugin) => {
|
||||
const feature = plugin.features;
|
||||
// 系统插件无 features 的情况,不需要再搜索
|
||||
if (!feature) return;
|
||||
feature.forEach((fe) => {
|
||||
const ext = path.extname(fileList[0].path);
|
||||
fe.cmds.forEach((cmd) => {
|
||||
const regImg = /\.(png|jpg|gif|jpeg|webp)$/;
|
||||
if (
|
||||
cmd.type === 'img' &&
|
||||
regImg.test(ext) &&
|
||||
fileList.length === 1
|
||||
) {
|
||||
const option = {
|
||||
name: cmd.label,
|
||||
value: 'plugin',
|
||||
icon: plugin.logo,
|
||||
desc: fe.explain,
|
||||
type: plugin.pluginType,
|
||||
click: () => {
|
||||
pluginClickEvent({
|
||||
plugin,
|
||||
fe,
|
||||
cmd,
|
||||
ext: {
|
||||
code: fe.code,
|
||||
type: cmd.type || 'text',
|
||||
payload: nativeImage
|
||||
.createFromPath(fileList[0].path)
|
||||
.toDataURL(),
|
||||
},
|
||||
openPlugin,
|
||||
option,
|
||||
});
|
||||
clearClipboardFile();
|
||||
},
|
||||
};
|
||||
options.push(option);
|
||||
}
|
||||
// 如果是文件,且符合文件正则类型
|
||||
if (
|
||||
fileList.length > 1 ||
|
||||
(cmd.type === 'file' && new RegExp(cmd.match).test(ext))
|
||||
) {
|
||||
const option = {
|
||||
name: cmd,
|
||||
value: 'plugin',
|
||||
icon: plugin.logo,
|
||||
desc: fe.explain,
|
||||
type: plugin.pluginType,
|
||||
click: () => {
|
||||
pluginClickEvent({
|
||||
plugin,
|
||||
fe,
|
||||
cmd,
|
||||
option,
|
||||
ext: {
|
||||
code: fe.code,
|
||||
type: cmd.type || 'text',
|
||||
payload: fileList,
|
||||
},
|
||||
openPlugin,
|
||||
});
|
||||
clearClipboardFile();
|
||||
},
|
||||
};
|
||||
options.push(option);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
setOptionsRef(options);
|
||||
clipboard.clear();
|
||||
return;
|
||||
|
||||
@@ -156,6 +156,8 @@ const optionsManager = ({
|
||||
setOptionsRef,
|
||||
});
|
||||
|
||||
window.searchFocus = searchFocus;
|
||||
|
||||
return {
|
||||
options: optionsRef,
|
||||
searchFocus,
|
||||
|
||||
1
src/renderer/shims-vue.d.ts
vendored
1
src/renderer/shims-vue.d.ts
vendored
@@ -26,4 +26,5 @@ interface Window {
|
||||
setCurrentPlugin: (plugin: any) => void;
|
||||
pluginLoaded: () => void;
|
||||
getMainInputInfo: () => any;
|
||||
searchFocus: (args: any) => any;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user