From 96f1f8ec396f3e7771f84d7bfe30cd79788a1aef Mon Sep 17 00:00:00 2001 From: Danny McGee Date: Wed, 28 Feb 2024 16:23:15 -0500 Subject: [PATCH] Add button to attach IK rig --- studio-frontend/src/app/app.element.ts | 42 +++++++++++++++++-- studio-ui/src/lib/button.element.scss | 6 +++ studio-ui/src/lib/button.element.ts | 13 +++++- studio-ui/src/lib/icon.element.ts | 2 + studio-web/src/lib/scene-hierarchy.element.ts | 2 +- 5 files changed, 59 insertions(+), 6 deletions(-) diff --git a/studio-frontend/src/app/app.element.ts b/studio-frontend/src/app/app.element.ts index 0ef0494..1c8c3ec 100644 --- a/studio-frontend/src/app/app.element.ts +++ b/studio-frontend/src/app/app.element.ts @@ -1,12 +1,18 @@ import { on } from "@storyteller/framework"; import * as studio from "@storyteller/studio"; import { + type EntitySelectEvent, type SceneSavedEvent, type SceneStateEvent, SceneState, StudioMode, + SceneElement, } from "@storyteller/studio"; -import { StudioURLParams } from "@storyteller/studio-web"; +import { + SceneHierarchyElement, + type SceneObject, + StudioURLParams, +} from "@storyteller/studio-web"; import { CanvasProvider } from "@storyteller/studio-web/canvas-provider"; import { match } from "@storyteller/utility"; import { LitElement, html, nothing } from "lit"; @@ -33,6 +39,9 @@ export class AppElement extends LitElement { @state() showHelp = false; @state() loading = true; + @state() selection?: SceneObject; + + #hierarchy = createRef(); #params = new StudioURLParams(); #canvasProvider: Ref = createRef(); @@ -72,6 +81,15 @@ export class AppElement extends LitElement { }); } + @on("entity-select") + onEntitySelected({ detail: id }: EntitySelectEvent): void { + if (!id) { + this.selection = undefined; + } else { + this.selection = this.#hierarchy.value?.entityMap.get(id); + } + } + toggleHelp(): void { this.showHelp = !this.showHelp; } @@ -102,6 +120,15 @@ export class AppElement extends LitElement { > Save + { + console.log("Attach IK rig"); + }} + > + Attach IK Rig + ` : nothing} ${this.#params.mode === StudioMode.Editor ? html` - - - + + + ` : nothing} diff --git a/studio-ui/src/lib/button.element.scss b/studio-ui/src/lib/button.element.scss index 2939af9..a171b45 100644 --- a/studio-ui/src/lib/button.element.scss +++ b/studio-ui/src/lib/button.element.scss @@ -31,6 +31,12 @@ color: #FFFF; } +:host(.disabled), +:host(.disabled:hover) { + background: #0003; + color: #FFF6; +} + .icon { fill: currentColor; } diff --git a/studio-ui/src/lib/button.element.ts b/studio-ui/src/lib/button.element.ts index a50ec94..73d6f5b 100644 --- a/studio-ui/src/lib/button.element.ts +++ b/studio-ui/src/lib/button.element.ts @@ -1,5 +1,5 @@ import { on } from "@storyteller/framework"; -import { LitElement, html, nothing, unsafeCSS } from "lit"; +import { LitElement, type PropertyValues, html, nothing, unsafeCSS } from "lit"; import { customElement, property } from "lit/decorators.js"; import styles from "./button.element.scss?inline"; @@ -11,10 +11,21 @@ export class ButtonElement extends LitElement { static override styles = unsafeCSS(styles); @property() icon?: string; + @property({ type: Boolean }) disabled = false; override role = "button"; override tabIndex = 0; + protected override willUpdate(changes: PropertyValues): void { + if (changes.has("disabled")) { + this.ariaDisabled = this.disabled ? "true" : null; + this.tabIndex = this.disabled ? -1 : 0; + this.classList.toggle("disabled", this.disabled); + } + + super.willUpdate(changes); + } + @on("keydown") onKeyDown(event: KeyboardEvent) { if (/^( |Enter)$/.test(event.key)) { diff --git a/studio-ui/src/lib/icon.element.ts b/studio-ui/src/lib/icon.element.ts index 0f10b2f..27a8968 100644 --- a/studio-ui/src/lib/icon.element.ts +++ b/studio-ui/src/lib/icon.element.ts @@ -28,6 +28,7 @@ import fasCheck from "@fortawesome/fontawesome-pro/svgs/solid/check.svg?raw"; import fasXmark from "@fortawesome/fontawesome-pro/svgs/solid/xmark.svg?raw"; import fasCircleCheck from "@fortawesome/fontawesome-pro/svgs/solid/circle-check.svg?raw"; import fasCircleXmark from "@fortawesome/fontawesome-pro/svgs/solid/circle-xmark.svg?raw"; +import farShareNodes from "@fortawesome/fontawesome-pro/svgs/regular/share-nodes.svg?raw"; import styles from "./icon.element.scss?inline"; @@ -74,6 +75,7 @@ function renderSvg(iconId: string) { "question": () => fasQuestion, "rotate": () => farRotate, "scale": () => farScale, + "share-nodes": () => farShareNodes, "skeleton": () => farSkeleton, "up-down-left-right": () => farUpDownLeftRight, "video": () => farVideo, diff --git a/studio-web/src/lib/scene-hierarchy.element.ts b/studio-web/src/lib/scene-hierarchy.element.ts index 7b14c1a..5d06e05 100644 --- a/studio-web/src/lib/scene-hierarchy.element.ts +++ b/studio-web/src/lib/scene-hierarchy.element.ts @@ -14,7 +14,7 @@ import styles from "./scene-hierarchy.element.scss?inline"; import "@storyteller/studio-ui/tree"; -interface SceneObject extends Omit { +export interface SceneObject extends Omit { icon?: string; children: SceneObject[]; }