diff --git a/src/dock.svelte b/src/dock.svelte
new file mode 100644
index 0000000..a380d69
--- /dev/null
+++ b/src/dock.svelte
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+ Custom Dock
+
+
+
+
+
+ {text}
+
+
diff --git a/src/i18n/en_US.json b/src/i18n/en_US.json
index 012adc1..7e9425a 100644
--- a/src/i18n/en_US.json
+++ b/src/i18n/en_US.json
@@ -1,4 +1,10 @@
{
+ "addTopBarIcon": "Add a top bar icon by plugin",
+ "cancel": "Cancel",
+ "save": "Save",
+ "byeMenu": "Bye, Menu!",
+ "helloPlugin": "Hello, Plugin!",
+ "byePlugin": "Bye, Plugin!",
"name": "SiYuan",
"hello": {
"makesure": "Before using this template, please read the offical sample, make sure that you've known about the pipeline for plugin developing."
diff --git a/src/i18n/zh_CN.json b/src/i18n/zh_CN.json
index f601228..7eaa3eb 100644
--- a/src/i18n/zh_CN.json
+++ b/src/i18n/zh_CN.json
@@ -1,4 +1,10 @@
{
+ "addTopBarIcon": "使用插件添加一个顶栏按钮",
+ "cancel": "取消",
+ "save": "保存",
+ "byeMenu": "再见,菜单!",
+ "helloPlugin": "你好,插件!",
+ "byePlugin": "再见,插件!",
"name": "思源",
"hello": {
"makesure": "使用这个模板之前,请阅读官方教程, 确保自己已经理解了插件的基本开发流程。"
diff --git a/src/index.ts b/src/index.ts
index 84af345..9b085f3 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -2,27 +2,164 @@
* Copyright (c) 2023 frostime. All rights reserved.
* https://github.com/frostime/sy-plugin-template-vite
*/
-import { Plugin, showMessage, Dialog } from "siyuan";
-import Hello from "./hello.svelte";
-import SettingPannel from "./libs/setting-panel.svelte";
+import { Plugin, showMessage, confirm, Dialog, Menu, isMobile, openTab } from "siyuan";
import "./index.scss";
+import HelloExample from "./hello.svelte";
+import DockExample from "./dock.svelte";
+import SettingPannel from "./libs/setting-panel.svelte";
+
+const STORAGE_NAME = "menu-config";
+const TAB_TYPE = "custom_tab";
+const DOCK_TYPE = "dock_tab";
+
export default class SamplePlugin extends Plugin {
counter: { [key: string]: number } = {
hello: 0,
};
+ private customTab: () => any;
async onload() {
- console.log("onload");
- showMessage("Hello World");
- this.addTopBar(
- {
- icon: "iconEmoji",
- "title": "Hello SiYuan",
- "callback": () => this.openHelloInDialog()
+ showMessage("Hello SiYuan Plugin");
+ console.log(this.i18n.helloPlugin);
+
+ const topBarElement = this.addTopBar({
+ icon: "iconEmoji",
+ title: this.i18n.addTopBarIcon,
+ position: "left",
+ callback: () => {
+ this.addMenu(topBarElement.getBoundingClientRect());
}
- )
+ });
+
+ this.customTab = this.addTab({
+ type: TAB_TYPE,
+ init() {
+ this.tab = new HelloExample({
+ target: this.element,
+ props: {
+ name: this.i18n.name,
+ opendCount: this.counter.hello,
+ i18n: this.i18n.hello
+ }
+ });
+ },
+ destroy() {
+ console.log("destroy tab:", TAB_TYPE);
+ this.tab.$destroy(); //Call svelte component destroy
+ }
+ });
+
+ this.addDock({
+ config: {
+ position: "LeftBottom",
+ size: { width: 200, height: 0 },
+ icon: "iconEmoji",
+ title: "Custom Dock",
+ },
+ data: {
+ text: "This is my custom dock"
+ },
+ type: DOCK_TYPE,
+ init() {
+ new DockExample({
+ target: this.element,
+ props: {
+ text: this.data.text,
+ }
+ });
+ },
+ destroy() {
+ console.log("destroy dock:", DOCK_TYPE);
+ }
+ });
+
+ }
+
+ private wsEvent({ detail }: any) {
+ console.log(detail);
+ }
+
+ private async addMenu(rect: DOMRect) {
+ const menu = new Menu("topBarSample", () => {
+ console.log(this.i18n.byeMenu);
+ });
+ menu.addItem({
+ icon: "iconHelp",
+ label: "Confirm",
+ click() {
+ confirm("Confirm", "Is this a confirm?", () => {
+ showMessage("confirm");
+ }, () => {
+ showMessage("cancel");
+ });
+ }
+ });
+ menu.addItem({
+ icon: "iconFeedback",
+ label: "Message",
+ click: () => {
+ showMessage(this.i18n.helloPlugin);
+ }
+ });
+ menu.addItem({
+ icon: "iconInfo",
+ label: "Dialog",
+ click: () => this.openHelloInDialog()
+ });
+ menu.addItem({
+ icon: "iconLayoutBottom",
+ label: "Open Tab",
+ click: () => {
+ openTab({
+ custom: {
+ icon: "iconEmoji",
+ title: "Custom Tab",
+ data: {
+ text: "This is my custom tab",
+ },
+ fn: this.customTab
+ },
+ });
+ }
+ });
+ menu.addItem({
+ icon: "iconTrashcan",
+ label: "Remove Data",
+ click: () => {
+ this.removeData(STORAGE_NAME);
+ }
+ });
+ menu.addItem({
+ icon: "iconSelect",
+ label: "On ws-main",
+ click: () => {
+ this.eventBus.on("ws-main", this.wsEvent);
+ }
+ });
+ menu.addItem({
+ icon: "iconClose",
+ label: "Off ws-main",
+ click: () => {
+ this.eventBus.off("ws-main", this.wsEvent);
+ }
+ });
+ menu.addSeparator();
+ menu.addItem({
+ icon: "iconSparkles",
+ label: this.data[STORAGE_NAME] || "Readonly",
+ type: "readonly",
+ });
+ if (isMobile()) {
+ menu.fullscreen();
+ } else {
+ menu.open({
+ x: rect.right,
+ y: rect.bottom,
+ isLeft: true,
+ });
+ }
}
openSetting(): void {
@@ -51,7 +188,7 @@ export default class SamplePlugin extends Plugin {
hello.$destroy();
},
});
- let hello = new Hello({
+ let hello = new HelloExample({
target: dialog.element.querySelector("#helloPanel"),
props: {
name: this.i18n.name,
@@ -62,7 +199,7 @@ export default class SamplePlugin extends Plugin {
}
async onunload() {
- showMessage("Goodbye World");
+ showMessage("Goodbye SiYuan Plugin");
console.log("onunload");
}
}