From c9f713d9a006f4cc12cd4c762b10f097f67e133d Mon Sep 17 00:00:00 2001 From: Manuel Serret Date: Tue, 6 May 2025 16:56:36 +0200 Subject: [PATCH] rework toolbar to single active tool --- packages/svelte/src/toolbar/ToolBar.svelte | 58 +++++----------------- 1 file changed, 12 insertions(+), 46 deletions(-) diff --git a/packages/svelte/src/toolbar/ToolBar.svelte b/packages/svelte/src/toolbar/ToolBar.svelte index 71159abc93..0ae56eacd0 100644 --- a/packages/svelte/src/toolbar/ToolBar.svelte +++ b/packages/svelte/src/toolbar/ToolBar.svelte @@ -9,8 +9,8 @@ } = $props(); let open = $state(false); // Default to closed - /** @type {SvelteMap>} */ - let active_tools = $state(new SvelteMap()); + /** @type {import('svelte').Component} */ + let ActiveComponent = $state(null); /** @type {HTMLElement} */ let toolbar; /** @type {HTMLElement} */ @@ -29,54 +29,16 @@ * @param {import('./public').Tool} tool */ function toggle_tool(tool) { - const active = active_tools.has(tool.name); - if (!active) { - let mounted_component; - if (tool.component) mounted_component = mountTool(tool.component, tool.name, { tool }); - - active_tools.set(tool.name, mounted_component); - if (tool.activate) tool.activate(); + if (tool.component === ActiveComponent) { + ActiveComponent = undefined; } else { - const mounted_component = active_tools.get(tool.name); - if (tool.component && mounted_component) unmountTool(mounted_component, tool.name); - - if (tool.deactivate) tool.deactivate(); - active_tools.delete(tool.name); + ActiveComponent = tool.component; } - if (active_tools.size === 0) toolbarPanels.style.display = 'none'; + if (!ActiveComponent) toolbarPanels.style.display = 'none'; else toolbarPanels.style.display = 'block'; } - /** - * @param {import('svelte').Component} component - * @param {string} id - * @param {Record} props - */ - function mountTool(component, id, props) { - if (document.getElementById(id) != null) { - throw Error(`${id} already exists, skipping`); - } - - const el = document.createElement('div'); - el.setAttribute('id', `svelte-toolbar-${id}`); - toolbarPanels.appendChild(el); - const mounted_component = mount(component, { target: el, props }); - - return mounted_component; - } - - /** - * @param {string} id - * @param {Record} component - */ - async function unmountTool(component, id) { - await unmount(component); - - const el = document.getElementById(`svelte-toolbar-${id}`); - if (el) el.remove(); - } - /** * @param {DragEvent} event */ @@ -129,7 +91,7 @@ {#if open}
    {#each config.tools as tool} -
  • +
  • @@ -140,7 +102,11 @@ -
    +
    + {#if ActiveComponent} + + {/if} +