diff --git a/frontend/react/src/ui/panels/header.tsx b/frontend/react/src/ui/panels/header.tsx index 8a2b3458..794d3e6e 100644 --- a/frontend/react/src/ui/panels/header.tsx +++ b/frontend/react/src/ui/panels/header.tsx @@ -67,7 +67,7 @@ export function Header() { navyunit: olButtonsVisibilityNavyunit, airbase: olButtonsVisibilityAirbase, dead: faSkull, - } + }; useEffect(() => { HiddenTypesChangedEvent.on((hiddenTypes) => setMapHiddenTypes({ ...hiddenTypes })); @@ -92,7 +92,7 @@ export function Header() { SessionDataSavedEvent.on(() => setSavingSessionData(false)); SessionDataLoadedEvent.on((sessionData) => { sessionData.mapSource && setMapSource(sessionData.mapSource.id); - }) + }); EnabledCommandModesChangedEvent.on((enabledCommandModes) => setEnabledCommandModes(enabledCommandModes)); AudioManagerStateChangedEvent.on((state) => setAudioState(state as AudioManagerState)); @@ -157,6 +157,30 @@ export function Header() { sr > 1 && scrolledRight && setScrolledRight(false); } + function unitTypeFilterClickHandler(event: MouseEvent, entryName: string) { + if (event.ctrlKey) { + const hiddenTypes = getApp().getMap().getHiddenTypes(); + const isAnyTypeHidden = Object.keys(unitViewTypesFilter).some((entryName) => hiddenTypes[entryName] === true); + + if (isAnyTypeHidden && !mapHiddenTypes[entryName]) { + // If we ctrl+click an already displayed unit type, we show every unit type + Object.keys(unitViewTypesFilter).forEach((entryName) => { + getApp().getMap().setHiddenType(entryName, false); + }); + return; + } + + Object.entries(unitViewTypesFilter) + .map((ut) => ut[0]) + .filter((utName) => utName !== entryName) + .forEach((utName) => getApp().getMap().setHiddenType(utName, true)); + + getApp().getMap().setHiddenType(entryName, false); + } else { + getApp().getMap().setHiddenType(entryName, !mapHiddenTypes[entryName]); + } + } + return (
Game Master {enabledCommandModes.length > 0 && ( <> - {loadingNewCommandMode ? : } + {loadingNewCommandMode ? ( + + ) : ( + + )} )}
@@ -293,9 +321,9 @@ export function Header() { {enabledCommandModes.length > 0 && ( <> {loadingNewCommandMode ? ( - + ) : ( )} @@ -324,9 +352,9 @@ export function Header() { {enabledCommandModes.length > 0 && ( <> {loadingNewCommandMode ? ( - + ) : ( )} @@ -361,11 +389,9 @@ export function Header() { onClick={() => { audioState === AudioManagerState.RUNNING ? getApp().getAudioManager().stop() : getApp().getAudioManager().start(); }} - className={ - audioState === AudioManagerState.ERROR - ? `animate-pulse !border-red-500 !text-red-500` - : "" - } + className={audioState === AudioManagerState.ERROR ? ` + animate-pulse !border-red-500 !text-red-500 + ` : ""} tooltip={() => ( { - if (event.ctrlKey) { - Object.entries(unitViewTypesFilter) - .map(ut => ut[0]) - .filter(utName => utName !== entry[0]) - .forEach(utName => getApp().getMap().setHiddenType(utName, true)); - - getApp().getMap().setHiddenType(entry[0], false); - } else { - getApp().getMap().setHiddenType(entry[0], !mapHiddenTypes[entry[0]]); - } - }} + onClick={(event) => unitTypeFilterClickHandler(event, entry[0])} checked={!mapHiddenTypes[entry[0]]} icon={entry[1]} - tooltip={"Hide/show " + entry[0] + " units. Tip: holding ctrl key while clicking will hide other unit categories."} + tooltip={"Hide/show " + entry[0] + " units. Tip: holding ctrl key while clicking will hide other unit categories. To show all units again, hold ctrl while clicking a displayed unit category."} /> ); })} diff --git a/scripts/lua/backend/OlympusCommand.lua b/scripts/lua/backend/OlympusCommand.lua index d187ef1c..14c3a19b 100644 --- a/scripts/lua/backend/OlympusCommand.lua +++ b/scripts/lua/backend/OlympusCommand.lua @@ -1123,10 +1123,19 @@ end -- This function is periodically called to collect the data of all the existing drawings in the mission to be transmitted to the olympus.dll function Olympus.initializeDrawings() + local function extract_custom_layer_name(str) + if str:match("^%[LYR:(.-)%]") then + return str:match("^%[LYR:(.-)%]") + elseif str:match("^%[(.-)%]") then + return str:match("^%[(.-)%]") + end + return nil + end + local drawings = {} if mist.DBs.drawingByName ~= nil then for drawingName, drawingData in pairs(mist.DBs.drawingByName) do - local customLayer = drawingData.name:match("^%[LYR:(.-)%]") + local customLayer = extract_custom_layer_name(drawingName) -- Let's convert DCS coords to lat lon local vec3 = { x = drawingData['mapX'], y = 0, z = drawingData['mapY'] } @@ -1163,10 +1172,10 @@ function Olympus.initializeDrawings() -- Let's put the drawing in the correct layer if customLayer then - -- Let's remove the tag from the drawing name + -- Let's remove the m from the drawing name local cleanDrawingName = string.match(drawingName, "%] (.+)") drawingData.name = cleanDrawingName - -- The drawing has the custom layer tag + -- The drawing has the custom layer m drawings[drawingData.layerName][customLayer][cleanDrawingName] = drawingData else -- The drawing is a standard drawing