Moodlight update

This commit is contained in:
MyNameIsBatman 2021-09-14 02:56:29 -03:00
parent ecc6f26ae9
commit 6d3c205436
6 changed files with 106 additions and 33 deletions

View File

@ -1,16 +1,16 @@
export class RoomDimmerPreset export class RoomDimmerPreset
{ {
private _id: number = 0; private _id: number;
private _type: number = 0; private _bgOnly: boolean;
private _color: number = 0; private _color: string;
private _intensity: number = 0; private _brightness: number;
constructor(id: number, type: number, color: number, intensity: number) constructor(id: number, bgOnly: boolean, color: string, brightness: number)
{ {
this._id = id; this._id = id;
this._type = type; this._bgOnly = bgOnly;
this._color = color; this._color = color;
this._intensity = intensity; this._brightness = brightness;
} }
public get id(): number public get id(): number
@ -18,18 +18,18 @@ export class RoomDimmerPreset
return this._id; return this._id;
} }
public get type(): number public get bgOnly(): boolean
{ {
return this._type; return this._bgOnly;
} }
public get color(): number public get color(): string
{ {
return this._color; return this._color;
} }
public get _Str_4272(): number public get brightness(): number
{ {
return this._intensity; return this._brightness;
} }
} }

View File

@ -36,9 +36,9 @@ export class RoomWidgetDimmerUpdateEvent extends RoomWidgetUpdateEvent
this._selectedPresetId = k; this._selectedPresetId = k;
} }
public setPresetValues(id: number, type: number, color: number, intensity: number):void public setPresetValues(id: number, bgOnly: boolean, color: string, brightness: number):void
{ {
const preset = new RoomDimmerPreset(id, type, color, intensity); const preset = new RoomDimmerPreset(id, bgOnly, color, brightness);
this._presets[(id - 1)] = preset; this._presets[(id - 1)] = preset;
} }

View File

@ -25,7 +25,7 @@ export class FurnitureDimmerWidgetHandler extends RoomWidgetHandler
{ {
const preset = presetsEvent.getPreset(i); const preset = presetsEvent.getPreset(i);
if(preset) updateEvent.setPresetValues(preset.id, preset.type, preset.color, preset.light); if(preset) updateEvent.setPresetValues(preset.id, preset.bgOnly, preset.color, preset.brightness);
i++; i++;
} }

View File

@ -1,6 +1,7 @@
import { RoomEngineDimmerStateEvent, RoomEngineEvent, RoomEngineObjectEvent, RoomEngineTriggerWidgetEvent, RoomEngineUseProductEvent, RoomId, RoomObjectCategory, RoomObjectOperationType, RoomSessionChatEvent, RoomSessionDanceEvent, RoomSessionDimmerPresetsEvent, RoomSessionDoorbellEvent, RoomSessionErrorMessageEvent, RoomSessionEvent, RoomSessionFriendRequestEvent, RoomSessionPetInfoUpdateEvent, RoomSessionPresentEvent, RoomSessionUserBadgesEvent, RoomZoomEvent } from '@nitrots/nitro-renderer'; import { RoomEngineDimmerStateEvent, RoomEngineEvent, RoomEngineObjectEvent, RoomEngineTriggerWidgetEvent, RoomEngineUseProductEvent, RoomId, RoomObjectCategory, RoomObjectOperationType, RoomSessionChatEvent, RoomSessionDanceEvent, RoomSessionDimmerPresetsEvent, RoomSessionDoorbellEvent, RoomSessionErrorMessageEvent, RoomSessionEvent, RoomSessionFriendRequestEvent, RoomSessionPetInfoUpdateEvent, RoomSessionPresentEvent, RoomSessionUserBadgesEvent, RoomZoomEvent } from '@nitrots/nitro-renderer';
import { FC, useCallback } from 'react'; import { FC, useCallback } from 'react';
import { CanManipulateFurniture, GetRoomEngine, IsFurnitureSelectionDisabled, LocalizeText, ProcessRoomObjectOperation, RoomWidgetFurniToWidgetMessage, RoomWidgetRoomEngineUpdateEvent, RoomWidgetRoomObjectUpdateEvent } from '../../../api'; import { CanManipulateFurniture, GetRoomEngine, IsFurnitureSelectionDisabled, LocalizeText, ProcessRoomObjectOperation, RoomWidgetFurniToWidgetMessage, RoomWidgetRoomEngineUpdateEvent, RoomWidgetRoomObjectUpdateEvent } from '../../../api';
import { RoomWidgetDimmerStateUpdateEvent } from '../../../api/nitro/room/widgets/events/RoomWidgetDimmerStateUpdateEvent';
import { useRoomEngineEvent, useRoomSessionManagerEvent } from '../../../hooks/events'; import { useRoomEngineEvent, useRoomSessionManagerEvent } from '../../../hooks/events';
import { useRoomContext } from '../context/RoomContext'; import { useRoomContext } from '../context/RoomContext';
import { AvatarInfoWidgetView } from './avatar-info/AvatarInfoWidgetView'; import { AvatarInfoWidgetView } from './avatar-info/AvatarInfoWidgetView';
@ -42,6 +43,9 @@ export const RoomWidgetsView: FC<RoomWidgetViewProps> = props =>
return; return;
} }
case RoomEngineDimmerStateEvent.ROOM_COLOR: { case RoomEngineDimmerStateEvent.ROOM_COLOR: {
const stateEvent = (event as RoomEngineDimmerStateEvent);
eventDispatcher.dispatchEvent(new RoomWidgetDimmerStateUpdateEvent(stateEvent.state, stateEvent.presetId, stateEvent.effectId, stateEvent.color, stateEvent.brightness));
return; return;
} }
} }

View File

@ -2,6 +2,5 @@ export class FurnitureDimmerData
{ {
constructor( constructor(
public objectId: number, public objectId: number,
public category: number, public category: number) {}
public active: boolean) {}
} }

View File

@ -1,10 +1,12 @@
import { NitroEvent, RoomEngineTriggerWidgetEvent, RoomObjectVariable } from '@nitrots/nitro-renderer'; import { NitroEvent, RoomEngineTriggerWidgetEvent } from '@nitrots/nitro-renderer';
import { FC, useCallback, useState } from 'react'; import { FC, useCallback, useEffect, useMemo, useState } from 'react';
import { GetRoomEngine, LocalizeText, RoomWidgetDimmerUpdateEvent, RoomWidgetRoomObjectUpdateEvent } from '../../../../../api'; import ReactSlider from 'react-slider';
import { GetRoomEngine, LocalizeText, RoomWidgetDimmerPreviewMessage, RoomWidgetDimmerSavePresetMessage, RoomWidgetDimmerUpdateEvent, RoomWidgetFurniToWidgetMessage, RoomWidgetRoomObjectUpdateEvent } from '../../../../../api';
import { RoomDimmerPreset } from '../../../../../api/nitro/room/widgets/events/RoomDimmerPreset';
import { RoomWidgetDimmerStateUpdateEvent } from '../../../../../api/nitro/room/widgets/events/RoomWidgetDimmerStateUpdateEvent'; import { RoomWidgetDimmerStateUpdateEvent } from '../../../../../api/nitro/room/widgets/events/RoomWidgetDimmerStateUpdateEvent';
import { RoomWidgetDimmerChangeStateMessage } from '../../../../../api/nitro/room/widgets/messages/RoomWidgetDimmerChangeStateMessage'; import { RoomWidgetDimmerChangeStateMessage } from '../../../../../api/nitro/room/widgets/messages/RoomWidgetDimmerChangeStateMessage';
import { CreateEventDispatcherHook, useRoomEngineEvent } from '../../../../../hooks'; import { CreateEventDispatcherHook, useRoomEngineEvent } from '../../../../../hooks';
import { NitroCardContentView, NitroCardHeaderView, NitroCardView } from '../../../../../layout'; import { NitroCardContentView, NitroCardHeaderView, NitroCardTabsItemView, NitroCardTabsView, NitroCardView } from '../../../../../layout';
import { useRoomContext } from '../../../context/RoomContext'; import { useRoomContext } from '../../../context/RoomContext';
import { FurnitureDimmerData } from './FurnitureDimmerData'; import { FurnitureDimmerData } from './FurnitureDimmerData';
@ -13,21 +15,52 @@ export const FurnitureDimmerView: FC<{}> = props =>
const { eventDispatcher = null, widgetHandler = null } = useRoomContext(); const { eventDispatcher = null, widgetHandler = null } = useRoomContext();
const [ dimmerData, setDimmerData ] = useState<FurnitureDimmerData>(null); const [ dimmerData, setDimmerData ] = useState<FurnitureDimmerData>(null);
const [ isActive, setIsActive ] = useState<boolean>(false);
const [ selectedPresetId, setSelectedPresetId ] = useState<number>(-1);
const [ presets, setPresets ] = useState<RoomDimmerPreset[]>([]);
const [ previewColor, setPreviewColor ] = useState<string>('#000000');
const [ previewBrightness, setPreviewBrightness ] = useState<number>(125);
const [ previewBgOnly, setPreviewBgOnly ] = useState<boolean>(false);
const previewColorInt = useMemo(() =>
{
return parseInt(previewColor.replace('#', ''), 16);
}, [ previewColor ]);
useEffect(() =>
{
if(selectedPresetId === -1 || presets.length === 0 || !isActive) return;
const preset = presets[selectedPresetId - 1];
if(!preset) return;
setPreviewColor(preset.color);
setPreviewBrightness(preset.brightness);
setPreviewBgOnly(preset.bgOnly);
}, [ selectedPresetId, presets ]);
useEffect(() =>
{
if(!widgetHandler || selectedPresetId === -1 || !isActive) return;
widgetHandler.processWidgetMessage(new RoomWidgetDimmerPreviewMessage(previewColorInt, previewBrightness, previewBgOnly));
}, [ previewBgOnly, previewBrightness, previewColor ]);
const onNitroEvent = useCallback((event: NitroEvent) => const onNitroEvent = useCallback((event: NitroEvent) =>
{ {
switch(event.type) switch(event.type)
{ {
case RoomEngineTriggerWidgetEvent.REQUEST_DIMMER: { case RoomEngineTriggerWidgetEvent.REQUEST_DIMMER: {
const widgetEvent = (event as RoomEngineTriggerWidgetEvent); const widgetEvent = (event as RoomEngineTriggerWidgetEvent);
console.log(widgetEvent);
const roomObject = GetRoomEngine().getRoomObject(widgetEvent.roomId, widgetEvent.objectId, widgetEvent.category); const roomObject = GetRoomEngine().getRoomObject(widgetEvent.roomId, widgetEvent.objectId, widgetEvent.category);
if(!roomObject) return; if(!roomObject) return;
const data = roomObject.model.getValue<string[]>(RoomObjectVariable.FURNITURE_DATA); setDimmerData(new FurnitureDimmerData(widgetEvent.objectId, widgetEvent.category));
widgetHandler.processWidgetMessage(new RoomWidgetFurniToWidgetMessage(RoomWidgetFurniToWidgetMessage.REQUEST_DIMMER, widgetEvent.objectId, widgetEvent.category, widgetEvent.roomId));
setDimmerData(new FurnitureDimmerData(widgetEvent.objectId, widgetEvent.category, false));
return; return;
} }
case RoomWidgetRoomObjectUpdateEvent.FURNI_REMOVED: { case RoomWidgetRoomObjectUpdateEvent.FURNI_REMOVED: {
@ -44,24 +77,25 @@ export const FurnitureDimmerView: FC<{}> = props =>
case RoomWidgetDimmerUpdateEvent.PRESETS: { case RoomWidgetDimmerUpdateEvent.PRESETS: {
const widgetEvent = (event as RoomWidgetDimmerUpdateEvent); const widgetEvent = (event as RoomWidgetDimmerUpdateEvent);
console.log(widgetEvent); setPresets(widgetEvent.presets);
setSelectedPresetId(widgetEvent.selectedPresetId);
return; return;
} }
case RoomWidgetDimmerStateUpdateEvent.DIMMER_STATE: { case RoomWidgetDimmerStateUpdateEvent.DIMMER_STATE: {
const widgetEvent = (event as RoomWidgetDimmerStateUpdateEvent); const widgetEvent = (event as RoomWidgetDimmerStateUpdateEvent);
console.log(widgetEvent); setIsActive(widgetEvent.state === 1);
return; return;
} }
} }
}, []); }, [ widgetHandler ]);
useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_DIMMER, onNitroEvent); useRoomEngineEvent(RoomEngineTriggerWidgetEvent.REQUEST_DIMMER, onNitroEvent);
CreateEventDispatcherHook(RoomWidgetRoomObjectUpdateEvent.FURNI_REMOVED, eventDispatcher, onNitroEvent); CreateEventDispatcherHook(RoomWidgetRoomObjectUpdateEvent.FURNI_REMOVED, eventDispatcher, onNitroEvent);
CreateEventDispatcherHook(RoomWidgetDimmerUpdateEvent.PRESETS, eventDispatcher, onNitroEvent); CreateEventDispatcherHook(RoomWidgetDimmerUpdateEvent.PRESETS, eventDispatcher, onNitroEvent);
CreateEventDispatcherHook(RoomWidgetDimmerStateUpdateEvent.DIMMER_STATE, eventDispatcher, onNitroEvent); CreateEventDispatcherHook(RoomWidgetDimmerStateUpdateEvent.DIMMER_STATE, eventDispatcher, onNitroEvent);
const processAction = useCallback((type: string, value: string = null) => const processAction = useCallback((type: string) =>
{ {
switch(type) switch(type)
{ {
@ -71,20 +105,56 @@ export const FurnitureDimmerView: FC<{}> = props =>
case 'close': case 'close':
setDimmerData(null); setDimmerData(null);
return; return;
case 'save':
widgetHandler.processWidgetMessage(new RoomWidgetDimmerSavePresetMessage(selectedPresetId, previewBgOnly ? 2 : 1, previewColorInt, previewBrightness, true));
return;
} }
}, [ widgetHandler ]); }, [ previewBgOnly, previewBrightness, previewColorInt, selectedPresetId, widgetHandler ]);
if(!dimmerData) return null; if(!dimmerData) return null;
return ( return (
<NitroCardView className="nitro-dimmer" simple={ true }> <NitroCardView className="nitro-dimmer">
<NitroCardHeaderView headerText={ LocalizeText('widget.dimmer.title') } onCloseClick={ () => processAction('close') } /> <NitroCardHeaderView headerText={ LocalizeText('widget.dimmer.title') } onCloseClick={ () => processAction('close') } />
<NitroCardContentView> <NitroCardContentView className="p-0">
{ !dimmerData.active && <div className="d-flex flex-column gap-2 align-items-center"> { !isActive && <div className="d-flex flex-column gap-2 align-items-center p-2">
<div className="dimmer-banner"></div> <div className="dimmer-banner"></div>
<div className="bg-muted rounded p-1 text-center text-black">{ LocalizeText('widget.dimmer.info.off') }</div> <div className="bg-muted rounded p-1 text-center text-black">{ LocalizeText('widget.dimmer.info.off') }</div>
<button className="btn-success btn w-100" onClick={ () => processAction('toggle_state') }>{ LocalizeText('widget.dimmer.button.on') }</button> <button className="btn-success btn w-100" onClick={ () => processAction('toggle_state') }>{ LocalizeText('widget.dimmer.button.on') }</button>
</div> } </div> }
{ isActive && <>
<NitroCardTabsView>
{ presets.map(preset =>
{
return <NitroCardTabsItemView key={ preset.id } isActive={ selectedPresetId === preset.id } onClick={ () => setSelectedPresetId(preset.id) }>{ LocalizeText(`widget.dimmer.tab.${preset.id}`) }</NitroCardTabsItemView>
}) }
</NitroCardTabsView>
<div className="p-2">
<div className="form-group mb-2">
<label className="fw-bold text-black">{ LocalizeText('widget.backgroundcolor.hue') }</label>
<input type="color" className="form-control" value={ previewColor } onChange={ (e) => setPreviewColor(e.target.value) } />
</div>
<div className="form-group mb-2">
<label className="fw-bold text-black">{ LocalizeText('widget.backgroundcolor.lightness') }</label>
<ReactSlider
className={ 'nitro-slider' }
min={ 75 }
max={ 255 }
value={ previewBrightness }
onChange={ newValue => setPreviewBrightness(newValue) }
thumbClassName={ 'thumb degree' }
renderThumb={ (props, state) => <div {...props}>{ state.valueNow - 75 }</div> } />
</div>
<div className="form-check mb-2">
<input className="form-check-input" type="checkbox" checked={ previewBgOnly } onChange={ (e) => setPreviewBgOnly(e.target.checked) } />
<label className="form-check-label text-black">{ LocalizeText('widget.dimmer.type.checkbox') }</label>
</div>
<div className="d-flex gap-2">
<button className="btn btn-danger w-100" onClick={ () => processAction('toggle_state') }>{ LocalizeText('widget.dimmer.button.off') }</button>
<button className="btn btn-success w-100" onClick={ () => processAction('save') }>{ LocalizeText('widget.dimmer.button.apply') }</button>
</div>
</div>
</> }
</NitroCardContentView> </NitroCardContentView>
</NitroCardView> </NitroCardView>
); );