From 73a2743b133e32abbe4047abbd8ea75a7e30685c Mon Sep 17 00:00:00 2001 From: Manuel Martin Date: Wed, 9 Aug 2023 12:51:15 +0200 Subject: [PATCH] Add link initialization support --- src/bit-components.js | 1 + src/bit-systems/link-hover-menu.ts | 26 ++++++++++++++++++++------ src/bit-systems/link-system.ts | 15 ++++++++------- src/inflators/link.ts | 3 ++- 4 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/bit-components.js b/src/bit-components.js index 39498d4133..0361d6af66 100644 --- a/src/bit-components.js +++ b/src/bit-components.js @@ -264,6 +264,7 @@ export const Link = defineComponent({ type: Types.ui8 }); Link.url[$isStringType] = true; +export const LinkInitializing = defineComponent(); // TODO: Store this data elsewhere, since only one or two will ever exist. export const PDFMenu = defineComponent({ prevButtonRef: Types.eid, diff --git a/src/bit-systems/link-hover-menu.ts b/src/bit-systems/link-hover-menu.ts index f20c233ef1..a285ee19ba 100644 --- a/src/bit-systems/link-hover-menu.ts +++ b/src/bit-systems/link-hover-menu.ts @@ -1,6 +1,14 @@ -import { defineQuery, entityExists } from "bitecs"; +import { Not, defineQuery, entityExists } from "bitecs"; import type { HubsWorld } from "../app"; -import { Link, LinkHoverMenu, HoveredRemoteRight, TextTag, Interacted, LinkHoverMenuItem } from "../bit-components"; +import { + Link, + LinkHoverMenu, + HoveredRemoteRight, + TextTag, + Interacted, + LinkHoverMenuItem, + LinkInitializing +} from "../bit-components"; import { findAncestorWithComponent, findChildWithComponent } from "../utils/bit-utils"; import { hubIdFromUrl } from "../utils/media-url-utils"; import { Text as TroikaText } from "troika-three-text"; @@ -11,7 +19,8 @@ import { setMatrixWorld } from "../utils/three-utils"; import { LinkType } from "../inflators/link"; const menuQuery = defineQuery([LinkHoverMenu]); -const hoveredLinksQuery = defineQuery([HoveredRemoteRight, Link]); +const hoveredLinksQuery = defineQuery([HoveredRemoteRight, Link, Not(LinkInitializing)]); +const hoveredMenuItemQuery = defineQuery([HoveredRemoteRight, LinkHoverMenuItem]); const clickedMenuItemQuery = defineQuery([Interacted, LinkHoverMenuItem]); function updateLinkMenuTarget(world: HubsWorld, menu: EntityID, sceneIsFrozen: boolean) { @@ -24,9 +33,14 @@ function updateLinkMenuTarget(world: HubsWorld, menu: EntityID, sceneIsFrozen: b LinkHoverMenu.targetObjectRef[menu] = 0; } - const hoveredLinks = hoveredLinksQuery(world); - if (hoveredLinks.length > 0) { - LinkHoverMenu.targetObjectRef[menu] = hoveredLinks[0]; + const hoveredLink = hoveredLinksQuery(world); + if (hoveredLink.length > 0) { + LinkHoverMenu.targetObjectRef[menu] = hoveredLink[0]; + LinkHoverMenu.clearTargetTimer[menu] = world.time.elapsed + 1000; + } + + const hoveredMenuItem = hoveredMenuItemQuery(world); + if (hoveredMenuItem.length > 0) { LinkHoverMenu.clearTargetTimer[menu] = world.time.elapsed + 1000; } diff --git a/src/bit-systems/link-system.ts b/src/bit-systems/link-system.ts index ff39e35294..6e1f309d7d 100644 --- a/src/bit-systems/link-system.ts +++ b/src/bit-systems/link-system.ts @@ -1,14 +1,14 @@ -import { defineQuery, enterQuery, exitQuery } from "bitecs"; +import { defineQuery, enterQuery, exitQuery, removeComponent } from "bitecs"; import type { HubsWorld } from "../app"; -import { Link } from "../bit-components"; +import { Link, LinkInitializing } from "../bit-components"; import { isHubsRoomUrl, isLocalHubsAvatarUrl, isLocalHubsSceneUrl, isLocalHubsUrl } from "../utils/media-url-utils"; import { LinkType } from "../inflators/link"; import { JobRunner } from "../utils/coroutine-utils"; import { EntityID } from "../utils/networking-types"; -const linkQuery = defineQuery([Link]); -const linkEnterQuery = enterQuery(linkQuery); -const linkExitQuery = exitQuery(linkQuery); +const linkInitializingQuery = defineQuery([LinkInitializing, Link]); +const linkInitializingEnterQuery = enterQuery(linkInitializingQuery); +const linkInitializingExitQuery = exitQuery(linkInitializingQuery); function* updateLinkType(world: HubsWorld, eid: EntityID) { const mayChangeScene = (APP.scene?.systems as any).permissions.canOrWillIfCreator("update_hub"); @@ -28,15 +28,16 @@ function* updateLinkType(world: HubsWorld, eid: EntityID) { Link.type[eid] = LinkType.ROOM_URL; } } + removeComponent(world, LinkInitializing, eid); } const jobs = new JobRunner(); export function linkSystem(world: HubsWorld) { - linkEnterQuery(world).forEach(eid => { + linkInitializingEnterQuery(world).forEach(eid => { jobs.stop(eid); jobs.add(eid, () => updateLinkType(world, eid)); }); - linkExitQuery(world).forEach(eid => { + linkInitializingExitQuery(world).forEach(eid => { jobs.stop(eid); }); jobs.tick(); diff --git a/src/inflators/link.ts b/src/inflators/link.ts index 3a53405654..4199b641a0 100644 --- a/src/inflators/link.ts +++ b/src/inflators/link.ts @@ -1,5 +1,5 @@ import { addComponent } from "bitecs"; -import { Link } from "../bit-components"; +import { Link, LinkInitializing } from "../bit-components"; import { HubsWorld } from "../app"; export enum LinkType { @@ -17,6 +17,7 @@ export type LinkParams = { }; export function inflateLink(world: HubsWorld, eid: number, params: LinkParams): number { + addComponent(world, LinkInitializing, eid); addComponent(world, Link, eid); Link.url[eid] = APP.getSid(params.href); Link.type[eid] = params.type !== undefined ? params.type : LinkType.LINK;