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