feat: 1. 更新音乐插件 2. 组件注册插件增加单插件模式

This commit is contained in:
539943419 committed 2024-09-27 14:04:41 +08:00
1 parent 4b5b7956c7
commit 38e1b098d2
9 files changed
+316 -41

No files matched your search

+25 -15
View File
@@ -2,6 +2,7 @@ import useVirtualPages from "@/hooks/useVirtualPages";
import VirtualDirectory, { VirtualFile } from "./VirtualDirectory";
import { ShallowRef, shallowRef } from "vue";
import { alertTipType, usePluginHooksType } from "@/types/type";
import VirtualPage from "./VirtualPage";
export enum PluginGroup {
default = "default",
@@ -17,6 +18,8 @@ export interface registerComponentOption {
filter: (VDirectories: VirtualDirectory[], VFiles: VirtualFile[]) => boolean;
disable?: boolean;
exitConfirm?: boolean;
// 若为true,则只会创建一个页面,当存在已创建页面则会直接将VFile和VDir加到curr里面
single?: boolean;
}
export type Plugin = {
@@ -31,12 +34,7 @@ export type Plugin = {
// 判断在未禁用时是否可以使用这个组件
// 使用组件即调用下面的func
filter: (VDirectories: VirtualDirectory[], VFiles: VirtualFile[]) => boolean;
func: (
VDirectories: VirtualDirectory[],
VFiles: VirtualFile[],
hooks: usePluginHooksType,
...args: any[]
) => void;
func: (VDirectories: VirtualDirectory[], VFiles: VirtualFile[], hooks: usePluginHooksType, ...args: any[]) => void;
};
export default class PluginCenter {
@@ -58,7 +56,7 @@ export default class PluginCenter {
* 便捷地注册一个组件为插件,触发时直接用新页面打开
*/
registerComponent(option: registerComponentOption): void {
const { key, name, getComponent, icon, filter, group = [PluginGroup.default], disable = false, exitConfirm = false } = option;
const { key, name, getComponent, icon, filter, group = [PluginGroup.default], disable = false, exitConfirm = false, single = false } = option;
let _component: any;
const views = useVirtualPages();
this.register(key, {
@@ -81,11 +79,18 @@ export default class PluginCenter {
timeout: 2000
});
}
views.push(_component, VDirectories, VFiles, {
VirtualPageOption: {
exitConfirm
}
});
if (single && views.find(_component) !== undefined) {
const view = views.find(_component) as VirtualPage;
view.currentFiles = [...view.currentFiles, ...VFiles];
view.currentDirectories = [...view.currentDirectories, ...VDirectories];
} else {
views.push(_component, VDirectories, VFiles, {
VirtualPageOption: {
exitConfirm,
allowCopy: single === false
}
});
}
}
});
}
@@ -112,8 +117,13 @@ export default class PluginCenter {
}
usePlugin(key: string, VDirectories?: VirtualDirectory[], VFiles?: VirtualFile[], ...args: any[]) {
this.pluginsMap[key].func(VDirectories ?? [], VFiles ?? [], {
globalAlertTip: this.globalAlertTip
}, ...args);
this.pluginsMap[key].func(
VDirectories ?? [],
VFiles ?? [],
{
globalAlertTip: this.globalAlertTip
},
...args
);
}
}
+4 -2
View File
@@ -36,6 +36,7 @@ export class VirtualFile {
stats: stats;
parent: VirtualDirectory;
id: number;
storage: {[key: string]: any} = {};
get path() {
return `${this.parent.path}${this.name}`;
}
@@ -48,7 +49,6 @@ export class VirtualFile {
class VirtualDirectory {
constructor(info: directory, parent?: VirtualDirectory) {
this.name = info.name;
this.type = "directory";
this.stats = info.stats;
this.parent = parent ?? undefined;
this.id = generateId();
@@ -60,7 +60,7 @@ class VirtualDirectory {
// 子目录
directories?: VirtualDirectory[];
// 没啥意义,标注一下就是了
type: "directory";
type: "directory" = 'directory';
// 文件夹创建时间等杂项属性
stats: stats;
// 父文件夹
@@ -68,6 +68,8 @@ class VirtualDirectory {
id: number;
storage: {[key: string]: any} = {};
/**
* 获取相对于根目录的路径的层数
* 用于目录下文件定位
+13 -2
View File
@@ -1,9 +1,10 @@
import { reactive, shallowRef } from 'vue'
import { Component, reactive, shallowRef } from 'vue'
import VirtualDirectory, { VirtualFile } from './VirtualDirectory'
import generateId from '@/hooks/generateId'
export interface VirtualPageOption {
exitConfirm?: boolean
allowCopy?: boolean
}
export interface ViewsPushOption {
@@ -44,6 +45,7 @@ export default class VirtualPage {
this.refreshKey = Math.random()
this.color = getRandomWebSafeColor()
this.exitConfirm = initObjects?.option?.exitConfirm ?? false
this.allowCopy = initObjects?.option?.allowCopy ?? true
}
// 页面使用的组件
component: any
@@ -61,8 +63,10 @@ export default class VirtualPage {
color: string
// 用于展示的title
_title?: string
// 关闭时是否需要确认
// 关闭时是否需要确认(未实现)
exitConfirm: boolean
// 是否允许复制页面
allowCopy: boolean
get title() {
if (this._title) {
@@ -155,4 +159,11 @@ export class VirtualPages {
deleteView(index: number) {
this._views.splice(index, 1)
}
/**
* 返回第一个使用此组件的页面
*/
find(component: Component) {
return this._views.find(v=>v.component === component)
}
}