OSDN Git Service

Fixes for Automatic startup
[automap/automap.git] / Automap / Subsystems / AutomapGUIDialog.cs
index c46e6aa..72471f0 100644 (file)
 
 using Vintagestory.API.Client;
 using Vintagestory.API.Common;
+using Vintagestory.API.Datastructures;
 
 namespace Automap
 {
-    public class AutomapGUIDialog : GuiDialog
-    {
-        public const string _automapControlPanelKey = "automapControlPanelKey";
-
-        private ILogger Logger;
-        private AutomapSystem _automapSystem;
-
-        public override string ToggleKeyCombinationCode
-        {
-            get
-            {
-                return _automapControlPanelKey;
-            }
-        }
-
-        public AutomapGUIDialog(ICoreClientAPI capi, AutomapSystem ams) : base(capi)
-        {
-            _automapSystem = ams;
-            Logger = capi.Logger;
-            SetupDialog();
-        }
-
-        private void SetupDialog()
-        {
-            ElementBounds dialogBounds = ElementStdBounds.AutosizedMainDialog.WithAlignment(EnumDialogArea.CenterMiddle);
-
-            ElementBounds textBounds = ElementBounds.Fixed(0, 40, 500, 300);
-
-            ElementBounds bgBounds = ElementBounds.Fill.WithFixedPadding(GuiStyle.ElementToDialogPadding);
-            bgBounds.BothSizing = ElementSizing.FitToChildren;
-            bgBounds.WithChildren(textBounds);
-
-            ElementBounds toggleBounds = textBounds.CopyOffsetedSibling(3, 5, 5, 2);
-            toggleBounds.fixedHeight = 18;
-            toggleBounds.fixedWidth = 50;
-
-            ElementBounds txtStatusBounds = textBounds.CopyOffsetedSibling(0, 20, 2, 4);
-            txtStatusBounds.fixedHeight = 16;
-            txtStatusBounds.percentWidth = 1;
-
-
-            this.SingleComposer = capi.Gui.CreateCompo("automapControlPanel", dialogBounds)
-                .AddShadedDialogBG(bgBounds)
-                .AddDialogTitleBar("Automap Controls", OnTitleBarCloseClicked)
-                .AddStaticText("Configure Automap settings:", CairoFont.WhiteDetailText(), textBounds)
-                .AddToggleButton("Run", CairoFont.ButtonText(), RunToggle, toggleBounds, "btnRun")
-                .AddStaticText("Idle.", CairoFont.WhiteSmallText().WithFontSize(12), txtStatusBounds, "txtStatus")
-                .Compose();
-        }
-
-        private void OnTitleBarCloseClicked()
-        {
-            TryClose();
-        }
-
-        /// <summary>
-        /// Toggle Automap from/to RUN state
-        /// </summary>
-        /// <returns>The toggle.</returns>
-        /// <param name="t1">T1.</param>
-        internal void RunToggle(bool toggle)
-        {
-            _automapSystem.Enabled = toggle;
-            Logger.VerboseDebug("Dialog Changed; [ Automap Enabled: {0} ]", toggle);
-            var statusText = this.SingleComposer.GetStaticText("txtStatus");
-            statusText.SetValue($"Running: {this._automapSystem.Enabled}, Total: {this._automapSystem.updatedChunksTotal}, Nulls: {this._automapSystem.nullChunkCount} ");
-
-        }
-    }
+       public class AutomapGUIDialog : GuiDialog
+       {
+               public const string _automapControlPanelKey = "automapControlPanelKey";
+               private const string _statusTextKey = @"txtStatus";
+               private const string _noteTextKey = @"edtNote";
+               private const string _swAutostart = @"swAutostart";
+               private const string _btnRunKey = @"btnRun";
+               private const string _btnSnapKey = @"btnSnap";
+
+               private ILogger Logger;
+               private PersistedConfiguration configuration;
+               private long dashTickHandle;
+
+               public override string ToggleKeyCombinationCode
+               {
+                       get {
+                               return _automapControlPanelKey;
+                       }
+               }
+
+               private uint totalShards, voidShards, changesThisTick;
+               private CommandType lastState;
+
+
+               public AutomapGUIDialog(ICoreClientAPI capi, AutomapSystem ams, PersistedConfiguration cfg) : base(capi)
+               {
+                       configuration = cfg;
+                       Logger = capi.Logger;
+                       SetupDialog();
+                       capi.Event.RegisterEventBusListener(AutomapStatusMsg, 1.0D, AutomapSystem.AutomapStatusEventKey);
+               }
+
+               public AutomapGUIDialog(ICoreClientAPI capi) : base(capi)
+               {                       
+               }
+
+               //Event for GUI status display
+
+               private void SetupDialog()
+               {
+                       ElementBounds dialogBounds = ElementStdBounds.AutosizedMainDialog.WithAlignment(EnumDialogArea.CenterMiddle);
+
+                       ElementBounds textBounds = ElementBounds.Fixed(0, 40, 500, 300);
+
+                       ElementBounds bgBounds = ElementBounds.Fill.WithFixedPadding(GuiStyle.ElementToDialogPadding);
+                       bgBounds.BothSizing = ElementSizing.FitToChildren;
+                       bgBounds.WithChildren(textBounds);
+
+                       ElementBounds toggleBounds = textBounds.CopyOffsetedSibling(0, 72, 5, 2);
+                       toggleBounds.fixedHeight = 24;
+                       toggleBounds.fixedWidth = 64;
+
+                       ElementBounds autostartBounds = toggleBounds.RightCopy(66, 0, 1, 1);
+                       autostartBounds.fixedHeight = 24;
+                       autostartBounds.fixedWidth = 80;
+
+                       ElementBounds txtStatusBounds = textBounds.CopyOffsetedSibling(0, 26, 2, 4);
+                       txtStatusBounds.fixedHeight = 16;
+                       txtStatusBounds.percentWidth = 1;
+
+                       ElementBounds btnNoteArea = textBounds.CopyOffsetedSibling(0, 42, 2, 5);
+                       btnNoteArea.fixedHeight = 24;
+                       btnNoteArea.fixedWidth = 20;
+
+                       ElementBounds txtNoteArea = btnNoteArea.CopyOffsetedSibling(64, 0, 1, 6);
+                       txtNoteArea.fixedHeight = 24;
+                       txtNoteArea.fixedWidth = 256;
+
+                       ElementBounds btnSnapshotArea = btnNoteArea.CopyOffsetedSibling(0, 64, 2, 5);
+                       btnNoteArea.fixedHeight = 24;
+                       btnNoteArea.fixedWidth = 28;
+
+
+                       this.SingleComposer = capi.Gui.CreateCompo("automapControlPanel", dialogBounds)
+                               .AddShadedDialogBG(bgBounds)
+                               .AddDialogTitleBar("Automap Controls", OnTitleBarCloseClicked)
+                               .AddStaticText("Configure Automap settings:", CairoFont.WhiteDetailText(), textBounds)
+                               .AddToggleButton("Run", CairoFont.ButtonText(), RunToggle, toggleBounds, _btnRunKey)
+                               .AddSwitch(AutostartChange,autostartBounds,_swAutostart)
+                               .AddStaticText("Autostart",CairoFont.WhiteDetailText(),autostartBounds.RightCopy(16))
+                               .AddDynamicText("Idle.", CairoFont.WhiteSmallText().WithFontSize(12), EnumTextOrientation.Left, txtStatusBounds, _statusTextKey)
+                               .AddTextInput(txtNoteArea, null, CairoFont.WhiteMediumText().WithFontSize(16), _noteTextKey)
+                               .AddButton("Note:", CreateNote, btnNoteArea, CairoFont.ButtonText())
+                               .AddButton("Snapshot!", TriggerSnapshot, btnSnapshotArea, CairoFont.ButtonText( ), key: _btnSnapKey)
+                               .Compose();
+
+                       //Controls for ALL Block & Entity Designators (Enable/Disable) <-- block edits while in 'Run' state
+                       //_automapSystem.BlockID_Designators
+                       //_automapSystem.Entity_Designators
+                       //Renderer selection
+                       //Message verbosity? Speed?
+                       var swAutostart = this.SingleComposer.GetSwitch(_swAutostart);
+                       swAutostart.On = this.configuration.Autostart;
+
+               }
+
+               private void OnTitleBarCloseClicked()
+               {
+                       TryClose();
+               }
+
+               public override void OnGuiOpened( )
+               {
+               base.OnGuiOpened( );
+               UpdateDashDisplay(0f);
+               if (dashTickHandle == 0L)  dashTickHandle = capi.Event.RegisterGameTickListener(UpdateDashDisplay, 1000);
+               }
+
+               public override void OnGuiClosed( )
+               {
+               base.OnGuiClosed( );
+
+               if (dashTickHandle != 0L) capi.Event.UnregisterGameTickListener(dashTickHandle);
+               }
+
+               /// <summary>
+               /// Toggle Automap from/to RUN state
+               /// </summary>
+               /// <returns>The toggle.</returns>
+               /// <param name="toggle">Run.</param>
+               internal void RunToggle(bool toggle)
+               {
+                       Logger.VerboseDebug("Dialog Changed; [ Automap Enabled: {0} ]", toggle);
+
+                       UpdateDashDisplay(0f);
+                                                
+                       CommandData cmd = new CommandData(toggle ? CommandType.Run : CommandType.Stop);
+
+                       capi.Event.PushEvent(AutomapSystem.AutomapCommandEventKey, cmd);
+               }
+
+               private bool CreateNote()
+               {
+                       var noteCmd = new CommandData(CommandType.Notation);
+                       var txtNote = this.SingleComposer.GetTextInput(_noteTextKey);
+                       if (!String.IsNullOrWhiteSpace(txtNote.GetText()))
+                       {
+                               noteCmd.Notation = txtNote.GetText().Replace("\n", " ");
+                               txtNote.SetValue(string.Empty);
+
+                               capi.Event.PushEvent(AutomapSystem.AutomapCommandEventKey, noteCmd);
+                       }
+                       return true;//FINDOUT: What does this DO?
+               }
+
+               private bool TriggerSnapshot( )
+               {
+               var snappyCmd = new CommandData(CommandType.Snapshot);
+               
+               capi.Event.PushEvent(AutomapSystem.AutomapCommandEventKey, snappyCmd);
+               
+               return true;//FINDOUT: What does this DO?
+               }
+
+               private void AutostartChange(bool startValue)
+               {
+               configuration.Autostart = startValue;           
+               }
+
+               private void AutomapStatusMsg(string eventName, ref EnumHandling handling, IAttribute data)
+               {
+                       Logger.VerboseDebug("MsgBus RX: AutomapStatusMsg");
+                       StatusData realData = data as StatusData;
+                       totalShards = realData.TotalUpdates;
+                       voidShards = realData.VoidChunks;
+                       changesThisTick = realData.Delta;
+                       lastState = realData.CurrentState;
+               }
+
+               private void UpdateDashDisplay(float delay)
+               {
+                       var statusText = this.SingleComposer.GetDynamicText(_statusTextKey);
+
+                       var btnRun = this.SingleComposer.GetToggleButton(_btnRunKey);
+
+                       if (lastState == CommandType.Run) {
+                       statusText.SetNewText($"State: {lastState}, Total: {totalShards}, Delta: ±{changesThisTick} Nulls: {voidShards} ");
+                       
+                       if (!btnRun.On) btnRun.SetValue(true);
+                                                       
+                       }
+                       else if (lastState == CommandType.Stop && btnRun.Enabled) {
+                       statusText.SetNewText($"State: {lastState}, Total: {totalShards}, Nulls: {voidShards} ");                       
+                       
+                       if (btnRun.On) btnRun.SetValue(false);
+                                                       
+                       }
+               }
+
+
+
+       }
 }