mirror of
https://github.com/rubickCenter/rubick
synced 2025-06-07 11:04:11 +08:00
203 lines
5.0 KiB
Vue
203 lines
5.0 KiB
Vue
<template>
|
|
<div
|
|
id="components-layout"
|
|
@mousedown="onMouseDown"
|
|
>
|
|
<Search
|
|
:currentPlugin="currentPlugin"
|
|
@changeCurrent="changeIndex"
|
|
@onSearch="onSearch"
|
|
@openMenu="openMenu"
|
|
@changeSelect="changeSelect"
|
|
:searchValue="searchValue"
|
|
:placeholder="placeholder"
|
|
:pluginLoading="pluginLoading"
|
|
:pluginHistory="pluginHistory"
|
|
:clipboardFile="clipboardFile || []"
|
|
@choosePlugin="choosePlugin"
|
|
@focus="searchFocus"
|
|
@clear-search-value="clearSearchValue"
|
|
@clearClipbord="clearClipboardFile"
|
|
@readClipboardContent="readClipboardContent"
|
|
/>
|
|
<Result
|
|
:pluginHistory="pluginHistory"
|
|
:currentPlugin="currentPlugin"
|
|
:searchValue="searchValue"
|
|
:currentSelect="currentSelect"
|
|
:options="options"
|
|
:clipboardFile="clipboardFile || []"
|
|
@setPluginHistory="setPluginHistory"
|
|
@choosePlugin="choosePlugin"
|
|
/>
|
|
</div>
|
|
</template>
|
|
|
|
<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';
|
|
import createPluginManager from './plugins-manager';
|
|
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');
|
|
|
|
const {
|
|
initPlugins,
|
|
getPluginInfo,
|
|
options,
|
|
onSearch,
|
|
searchValue,
|
|
changeSelect,
|
|
openPlugin,
|
|
currentPlugin,
|
|
placeholder,
|
|
pluginLoading,
|
|
searchFocus,
|
|
clipboardFile,
|
|
setSearchValue,
|
|
clearClipboardFile,
|
|
readClipboardContent,
|
|
pluginHistory,
|
|
setPluginHistory,
|
|
changePluginHistory,
|
|
} = createPluginManager();
|
|
|
|
initPlugins();
|
|
|
|
const currentSelect = ref(0);
|
|
const menuPluginInfo: any = ref({});
|
|
|
|
const config: any = ref(localConfig.getConfig());
|
|
|
|
getPluginInfo({
|
|
pluginName: 'feature',
|
|
// eslint-disable-next-line no-undef
|
|
pluginPath: `${__static}/feature/package.json`,
|
|
}).then((res) => {
|
|
menuPluginInfo.value = res;
|
|
remote.getGlobal('LOCAL_PLUGINS').addPlugin(res);
|
|
});
|
|
|
|
watch(
|
|
[options, pluginHistory, currentPlugin],
|
|
() => {
|
|
currentSelect.value = 0;
|
|
if (currentPlugin.value.name) return;
|
|
window.rubick.setExpendHeight(
|
|
getWindowHeight(
|
|
options.value,
|
|
(pluginLoading.value || !config.value.perf.common.history) ? [] : pluginHistory.value
|
|
)
|
|
);
|
|
},
|
|
{
|
|
immediate: true,
|
|
}
|
|
);
|
|
|
|
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
|
|
) {
|
|
currentSelect.value = 0;
|
|
return;
|
|
}
|
|
currentSelect.value = currentSelect.value + index;
|
|
};
|
|
|
|
const openMenu = (ext) => {
|
|
openPlugin({
|
|
...toRaw(menuPluginInfo.value),
|
|
feature: menuPluginInfo.value.features[0],
|
|
cmd: '插件市场',
|
|
ext,
|
|
click: () => openMenu(ext),
|
|
});
|
|
};
|
|
|
|
window.rubick.openMenu = openMenu;
|
|
|
|
const choosePlugin = (plugin) => {
|
|
if (options.value.length) {
|
|
const currentChoose = options.value[currentSelect.value];
|
|
currentChoose.click();
|
|
} else {
|
|
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;
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
if (hasRemove) {
|
|
const result = window.rubick.db.get(PLUGIN_HISTORY) || {};
|
|
const history = result.data.filter(item => item.originName !== currentChoose.originName);
|
|
setPluginHistory(history);
|
|
return message.warning('插件已被卸载!');
|
|
}
|
|
changePluginHistory(currentChoose);
|
|
window.rubick.openPlugin(
|
|
JSON.parse(
|
|
JSON.stringify({
|
|
...currentChoose,
|
|
ext: {
|
|
code: currentChoose.feature.code,
|
|
type: currentChoose.cmd.type || 'text',
|
|
payload: null,
|
|
},
|
|
})
|
|
)
|
|
);
|
|
}
|
|
};
|
|
|
|
const clearSearchValue = () => {
|
|
setSearchValue('');
|
|
};
|
|
</script>
|
|
|
|
<style lang="less">
|
|
@import './assets/var.less';
|
|
#components-layout {
|
|
height: 100vh;
|
|
overflow: hidden;
|
|
background: var(--color-body-bg);
|
|
::-webkit-scrollbar {
|
|
width: 0;
|
|
}
|
|
&.drag {
|
|
-webkit-app-region: drag;
|
|
}
|
|
}
|
|
</style>
|