From 91645a43b61ae4cfbc9ec46173b5ef28b99e591c Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 24 Jun 2026 16:11:32 +0200 Subject: [PATCH 1/2] Add custom fly-to slider --- public/locales/en/panel-navigation.json | 3 +- .../NodeNavigationButton.tsx | 6 ++ .../NavigationPanel/NavigationSettings.tsx | 56 ++++++++++++++++++- src/redux/local/localSlice.ts | 20 ++++++- 4 files changed, 81 insertions(+), 4 deletions(-) diff --git a/public/locales/en/panel-navigation.json b/public/locales/en/panel-navigation.json index c007c4ba..06f8a6b3 100644 --- a/public/locales/en/panel-navigation.json +++ b/public/locales/en/panel-navigation.json @@ -46,7 +46,8 @@ "title": "Navigation Settings", "include-non-focusable-label": "Include Non-focusable Nodes in Search", "include-non-focusable-description": "Per default, nodes that are marked as non-focusable from the search in the navigation menu. Checking this option will include them and allow setting these nodes as focus.", - "camera-path-settings": "Camera Path Settings" + "camera-path-settings": "Camera Path Settings", + "override-fly-to-duration-label": "Override Fly-to Duration" }, "remaining-flight-time-indicator": { "flying-to": "Flying to {{target}}", diff --git a/src/components/NodeNavigationButton/NodeNavigationButton.tsx b/src/components/NodeNavigationButton/NodeNavigationButton.tsx index 9c83d028..32ac0da7 100644 --- a/src/components/NodeNavigationButton/NodeNavigationButton.tsx +++ b/src/components/NodeNavigationButton/NodeNavigationButton.tsx @@ -18,6 +18,7 @@ import { FrameFocusIcon, LightningFlashIcon } from '@/icons/icons'; +import { useAppSelector } from '@/redux/hooks'; import { NavigationType } from '@/types/enums'; import { Identifier } from '@/types/types'; @@ -81,6 +82,9 @@ export function NodeNavigationButton({ const engineMode = useSubscribeToEngineMode(); const luaApi = useOpenSpaceApi(); + const flyToOverrideDuration = useAppSelector( + (state) => state.local.menus.navigation.flyToOverrideDuration + ); const isInPlayback = engineMode === EngineMode.SessionRecordingPlayback; @@ -95,6 +99,8 @@ export function NodeNavigationButton({ function flyTo(event: React.MouseEvent) { if (event.shiftKey) { luaApi?.navigation.flyTo(identifier, 0.0); + } else if (flyToOverrideDuration.enabled) { + luaApi?.navigation.flyTo(identifier, flyToOverrideDuration.duration); } else { luaApi?.navigation.flyTo(identifier); } diff --git a/src/panels/NavigationPanel/NavigationSettings.tsx b/src/panels/NavigationPanel/NavigationSettings.tsx index 41a6caa3..3b0e083f 100644 --- a/src/panels/NavigationPanel/NavigationSettings.tsx +++ b/src/panels/NavigationPanel/NavigationSettings.tsx @@ -1,11 +1,25 @@ import { useTranslation } from 'react-i18next'; -import { Container, Divider, Menu } from '@mantine/core'; +import { + Box, + Checkbox, + Container, + Divider, + Group, + Menu, + NumberInput, + Stack +} from '@mantine/core'; import { BoolInput } from '@/components/Input/BoolInput'; +import { NumericSlider } from '@/components/Input/NumericInput/NumericSlider/NumericSlider'; import { Property } from '@/components/Property/Property'; import { SettingsPopout } from '@/components/SettingsPopout/SettingsPopout'; import { useAppDispatch, useAppSelector } from '@/redux/hooks'; -import { setOnlyFocusableInNavMenu } from '@/redux/local/localSlice'; +import { + setFlyToOverrideDuration, + setFlyToOverrideDurationEnabled, + setOnlyFocusableInNavMenu +} from '@/redux/local/localSlice'; import { ApplyIdleMotionOnPathFinishKey, CameraPathArrivalDistanceFactorKey, @@ -20,6 +34,10 @@ export function NavigationSettings() { (state) => state.local.menus.navigation.onlyFocusable ); + const flyToOverrideDuration = useAppSelector( + (state) => state.local.menus.navigation.flyToOverrideDuration + ); + const dispatch = useAppDispatch(); return ( @@ -40,6 +58,40 @@ export function NavigationSettings() { + + + dispatch(setFlyToOverrideDurationEnabled(event.currentTarget.checked)) + } + /> + + + dispatch(setFlyToOverrideDuration(value))} + /> + + + dispatch(setFlyToOverrideDuration(typeof value === 'number' ? value : 0)) + } + /> + + ); diff --git a/src/redux/local/localSlice.ts b/src/redux/local/localSlice.ts index 833f7f26..de14fe97 100644 --- a/src/redux/local/localSlice.ts +++ b/src/redux/local/localSlice.ts @@ -8,6 +8,10 @@ export interface LocalState { navigation: { // Whether to show non-focusable nodes in the navigation menu search results onlyFocusable: boolean; + flyToOverrideDuration: { + enabled: boolean; + duration: number; + }; }; }; sceneTree: { @@ -24,7 +28,11 @@ export interface LocalState { const initialState: LocalState = { menus: { navigation: { - onlyFocusable: true + onlyFocusable: true, + flyToOverrideDuration: { + enabled: false, + duration: 5 + } } }, // @TODO: (emmbr 2025-04-09): Consider moving this to the menus object above. did not @@ -74,6 +82,14 @@ export const localSlice = createSlice({ state.menus.navigation.onlyFocusable = action.payload; return state; }, + setFlyToOverrideDurationEnabled: (state, action: PayloadAction) => { + state.menus.navigation.flyToOverrideDuration.enabled = action.payload; + return state; + }, + setFlyToOverrideDuration: (state, action: PayloadAction) => { + state.menus.navigation.flyToOverrideDuration.duration = action.payload; + return state; + }, setMenuItemVisible: ( state, action: PayloadAction<{ id: string; visible: boolean }> @@ -108,6 +124,8 @@ export const { setSceneTreeNodeExpanded, setSceneTreeSelectedNode, setOnlyFocusableInNavMenu, + setFlyToOverrideDurationEnabled, + setFlyToOverrideDuration, setMenuItemVisible, setMenuItemOpen, setMenuItemsConfig, From e2410ce0b2437fcd650ab763c971455d590b4b26 Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 24 Jun 2026 23:22:48 +0900 Subject: [PATCH 2/2] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/panels/NavigationPanel/NavigationSettings.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/panels/NavigationPanel/NavigationSettings.tsx b/src/panels/NavigationPanel/NavigationSettings.tsx index 3b0e083f..5d96e1fc 100644 --- a/src/panels/NavigationPanel/NavigationSettings.tsx +++ b/src/panels/NavigationPanel/NavigationSettings.tsx @@ -83,12 +83,16 @@ export function NavigationSettings() { min={0} max={60} step={1.25} + clampBehavior={'strict'} suffix={'s'} disabled={!flyToOverrideDuration.enabled} value={flyToOverrideDuration.duration} - onChange={(value) => - dispatch(setFlyToOverrideDuration(typeof value === 'number' ? value : 0)) - } + onChange={(value) => { + if (typeof value !== 'number' || Number.isNaN(value)) { + return; + } + dispatch(setFlyToOverrideDuration(value)); + }} />