From dee938a283e76e456239cd256149abfcb62a269d Mon Sep 17 00:00:00 2001 From: zhiyuang Date: Thu, 8 Feb 2024 09:31:20 +0800 Subject: [PATCH 01/15] DropdownInput support preview --- .../node_graph_message_handler/node_properties.rs | 4 ++-- .../src/components/floating-menus/MenuList.svelte | 4 +++- frontend/src/components/widgets/WidgetSpan.svelte | 13 ++++++++++++- .../components/widgets/inputs/DropdownInput.svelte | 12 +++++++++++- frontend/wasm/src/editor_api.rs | 7 +++++++ 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs index 8ce739cebd9..591a6a29cc2 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs @@ -908,7 +908,7 @@ pub fn black_and_white_properties(document_node: &DocumentNode, node_id: NodeId, pub fn blend_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { let backdrop = color_widget(document_node, node_id, 1, "Backdrop", ColorButton::default(), true); let blend_mode = blend_mode(document_node, node_id, 2, "Blend Mode", true); - let opacity = number_widget(document_node, node_id, 3, "Opacity", NumberInput::default().mode_range().min(0.).max(100.).unit("%"), true); + let opacity = number_widget(document_node, node_id, 3, "Opac", NumberInput::default().mode_range().min(0.).max(100.).unit("%"), true); vec![backdrop, blend_mode, LayoutGroup::Row { widgets: opacity }] } @@ -2289,7 +2289,7 @@ pub fn color_fill_properties(document_node: &DocumentNode, node_id: NodeId, _con pub fn color_overlay_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { let color = color_widget(document_node, node_id, 1, "Color", ColorButton::default(), true); let blend_mode = blend_mode(document_node, node_id, 2, "Blend Mode", true); - let opacity = number_widget(document_node, node_id, 3, "Opacity", NumberInput::default().percentage(), true); + let opacity = number_widget(document_node, node_id, 3, "Opaci", NumberInput::default().percentage(), true); vec![color, blend_mode, LayoutGroup::Row { widgets: opacity }] } diff --git a/frontend/src/components/floating-menus/MenuList.svelte b/frontend/src/components/floating-menus/MenuList.svelte index 93727bc262c..c97143ad777 100644 --- a/frontend/src/components/floating-menus/MenuList.svelte +++ b/frontend/src/components/floating-menus/MenuList.svelte @@ -19,7 +19,7 @@ let scroller: LayoutCol | undefined; let searchTextInput: TextInput | undefined; - const dispatch = createEventDispatcher<{ open: boolean; activeEntry: MenuListEntry; naturalWidth: number }>(); + const dispatch = createEventDispatcher<{ open: boolean; activeEntry: MenuListEntry; menuHoverIn: MenuListEntry; menuHoverOut: undefined; naturalWidth: number }>(); export let entries: MenuListEntry[][]; export let activeEntry: MenuListEntry | undefined = undefined; @@ -164,6 +164,7 @@ } function onEntryPointerEnter(menuListEntry: MenuListEntry) { + dispatch("menuHoverIn", menuListEntry); if (!menuListEntry.children?.length) return; let childReference = getChildReference(menuListEntry); @@ -174,6 +175,7 @@ } function onEntryPointerLeave(menuListEntry: MenuListEntry) { + dispatch("menuHoverOut"); if (!menuListEntry.children?.length) return; let childReference = getChildReference(menuListEntry); diff --git a/frontend/src/components/widgets/WidgetSpan.svelte b/frontend/src/components/widgets/WidgetSpan.svelte index 943e14cb3c9..65f8ef18dea 100644 --- a/frontend/src/components/widgets/WidgetSpan.svelte +++ b/frontend/src/components/widgets/WidgetSpan.svelte @@ -66,9 +66,15 @@ } function widgetValueCommitAndUpdate(index: number, value: unknown) { + console.log("widget value commit and udpdate"); editor.instance.widgetValueCommitAndUpdate(layoutTarget, widgets[index].widgetId, value); } + function widgetValueRevert() { + console.log("widget value revert"); + editor.instance.widgetValueRevert(); + } + // TODO: This seems to work, but verify the correctness and terseness of this, it's adapted from https://stackoverflow.com/a/67434028/775283 function exclude(props: T, additional?: (keyof T)[]): Omit ? K : never> { const exclusions = ["kind", ...(additional || [])]; @@ -96,7 +102,12 @@ {/if} {@const dropdownInput = narrowWidgetProps(component.props, "DropdownInput")} {#if dropdownInput} - widgetValueCommitAndUpdate(index, detail)} /> + widgetValueCommitAndUpdate(index, detail)} + on:menuHoverOut={() => widgetValueRevert()} + on:selectedIndex={({ detail }) => widgetValueCommitAndUpdate(index, detail)} + /> {/if} {@const fontInput = narrowWidgetProps(component.props, "FontInput")} {#if fontInput} diff --git a/frontend/src/components/widgets/inputs/DropdownInput.svelte b/frontend/src/components/widgets/inputs/DropdownInput.svelte index 2063be49d08..afe8d80a894 100644 --- a/frontend/src/components/widgets/inputs/DropdownInput.svelte +++ b/frontend/src/components/widgets/inputs/DropdownInput.svelte @@ -10,7 +10,7 @@ const DASH_ENTRY = { value: "", label: "-" }; - const dispatch = createEventDispatcher<{ selectedIndex: number }>(); + const dispatch = createEventDispatcher<{ selectedIndex: number; menuHoverIn: number; menuHoverOut: undefined }>(); let menuList: MenuList | undefined; let self: LayoutRow | undefined; @@ -45,6 +45,14 @@ } } + function dispatchHoverInEntry(hoveredEntry: MenuListEntry) { + dispatch("menuHoverIn", entries.flat().indexOf(hoveredEntry)); + } + + function dispatchHoverOutEntry() { + dispatch("menuHoverOut"); + } + function makeActiveEntry(): MenuListEntry { const allEntries = entries.flat(); @@ -81,6 +89,8 @@ on:naturalWidth={({ detail }) => (minWidth = detail)} {activeEntry} on:activeEntry={({ detail }) => (activeEntry = detail)} + on:menuHoverIn={({ detail }) => dispatchHoverInEntry(detail)} + on:menuHoverOut={() => dispatchHoverOutEntry()} {open} on:open={({ detail }) => (open = detail)} {entries} diff --git a/frontend/wasm/src/editor_api.rs b/frontend/wasm/src/editor_api.rs index 99631d04268..b58ae6cb20a 100644 --- a/frontend/wasm/src/editor_api.rs +++ b/frontend/wasm/src/editor_api.rs @@ -350,6 +350,13 @@ impl JsEditorHandle { Ok(()) } + /// Update the value of a given UI widget, and commit it to the history + #[wasm_bindgen(js_name = widgetValueRevert)] + pub fn widget_value_revert(&self) -> Result<(), JsValue> { + self.dispatch(DocumentMessage::Undo); + Ok(()) + } + #[wasm_bindgen(js_name = loadPreferences)] pub fn load_preferences(&self, preferences: String) { let message = PreferencesMessage::Load { preferences }; From 21e7833c1770cb96cbe07ca66bd8bfb83e0ca28a Mon Sep 17 00:00:00 2001 From: zhiyuang Date: Thu, 8 Feb 2024 15:08:45 +0800 Subject: [PATCH 02/15] fix typo and rm logs --- .../node_graph/node_graph_message_handler/node_properties.rs | 4 ++-- frontend/src/components/widgets/WidgetSpan.svelte | 2 -- frontend/src/components/widgets/inputs/TextAreaInput.svelte | 1 + 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs index 591a6a29cc2..8ce739cebd9 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler/node_properties.rs @@ -908,7 +908,7 @@ pub fn black_and_white_properties(document_node: &DocumentNode, node_id: NodeId, pub fn blend_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { let backdrop = color_widget(document_node, node_id, 1, "Backdrop", ColorButton::default(), true); let blend_mode = blend_mode(document_node, node_id, 2, "Blend Mode", true); - let opacity = number_widget(document_node, node_id, 3, "Opac", NumberInput::default().mode_range().min(0.).max(100.).unit("%"), true); + let opacity = number_widget(document_node, node_id, 3, "Opacity", NumberInput::default().mode_range().min(0.).max(100.).unit("%"), true); vec![backdrop, blend_mode, LayoutGroup::Row { widgets: opacity }] } @@ -2289,7 +2289,7 @@ pub fn color_fill_properties(document_node: &DocumentNode, node_id: NodeId, _con pub fn color_overlay_properties(document_node: &DocumentNode, node_id: NodeId, _context: &mut NodePropertiesContext) -> Vec { let color = color_widget(document_node, node_id, 1, "Color", ColorButton::default(), true); let blend_mode = blend_mode(document_node, node_id, 2, "Blend Mode", true); - let opacity = number_widget(document_node, node_id, 3, "Opaci", NumberInput::default().percentage(), true); + let opacity = number_widget(document_node, node_id, 3, "Opacity", NumberInput::default().percentage(), true); vec![color, blend_mode, LayoutGroup::Row { widgets: opacity }] } diff --git a/frontend/src/components/widgets/WidgetSpan.svelte b/frontend/src/components/widgets/WidgetSpan.svelte index 65f8ef18dea..b3e576233e8 100644 --- a/frontend/src/components/widgets/WidgetSpan.svelte +++ b/frontend/src/components/widgets/WidgetSpan.svelte @@ -66,12 +66,10 @@ } function widgetValueCommitAndUpdate(index: number, value: unknown) { - console.log("widget value commit and udpdate"); editor.instance.widgetValueCommitAndUpdate(layoutTarget, widgets[index].widgetId, value); } function widgetValueRevert() { - console.log("widget value revert"); editor.instance.widgetValueRevert(); } diff --git a/frontend/src/components/widgets/inputs/TextAreaInput.svelte b/frontend/src/components/widgets/inputs/TextAreaInput.svelte index 440fb3533c6..ab4e4bb8291 100644 --- a/frontend/src/components/widgets/inputs/TextAreaInput.svelte +++ b/frontend/src/components/widgets/inputs/TextAreaInput.svelte @@ -20,6 +20,7 @@ // Called only when `value` is changed from the