diff --git a/src/main.ts b/src/main.ts index ccdae52..256fd92 100644 --- a/src/main.ts +++ b/src/main.ts @@ -15,7 +15,7 @@ import { PageHeaderManager, StatusBarManager, } from "./manager/commands"; -import { Action, CommanderSettings, Macro } from "./types"; +import { Action, CommanderSettings, Macro, MacroItem } from "./types"; import CommanderSettingTab from "./ui/settingTab"; import SettingTabModal from "./ui/settingTabModal"; @@ -54,29 +54,37 @@ export default class CommanderPlugin extends Plugin { const macro = this.settings.macros[id]; if (!macro) throw new Error("Macro not found"); - for (const command of macro.macro) { - switch (command.action) { - case Action.COMMAND: { - await app.commands.executeCommandById(command.commandId); - continue; - } - case Action.DELAY: { - await new Promise((resolve) => - setTimeout(resolve, command.delay) - ); - continue; - } - case Action.EDITOR: { - continue; - } - case Action.LOOP: { - for (let i = 0; i < command.times; i++) { - await app.commands.executeCommandById( - command.commandId - ); - } - continue; + if (macro.stepByStep){ + const nextCommandIndex = macro.nextCommandIndex || 0; + const command = macro.macro[nextCommandIndex]; + macro.nextCommandIndex = (nextCommandIndex + 1) % macro.macro.length; + await this.executeMacroCommand(command); + } + else { + for (const command of macro.macro) { + await this.executeMacroCommand(command); + } + } + } + + private async executeMacroCommand(command: MacroItem): Promise { + switch (command.action) { + case Action.COMMAND: { + app.commands.executeCommandById(command.commandId); + break; + } + case Action.DELAY: { + await new Promise((resolve) => setTimeout(resolve, command.delay)); + break; + } + case Action.EDITOR: { + break; + } + case Action.LOOP: { + for (let i = 0; i < command.times; i++) { + app.commands.executeCommandById(command.commandId); } + break; } } } diff --git a/src/styles/styles.scss b/src/styles/styles.scss index e0e0797..a5c5f85 100644 --- a/src/styles/styles.scss +++ b/src/styles/styles.scss @@ -497,6 +497,15 @@ } } +.cmdr-macro-label { + display: inline-block; + margin-left: 1em; + padding: 1px 5px; + border:1px solid #00000030; + border-radius: 4px; + font-size: 90%; +} + .cmdr-mm-item { display: flex; flex-direction: row !important; diff --git a/src/types.ts b/src/types.ts index 1613e17..754f4b3 100644 --- a/src/types.ts +++ b/src/types.ts @@ -19,6 +19,8 @@ export interface Macro { startup?: boolean; enterFullscreen?: boolean; exitFullscreen?: boolean; + stepByStep?: boolean; + nextCommandIndex?: number; macro: MacroItem[]; } diff --git a/src/ui/components/MacroBuilder.tsx b/src/ui/components/MacroBuilder.tsx index 9491c6a..f6ee799 100644 --- a/src/ui/components/MacroBuilder.tsx +++ b/src/ui/components/MacroBuilder.tsx @@ -24,6 +24,7 @@ export default function ({ const [startup, setStartup] = useState(macro.startup || false); const [enterFullscreen, setEnterFullscreen] = useState(macro.enterFullscreen || false); const [exitFullscreen, setExitFullscreen] = useState(macro.exitFullscreen || false); + const [stepByStep, setStepByStep] = useState(macro.stepByStep || false); const [macroCommands, setMacroCommands] = useState( JSON.parse(JSON.stringify(macro.macro)) || [] ); @@ -77,6 +78,18 @@ export default function ({
+
+ { + //@ts-expect-error + setStepByStep(target?.checked ?? false); + }} + /> + +
- +
- +
- +
@@ -284,7 +297,7 @@ export default function ({ disabled={macroCommands.length === 0} onClick={() => macroCommands.length && - onSave({ macro: macroCommands, name, icon, startup, enterFullscreen, exitFullscreen }) + onSave({ macro: macroCommands, name, icon, startup, enterFullscreen, exitFullscreen, stepByStep }) } > Save diff --git a/src/ui/components/MacroViewer.tsx b/src/ui/components/MacroViewer.tsx index 0f03924..d4a8baa 100644 --- a/src/ui/components/MacroViewer.tsx +++ b/src/ui/components/MacroViewer.tsx @@ -52,6 +52,10 @@ export default function MacroViewer({
{item.name}
{item.macro.length} Actions + {item.startup && (Startup)} + {item.enterFullscreen && (Enter fullscreen)} + {item.exitFullscreen && (Exit fullscreen)} + {item.stepByStep && (Step by step)}