From e681d462d388922dac90f6a938b6ad01a4f399c1 Mon Sep 17 00:00:00 2001 From: dragonwocky Date: Sun, 15 Jan 2023 00:39:01 +1100 Subject: [PATCH] feat(menu): mimic notion select options popup electron was positioning options distanced from their `, + $popup = html`
- ${values.map((value) => { - return html`
+ `; - const { onchange } = $select; - $select.onchange = (event) => { - onchange?.(event); - _set?.($select.value); - updateWidth(); + const { onclick } = $select; + $select.onclick = (event) => { + onclick?.(event); + $popup.setAttribute("open", true); }; useState(["rerender"], () => { _get?.().then((value) => { - $select.value = value; - updateWidth(); + if ($popup.hasAttribute("open")) { + $popup.removeAttribute("open"); + $select.style.width = `${$select.offsetWidth}px`; + $select.style.background = "transparent"; + $select.innerText = value; + setTimeout(() => { + $select.style.width = ""; + $select.style.background = ""; + }, 200); + } else $select.innerText = value; }); }); return html`
- ${$select} + ${$select}${$popup} `, + $option = html`
+
+ ${value} +
+
`; + + const { onclick } = $option; + $option.onclick = (event) => { + onclick?.(event); + _set?.(value); + }; + useState(["rerender"], () => { + _get?.().then((actualValue) => { + if (actualValue === value) { + $option.append($selected); + } else $selected.remove(); + }); + }); + + return $option; +} + function Toggle({ _get, _set, ...props }) { const { html } = globalThis.__enhancerApi, $input = html``; diff --git a/src/core/menu/menu.mjs b/src/core/menu/menu.mjs index 3e9f629..3fefcd5 100644 --- a/src/core/menu/menu.mjs +++ b/src/core/menu/menu.mjs @@ -35,7 +35,10 @@ const renderOptions = async (mod) => { options = options.map(async (opt) => { if (opt.type === "heading") return html`<${Option} ...${opt} />`; const _get = () => db.get(opt.key), - _set = (value) => db.set(opt.key, value); + _set = async (value) => { + await db.set(opt.key, value); + setState({ rerender: true }); + }; return html`<${Option} ...${{ ...opt, _get, _set }} />`; }); return Promise.all(options); @@ -60,7 +63,10 @@ const compatibleMods = (mods) => { enabledMods = initDatabase([await getProfile(), "enabledMods"]); mods = compatibleMods(mods).map(async (mod) => { const _get = () => enabledMods.get(mod.id), - _set = (enabled) => enabledMods.set(mod.id, enabled); + _set = async (enabled) => { + await enabledMods.set(mod.id, enabled); + setState({ rerender: true }); + }; return html`<${Mod} ...${{ ...mod, _get, _set }} />`; }); return html`<${List}>${await Promise.all(mods)}`; @@ -75,7 +81,10 @@ const renderOptionViews = async (parentView, mods) => { }) .map(async (mod) => { const _get = () => enabledMods.get(mod.id), - _set = (enabled) => enabledMods.set(mod.id, enabled); + _set = async (enabled) => { + await enabledMods.set(mod.id, enabled); + setState({ rerender: true }); + }; return html`<${View} id=${mod.id}> <${Mod} ...${{ ...mod, options: [], _get, _set }} /> ${await renderOptions(mod)}