From 09db6fd8674b2242acbe13eebfd417d03aa83926 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 9 Mar 2023 19:41:12 +0100 Subject: [PATCH] fix key navigation --- .../components/layout/AppSplitpanes.svelte | 35 +++-- .../apps/components/layout/AppTabs.svelte | 45 ++++-- .../components/apps/editor/AppEditor.svelte | 3 +- .../components/apps/editor/AppPreview.svelte | 3 +- .../component/ComponentNavigation.svelte | 140 ++++++++++-------- .../apps/editor/settingsPanel/GridTab.svelte | 2 +- frontend/src/lib/components/apps/types.ts | 17 ++- 7 files changed, 143 insertions(+), 102 deletions(-) diff --git a/frontend/src/lib/components/apps/components/layout/AppSplitpanes.svelte b/frontend/src/lib/components/apps/components/layout/AppSplitpanes.svelte index 534daeee96..7e34194fec 100644 --- a/frontend/src/lib/components/apps/components/layout/AppSplitpanes.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppSplitpanes.svelte @@ -7,7 +7,6 @@ import InputValue from '../helpers/InputValue.svelte' import { Pane, Splitpanes } from 'svelte-splitpanes' import { deepEqual } from 'fast-equals' - import type { Output } from '../../rx' export let id: string export let configuration: Record @@ -17,9 +16,7 @@ export let panes: number[] export let render: boolean - export const staticOutputs: string[] = ['selectedTabIndex'] - - const { app, focusedGrid, selectedComponent, worldStore } = + const { app, focusedGrid, selectedComponent, componentControl } = getContext('AppEditorContext') let noPadding: boolean | undefined = undefined @@ -31,23 +28,31 @@ } } - $: outputs = $worldStore?.outputsById[id] as { - selectedTabIndex: Output - } - $: $selectedComponent === id && onFocus() $: css = concatCustomCss($app.css?.containercomponent, customCss) - $: outputs?.selectedTabIndex.subscribe({ - next: (value) => { - if (value !== null) { - $focusedGrid = { - parentComponentId: id, - subGridIndex: value + $componentControl[id] = { + left: () => { + if ($focusedGrid?.subGridIndex) { + const index = $focusedGrid?.subGridIndex ?? 0 + if (index > 0) { + $focusedGrid.subGridIndex = index - 1 + return true } } + return false + }, + right: () => { + if ($focusedGrid?.subGridIndex) { + const index = $focusedGrid?.subGridIndex ?? 0 + if (index < panes.length - 1) { + $focusedGrid.subGridIndex = index - 1 + return true + } + } + return false } - }) + } let sumedup = [50, 50] $: { diff --git a/frontend/src/lib/components/apps/components/layout/AppTabs.svelte b/frontend/src/lib/components/apps/components/layout/AppTabs.svelte index 456fdb99e8..05b72acb67 100644 --- a/frontend/src/lib/components/apps/components/layout/AppTabs.svelte +++ b/frontend/src/lib/components/apps/components/layout/AppTabs.svelte @@ -18,7 +18,7 @@ export let render: boolean export const staticOutputs: string[] = ['selectedTabIndex'] - const { app, worldStore, focusedGrid, selectedComponent } = + const { app, worldStore, focusedGrid, selectedComponent, componentControl } = getContext('AppEditorContext') let selected: string = tabs[0] @@ -41,22 +41,45 @@ } } - $: selected && outputs?.selectedTabIndex && handleTabSelection() + $: $selectedComponent === id && focusGrid() + + function focusGrid() { + const selectedIndex = tabs?.indexOf(selected) + if ($focusedGrid?.parentComponentId != id || $focusedGrid?.subGridIndex != selectedIndex) { + $focusedGrid = { + parentComponentId: id, + subGridIndex: selectedIndex + } + } + } + + $componentControl[id] = { + left: () => { + const index = tabs.indexOf(selected) + if (index > 0) { + selected = tabs[index - 1] + return true + } + return false + }, + right: () => { + const index = tabs.indexOf(selected) + if (index < tabs.length - 1) { + selected = tabs[index + 1] + return true + } + return false + } + } + + $: selected && handleTabSelection() + $: outputs = $worldStore?.outputsById[id] as { selectedTabIndex: Output } $: selectedIndex = tabs?.indexOf(selected) ?? -1 - $: outputs?.selectedTabIndex.subscribe({ - next: (value) => { - if (selectedIndex !== value && value !== null) { - selectedIndex = value - selected = tabs[selectedIndex] - } - } - }) - $: css = concatCustomCss($app.css?.tabscomponent, customCss) diff --git a/frontend/src/lib/components/apps/editor/AppEditor.svelte b/frontend/src/lib/components/apps/editor/AppEditor.svelte index ad9919fa6c..e99cd33f45 100644 --- a/frontend/src/lib/components/apps/editor/AppEditor.svelte +++ b/frontend/src/lib/components/apps/editor/AppEditor.svelte @@ -85,7 +85,8 @@ focusedGrid, stateId: writable(0), parentWidth: writable(0), - history + history, + componentControl: writable({}) }) let timeout: NodeJS.Timeout | undefined = undefined diff --git a/frontend/src/lib/components/apps/editor/AppPreview.svelte b/frontend/src/lib/components/apps/editor/AppPreview.svelte index 1172ed3218..dbd360beee 100644 --- a/frontend/src/lib/components/apps/editor/AppPreview.svelte +++ b/frontend/src/lib/components/apps/editor/AppPreview.svelte @@ -62,7 +62,8 @@ focusedGrid: writable(undefined), stateId: writable(0), parentWidth: writable(0), - history: writable(undefined) + history: writable(undefined), + componentControl: writable({}) }) let mounted = false diff --git a/frontend/src/lib/components/apps/editor/component/ComponentNavigation.svelte b/frontend/src/lib/components/apps/editor/component/ComponentNavigation.svelte index 938d09bb50..98d23cf93b 100644 --- a/frontend/src/lib/components/apps/editor/component/ComponentNavigation.svelte +++ b/frontend/src/lib/components/apps/editor/component/ComponentNavigation.svelte @@ -1,15 +1,13 @@