diff --git a/fission/src/mirabuf/MirabufSceneObject.ts b/fission/src/mirabuf/MirabufSceneObject.ts index be780b0436..ed2c9d6427 100644 --- a/fission/src/mirabuf/MirabufSceneObject.ts +++ b/fission/src/mirabuf/MirabufSceneObject.ts @@ -313,6 +313,8 @@ class MirabufSceneObject extends SceneObject implements ContextSupplier { if (this.miraType === MiraType.ROBOT || !cameraControls.focusProvider) { cameraControls.focusProvider = this } + + MirabufObjectChangeEvent.dispatch(this) } // Centered in xz plane, bottom surface of object @@ -431,6 +433,7 @@ class MirabufSceneObject extends SceneObject implements ContextSupplier { if (this._brain && this._brain instanceof SynthesisBrain) { this._brain.clearControls() } + MirabufObjectChangeEvent.dispatch(null) } public eject() { @@ -986,3 +989,29 @@ export class RigidNodeAssociate extends BodyAssociate { } export default MirabufSceneObject + +export class MirabufObjectChangeEvent extends Event { + private static _eventKey = "MirabufObjectChange" + private _obj: MirabufSceneObject | null + + private constructor(obj: MirabufSceneObject | null) { + super(MirabufObjectChangeEvent._eventKey) + this._obj = obj + } + + public static addEventListener(cb: (object: MirabufSceneObject | null) => void): () => void { + const listener = (event: Event) => { + if (event instanceof MirabufObjectChangeEvent) { + cb(event._obj) + } else { + cb(null) + } + } + window.addEventListener(this._eventKey, listener) + return () => window.removeEventListener(this._eventKey, listener) + } + + public static dispatch(obj: MirabufSceneObject | null) { + window.dispatchEvent(new MirabufObjectChangeEvent(obj)) + } +} diff --git a/fission/src/ui/UIProvider.tsx b/fission/src/ui/UIProvider.tsx index 9cb2c7c00f..1bac6eb363 100644 --- a/fission/src/ui/UIProvider.tsx +++ b/fission/src/ui/UIProvider.tsx @@ -1,5 +1,4 @@ import CloseIcon from "@mui/icons-material/Close" -import { IconButton } from "./components/StyledComponents" import type { SnackbarKey, SnackbarMessage, VariantType } from "notistack" import { useSnackbar } from "notistack" import type React from "react" @@ -8,6 +7,7 @@ import { useCallback, useReducer, useState } from "react" import { v4 as uuidv4 } from "uuid" import type { ModalImplProps } from "./components/Modal" import type { PanelImplProps } from "./components/Panel" +import { IconButton } from "./components/StyledComponents" import { CloseType, type ConfigureScreenFn, diff --git a/fission/src/ui/components/AnalyticsConsent.tsx b/fission/src/ui/components/AnalyticsConsent.tsx index 400ff46970..de07f8e758 100644 --- a/fission/src/ui/components/AnalyticsConsent.tsx +++ b/fission/src/ui/components/AnalyticsConsent.tsx @@ -1,7 +1,7 @@ import { Box } from "@mui/material" -import { Button } from "./StyledComponents" import { AiOutlineClose } from "react-icons/ai" import Label from "./Label" +import { Button } from "./StyledComponents" interface AnalyticsConsentProps { onClose: () => void diff --git a/fission/src/ui/components/ContextMenu.tsx b/fission/src/ui/components/ContextMenu.tsx index f1cd8a9937..8440a694aa 100644 --- a/fission/src/ui/components/ContextMenu.tsx +++ b/fission/src/ui/components/ContextMenu.tsx @@ -1,10 +1,10 @@ import { Divider, Stack } from "@mui/material" -import { Button } from "./StyledComponents" import type React from "react" import { useEffect, useState } from "react" import { type ContextData, ContextSupplierEvent } from "./ContextMenuData" import { globalOpenModal, globalOpenPanel } from "./GlobalUIControls" import Label from "./Label" +import { Button } from "./StyledComponents" interface ContextMenuStateData { data: ContextData diff --git a/fission/src/ui/components/MainHUD.tsx b/fission/src/ui/components/MainHUD.tsx index 817ec6e8f8..45db372a0d 100644 --- a/fission/src/ui/components/MainHUD.tsx +++ b/fission/src/ui/components/MainHUD.tsx @@ -1,5 +1,4 @@ import { Box, Stack } from "@mui/material" -import { Button, IconButton } from "./StyledComponents" import { motion } from "framer-motion" import type React from "react" import { useEffect, useState } from "react" @@ -20,7 +19,7 @@ import DebugPanel from "../panels/DebugPanel" import DeveloperToolPanel from "../panels/DeveloperToolPanel" import ImportMirabufPanel from "../panels/mirabuf/ImportMirabufPanel" import { setAddToast, setOpenModal, setOpenPanel } from "./GlobalUIControls" -import { SynthesisIcons } from "./StyledComponents" +import { Button, IconButton, SynthesisIcons } from "./StyledComponents" import { TouchControlsEvent, TouchControlsEventKeys } from "./TouchControls" import UserIcon from "./UserIcon" diff --git a/fission/src/ui/components/Modal.tsx b/fission/src/ui/components/Modal.tsx index 5251540e82..4c659563db 100644 --- a/fission/src/ui/components/Modal.tsx +++ b/fission/src/ui/components/Modal.tsx @@ -1,8 +1,8 @@ import { Card, CardActions, CardContent, CardHeader, Modal as MUIModal } from "@mui/material" -import { Button } from "./StyledComponents" import React, { type ReactElement } from "react" import type { Modal as ModalType, Panel as PanelType } from "../helpers/UIProviderHelpers" import { CloseType, useUIContext } from "../helpers/UIProviderHelpers" +import { Button } from "./StyledComponents" export type ModalImplProps = Partial<{ modal: ModalType diff --git a/fission/src/ui/components/Panel.tsx b/fission/src/ui/components/Panel.tsx index 3e057e56b3..29122bbbfe 100644 --- a/fission/src/ui/components/Panel.tsx +++ b/fission/src/ui/components/Panel.tsx @@ -1,5 +1,4 @@ import { Card, CardActions, CardContent, CardHeader } from "@mui/material" -import { Button } from "./StyledComponents" import React, { type ReactElement } from "react" import Draggable from "react-draggable" import { @@ -9,6 +8,7 @@ import { type Panel as PanelType, useUIContext, } from "../helpers/UIProviderHelpers" +import { Button } from "./StyledComponents" // biome-ignore-start lint/suspicious/noExplicitAny: need to be able to extend export type PanelImplProps = Partial<{ diff --git a/fission/src/ui/components/SelectButton.tsx b/fission/src/ui/components/SelectButton.tsx index 16be53f17e..bd5a82f027 100644 --- a/fission/src/ui/components/SelectButton.tsx +++ b/fission/src/ui/components/SelectButton.tsx @@ -1,11 +1,10 @@ import type Jolt from "@azaleacolburn/jolt-physics" import { Stack } from "@mui/material" -import { Button } from "./StyledComponents" import type React from "react" import { useCallback, useEffect, useRef, useState } from "react" import World from "@/systems/World" import { convertThreeVector3ToJoltVec3 } from "@/util/TypeConversions" -import { LabelWithTooltip } from "./StyledComponents" +import { Button, LabelWithTooltip } from "./StyledComponents" // raycasting constants const RAY_MAX_LENGTH = 20.0 diff --git a/fission/src/ui/components/SelectMenu.tsx b/fission/src/ui/components/SelectMenu.tsx index 09765a098a..4c0c9a08ec 100644 --- a/fission/src/ui/components/SelectMenu.tsx +++ b/fission/src/ui/components/SelectMenu.tsx @@ -1,9 +1,8 @@ import { Divider, Stack } from "@mui/material" -import { Button, IconButton } from "./StyledComponents" import type React from "react" import { useEffect, useState } from "react" import Label from "./Label" -import { CustomTooltip, Spacer, SynthesisIcons } from "./StyledComponents" +import { Button, CustomTooltip, IconButton, Spacer, SynthesisIcons } from "./StyledComponents" /** Extend this to make a type that contains custom data */ export class SelectMenuOption { diff --git a/fission/src/ui/components/StyledComponents.tsx b/fission/src/ui/components/StyledComponents.tsx index 80da91eff9..4b92d5fa5b 100644 --- a/fission/src/ui/components/StyledComponents.tsx +++ b/fission/src/ui/components/StyledComponents.tsx @@ -1,18 +1,17 @@ import InfoIcon from "@mui/icons-material/Info" import { Box, - Button as MuiButton, type ButtonProps, - IconButton as MuiIconButton, type IconButtonProps, - Stack, - Tooltip, + Button as MuiButton, + IconButton as MuiIconButton, ToggleButton as MuiToggleButton, - type ToggleButtonProps, ToggleButtonGroup as MuiToggleButtonGroup, + Stack, type ToggleButtonGroupProps, + type ToggleButtonProps, + Tooltip, } from "@mui/material" -import { SoundPlayer } from "@/systems/sound/SoundPlayer" import { AiFillWarning, AiOutlineDoubleRight, AiOutlineInfoCircle } from "react-icons/ai" import { BiRefresh } from "react-icons/bi" import { BsCodeSquare } from "react-icons/bs" @@ -38,6 +37,7 @@ import { GiSteeringWheel } from "react-icons/gi" import { GrConnect } from "react-icons/gr" import { HiDownload } from "react-icons/hi" import { IoCheckmark, IoPencil, IoPeople, IoPlayOutline, IoTrashBin } from "react-icons/io5" +import { SoundPlayer } from "@/systems/sound/SoundPlayer" import Label from "./Label" export class SynthesisIcons { diff --git a/fission/src/ui/components/TransformGizmoControl.tsx b/fission/src/ui/components/TransformGizmoControl.tsx index cc9bd2a6d8..43d57dd528 100644 --- a/fission/src/ui/components/TransformGizmoControl.tsx +++ b/fission/src/ui/components/TransformGizmoControl.tsx @@ -1,11 +1,10 @@ -import { Button, ToggleButton, ToggleButtonGroup } from "./StyledComponents" import type React from "react" import { useEffect, useState } from "react" import * as THREE from "three" import InputSystem from "@/systems/input/InputSystem" import GizmoSceneObject, { type GizmoMode } from "@/systems/scene/GizmoSceneObject" - import World from "@/systems/World" +import { Button, ToggleButton, ToggleButtonGroup } from "./StyledComponents" import type TransformGizmoControlProps from "./TransformGizmoControlProps" /** diff --git a/fission/src/ui/components/simulation/FlowControls.tsx b/fission/src/ui/components/simulation/FlowControls.tsx index b7baa57455..30da1a7dc9 100644 --- a/fission/src/ui/components/simulation/FlowControls.tsx +++ b/fission/src/ui/components/simulation/FlowControls.tsx @@ -1,8 +1,8 @@ -import { Button } from "../StyledComponents" import { Panel as FlowPanel, useReactFlow } from "@xyflow/react" import { FaPlus } from "react-icons/fa6" import { MdFitScreen, MdZoomInMap, MdZoomOutMap } from "react-icons/md" import type { FlowControlsProps } from "@/systems/simulation/SimConfigShared" +import { Button } from "../StyledComponents" function FlowControls({ onCreateJunction }: FlowControlsProps) { const { zoomIn, zoomOut, fitView } = useReactFlow() diff --git a/fission/src/ui/modals/MainMenuModal.tsx b/fission/src/ui/modals/MainMenuModal.tsx index 82371c0f12..41888bbded 100644 --- a/fission/src/ui/modals/MainMenuModal.tsx +++ b/fission/src/ui/modals/MainMenuModal.tsx @@ -1,10 +1,10 @@ import { Stack } from "@mui/material" -import { Button } from "../components/StyledComponents" import type React from "react" import { useLayoutEffect } from "react" import { globalAddToast } from "@/components/GlobalUIControls.ts" import MirabufCachingService, { MiraType } from "@/mirabuf/MirabufLoader" import type { ModalImplProps } from "../components/Modal" +import { Button } from "../components/StyledComponents" import { useStateContext } from "../helpers/StateProviderHelpers" import { CloseType, useUIContext } from "../helpers/UIProviderHelpers" import { spawnCachedMira } from "../panels/mirabuf/ImportMirabufPanel" diff --git a/fission/src/ui/modals/MatchResultsModal.tsx b/fission/src/ui/modals/MatchResultsModal.tsx index fa5db71f8a..db5b34535c 100644 --- a/fission/src/ui/modals/MatchResultsModal.tsx +++ b/fission/src/ui/modals/MatchResultsModal.tsx @@ -1,11 +1,11 @@ import { Stack, styled, Typography } from "@mui/material" -import { Button } from "../components/StyledComponents" import type React from "react" import { useEffect } from "react" import MatchMode from "@/systems/match_mode/MatchMode" import SimulationSystem from "@/systems/simulation/SimulationSystem" import Label from "../components/Label" import type { ModalImplProps } from "../components/Modal" +import { Button } from "../components/StyledComponents" import { CloseType, useUIContext } from "../helpers/UIProviderHelpers" type Entry = { diff --git a/fission/src/ui/modals/common/ConfirmModal.tsx b/fission/src/ui/modals/common/ConfirmModal.tsx index be180b8a3a..f424fb0ca6 100644 --- a/fission/src/ui/modals/common/ConfirmModal.tsx +++ b/fission/src/ui/modals/common/ConfirmModal.tsx @@ -1,8 +1,8 @@ import { Stack, Typography } from "@mui/material" import type React from "react" import { useEffect } from "react" -import { useUIContext } from "@/ui/helpers/UIProviderHelpers" import type { ModalImplProps } from "@/ui/components/Modal" +import { useUIContext } from "@/ui/helpers/UIProviderHelpers" export type ConfirmModalCustomProps = { message: string diff --git a/fission/src/ui/modals/configuring/RoboRIOModal.tsx b/fission/src/ui/modals/configuring/RoboRIOModal.tsx index c038437e48..32917657c3 100644 --- a/fission/src/ui/modals/configuring/RoboRIOModal.tsx +++ b/fission/src/ui/modals/configuring/RoboRIOModal.tsx @@ -1,8 +1,8 @@ import { FormControlLabel } from "@mui/material" -import { Button } from "@/ui/components/StyledComponents" import type React from "react" import { useEffect } from "react" import type { ModalImplProps } from "@/ui/components/Modal" +import { Button } from "@/ui/components/StyledComponents" import { useUIContext } from "@/ui/helpers/UIProviderHelpers" import RCCreateDeviceModal from "./rio-config/RCCreateDeviceModal" diff --git a/fission/src/ui/modals/configuring/SettingsModal.tsx b/fission/src/ui/modals/configuring/SettingsModal.tsx index ee1fdbc0b8..09b26d5d03 100644 --- a/fission/src/ui/modals/configuring/SettingsModal.tsx +++ b/fission/src/ui/modals/configuring/SettingsModal.tsx @@ -1,5 +1,4 @@ import { Box, Stack, Tab, Tabs, TextField } from "@mui/material" -import { Button } from "@/ui/components/StyledComponents" import type React from "react" import { useCallback, useEffect, useReducer, useState } from "react" import { GiPerspectiveDiceSixFacesOne } from "react-icons/gi" @@ -12,7 +11,7 @@ import Checkbox from "@/ui/components/Checkbox" import Label from "@/ui/components/Label" import type { ModalImplProps } from "@/ui/components/Modal" import StatefulSlider from "@/ui/components/StatefulSlider" -import { Spacer } from "@/ui/components/StyledComponents" +import { Button, Spacer } from "@/ui/components/StyledComponents" import { useThemeContext } from "@/ui/helpers/ThemeProviderHelpers" import { useUIContext } from "@/ui/helpers/UIProviderHelpers" import { randomColor } from "@/util/Random" diff --git a/fission/src/ui/modals/mirabuf/ImportLocalMirabufModal.tsx b/fission/src/ui/modals/mirabuf/ImportLocalMirabufModal.tsx index 671221a15c..ea68c509af 100644 --- a/fission/src/ui/modals/mirabuf/ImportLocalMirabufModal.tsx +++ b/fission/src/ui/modals/mirabuf/ImportLocalMirabufModal.tsx @@ -1,13 +1,12 @@ import { Stack, styled } from "@mui/material" -import { Button, ToggleButton, ToggleButtonGroup } from "@/ui/components/StyledComponents" import { type ChangeEvent, useEffect, useState } from "react" import MirabufCachingService, { MiraType } from "@/mirabuf/MirabufLoader" import { createMirabuf } from "@/mirabuf/MirabufSceneObject" import { PAUSE_REF_ASSEMBLY_SPAWNING } from "@/systems/physics/PhysicsTypes" - import World from "@/systems/World" import Label from "@/ui/components/Label" import type { ModalImplProps } from "@/ui/components/Modal" +import { Button, ToggleButton, ToggleButtonGroup } from "@/ui/components/StyledComponents" import { CloseType, useUIContext } from "@/ui/helpers/UIProviderHelpers" import type { ConfigurationType } from "@/ui/panels/configuring/assembly-config/ConfigTypes" import InitialConfigPanel from "@/ui/panels/configuring/initial-config/InitialConfigPanel" diff --git a/fission/src/ui/panels/DebugPanel.tsx b/fission/src/ui/panels/DebugPanel.tsx index 71783ccf84..68308ce4ab 100644 --- a/fission/src/ui/panels/DebugPanel.tsx +++ b/fission/src/ui/panels/DebugPanel.tsx @@ -1,5 +1,4 @@ import { Box, Stack } from "@mui/material" -import { Button } from "../components/StyledComponents" import type React from "react" import { useEffect } from "react" import APS from "@/aps/APS" @@ -10,14 +9,15 @@ import MirabufCachingService, { } from "@/mirabuf/MirabufLoader" import PreferencesSystem from "@/systems/preferences/PreferencesSystem" import World from "@/systems/World" +import ConfirmModal from "@/ui/modals/common/ConfirmModal" import { random } from "@/util/Random" import { globalAddToast } from "../components/GlobalUIControls" import Label from "../components/Label" import type { PanelImplProps } from "../components/Panel" +import { Button } from "../components/StyledComponents" import { useUIContext } from "../helpers/UIProviderHelpers" import PokerPanel from "./PokerPanel" import WsViewPanel from "./WsViewPanel" -import ConfirmModal from "@/ui/modals/common/ConfirmModal" function toggleDragMode() { const dragSystem = World.dragModeSystem diff --git a/fission/src/ui/panels/DeveloperToolPanel.tsx b/fission/src/ui/panels/DeveloperToolPanel.tsx index fb8a34cbfa..37ac725be3 100644 --- a/fission/src/ui/panels/DeveloperToolPanel.tsx +++ b/fission/src/ui/panels/DeveloperToolPanel.tsx @@ -1,5 +1,4 @@ import { Stack } from "@mui/material" -import { Button } from "../components/StyledComponents" import type React from "react" import { useEffect, useRef, useState } from "react" import MirabufCachingService, { MiraType } from "@/mirabuf/MirabufLoader" @@ -10,7 +9,7 @@ import World from "@/systems/World" import FieldMiraEditor, { type DevtoolKey, devtoolHandlers, devtoolKeys } from "../../mirabuf/FieldMiraEditor" import { globalAddToast } from "../components/GlobalUIControls" import type { PanelImplProps } from "../components/Panel" -import { LabelWithTooltip } from "../components/StyledComponents" +import { Button, LabelWithTooltip } from "../components/StyledComponents" import { useUIContext } from "../helpers/UIProviderHelpers" const DeveloperToolPanel: React.FC> = ({ panel }) => { diff --git a/fission/src/ui/panels/RobotSwitchPanel.tsx b/fission/src/ui/panels/RobotSwitchPanel.tsx index e57b03ee83..b1f0563ff9 100644 --- a/fission/src/ui/panels/RobotSwitchPanel.tsx +++ b/fission/src/ui/panels/RobotSwitchPanel.tsx @@ -1,10 +1,10 @@ import { Stack } from "@mui/material" -import { Button } from "../components/StyledComponents" import type React from "react" import { useEffect, useState } from "react" import Checkbox from "@/components/Checkbox.tsx" import Label from "../components/Label" import type { PanelImplProps } from "../components/Panel" +import { Button } from "../components/StyledComponents" import { useUIContext } from "../helpers/UIProviderHelpers" const RobotSwitchPanel: React.FC> = ({ panel }) => { diff --git a/fission/src/ui/panels/configuring/CameraSelectionPanel.tsx b/fission/src/ui/panels/configuring/CameraSelectionPanel.tsx index 6978cf12a2..c299c168cd 100644 --- a/fission/src/ui/panels/configuring/CameraSelectionPanel.tsx +++ b/fission/src/ui/panels/configuring/CameraSelectionPanel.tsx @@ -1,4 +1,3 @@ -import { ToggleButton, ToggleButtonGroup } from "@/ui/components/StyledComponents" import type React from "react" import { useCallback, useEffect, useState } from "react" import buttonPressSound from "@/assets/sound-files/ButtonPress.mp3" @@ -7,6 +6,7 @@ import { SoundPlayer } from "@/systems/sound/SoundPlayer" import World from "@/systems/World" import Checkbox from "@/ui/components/Checkbox" import type { PanelImplProps } from "@/ui/components/Panel" +import { ToggleButton, ToggleButtonGroup } from "@/ui/components/StyledComponents" import { useUIContext } from "@/ui/helpers/UIProviderHelpers" interface OrbitSettingsProps { diff --git a/fission/src/ui/panels/configuring/assembly-config/ConfigurePanel.tsx b/fission/src/ui/panels/configuring/assembly-config/ConfigurePanel.tsx index 7b378e1c62..4ba18a9136 100644 --- a/fission/src/ui/panels/configuring/assembly-config/ConfigurePanel.tsx +++ b/fission/src/ui/panels/configuring/assembly-config/ConfigurePanel.tsx @@ -1,4 +1,3 @@ -import { Button, ToggleButton, ToggleButtonGroup } from "@/ui/components/StyledComponents" import type React from "react" import { useEffect, useMemo, useRef, useState } from "react" import { ConfigurationSavedEvent } from "@/events/ConfigurationSavedEvent" @@ -13,6 +12,7 @@ import type SynthesisBrain from "@/systems/simulation/synthesis_brain/SynthesisB import World from "@/systems/World" import Label from "@/ui/components/Label" import type { PanelImplProps } from "@/ui/components/Panel" +import { Button, ToggleButton, ToggleButtonGroup } from "@/ui/components/StyledComponents" import TransformGizmoControl from "@/ui/components/TransformGizmoControl" import { CloseType, type UIScreen, useUIContext } from "@/ui/helpers/UIProviderHelpers" import ChooseInputSchemePanel from "../ChooseInputSchemePanel" diff --git a/fission/src/ui/panels/configuring/assembly-config/configure/AssemblySelection.tsx b/fission/src/ui/panels/configuring/assembly-config/configure/AssemblySelection.tsx index f401182249..53fabafa1a 100644 --- a/fission/src/ui/panels/configuring/assembly-config/configure/AssemblySelection.tsx +++ b/fission/src/ui/panels/configuring/assembly-config/configure/AssemblySelection.tsx @@ -1,8 +1,10 @@ import type React from "react" -import { useMemo, useReducer } from "react" +import { useCallback, useEffect, useState } from "react" +import { ConfigurationSavedEvent } from "@/events/ConfigurationSavedEvent.ts" import type MirabufSceneObject from "@/mirabuf/MirabufSceneObject" -import InputSystem from "@/systems/input/InputSystem" -import type SynthesisBrain from "@/systems/simulation/synthesis_brain/SynthesisBrain" +import { MirabufObjectChangeEvent } from "@/mirabuf/MirabufSceneObject" +import InputSystem from "@/systems/input/InputSystem.ts" +import type SynthesisBrain from "@/systems/simulation/synthesis_brain/SynthesisBrain.ts" import World from "@/systems/World.ts" import type { PanelImplProps } from "@/ui/components/Panel" import SelectMenu, { SelectMenuOption } from "@/ui/components/SelectMenu" @@ -29,7 +31,6 @@ export class AssemblySelectionOption extends SelectMenuOption { } function makeSelectionOption(configurationType: ConfigurationType, assembly: MirabufSceneObject) { - console.log("MAKING SELECTION OPTION FOR", configurationType) return new AssemblySelectionOption( `${configurationType === "ROBOTS" ? `[${InputSystem.brainIndexSchemeMap.get((assembly.brain as SynthesisBrain).brainIndex)?.schemeName ?? "-"}] ` : ""}${assembly.assemblyName}`, assembly @@ -44,26 +45,37 @@ const AssemblySelection: React.FC { - const [u, update] = useReducer(x => !x, false) const { openPanel, closePanel } = useUIContext() + const [options, setOptions] = useState([]) - const robots = useMemo(() => { - return World.sceneRenderer.mirabufSceneObjects.getRobots().filter(x => !pendingDeletes.includes(x.id)) - }, [u, pendingDeletes]) - - const fields = useMemo(() => { + const getRobots = useCallback( + () => World.sceneRenderer.mirabufSceneObjects.getRobots().filter(x => !pendingDeletes.includes(x.id)), + [pendingDeletes] + ) + const getFields = useCallback(() => { const field = World.sceneRenderer.mirabufSceneObjects.getField() return !field || pendingDeletes.includes(field.id) ? [] : [field] - }, [u, pendingDeletes]) - - console.log(robots[0], fields[0]) + }, [pendingDeletes]) - const options = useMemo(() => { - const list = configurationType === "ROBOTS" ? robots : fields - return list - .filter((assembly): assembly is MirabufSceneObject => assembly != null) + const update = useCallback(() => { + const items: MirabufSceneObject[] = configurationType === "ROBOTS" ? getRobots() : getFields() + const newOptions = items + .filter(assembly => assembly != null) .map(assembly => makeSelectionOption(configurationType, assembly)) - }, [configurationType, robots, fields]) + setOptions(newOptions) + }, [getRobots, getFields, configurationType]) + + MirabufObjectChangeEvent.addEventListener(() => { + update() + }) + + ConfigurationSavedEvent.listen(() => { + update() + }) + + useEffect(() => { + update() + }, [update]) return ( { diff --git a/fission/src/ui/panels/configuring/assembly-config/interfaces/scoring/ConfigureScoringZonesInterface.tsx b/fission/src/ui/panels/configuring/assembly-config/interfaces/scoring/ConfigureScoringZonesInterface.tsx index 9b5ea175d2..fc9606106c 100644 --- a/fission/src/ui/panels/configuring/assembly-config/interfaces/scoring/ConfigureScoringZonesInterface.tsx +++ b/fission/src/ui/panels/configuring/assembly-config/interfaces/scoring/ConfigureScoringZonesInterface.tsx @@ -1,5 +1,4 @@ import { Box, Divider, Stack } from "@mui/material" -import { Button } from "@/ui/components/StyledComponents" import type React from "react" import { useState } from "react" import { ConfigurationSavedEvent } from "@/events/ConfigurationSavedEvent" @@ -7,7 +6,7 @@ import type MirabufSceneObject from "@/mirabuf/MirabufSceneObject" import PreferencesSystem from "@/systems/preferences/PreferencesSystem" import type { ScoringZonePreferences } from "@/systems/preferences/PreferenceTypes" import Label from "@/ui/components/Label" -import { SynthesisIcons } from "@/ui/components/StyledComponents" +import { Button, SynthesisIcons } from "@/ui/components/StyledComponents" import ManageScoringZonesInterface from "./ManageScoringZonesInterface" import ZoneConfigInterface from "./ScoringZoneConfigInterface" diff --git a/fission/src/ui/panels/configuring/assembly-config/interfaces/scoring/ScoringZoneConfigInterface.tsx b/fission/src/ui/panels/configuring/assembly-config/interfaces/scoring/ScoringZoneConfigInterface.tsx index 065dc3a5b5..875022fc31 100644 --- a/fission/src/ui/panels/configuring/assembly-config/interfaces/scoring/ScoringZoneConfigInterface.tsx +++ b/fission/src/ui/panels/configuring/assembly-config/interfaces/scoring/ScoringZoneConfigInterface.tsx @@ -1,6 +1,5 @@ import type Jolt from "@azaleacolburn/jolt-physics" import { TextField } from "@mui/material" -import { Button } from "@/ui/components/StyledComponents" import { useCallback, useEffect, useMemo, useRef, useState } from "react" import * as THREE from "three" import { ConfigurationSavedEvent } from "@/events/ConfigurationSavedEvent" @@ -14,6 +13,7 @@ import type GizmoSceneObject from "@/systems/scene/GizmoSceneObject" import World from "@/systems/World" import Checkbox from "@/ui/components/Checkbox" import SelectButton from "@/ui/components/SelectButton" +import { Button } from "@/ui/components/StyledComponents" import TransformGizmoControl from "@/ui/components/TransformGizmoControl" import { convertArrayToThreeMatrix4, diff --git a/fission/src/ui/panels/configuring/initial-config/InitialConfigPanel.tsx b/fission/src/ui/panels/configuring/initial-config/InitialConfigPanel.tsx index aa6966bf0a..8284f34eeb 100644 --- a/fission/src/ui/panels/configuring/initial-config/InitialConfigPanel.tsx +++ b/fission/src/ui/panels/configuring/initial-config/InitialConfigPanel.tsx @@ -1,7 +1,7 @@ import { Box, Stack } from "@mui/material" -import { Button } from "@/ui/components/StyledComponents" import type React from "react" import { useCallback, useEffect, useMemo, useState } from "react" +import { ConfigurationSavedEvent } from "@/events/ConfigurationSavedEvent.ts" import { MiraType } from "@/mirabuf/MirabufLoader" import { getSpotlightAssembly } from "@/mirabuf/MirabufSceneObject" import InputSchemeManager from "@/systems/input/InputSchemeManager" @@ -14,6 +14,7 @@ import SynthesisBrain from "@/systems/simulation/synthesis_brain/SynthesisBrain" import World from "@/systems/World" import Label from "@/ui/components/Label" import type { PanelImplProps } from "@/ui/components/Panel" +import { Button } from "@/ui/components/StyledComponents" import TransformGizmoControl from "@/ui/components/TransformGizmoControl" import { useStateContext } from "@/ui/helpers/StateProviderHelpers" import { useUIContext } from "@/ui/helpers/UIProviderHelpers" @@ -59,6 +60,7 @@ const InitialConfigPanel: React.FC> = ({ panel }) => setSelectedScheme(scheme) } } + new ConfigurationSavedEvent() }, [closePanel, panel, targetAssembly]) const closeDelete = useCallback(() => { diff --git a/fission/src/ui/panels/configuring/initial-config/InputSchemeSelection.tsx b/fission/src/ui/panels/configuring/initial-config/InputSchemeSelection.tsx index b14ff07fde..9ca9134278 100644 --- a/fission/src/ui/panels/configuring/initial-config/InputSchemeSelection.tsx +++ b/fission/src/ui/panels/configuring/initial-config/InputSchemeSelection.tsx @@ -1,5 +1,4 @@ import { Box, Divider, FormControl, InputLabel, MenuItem, Select, Stack, Tooltip } from "@mui/material" -import { Button } from "@/ui/components/StyledComponents" import { type ReactElement, useCallback, useEffect, useReducer, useState } from "react" import InputSchemeManager from "@/systems/input/InputSchemeManager" import InputSystem from "@/systems/input/InputSystem" @@ -8,7 +7,7 @@ import PreferencesSystem from "@/systems/preferences/PreferencesSystem" import { DriveType } from "@/systems/simulation/behavior/Behavior" import SynthesisBrain from "@/systems/simulation/synthesis_brain/SynthesisBrain" import Label from "@/ui/components/Label" -import { DeleteButton, EditButton, PositiveButton, SynthesisIcons } from "@/ui/components/StyledComponents" +import { Button, DeleteButton, EditButton, PositiveButton, SynthesisIcons } from "@/ui/components/StyledComponents" import { TouchControlsEvent, TouchControlsEventKeys } from "@/ui/components/TouchControls" import { useStateContext } from "@/ui/helpers/StateProviderHelpers" diff --git a/fission/src/ui/panels/simulation/AutoTestPanel.tsx b/fission/src/ui/panels/simulation/AutoTestPanel.tsx index bdff71fcc1..1ad1d6b7d7 100644 --- a/fission/src/ui/panels/simulation/AutoTestPanel.tsx +++ b/fission/src/ui/panels/simulation/AutoTestPanel.tsx @@ -1,6 +1,5 @@ import type Jolt from "@azaleacolburn/jolt-physics" import { TextField } from "@mui/material" -import { Button, ToggleButton, ToggleButtonGroup } from "@/ui/components/StyledComponents" import { Stack, styled } from "@mui/system" import type React from "react" import { useCallback, useEffect, useMemo, useState } from "react" @@ -9,10 +8,10 @@ import * as THREE from "three" import type MirabufSceneObject from "@/mirabuf/MirabufSceneObject" import SimDriverStation from "@/systems/simulation/wpilib_brain/sim/SimDriverStation" import { type AllianceStation, RobotSimMode } from "@/systems/simulation/wpilib_brain/WPILibTypes" - import World from "@/systems/World" import Label from "@/ui/components/Label" import type { PanelImplProps } from "@/ui/components/Panel" +import { Button, ToggleButton, ToggleButtonGroup } from "@/ui/components/StyledComponents" import TransformGizmoControl from "@/ui/components/TransformGizmoControl" import { useUIContext } from "@/ui/helpers/UIProviderHelpers" import JOLT from "@/util/loading/JoltSyncLoader" diff --git a/fission/src/ui/panels/simulation/DriverStationPanel.tsx b/fission/src/ui/panels/simulation/DriverStationPanel.tsx index 23f74d54cd..1655b32601 100644 --- a/fission/src/ui/panels/simulation/DriverStationPanel.tsx +++ b/fission/src/ui/panels/simulation/DriverStationPanel.tsx @@ -1,8 +1,8 @@ import { MenuItem, Select, Stack } from "@mui/material" -import { Button } from "@/ui/components/StyledComponents" import type React from "react" import { useEffect, useState } from "react" import type { PanelImplProps } from "@/ui/components/Panel" +import { Button } from "@/ui/components/StyledComponents" import { useUIContext } from "@/ui/helpers/UIProviderHelpers" const DriverStationPanel: React.FC> = ({ panel }) => { diff --git a/fission/src/ui/panels/simulation/WiringPanel.tsx b/fission/src/ui/panels/simulation/WiringPanel.tsx index 44ba4b3b83..baf460658d 100644 --- a/fission/src/ui/panels/simulation/WiringPanel.tsx +++ b/fission/src/ui/panels/simulation/WiringPanel.tsx @@ -1,5 +1,4 @@ import { Grid, Stack } from "@mui/material" -import { Button } from "@/ui/components/StyledComponents" import { type Connection, type FinalConnectionState, @@ -33,6 +32,7 @@ import Checkbox from "@/ui/components/Checkbox" import Label from "@/ui/components/Label" import type { PanelImplProps } from "@/ui/components/Panel" import ScrollView from "@/ui/components/ScrollView" +import { Button } from "@/ui/components/StyledComponents" import FlowControls from "@/ui/components/simulation/FlowControls" import FlowInfo from "@/ui/components/simulation/FlowInfo" import { useUIContext } from "../../helpers/UIProviderHelpers"