From da3c98b24d01d7a199de37dd870b6cc236e35fe4 Mon Sep 17 00:00:00 2001 From: Bill Date: Sat, 17 Jul 2021 05:30:30 -0400 Subject: [PATCH] Add stack helper --- src/views/room/RoomView.tsx | 3 +- .../RoomWidgetUpdateCustomStackHeightEvent.ts | 27 +++++ src/views/room/events/index.ts | 1 + ...FurnitureCustomStackHeightWidgetHandler.ts | 61 +++++++++++ src/views/room/handlers/index.ts | 1 + .../FurnitureCustomStackHeightView.tsx | 102 ++++++++++++++---- 6 files changed, 176 insertions(+), 19 deletions(-) create mode 100644 src/views/room/events/RoomWidgetUpdateCustomStackHeightEvent.ts create mode 100644 src/views/room/handlers/FurnitureCustomStackHeightWidgetHandler.ts diff --git a/src/views/room/RoomView.tsx b/src/views/room/RoomView.tsx index 4103324b..0ec62aad 100644 --- a/src/views/room/RoomView.tsx +++ b/src/views/room/RoomView.tsx @@ -7,7 +7,7 @@ import { DispatchTouchEvent } from '../../api/nitro/room/DispatchTouchEvent'; import { GetRoomEngine } from '../../api/nitro/room/GetRoomEngine'; import { RoomContextProvider } from './context/RoomContext'; import { RoomWidgetUpdateRoomViewEvent } from './events/RoomWidgetUpdateRoomViewEvent'; -import { FurnitureContextMenuWidgetHandler, IRoomWidgetHandlerManager, RoomWidgetAvatarInfoHandler, RoomWidgetChatHandler, RoomWidgetChatInputHandler, RoomWidgetHandlerManager, RoomWidgetInfostandHandler } from './handlers'; +import { FurnitureContextMenuWidgetHandler, FurnitureCustomStackHeightWidgetHandler, IRoomWidgetHandlerManager, RoomWidgetAvatarInfoHandler, RoomWidgetChatHandler, RoomWidgetChatInputHandler, RoomWidgetHandlerManager, RoomWidgetInfostandHandler } from './handlers'; import { RoomColorView } from './RoomColorView'; import { RoomViewProps } from './RoomView.types'; import { RoomWidgetsView } from './widgets/RoomWidgetsView'; @@ -39,6 +39,7 @@ export const RoomView: FC = props => widgetHandlerManager.registerHandler(new RoomWidgetChatInputHandler()); widgetHandlerManager.registerHandler(new RoomWidgetChatHandler()); widgetHandlerManager.registerHandler(new FurnitureContextMenuWidgetHandler()); + widgetHandlerManager.registerHandler(new FurnitureCustomStackHeightWidgetHandler()); setWidgetHandler(widgetHandlerManager); diff --git a/src/views/room/events/RoomWidgetUpdateCustomStackHeightEvent.ts b/src/views/room/events/RoomWidgetUpdateCustomStackHeightEvent.ts new file mode 100644 index 00000000..983b5633 --- /dev/null +++ b/src/views/room/events/RoomWidgetUpdateCustomStackHeightEvent.ts @@ -0,0 +1,27 @@ +import { RoomWidgetUpdateEvent } from './RoomWidgetUpdateEvent'; + +export class RoomWidgetUpdateCustomStackHeightEvent extends RoomWidgetUpdateEvent +{ + public static UPDATE_CUSTOM_STACK_HEIGHT: string = 'RWUCSHE_UPDATE_CUSTOM_STACK_HEIGHT'; + + private _objectId: number; + private _height: number; + + constructor(objectId: number, height: number = 0) + { + super(RoomWidgetUpdateCustomStackHeightEvent.UPDATE_CUSTOM_STACK_HEIGHT); + + this._objectId = objectId; + this._height = height; + } + + public get objectId(): number + { + return this._objectId; + } + + public get height(): number + { + return this._height; + } +} diff --git a/src/views/room/events/index.ts b/src/views/room/events/index.ts index c76fb712..60f8d0c8 100644 --- a/src/views/room/events/index.ts +++ b/src/views/room/events/index.ts @@ -6,6 +6,7 @@ export * from './RoomWidgetRoomObjectUpdateEvent'; export * from './RoomWidgetUpdateBackgroundColorPreviewEvent'; export * from './RoomWidgetUpdateChatEvent'; export * from './RoomWidgetUpdateChatInputContentEvent'; +export * from './RoomWidgetUpdateCustomStackHeightEvent'; export * from './RoomWidgetUpdateDanceStatusEvent'; export * from './RoomWidgetUpdateEvent'; export * from './RoomWidgetUpdateInfostandEvent'; diff --git a/src/views/room/handlers/FurnitureCustomStackHeightWidgetHandler.ts b/src/views/room/handlers/FurnitureCustomStackHeightWidgetHandler.ts new file mode 100644 index 00000000..7ffb8231 --- /dev/null +++ b/src/views/room/handlers/FurnitureCustomStackHeightWidgetHandler.ts @@ -0,0 +1,61 @@ +import { NitroEvent, RoomEngineTriggerWidgetEvent, RoomWidgetEnum } from 'nitro-renderer'; +import { GetRoomEngine } from '../../../api'; +import { RoomWidgetUpdateCustomStackHeightEvent, RoomWidgetUpdateEvent } from '../events'; +import { RoomWidgetMessage } from '../messages'; +import { RoomWidgetHandler } from './RoomWidgetHandler'; + +export class FurnitureCustomStackHeightWidgetHandler extends RoomWidgetHandler +{ + private _lastFurniId: number = -1; + + public processEvent(event: NitroEvent): void + { + switch(event.type) + { + case RoomEngineTriggerWidgetEvent.OPEN_WIDGET: { + const widgetEvent = (event as RoomEngineTriggerWidgetEvent); + + const roomObject = GetRoomEngine().getRoomObject(widgetEvent.roomId, widgetEvent.objectId, widgetEvent.category); + + if(!roomObject) return; + + this._lastFurniId = widgetEvent.objectId; + + this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateCustomStackHeightEvent(this._lastFurniId, roomObject.getLocation().z)); + return; + } + case RoomEngineTriggerWidgetEvent.CLOSE_WIDGET: { + const widgetEvent = (event as RoomEngineTriggerWidgetEvent); + + if(widgetEvent.objectId !== this._lastFurniId) return; + + this.container.eventDispatcher.dispatchEvent(new RoomWidgetUpdateCustomStackHeightEvent(-1)); + return; + } + } + } + + public processWidgetMessage(message: RoomWidgetMessage): RoomWidgetUpdateEvent + { + switch(message.type) + { + } + + return null; + } + + public get type(): string + { + return RoomWidgetEnum.CUSTOM_STACK_HEIGHT; + } + + public get eventTypes(): string[] + { + return []; + } + + public get messageTypes(): string[] + { + return []; + } +} diff --git a/src/views/room/handlers/index.ts b/src/views/room/handlers/index.ts index 5c6464e2..1d7bd389 100644 --- a/src/views/room/handlers/index.ts +++ b/src/views/room/handlers/index.ts @@ -1,4 +1,5 @@ export * from './FurnitureContextMenuWidgetHandler'; +export * from './FurnitureCustomStackHeightWidgetHandler'; export * from './IRoomWidgetHandler'; export * from './IRoomWidgetHandlerManager'; export * from './RoomWidgetAvatarInfoHandler'; diff --git a/src/views/room/widgets/furniture/custom-stack-height/FurnitureCustomStackHeightView.tsx b/src/views/room/widgets/furniture/custom-stack-height/FurnitureCustomStackHeightView.tsx index de0fb14c..18debd32 100644 --- a/src/views/room/widgets/furniture/custom-stack-height/FurnitureCustomStackHeightView.tsx +++ b/src/views/room/widgets/furniture/custom-stack-height/FurnitureCustomStackHeightView.tsx @@ -1,48 +1,114 @@ -import { RoomEngineObjectEvent } from 'nitro-renderer'; -import { FC, useCallback, useState } from 'react'; +import { FurnitureStackHeightComposer, FurnitureStackHeightEvent } from 'nitro-renderer'; +import { FC, useCallback, useEffect, useState } from 'react'; +import ReactSlider from 'react-slider'; +import { CreateMessageHook, SendMessageHook } from '../../../../../hooks'; import { CreateEventDispatcherHook } from '../../../../../hooks/events'; import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; import { LocalizeText } from '../../../../../utils/LocalizeText'; import { useRoomContext } from '../../../context/RoomContext'; -import { RoomWidgetRoomObjectUpdateEvent } from '../../../events'; +import { RoomWidgetUpdateCustomStackHeightEvent } from '../../../events'; + +const MAX_HEIGHT: number = 40; export const FurnitureCustomStackHeightView: FC<{}> = props => { const [ objectId, setObjectId ] = useState(-1); + const [ height, setHeight ] = useState(0); + const [ pendingHeight, setPendingHeight ] = useState(-1); + const { roomSession = null, eventDispatcher = null } = useRoomContext(); const close = useCallback(() => { setObjectId(-1); + setHeight(0); }, []); - const onRoomEngineObjectEvent = useCallback((event: RoomEngineObjectEvent) => + const updateHeight = useCallback((height: number, fromServer: boolean = false) => + { + if(!height) height = 0; + + height = Math.abs(height); + + if(!fromServer) ((height > MAX_HEIGHT) && (height = MAX_HEIGHT)); + + setHeight(parseFloat(height.toFixed(2))); + + if(!fromServer) setPendingHeight(height * 100); + }, []); + + const onRoomWidgetUpdateCustomStackHeightEvent = useCallback((event: RoomWidgetUpdateCustomStackHeightEvent) => { switch(event.type) { - // case RoomEngineTriggerWidgetEvent.REQUEST_CUSTOM_STACK_HEIGHT: { - // setObjectId(event.objectId); - // return; - // } - case RoomWidgetRoomObjectUpdateEvent.FURNI_REMOVED: { - if(objectId !== event.objectId) return; - - close(); - return; + case RoomWidgetUpdateCustomStackHeightEvent.UPDATE_CUSTOM_STACK_HEIGHT: { + setObjectId(event.objectId); + updateHeight(event.height, true); } } - }, [ objectId, close ]); + }, [ updateHeight ]); - //useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_CUSTOM_STACK_HEIGHT, onRoomEngineObjectEvent); - CreateEventDispatcherHook(RoomWidgetRoomObjectUpdateEvent.FURNI_REMOVED, eventDispatcher, onRoomEngineObjectEvent); + CreateEventDispatcherHook(RoomWidgetUpdateCustomStackHeightEvent.UPDATE_CUSTOM_STACK_HEIGHT, eventDispatcher, onRoomWidgetUpdateCustomStackHeightEvent); + + const onFurnitureStackHeightEvent = useCallback((event: FurnitureStackHeightEvent) => + { + const parser = event.getParser(); + + if(objectId !== parser.furniId) return; + + updateHeight(parser.height, true); + }, [ objectId, updateHeight ]); + + CreateMessageHook(FurnitureStackHeightEvent, onFurnitureStackHeightEvent); + + const sendUpdate = useCallback((height: number) => + { + SendMessageHook(new FurnitureStackHeightComposer(objectId, ~~(height))); + }, [ objectId ]); + + const placeAboveStack = useCallback(() => + { + sendUpdate(-100); + }, [ sendUpdate ]); + + const placeAtFloor = useCallback(() => + { + sendUpdate(0); + }, [ sendUpdate ]); + + useEffect(() => + { + if((objectId === -1) || (pendingHeight === -1)) return; + + const timeout = setTimeout(() => sendUpdate(~~(pendingHeight)), 10); + + return () => clearTimeout(timeout); + }, [ objectId, pendingHeight, sendUpdate ]); if(objectId === -1) return null; return ( - + - custom stack height +
+ + updateHeight(event) } + renderThumb={ (props, state) =>
{ state.valueNow }
} /> +
+
+ updateHeight(parseFloat(event.target.value)) } /> +
+
+ + +
);