mirror of
https://github.com/rubickCenter/rubick
synced 2025-06-07 19:14:11 +08:00
192 lines
5.7 KiB
TypeScript
192 lines
5.7 KiB
TypeScript
import getCopyFiles from '@/common/utils/getCopyFiles';
|
|
import { clipboard, nativeImage, remote, ipcRenderer } from 'electron';
|
|
import path from 'path';
|
|
import pluginClickEvent from './pluginClickEvent';
|
|
import { ref } from 'vue';
|
|
|
|
export default ({ currentPlugin, optionsRef, openPlugin, setOptionsRef }) => {
|
|
const clipboardFile: any = ref([]);
|
|
const searchFocus = () => {
|
|
const config = remote.getGlobal('OP_CONFIG').get();
|
|
// 未开启自动粘贴
|
|
if (!config.perf.common.autoPast) return;
|
|
|
|
if (currentPlugin.value.name) return;
|
|
const fileList = getCopyFiles();
|
|
// 拷贝的是文件
|
|
if (fileList) {
|
|
window.setSubInputValue({ value: '' });
|
|
clipboardFile.value = fileList;
|
|
const localPlugins = remote.getGlobal('LOCAL_PLUGINS').getLocalPlugins();
|
|
const options: any = [
|
|
{
|
|
name: '复制路径',
|
|
value: 'plugin',
|
|
icon: require('../assets/link.png'),
|
|
desc: '复制路径到剪切板',
|
|
click: () => {
|
|
clipboard.writeText(fileList.map((file) => file.path).join(','));
|
|
ipcRenderer.send('msg-trigger', { type: 'hideMainWindow' });
|
|
},
|
|
},
|
|
];
|
|
// 判断复制的文件类型是否一直
|
|
const commonLen = fileList.filter(
|
|
(file) => path.extname(fileList[0].path) === path.extname(file.path)
|
|
).length;
|
|
// 复制路径
|
|
if (commonLen !== fileList.length) {
|
|
setOptionsRef(options);
|
|
return;
|
|
}
|
|
|
|
// 再正则插件
|
|
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
|
|
) {
|
|
options.push({
|
|
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,
|
|
});
|
|
clearClipboardFile();
|
|
},
|
|
});
|
|
}
|
|
// 如果是文件,且符合文件正则类型
|
|
if (
|
|
fileList.length > 1 ||
|
|
(cmd.type === 'file' && new RegExp(cmd.match).test(ext))
|
|
) {
|
|
options.push({
|
|
name: cmd,
|
|
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: fileList,
|
|
},
|
|
openPlugin,
|
|
});
|
|
clearClipboardFile();
|
|
},
|
|
});
|
|
}
|
|
});
|
|
});
|
|
});
|
|
|
|
setOptionsRef(options);
|
|
clipboard.clear();
|
|
return;
|
|
}
|
|
const clipboardType = clipboard.availableFormats();
|
|
if (!clipboardType.length) return;
|
|
if ('text/plain' === clipboardType[0]) {
|
|
const contentText = clipboard.readText();
|
|
if (contentText.trim()) {
|
|
clearClipboardFile();
|
|
window.setSubInputValue({ value: contentText });
|
|
}
|
|
clipboard.clear();
|
|
}
|
|
};
|
|
|
|
const clearClipboardFile = () => {
|
|
clipboardFile.value = [];
|
|
optionsRef.value = [];
|
|
};
|
|
// 触发 ctrl + v 主动粘贴时
|
|
const readClipboardContent = () => {
|
|
// read image
|
|
const img = clipboard.readImage();
|
|
const dataUrl = img.toDataURL();
|
|
if (!dataUrl.replace('data:image/png;base64,', '')) return;
|
|
clipboardFile.value = [
|
|
{
|
|
isFile: true,
|
|
isDirectory: false,
|
|
path: null,
|
|
dataUrl,
|
|
},
|
|
];
|
|
const localPlugins = remote.getGlobal('LOCAL_PLUGINS').getLocalPlugins();
|
|
const options: any = [];
|
|
// 再正则插件
|
|
localPlugins.forEach((plugin) => {
|
|
const feature = plugin.features;
|
|
// 系统插件无 features 的情况,不需要再搜索
|
|
if (!feature) return;
|
|
feature.forEach((fe) => {
|
|
fe.cmds.forEach((cmd) => {
|
|
if (cmd.type === 'img') {
|
|
options.push({
|
|
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: dataUrl,
|
|
},
|
|
openPlugin,
|
|
});
|
|
clearClipboardFile();
|
|
},
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
setOptionsRef(options);
|
|
});
|
|
};
|
|
|
|
return {
|
|
searchFocus,
|
|
clipboardFile,
|
|
clearClipboardFile,
|
|
readClipboardContent,
|
|
};
|
|
};
|