From 1a93ee68d07dc96113d5342388f4ced70ecce063 Mon Sep 17 00:00:00 2001 From: Davide Passoni Date: Thu, 6 Feb 2025 17:31:27 +0100 Subject: [PATCH] fix: Check for protected units not working for control panel --- .../src/map/markers/stylesheets/units.css | 2 +- .../react/src/ui/panels/unitcontrolmenu.tsx | 388 ++++++++++-------- frontend/react/src/unit/unitsmanager.ts | 125 ++++-- 3 files changed, 310 insertions(+), 205 deletions(-) diff --git a/frontend/react/src/map/markers/stylesheets/units.css b/frontend/react/src/map/markers/stylesheets/units.css index 40085d15..803960b0 100644 --- a/frontend/react/src/map/markers/stylesheets/units.css +++ b/frontend/react/src/map/markers/stylesheets/units.css @@ -6,7 +6,7 @@ justify-content: center; position: relative; width: 100%; - filter: drop-shadow( 3px 3px 3px rgba(0, 0, 0, .4)); + filter: drop-shadow( 3px 3px 3px rgba(0, 0, 0, .2)); } [data-object|="unit"].attack-cursor { diff --git a/frontend/react/src/ui/panels/unitcontrolmenu.tsx b/frontend/react/src/ui/panels/unitcontrolmenu.tsx index 986a6ef0..d8783d3a 100644 --- a/frontend/react/src/ui/panels/unitcontrolmenu.tsx +++ b/frontend/react/src/ui/panels/unitcontrolmenu.tsx @@ -79,6 +79,9 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { isActiveTanker: undefined as undefined | boolean, onOff: undefined as undefined | boolean, isAudioSink: undefined as undefined | boolean, + radio: undefined as undefined | Radio, + TACAN: undefined as undefined | TACAN, + generalSettings: undefined as undefined | GeneralSettings, }; } @@ -156,6 +159,9 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { isActiveAWACS: (unit: Unit) => unit.getIsActiveAWACS(), isActiveTanker: (unit: Unit) => unit.getIsActiveTanker(), onOff: (unit: Unit) => unit.getOnOff(), + radio: (unit: Unit) => unit.getRadio(), + TACAN: (unit: Unit) => unit.getTACAN(), + generalSettings: (unit: Unit) => unit.getGeneralSettings(), isAudioSink: (unit: Unit) => { return ( getApp() @@ -558,25 +564,28 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { leftLabel={"ASL"} rightLabel={"AGL"} onClick={() => { - selectedUnits.forEach((unit) => { - unit.setAltitudeType(selectedUnitsData.desiredAltitudeType === "ASL" ? "AGL" : "ASL"); - setForcedUnitsData({ - ...forcedUnitsData, - desiredAltitudeType: selectedUnitsData.desiredAltitudeType === "ASL" ? "AGL" : "ASL", - }); - }); + getApp() + .getUnitsManager() + .setAltitudeType(selectedUnitsData.desiredAltitudeType === "ASL" ? "AGL" : "ASL", null, () => + setForcedUnitsData({ + ...forcedUnitsData, + desiredAltitudeType: selectedUnitsData.desiredAltitudeType === "ASL" ? "AGL" : "ASL", + }) + ); }} /> { - selectedUnits.forEach((unit) => { - unit.setAltitude(ftToM(Number(ev.target.value))); - setForcedUnitsData({ - ...forcedUnitsData, - desiredAltitude: Number(ev.target.value), - }); - }); + let value = Number(ev.target.value); + getApp() + .getUnitsManager() + .setAltitude(ftToM(value), null, () => + setForcedUnitsData({ + ...forcedUnitsData, + desiredAltitude: value, + }) + ); }} value={selectedUnitsData.desiredAltitude} min={minAltitude} @@ -620,26 +629,29 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { leftLabel={"CAS"} rightLabel={"GS"} onClick={() => { - selectedUnits.forEach((unit) => { - unit.setSpeedType(selectedUnitsData.desiredSpeedType === "CAS" ? "GS" : "CAS"); - setForcedUnitsData({ - ...forcedUnitsData, - desiredSpeedType: selectedUnitsData.desiredSpeedType === "CAS" ? "GS" : "CAS", - }); - }); + getApp() + .getUnitsManager() + .setSpeedType(selectedUnitsData.desiredSpeedType === "CAS" ? "GS" : "CAS", null, () => + setForcedUnitsData({ + ...forcedUnitsData, + desiredSpeedType: selectedUnitsData.desiredSpeedType === "CAS" ? "GS" : "CAS", + }) + ); }} /> )} { - selectedUnits.forEach((unit) => { - unit.setSpeed(knotsToMs(Number(ev.target.value))); - setForcedUnitsData({ - ...forcedUnitsData, - desiredSpeed: Number(ev.target.value), - }); - }); + let value = Number(ev.target.value); + getApp() + .getUnitsManager() + .setSpeed(knotsToMs(value), null, () => + setForcedUnitsData({ + ...forcedUnitsData, + desiredSpeed: value, + }) + ); }} value={selectedUnitsData.desiredSpeed} min={minSpeed} @@ -665,13 +677,14 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { { - selectedUnits.forEach((unit) => { - unit.setROE(ROEs[convertROE(idx)]); - setForcedUnitsData({ - ...forcedUnitsData, - ROE: ROEs[convertROE(idx)], - }); - }); + getApp() + .getUnitsManager() + .setROE(ROEs[convertROE(idx)], null, () => + setForcedUnitsData({ + ...forcedUnitsData, + ROE: ROEs[convertROE(idx)], + }) + ); }} active={selectedUnitsData.ROE === ROEs[convertROE(idx)]} icon={icon} @@ -702,13 +715,14 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { { - selectedUnits.forEach((unit) => { - unit.setReactionToThreat(reactionsToThreat[idx]); - setForcedUnitsData({ - ...forcedUnitsData, - reactionToThreat: reactionsToThreat[idx], - }); - }); + getApp() + .getUnitsManager() + .setReactionToThreat(reactionsToThreat[idx], null, () => + setForcedUnitsData({ + ...forcedUnitsData, + reactionToThreat: reactionsToThreat[idx], + }) + ); }} active={selectedUnitsData.reactionToThreat === reactionsToThreat[idx]} icon={icon} @@ -734,13 +748,14 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { { - selectedUnits.forEach((unit) => { - unit.setEmissionsCountermeasures(emissionsCountermeasures[idx]); - setForcedUnitsData({ - ...forcedUnitsData, - emissionsCountermeasures: emissionsCountermeasures[idx], - }); - }); + getApp() + .getUnitsManager() + .setEmissionsCountermeasures(emissionsCountermeasures[idx], null, () => + setForcedUnitsData({ + ...forcedUnitsData, + emissionsCountermeasures: emissionsCountermeasures[idx], + }) + ); }} active={selectedUnitsData.emissionsCountermeasures === emissionsCountermeasures[idx]} icon={icon} @@ -770,19 +785,27 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { { - selectedUnits.forEach((unit) => { - unit.setAdvancedOptions( - !selectedUnitsData.isActiveTanker, - unit.getIsActiveAWACS(), - unit.getTACAN(), - unit.getRadio(), - unit.getGeneralSettings() - ); - setForcedUnitsData({ - ...forcedUnitsData, - isActiveTanker: !selectedUnitsData.isActiveTanker, - }); - }); + if ( + selectedUnitsData.isActiveAWACS !== undefined && + selectedUnitsData.TACAN !== undefined && + selectedUnitsData.radio !== undefined && + selectedUnitsData.generalSettings !== undefined + ) + getApp() + .getUnitsManager() + .setAdvancedOptions( + !selectedUnitsData.isActiveTanker, + selectedUnitsData.isActiveAWACS, + selectedUnitsData.TACAN, + selectedUnitsData.radio, + selectedUnitsData.generalSettings, + null, + () => + setForcedUnitsData({ + ...forcedUnitsData, + isActiveTanker: !selectedUnitsData.isActiveTanker, + }) + ); }} /> @@ -804,19 +827,27 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { { - selectedUnits.forEach((unit) => { - unit.setAdvancedOptions( - unit.getIsActiveTanker(), - !selectedUnitsData.isActiveAWACS, - unit.getTACAN(), - unit.getRadio(), - unit.getGeneralSettings() - ); - setForcedUnitsData({ - ...forcedUnitsData, - isActiveAWACS: !selectedUnitsData.isActiveAWACS, - }); - }); + if ( + selectedUnitsData.isActiveTanker !== undefined && + selectedUnitsData.TACAN !== undefined && + selectedUnitsData.radio !== undefined && + selectedUnitsData.generalSettings !== undefined + ) + getApp() + .getUnitsManager() + .setAdvancedOptions( + selectedUnitsData.isActiveTanker, + !selectedUnitsData.isActiveAWACS, + selectedUnitsData.TACAN, + selectedUnitsData.radio, + selectedUnitsData.generalSettings, + null, + () => + setForcedUnitsData({ + ...forcedUnitsData, + isActiveAWACS: !selectedUnitsData.isActiveAWACS, + }) + ); }} /> @@ -891,14 +922,15 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { { - selectedUnits.forEach((unit) => { - selectedUnitsData.scenicAAA ? unit.changeSpeed("stop") : unit.scenicAAA(); - setForcedUnitsData({ - ...forcedUnitsData, - scenicAAA: !selectedUnitsData.scenicAAA, - missOnPurpose: false, - }); - }); + getApp() + .getUnitsManager() + .scenicAAA(null, () => + setForcedUnitsData({ + ...forcedUnitsData, + scenicAAA: !selectedUnitsData.scenicAAA, + missOnPurpose: false, + }) + ); }} /> @@ -916,14 +948,15 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { { - selectedUnits.forEach((unit) => { - selectedUnitsData.missOnPurpose ? unit.changeSpeed("stop") : unit.missOnPurpose(); - setForcedUnitsData({ - ...forcedUnitsData, - scenicAAA: false, - missOnPurpose: !selectedUnitsData.missOnPurpose, - }); - }); + getApp() + .getUnitsManager() + .missOnPurpose(null, () => + setForcedUnitsData({ + ...forcedUnitsData, + scenicAAA: false, + missOnPurpose: !selectedUnitsData.missOnPurpose, + }) + ); }} /> @@ -945,13 +978,14 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { { - selectedUnits.forEach((unit) => { - unit.setShotsScatter(idx + 1); - setForcedUnitsData({ - ...forcedUnitsData, - shotsScatter: idx + 1, - }); - }); + getApp() + .getUnitsManager() + .setShotsScatter(idx + 1, null, () => + setForcedUnitsData({ + ...forcedUnitsData, + shotsScatter: idx + 1, + }) + ); }} active={selectedUnitsData.shotsScatter === idx + 1} icon={icon} @@ -977,13 +1011,14 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { { - selectedUnits.forEach((unit) => { - unit.setShotsIntensity(idx + 1); - setForcedUnitsData({ - ...forcedUnitsData, - shotsIntensity: idx + 1, - }); - }); + getApp() + .getUnitsManager() + .setShotsIntensity(idx + 1, null, () => + setForcedUnitsData({ + ...forcedUnitsData, + shotsIntensity: idx + 1, + }) + ); }} active={selectedUnitsData.shotsIntensity === idx + 1} icon={icon} @@ -995,30 +1030,31 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { {/* ============== Shots intensity END ============== */} {/* ============== Operate as toggle START ============== */} - {selectedUnits.every((unit) => unit.getCoalition() === 'neutral') &&
- - Operate as - - { - selectedUnits.forEach((unit) => { - unit.setOperateAs(selectedUnitsData.operateAs === "blue" ? "red" : "blue"); - setForcedUnitsData({ - ...forcedUnitsData, - operateAs: selectedUnitsData.operateAs === "blue" ? "red" : "blue", - }); - }); - }} - /> -
} + {selectedUnits.every((unit) => unit.getCoalition() === "neutral") && ( +
+ + Operate as + + { + getApp() + .getUnitsManager() + .setOperateAs(selectedUnitsData.operateAs === "blue" ? "red" : "blue", null, () => + setForcedUnitsData({ + ...forcedUnitsData, + operateAs: selectedUnitsData.operateAs === "blue" ? "red" : "blue", + }) + ); + }} + /> +
+ )} {/* ============== Operate as toggle END ============== */} {/* ============== Follow roads toggle START ============== */} @@ -1034,13 +1070,14 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { { - selectedUnits.forEach((unit) => { - unit.setFollowRoads(!selectedUnitsData.followRoads); - setForcedUnitsData({ - ...forcedUnitsData, - followRoads: !selectedUnitsData.followRoads, - }); - }); + getApp() + .getUnitsManager() + .setFollowRoads(!selectedUnitsData.followRoads, null, () => + setForcedUnitsData({ + ...forcedUnitsData, + followRoads: !selectedUnitsData.followRoads, + }) + ); }} /> @@ -1058,13 +1095,14 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { { - selectedUnits.forEach((unit) => { - unit.setOnOff(!selectedUnitsData.onOff); - setForcedUnitsData({ - ...forcedUnitsData, - onOff: !selectedUnitsData.onOff, - }); - }); + getApp() + .getUnitsManager() + .setOnOff(!selectedUnitsData.onOff, null, () => + setForcedUnitsData({ + ...forcedUnitsData, + onOff: !selectedUnitsData.onOff, + }) + ); }} /> @@ -1223,10 +1261,9 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { value={activeRadioSettings ? activeRadioSettings.TACAN.channel : 1} > - + { @@ -1294,14 +1331,21 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { hover:bg-blue-800 `} onClick={() => { - if (activeRadioSettings) - selectedUnits[0].setAdvancedOptions( - selectedUnits[0].getIsActiveTanker(), - selectedUnits[0].getIsActiveAWACS(), - activeRadioSettings.TACAN, - activeRadioSettings.radio, - selectedUnits[0].getGeneralSettings() - ); + if ( + activeRadioSettings && + selectedUnitsData.isActiveTanker !== undefined && + selectedUnitsData.isActiveAWACS !== undefined && + selectedUnitsData.generalSettings !== undefined + ) + getApp() + .getUnitsManager() + .setAdvancedOptions( + selectedUnitsData.isActiveTanker, + selectedUnitsData.isActiveAWACS, + activeRadioSettings.TACAN, + activeRadioSettings.radio, + selectedUnitsData.generalSettings + ); setActiveRadioSettings(null); setShowRadioSettings(false); }} @@ -1375,7 +1419,7 @@ export function UnitControlMenu(props: { open: boolean; onClose: () => void }) { toggled={activeAdvancedSettings?.prohibitAfterburner} /> - +