using System; using Vintagestory.API.Client; using Vintagestory.API.Common; using Vintagestory.API.Datastructures; namespace Automap { 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 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) { Logger = capi.Logger; SetupDialog(); capi.Event.RegisterEventBusListener(AutomapStatusMsg, 1.0D, AutomapSystem.AutomapStatusEventKey); configuration = cfg; } 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; 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()) .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? } 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); } /// /// Toggle Automap from/to RUN state /// /// The toggle. /// Run. internal void RunToggle(bool toggle) { Logger.VerboseDebug("Dialog Changed; [ Automap Enabled: {0} ]", toggle); var statusText = this.SingleComposer.GetDynamicText(_statusTextKey); 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(); txtNote.SetValue(string.Empty); capi.Event.PushEvent(AutomapSystem.AutomapCommandEventKey, noteCmd); } 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} "); btnRun.SetValue(true); } else if (lastState == CommandType.Stop) { statusText.SetNewText($"State: {lastState}, Total: {totalShards}, Nulls: {voidShards} "); btnRun.SetValue(false); } } } }