diff --git a/TLM/TLM/TLM.csproj b/TLM/TLM/TLM.csproj index 3340c4f4c..d5bd37117 100644 --- a/TLM/TLM/TLM.csproj +++ b/TLM/TLM/TLM.csproj @@ -185,6 +185,7 @@ + diff --git a/TLM/TLM/UI/LegacySubTool.cs b/TLM/TLM/UI/LegacySubTool.cs index e797584fe..d1c97056a 100644 --- a/TLM/TLM/UI/LegacySubTool.cs +++ b/TLM/TLM/UI/LegacySubTool.cs @@ -15,8 +15,8 @@ public LegacySubTool(TrafficManagerTool mainTool) { uiTransparencyUnbsubscriber_ = ModUI.Instance.Events.UiOpacity.Subscribe(this); } - protected TrafficManagerTool MainTool { get; } - protected GUILayoutOption[] EmptyOptionsArray = new GUILayoutOption[0]; + internal TrafficManagerTool MainTool { get; } + protected static GUILayoutOption[] EmptyOptionsArray = new GUILayoutOption[0]; private Texture2D WindowTexture { get { @@ -32,34 +32,33 @@ private Texture2D WindowTexture { private Texture2D windowTexture_; - protected GUIStyle WindowStyle => + internal GUIStyle WindowStyle => // ReSharper disable once ConvertToNullCoalescingCompoundAssignment windowStyle_ ?? - (windowStyle_ - = new GUIStyle { - normal = { - background = WindowTexture, - textColor = Color.white, - }, - alignment = TextAnchor.UpperCenter, - fontSize = 20, - border = { - left = 4, - top = 41, - right = 4, - bottom = 8, - }, - overflow = { - bottom = 0, - top = 0, - right = 12, - left = 12, - }, - contentOffset = new Vector2(0, -44), - padding = { - top = 55, - }, - }); + (windowStyle_ = new GUIStyle { + normal = { + background = WindowTexture, + textColor = Color.white, + }, + alignment = TextAnchor.UpperCenter, + fontSize = 20, + border = { + left = 4, + top = 41, + right = 4, + bottom = 8, + }, + overflow = { + bottom = 0, + top = 0, + right = 12, + left = 12, + }, + contentOffset = new Vector2(0, -44), + padding = { + top = 55, + }, + }); private GUIStyle windowStyle_; @@ -185,6 +184,11 @@ public virtual void RenderOverlayForOtherTools(RenderManager.CameraInfo cameraIn public virtual void ShowGUIOverlay(ToolMode toolMode, bool viewOnly) { } public virtual bool IsCursorInPanel() { + return IsCursorInPanel_(); + } + + /// Check whether cursor is in the main menu or debug menu area. + internal static bool IsCursorInPanel_() { return ModUI.Instance.GetMenu().containsMouse #if DEBUG || ModUI.Instance.GetDebugMenu().containsMouse diff --git a/TLM/TLM/UI/LegacySubToolMixin.cs b/TLM/TLM/UI/LegacySubToolMixin.cs new file mode 100644 index 000000000..093053d5d --- /dev/null +++ b/TLM/TLM/UI/LegacySubToolMixin.cs @@ -0,0 +1,83 @@ +namespace TrafficManager.UI { + using System; + using ColossalFramework.UI; + using TrafficManager.U; + using UnityEngine; + + [Obsolete("Used in legacy GUI for migration to new subtool base clas")] + public class LegacySubToolMixin { + [Obsolete("Used in legacy GUI")] + internal static GUILayoutOption[] LegacyEmptyOptionsArray = new GUILayoutOption[0]; + + [Obsolete("Used in legacy GUI")] + protected void LegacyDragWindow(ref Rect window) { + Vector2 resolution = UIView.GetAView().GetScreenResolution(); + window.x = Mathf.Clamp(window.x, 0, UIScaler.MaxWidth - window.width); + window.y = Mathf.Clamp(window.y, 0, UIScaler.MaxHeight - window.height); + + bool primaryMouseDown = Input.GetMouseButton(0); + if (primaryMouseDown) { + GUI.DragWindow(); + } + } + + [Obsolete("Used in legacy GUI")] + private Texture2D LegacyWindowTexture { + get { + if (legacyWindowTexture_ == null) { + legacyWindowTexture_ = TextureUtil.AdjustAlpha( + Textures.MainMenu.WindowBackground, + TrafficManagerTool.GetWindowAlpha()); + } + + return legacyWindowTexture_; + } + } + + [Obsolete("Used in legacy GUI")] + private Texture2D legacyWindowTexture_; + + [Obsolete("Used in legacy GUI")] + private GUIStyle legacyWindowStyle_; + + [Obsolete("Used in legacy GUI")] + internal GUIStyle LegacyWindowStyle => + // ReSharper disable once ConvertToNullCoalescingCompoundAssignment + legacyWindowStyle_ ?? + (legacyWindowStyle_ = new GUIStyle { + normal = { + background = LegacyWindowTexture, + textColor = Color.white, + }, + alignment = TextAnchor.UpperCenter, + fontSize = 20, + border = { + left = 4, + top = 41, + right = 4, + bottom = 8, + }, + overflow = { + bottom = 0, + top = 0, + right = 12, + left = 12, + }, + contentOffset = new Vector2(0, -44), + padding = { + top = 55, + }, + }); + + + /// Check whether cursor is in the main menu or debug menu area. + [Obsolete("Member of legacy subtool")] + internal static bool LegacyIsCursorInPanel() { + return ModUI.Instance.GetMenu().containsMouse +#if DEBUG + || ModUI.Instance.GetDebugMenu().containsMouse +#endif + ; + } + } +} \ No newline at end of file diff --git a/TLM/TLM/UI/SubTools/TTL/TTLToolMode.cs b/TLM/TLM/UI/SubTools/TTL/TTLToolMode.cs index abe30ac31..105704d5d 100644 --- a/TLM/TLM/UI/SubTools/TTL/TTLToolMode.cs +++ b/TLM/TLM/UI/SubTools/TTL/TTLToolMode.cs @@ -1,5 +1,5 @@ -namespace TrafficManager.UI.SubTools { - internal enum TTLToolMode { +namespace TrafficManager.UI.SubTools.TTL { + internal enum TtlToolMode { /// Timed traffic light submode. SelectNode, diff --git a/TLM/TLM/UI/SubTools/TTL/TimedTrafficLightsTool.cs b/TLM/TLM/UI/SubTools/TTL/TimedTrafficLightsTool.cs index 977a01175..e9cd0486f 100644 --- a/TLM/TLM/UI/SubTools/TTL/TimedTrafficLightsTool.cs +++ b/TLM/TLM/UI/SubTools/TTL/TimedTrafficLightsTool.cs @@ -20,18 +20,18 @@ namespace TrafficManager.UI.SubTools.TTL { using UnityEngine; public class TimedTrafficLightsTool - : LegacySubTool, + : TrafficManagerSubTool, UI.MainMenu.IOnscreenDisplayProvider { private readonly GUI.WindowFunction _guiTimedControlPanelDelegate; private readonly GUI.WindowFunction _guiTimedTrafficLightsNodeWindowDelegate; private readonly GUI.WindowFunction _guiTimedTrafficLightsPasteWindowDelegate; - private TTLToolMode ttlToolMode_ = TTLToolMode.SelectNode; + private TtlToolMode ttlToolMode_ = TtlToolMode.SelectNode; - private readonly GUIStyle _counterStyle = new GUIStyle(); + private readonly GUIStyle _counterStyle = new(); private readonly int[] _hoveredButton = new int[2]; private bool nodeSelectionLocked; - private List selectedNodeIds = new List(); + private List selectedNodeIds = new(); private bool _cursorInSecondaryPanel; private Rect _windowRect = TrafficManagerTool.GetDefaultScreenPositionForRect(new Rect(0, 0, 480, 350)); private Rect _windowRect2 = TrafficManagerTool.GetDefaultScreenPositionForRect(new Rect(0, 0, 300, 150)); @@ -53,10 +53,10 @@ public class TimedTrafficLightsTool private ushort nodeIdToCopy; private HashSet currentTimedNodeIds; - private GUIStyle layout = new GUIStyle { normal = { textColor = new Color(1f, 1f, 1f) } }; - private GUIStyle layoutRed = new GUIStyle { normal = { textColor = new Color(1f, 0f, 0f) } }; - private GUIStyle layoutGreen = new GUIStyle { normal = { textColor = new Color(0f, .8f, 0f) } }; - private GUIStyle layoutYellow = new GUIStyle { normal = { textColor = new Color(1f, .7f, 0f) } }; + private GUIStyle layout = new() { normal = { textColor = new Color(1f, 1f, 1f) } }; + private GUIStyle layoutRed = new() { normal = { textColor = new Color(1f, 0f, 0f) } }; + private GUIStyle layoutGreen = new() { normal = { textColor = new Color(0f, .8f, 0f) } }; + private GUIStyle layoutYellow = new() { normal = { textColor = new Color(1f, .7f, 0f) } }; public TimedTrafficLightsTool(TrafficManagerTool mainTool) : base(mainTool) { @@ -65,10 +65,20 @@ public TimedTrafficLightsTool(TrafficManagerTool mainTool) _guiTimedTrafficLightsPasteWindowDelegate = GuiTimedTrafficLightsPasteWindow; currentTimedNodeIds = new HashSet(); + + // Construct and reset for the first time + Cleanup(); + + if (Options.timedLightsOverlay) { + RefreshCurrentTimedNodeIds(); + } else { + currentTimedNodeIds.Clear(); + } } - public override bool IsCursorInPanel() { - return base.IsCursorInPanel() || _cursorInSecondaryPanel; + [Obsolete("Member of legacy subtool")] + private protected bool IsCursorInPanel() { + return LegacyIsCursorInPanel() || _cursorInSecondaryPanel; } private void RefreshCurrentTimedNodeIds(ushort forceNodeId = 0) { @@ -95,10 +105,8 @@ private void RefreshCurrentTimedNodeIds(ushort forceNodeId = 0) { } } - public override void OnActivate() { - base.OnActivate(); - - SetToolMode(TTLToolMode.SelectNode); + public override void OnActivateTool() { + SetToolMode(TtlToolMode.SelectNode); TrafficLightSimulationManager tlsMan = TrafficLightSimulationManager.Instance; RefreshCurrentTimedNodeIds(); @@ -117,22 +125,28 @@ public override void OnActivate() { MainTool.RequestOnscreenDisplayUpdate(); } - public override void OnSecondaryClickOverlay() { - if (!IsCursorInPanel()) { - if (ttlToolMode_ != TTLToolMode.SelectNode) { - Cleanup(); - SetToolMode(TTLToolMode.SelectNode); - } else { - MainTool.SetToolMode(ToolMode.None); - } + public override void OnToolRightClick() { + if (IsCursorInPanel()) { + return; } + + if (ttlToolMode_ != TtlToolMode.SelectNode) { + OnDeactivateTool(); + SetToolMode(TtlToolMode.SelectNode); + } else { + MainTool.SetToolMode(ToolMode.None); + } + } + + public override void UpdateEveryFrame() { + throw new NotImplementedException(); } - private void SetToolMode(TTLToolMode t) { + private void SetToolMode(TtlToolMode t) { ttlToolMode_ = t; } - public override void OnPrimaryClickOverlay() { + public override void OnToolLeftClick() { if (HoveredNodeId <= 0 || nodeSelectionLocked || !Flags.MayHaveTrafficLight(HoveredNodeId)) { return; } @@ -169,16 +183,16 @@ public override void OnPrimaryClickOverlay() { return; } RefreshCurrentTimedNodeIds(HoveredNodeId); - SetToolMode(TTLToolMode.ShowLights); + SetToolMode(TtlToolMode.ShowLights); } TrafficLightSimulationManager tlsMan = TrafficLightSimulationManager.Instance; switch (ttlToolMode_) { - case TTLToolMode.SelectNode: - case TTLToolMode.ShowLights: { - if (ttlToolMode_ == TTLToolMode.ShowLights) { - SetToolMode(TTLToolMode.SelectNode); + case TtlToolMode.SelectNode: + case TtlToolMode.ShowLights: { + if (ttlToolMode_ == TtlToolMode.ShowLights) { + SetToolMode(TtlToolMode.SelectNode); ClearSelectedNodes(); } @@ -196,7 +210,7 @@ public override void OnPrimaryClickOverlay() { if (timedLight != null) { selectedNodeIds = new List(timedLight.NodeGroup); - SetToolMode(TTLToolMode.ShowLights); + SetToolMode(TtlToolMode.ShowLights); } } else { MainTool.WarningPrompt(T("Dialog.Text:Node has timed TL script")); @@ -206,9 +220,9 @@ public override void OnPrimaryClickOverlay() { break; } - case TTLToolMode.AddNode: { + case TtlToolMode.AddNode: { if (selectedNodeIds.Count <= 0) { - SetToolMode(TTLToolMode.SelectNode); + SetToolMode(TtlToolMode.SelectNode); return; } @@ -246,13 +260,13 @@ public override void OnPrimaryClickOverlay() { AddSelectedNode(nodeId); } - SetToolMode(TTLToolMode.ShowLights); + SetToolMode(TtlToolMode.ShowLights); break; } - case TTLToolMode.RemoveNode: { + case TtlToolMode.RemoveNode: { if (selectedNodeIds.Count <= 0) { - SetToolMode(TTLToolMode.SelectNode); + SetToolMode(TtlToolMode.SelectNode); return; } @@ -265,13 +279,13 @@ public override void OnPrimaryClickOverlay() { } RemoveSelectedNode(HoveredNodeId); - SetToolMode(TTLToolMode.ShowLights); + SetToolMode(TtlToolMode.ShowLights); break; } - case TTLToolMode.CopyLights: { + case TtlToolMode.CopyLights: { if (nodeIdToCopy == 0 || !tlsMan.HasTimedSimulation(nodeIdToCopy)) { - SetToolMode(TTLToolMode.SelectNode); + SetToolMode(TtlToolMode.SelectNode); return; } @@ -306,31 +320,29 @@ public override void OnPrimaryClickOverlay() { Cleanup(); AddSelectedNode(HoveredNodeId); - SetToolMode(TTLToolMode.ShowLights); + SetToolMode(TtlToolMode.ShowLights); break; } } } - public override void OnToolGUI(Event e) { - base.OnToolGUI(e); - + public override void RenderActiveToolOverlay_GUI() { switch (ttlToolMode_) { - case TTLToolMode.SelectNode: { + case TtlToolMode.SelectNode: { if (!Shortcuts.ControlIsPressed) { GuiTimedTrafficLightsNode(); } break; } - case TTLToolMode.ShowLights: - case TTLToolMode.AddNode: - case TTLToolMode.RemoveNode: { + case TtlToolMode.ShowLights: + case TtlToolMode.AddNode: + case TtlToolMode.RemoveNode: { GuiTimedTrafficLights(); break; } - case TTLToolMode.CopyLights: { + case TtlToolMode.CopyLights: { GuiTimedTrafficLightsCopy(); break; } @@ -341,12 +353,12 @@ public override void OnToolGUI(Event e) { } } - public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { - bool onlySelected = ttlToolMode_ == TTLToolMode.RemoveNode; + public override void RenderGenericInfoOverlay(RenderManager.CameraInfo cameraInfo) { + } + + public override void RenderActiveToolOverlay(RenderManager.CameraInfo cameraInfo) { + bool onlySelected = ttlToolMode_ == TtlToolMode.RemoveNode; - // Log._Debug($"nodeSelLocked={nodeSelectionLocked} HoveredNodeId={HoveredNodeId} - // IsNodeSelected={IsNodeSelected(HoveredNodeId)} onlySelected={onlySelected} - // isinsideui={MainTool.GetToolController().IsInsideUI} cursorVis={Cursor.visible}"); if (!nodeSelectionLocked && HoveredNodeId != 0 && !IsNodeSelected(HoveredNodeId) ^ onlySelected @@ -366,25 +378,23 @@ public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { } private void GuiTimedControlPanel(int num) { - // Log._Debug("guiTimedControlPanel"); try { TrafficLightSimulationManager tlsMan = TrafficLightSimulationManager.Instance; - if (ttlToolMode_ == TTLToolMode.AddNode || - ttlToolMode_ == TTLToolMode.RemoveNode) { - GUILayout.Label(T("TTL.Label:Select junction"), EmptyOptionsArray); - if (GUILayout.Button(T("Button:Cancel"), EmptyOptionsArray)) { - SetToolMode(TTLToolMode.ShowLights); + if (ttlToolMode_ == TtlToolMode.AddNode || + ttlToolMode_ == TtlToolMode.RemoveNode) { + GUILayout.Label(T("TTL.Label:Select junction"), LegacyEmptyOptionsArray); + if (GUILayout.Button(T("Button:Cancel"), LegacyEmptyOptionsArray)) { + SetToolMode(TtlToolMode.ShowLights); } else { - DragWindow(ref _windowRect); + LegacyDragWindow(ref _windowRect); return; } } if (!tlsMan.HasTimedSimulation(selectedNodeIds[0])) { - SetToolMode(TTLToolMode.SelectNode); - // Log._Debug("nodesim or timednodemain is null"); - DragWindow(ref _windowRect); + SetToolMode(TtlToolMode.SelectNode); + LegacyDragWindow(ref _windowRect); return; } @@ -407,12 +417,12 @@ private void GuiTimedControlPanel(int num) { } for (var i = 0; i < timedNodeMain.NumSteps(); i++) { - GUILayout.BeginHorizontal(EmptyOptionsArray); + GUILayout.BeginHorizontal(LegacyEmptyOptionsArray); if (_timedEditStep != i) { if (timedLightActive) { if (i == currentStep) { - GUILayout.BeginVertical(EmptyOptionsArray); + GUILayout.BeginVertical(LegacyEmptyOptionsArray); GUILayout.Space(5); string labelStr = string.Format( @@ -468,7 +478,7 @@ private void GuiTimedControlPanel(int num) { labelLayout = inEndTransition ? layoutYellow : layoutGreen; } - GUILayout.Label(labelStr, labelLayout, EmptyOptionsArray); + GUILayout.Label(labelStr, labelLayout, LegacyEmptyOptionsArray); GUILayout.Space(5); GUILayout.EndVertical(); @@ -489,7 +499,7 @@ private void GuiTimedControlPanel(int num) { timedNodeMain.GetStep(i).MinTime, timedNodeMain.GetStep(i).MaxTime), layout, - EmptyOptionsArray); + LegacyEmptyOptionsArray); } } else { GUIStyle labelLayout = layout; @@ -505,7 +515,7 @@ private void GuiTimedControlPanel(int num) { timedNodeMain.GetStep(i).MinTime, timedNodeMain.GetStep(i).MaxTime), labelLayout, - EmptyOptionsArray); + LegacyEmptyOptionsArray); if (_timedEditStep < 0) { GUILayout.BeginHorizontal(GUILayout.Width(100)); @@ -662,13 +672,13 @@ private void GuiTimedControlPanel(int num) { BuildStepChangeMetricDisplay(true); BuildFlowPolicyDisplay(true); - GUILayout.BeginHorizontal(EmptyOptionsArray); + GUILayout.BeginHorizontal(LegacyEmptyOptionsArray); } GUILayout.EndHorizontal(); } // foreach step - GUILayout.BeginHorizontal(EmptyOptionsArray); + GUILayout.BeginHorizontal(LegacyEmptyOptionsArray); if (_timedEditStep < 0 && !timedLightActive) { if (_timedPanelAdd) { @@ -738,10 +748,10 @@ private void GuiTimedControlPanel(int num) { BuildStepChangeMetricDisplay(true); BuildFlowPolicyDisplay(true); - GUILayout.BeginHorizontal(EmptyOptionsArray); + GUILayout.BeginHorizontal(LegacyEmptyOptionsArray); } else { if (_timedEditStep < 0) { - if (GUILayout.Button(T("TTL.Button:Add step"), EmptyOptionsArray)) { + if (GUILayout.Button(T("TTL.Button:Add step"), LegacyEmptyOptionsArray)) { TrafficManagerTool.ShowAdvisor(GetType().Name + "_AddStep"); _timedPanelAdd = true; nodeSelectionLocked = true; @@ -763,11 +773,11 @@ private void GuiTimedControlPanel(int num) { _timedShowNumbers ? T("TTL.Button:Hide counters") : T("TTL.Button:Show counters"), - EmptyOptionsArray)) { + LegacyEmptyOptionsArray)) { _timedShowNumbers = !_timedShowNumbers; } - if (GUILayout.Button(T("TTL.Button:Stop"), EmptyOptionsArray)) { + if (GUILayout.Button(T("TTL.Button:Stop"), LegacyEmptyOptionsArray)) { foreach (ushort nodeId in selectedNodeIds) { tlsMan.TrafficLightSimulations[nodeId] .timedLight @@ -809,14 +819,14 @@ private void GuiTimedControlPanel(int num) { bool testMode = GUILayout.Toggle( inTestMode, T("TTL.Checkbox:Pause in this step"), - EmptyOptionsArray); + LegacyEmptyOptionsArray); foreach (ushort nodeId in selectedNodeIds) { tlsMan.TrafficLightSimulations[nodeId].timedLight?.SetTestMode(testMode); } } else { if (_timedEditStep < 0 && !_timedPanelAdd) { - if (GUILayout.Button(T("TTL.Button:Start"), EmptyOptionsArray)) { + if (GUILayout.Button(T("TTL.Button:Start"), LegacyEmptyOptionsArray)) { _timedPanelAdd = false; nodeSelectionLocked = false; @@ -831,27 +841,27 @@ private void GuiTimedControlPanel(int num) { } if (_timedEditStep >= 0) { - DragWindow(ref _windowRect); + LegacyDragWindow(ref _windowRect); return; } GUILayout.Space(30); if (selectedNodeIds.Count == 1 && timedNodeMain.NumSteps() > 0) { - GUILayout.BeginHorizontal(EmptyOptionsArray); + GUILayout.BeginHorizontal(LegacyEmptyOptionsArray); - if (GUILayout.Button(T("TTL.Button:Rotate left"), EmptyOptionsArray)) { + if (GUILayout.Button(T("TTL.Button:Rotate left"), LegacyEmptyOptionsArray)) { timedNodeMain.RotateLeft(); _timedViewedStep = 0; } - if (GUILayout.Button(T("TTL.Button:Copy"), EmptyOptionsArray)) { + if (GUILayout.Button(T("TTL.Button:Copy"), LegacyEmptyOptionsArray)) { TrafficManagerTool.ShowAdvisor(GetType().Name + "_Copy"); nodeIdToCopy = selectedNodeIds[0]; - SetToolMode(TTLToolMode.CopyLights); + SetToolMode(TtlToolMode.CopyLights); } - if (GUILayout.Button(T("TTL.Button:Rotate right"), EmptyOptionsArray)) { + if (GUILayout.Button(T("TTL.Button:Rotate right"), LegacyEmptyOptionsArray)) { timedNodeMain.RotateRight(); _timedViewedStep = 0; } @@ -864,30 +874,30 @@ private void GuiTimedControlPanel(int num) { if (GUILayout.Button( T("TTL.Button:Add junction to TTL"), - EmptyOptionsArray)) { + LegacyEmptyOptionsArray)) { TrafficManagerTool.ShowAdvisor(GetType().Name + "_AddJunction"); - SetToolMode(TTLToolMode.AddNode); + SetToolMode(TtlToolMode.AddNode); } if (selectedNodeIds.Count > 1) { if (GUILayout.Button( T("TTL.Button:Remove junction from TTL"), - EmptyOptionsArray)) { + LegacyEmptyOptionsArray)) { TrafficManagerTool.ShowAdvisor(GetType().Name + "_RemoveJunction"); - SetToolMode(TTLToolMode.RemoveNode); + SetToolMode(TtlToolMode.RemoveNode); } } GUILayout.Space(30); - if (GUILayout.Button(T("TTL.Button:Remove entire TTL"), EmptyOptionsArray)) { + if (GUILayout.Button(T("TTL.Button:Remove entire TTL"), LegacyEmptyOptionsArray)) { DisableTimed(); ClearSelectedNodes(); - SetToolMode(TTLToolMode.SelectNode); + SetToolMode(TtlToolMode.SelectNode); } } - DragWindow(ref _windowRect); + LegacyDragWindow(ref _windowRect); } catch (Exception e) { Log.Error($"TimedTrafficLightsTool._guiTimedControlPanel: {e}"); @@ -904,7 +914,11 @@ private void RemoveStep(int stepIndex) { } } - public override void Cleanup() { + public override void OnDeactivateTool() { + Cleanup(); + } + + private void Cleanup() { SelectedNodeId = 0; ClearSelectedNodes(); @@ -918,64 +932,53 @@ public override void Cleanup() { nodeIdToCopy = 0; } - public override void Initialize() { - base.Initialize(); - Cleanup(); - - if (Options.timedLightsOverlay) { - RefreshCurrentTimedNodeIds(); - } else { - currentTimedNodeIds.Clear(); - } - } - private void BuildStepChangeMetricDisplay(bool editable) { GUILayout.BeginVertical(); if (editable) { GUILayout.Label( T("TTL.Label:After min. time go to next step if") + ":", - EmptyOptionsArray); + LegacyEmptyOptionsArray); if (GUILayout.Toggle( _stepMetric == StepChangeMetric.Default, GetStepChangeMetricDescription(StepChangeMetric.Default), - EmptyOptionsArray)) { + LegacyEmptyOptionsArray)) { _stepMetric = StepChangeMetric.Default; } if (GUILayout.Toggle( _stepMetric == StepChangeMetric.FirstFlow, GetStepChangeMetricDescription(StepChangeMetric.FirstFlow), - EmptyOptionsArray)) { + LegacyEmptyOptionsArray)) { _stepMetric = StepChangeMetric.FirstFlow; } if (GUILayout.Toggle( _stepMetric == StepChangeMetric.FirstWait, GetStepChangeMetricDescription(StepChangeMetric.FirstWait), - EmptyOptionsArray)) { + LegacyEmptyOptionsArray)) { _stepMetric = StepChangeMetric.FirstWait; } if (GUILayout.Toggle( _stepMetric == StepChangeMetric.NoFlow, GetStepChangeMetricDescription(StepChangeMetric.NoFlow), - EmptyOptionsArray)) { + LegacyEmptyOptionsArray)) { _stepMetric = StepChangeMetric.NoFlow; } if (GUILayout.Toggle( _stepMetric == StepChangeMetric.NoWait, GetStepChangeMetricDescription(StepChangeMetric.NoWait), - EmptyOptionsArray)) { + LegacyEmptyOptionsArray)) { _stepMetric = StepChangeMetric.NoWait; } } else { GUILayout.Label( T("TTL.Label:Adaptive step switching") + ": " + GetStepChangeMetricDescription(_stepMetric), - EmptyOptionsArray); + LegacyEmptyOptionsArray); } GUILayout.EndVertical(); @@ -991,7 +994,7 @@ private void BuildFlowPolicyDisplay(bool editable) { formatStr = "{0:0.#}"; } - GUILayout.BeginHorizontal(EmptyOptionsArray); + GUILayout.BeginHorizontal(LegacyEmptyOptionsArray); string sensText = T("TTL.Label:Flow sensitivity"); // TODO: Clarify for the user what this means, more help text, simpler UI @@ -999,27 +1002,27 @@ private void BuildFlowPolicyDisplay(bool editable) { string flowBalanceText = string.Format(formatStr, _waitFlowBalance); GUILayout.Label( $"{sensText} ({flowBalanceText}, {GetWaitFlowBalanceInfo()}):", - EmptyOptionsArray); + LegacyEmptyOptionsArray); if (_waitFlowBalance <= 0.01f) { if (_waitFlowBalance >= 0) { - if (GUILayout.Button("-.001", EmptyOptionsArray)) { + if (GUILayout.Button("-.001", LegacyEmptyOptionsArray)) { _waitFlowBalance -= 0.001f; } } if (_waitFlowBalance < 0.01f) { - if (GUILayout.Button("+.001", EmptyOptionsArray)) { + if (GUILayout.Button("+.001", LegacyEmptyOptionsArray)) { _waitFlowBalance += 0.001f; } } } else if (_waitFlowBalance <= 0.1f) { - if (GUILayout.Button("-.01", EmptyOptionsArray)) { + if (GUILayout.Button("-.01", LegacyEmptyOptionsArray)) { _waitFlowBalance -= 0.01f; } if (_waitFlowBalance < 0.1f) { - if (GUILayout.Button("+.01", EmptyOptionsArray)) { + if (GUILayout.Button("+.01", LegacyEmptyOptionsArray)) { _waitFlowBalance += 0.01f; } } @@ -1035,7 +1038,11 @@ private void BuildFlowPolicyDisplay(bool editable) { GUILayout.EndHorizontal(); - _waitFlowBalance = GUILayout.HorizontalSlider(_waitFlowBalance, 0.001f, 10f, EmptyOptionsArray); + _waitFlowBalance = GUILayout.HorizontalSlider( + _waitFlowBalance, + 0.001f, + 10f, + LegacyEmptyOptionsArray); // step snapping if (_waitFlowBalance < 0.001f) { @@ -1050,7 +1057,7 @@ private void BuildFlowPolicyDisplay(bool editable) { _waitFlowBalance = 10f; } - GUILayout.BeginHorizontal(EmptyOptionsArray); + GUILayout.BeginHorizontal(LegacyEmptyOptionsArray); GUIStyle style = new GUIStyle { normal = { textColor = Color.white }, alignment = TextAnchor.LowerLeft, @@ -1066,7 +1073,7 @@ private void BuildFlowPolicyDisplay(bool editable) { GUILayout.Height(10)); } else { string flowBalanceText = string.Format(formatStr, _waitFlowBalance); - GUILayout.Label($"{sensText}: {flowBalanceText} ({GetWaitFlowBalanceInfo()})", EmptyOptionsArray); + GUILayout.Label($"{sensText}: {flowBalanceText} ({GetWaitFlowBalanceInfo()})", LegacyEmptyOptionsArray); } GUILayout.EndHorizontal(); @@ -1109,8 +1116,8 @@ private void GuiTimedTrafficLightsNode() { screenRect: _windowRect2, func: _guiTimedTrafficLightsNodeWindowDelegate, text: T("TTL.Window.Title:Select nodes"), - style: WindowStyle, - options: EmptyOptionsArray); + style: LegacyWindowStyle, + options: LegacyEmptyOptionsArray); GUI.matrix = oldMatrix; _cursorInSecondaryPanel = _windowRect2.Contains(Event.current.mousePosition); @@ -1129,8 +1136,8 @@ private void GuiTimedTrafficLights() { screenRect: _windowRect, func: _guiTimedControlPanelDelegate, text: T("Dialog.Title:Timed traffic lights manager"), - style: WindowStyle, - options: EmptyOptionsArray); + style: LegacyWindowStyle, + options: LegacyEmptyOptionsArray); _cursorInSecondaryPanel = _windowRect.Contains(Event.current.mousePosition); GUI.matrix = oldMatrix; @@ -1151,15 +1158,15 @@ private void GuiTimedTrafficLightsCopy() { screenRect: _windowRect2, func: _guiTimedTrafficLightsPasteWindowDelegate, text: T("TTL.Window.Title:Paste"), - style: WindowStyle, - options: EmptyOptionsArray); + style: LegacyWindowStyle, + options: LegacyEmptyOptionsArray); _cursorInSecondaryPanel = _windowRect2.Contains(Event.current.mousePosition); GUI.matrix = oldMatrix; } private void GuiTimedTrafficLightsPasteWindow(int num) { - GUILayout.Label(T("TTL.Label:Select junction"), EmptyOptionsArray); + GUILayout.Label(T("TTL.Label:Select junction"), LegacyEmptyOptionsArray); } /// @@ -1170,7 +1177,7 @@ private void GuiTimedTrafficLightsNodeWindow(int num) { TrafficLightSimulationManager tlsMan = TrafficLightSimulationManager.Instance; if (selectedNodeIds.Count < 1) { - GUILayout.Label(T("Label:Select nodes"), EmptyOptionsArray); + GUILayout.Label(T("Label:Select nodes"), LegacyEmptyOptionsArray); } else { string txt = selectedNodeIds.Aggregate( string.Empty, @@ -1179,14 +1186,14 @@ private void GuiTimedTrafficLightsNodeWindow(int num) { return current + string.Format(format, t.ToString()); }); - GUILayout.Label(txt, EmptyOptionsArray); + GUILayout.Label(txt, LegacyEmptyOptionsArray); if (selectedNodeIds.Count > 0 && - GUILayout.Button(T("TTL.Button:Deselect all nodes"), EmptyOptionsArray)) { + GUILayout.Button(T("TTL.Button:Deselect all nodes"), LegacyEmptyOptionsArray)) { ClearSelectedNodes(); } - if (GUILayout.Button(T("TTL.Button:Setup timed traffic light"), EmptyOptionsArray)) { + if (GUILayout.Button(T("TTL.Button:Setup timed traffic light"), LegacyEmptyOptionsArray)) { _waitFlowBalance = GlobalConfig.Instance.TimedTrafficLights.FlowToWaitRatio; foreach (ushort nodeId in selectedNodeIds) { @@ -1194,13 +1201,13 @@ private void GuiTimedTrafficLightsNodeWindow(int num) { RefreshCurrentTimedNodeIds(nodeId); } - SetToolMode(TTLToolMode.ShowLights); + SetToolMode(TtlToolMode.ShowLights); } else { return; } } - DragWindow(ref _windowRect2); + LegacyDragWindow(ref _windowRect2); } private string GetWaitFlowBalanceInfo() { @@ -1410,12 +1417,8 @@ private void DrawMainLightTexture(RoadBaseAI.TrafficLightState state, Rect rect) } } - public override void ShowGUIOverlay(ToolMode toolMode, bool viewOnly) { - if (!ToolMode.TimedTrafficLights.Equals(toolMode)) { - return; - } - - if (viewOnly && !Options.timedLightsOverlay) { + public override void RenderGenericInfoOverlay_GUI() { + if (!Options.timedLightsOverlay) { return; } diff --git a/TLM/TLM/UI/SubTools/ToggleTrafficLightsTool.cs b/TLM/TLM/UI/SubTools/ToggleTrafficLightsTool.cs index 589cae5b5..2b229ed0e 100644 --- a/TLM/TLM/UI/SubTools/ToggleTrafficLightsTool.cs +++ b/TLM/TLM/UI/SubTools/ToggleTrafficLightsTool.cs @@ -13,7 +13,7 @@ namespace TrafficManager.UI.SubTools { using UnityEngine; public class ToggleTrafficLightsTool - : LegacySubTool, + : TrafficManagerSubTool, UI.MainMenu.IOnscreenDisplayProvider { /// @@ -37,8 +37,11 @@ public ToggleTrafficLightsTool(TrafficManagerTool mainTool) LastCachedCamera = new CameraTransformValue(); } - public override void OnPrimaryClickOverlay() { - if (IsCursorInPanel()) { + public override void RenderGenericInfoOverlay_GUI() { + } + + public override void OnToolLeftClick() { + if (LegacyIsCursorInPanel()) { return; } @@ -49,14 +52,19 @@ public override void OnPrimaryClickOverlay() { ToggleTrafficLight(HoveredNodeId, ref HoveredNodeId.ToNode()); } - public override void OnSecondaryClickOverlay() { + public override void OnToolRightClick() { + // Right click cancels the mode MainTool.SetToolMode(ToolMode.None); } + public override void UpdateEveryFrame() { + } + public void ToggleTrafficLight(ushort nodeId, ref NetNode node, bool showMessageOnError = true) { ToggleTrafficLightError reason; + if (!TrafficLightManager.Instance.CanToggleTrafficLight( nodeId, !TrafficLightManager.Instance.HasTrafficLight( @@ -88,7 +96,7 @@ public void ToggleTrafficLight(ushort nodeId, TrafficLightManager.Instance.ToggleTrafficLight(nodeId, ref node); } - public override void OnToolGUI(Event e) { + public override void RenderActiveToolOverlay_GUI() { Vector3 camPos = Singleton.instance.m_simulationView.m_position; var textures = TrafficLightTextures.Instance; @@ -125,7 +133,13 @@ public override void OnToolGUI(Event e) { } } - public override void RenderOverlay(RenderManager.CameraInfo cameraInfo) { + public override void RenderGenericInfoOverlay(RenderManager.CameraInfo cameraInfo) { + } + + public override void OnDeactivateTool() { + } + + public override void RenderActiveToolOverlay(RenderManager.CameraInfo cameraInfo) { if (MainTool.GetToolController().IsInsideUI || !Cursor.visible) { return; } @@ -204,8 +218,7 @@ public void UpdateOnscreenDisplayPanel() { OnscreenDisplay.Display(items); } - public override void OnActivate() { - base.OnActivate(); + public override void OnActivateTool() { MainTool.RequestOnscreenDisplayUpdate(); } } diff --git a/TLM/TLM/UI/TrafficManagerSubTool.cs b/TLM/TLM/UI/TrafficManagerSubTool.cs index ff671cace..367ab98ea 100644 --- a/TLM/TLM/UI/TrafficManagerSubTool.cs +++ b/TLM/TLM/UI/TrafficManagerSubTool.cs @@ -3,7 +3,7 @@ namespace TrafficManager.UI { /// SubTool represents TM:PE operation modes, grouped under a single TrafficManagerTool /// (which is a CO.DefaultTool). /// - public abstract class TrafficManagerSubTool { + public abstract class TrafficManagerSubTool : LegacySubToolMixin { public TrafficManagerSubTool(TrafficManagerTool mainTool) { MainTool = mainTool; } diff --git a/TLM/TLM/UI/TrafficManagerTool.cs b/TLM/TLM/UI/TrafficManagerTool.cs index bcc937b50..d4b983faf 100644 --- a/TLM/TLM/UI/TrafficManagerTool.cs +++ b/TLM/TLM/UI/TrafficManagerTool.cs @@ -235,18 +235,16 @@ internal void Initialize() { Log.Info("TrafficManagerTool: Initialization running now."); Guide = new GuideHandler(); - LegacySubTool timedLightsTool = new TimedTrafficLightsTool(this); - subTools_ = new Dictionary { [ToolMode.LaneArrows] = new LaneArrowTool(this), [ToolMode.SpeedLimits] = new SpeedLimitsTool(this), [ToolMode.RoutingDetector] = new RoutingDetectorTool(this), + [ToolMode.TimedTrafficLights] = new TimedTrafficLightsTool(this), + [ToolMode.ToggleTrafficLight] = new ToggleTrafficLightsTool(this), }; legacySubTools_ = new Dictionary { - [ToolMode.ToggleTrafficLight] = new ToggleTrafficLightsTool(this), [ToolMode.AddPrioritySigns] = new PrioritySignsTool(this), [ToolMode.ManualSwitch] = new ManualTrafficLightsTool(this), - [ToolMode.TimedTrafficLights] = timedLightsTool, [ToolMode.VehicleRestrictions] = new VehicleRestrictionsTool(this), [ToolMode.LaneConnector] = new LaneConnectorTool(this), [ToolMode.JunctionRestrictions] = new JunctionRestrictionsTool(this), @@ -302,8 +300,8 @@ protected override void Awake() { } /// Only used from CustomRoadBaseAI. - public LegacySubTool GetSubTool(ToolMode mode) { - if (legacySubTools_.TryGetValue(mode, out LegacySubTool ret)) { + public TrafficManagerSubTool GetSubTool(ToolMode mode) { + if (subTools_.TryGetValue(mode, out TrafficManagerSubTool ret)) { return ret; }