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);
+
+ }
+ }
+
+
+
+ }
}