diff --git a/TBF/Rig/DataEntry/Uni/CycleBgEnForm.cs b/TBF/Rig/DataEntry/Uni/CycleBgEnForm.cs index ba259f94b..eb1966c77 100644 --- a/TBF/Rig/DataEntry/Uni/CycleBgEnForm.cs +++ b/TBF/Rig/DataEntry/Uni/CycleBgEnForm.cs @@ -76,6 +76,9 @@ namespace TBF.Rig.DataEntry.Uni /// Set to 'true' when the form closes public bool Completed { get { return completed; } } bool completed; + private System.Windows.Forms.Timer autoCloseTimer; + private int autoCloseSecondsRemaining; + private string okButtonTextBeforeAutoClose; private readonly IRegReader[] regReaders; @@ -698,6 +701,7 @@ namespace TBF.Rig.DataEntry.Uni private void okButton_Click(object sender, EventArgs e) { + StopAutoCloseCountdown(); UpdateWMsFromBoxes(); completed = true; @@ -1167,6 +1171,7 @@ namespace TBF.Rig.DataEntry.Uni private void OnForceClose(object sender, EventArgs args) { + StopAutoCloseCountdown(); DialogResult = DialogResult.Cancel; Close(); } @@ -1339,23 +1344,62 @@ namespace TBF.Rig.DataEntry.Uni log.Debug("Reading serial numbers DONE!"); } - public void AutoClickOkAfterDelay(int delayMs = 10000) + public void AutoClickOkAfterDelay(int delayMs = 5000) { - _ = AutoClickInternal(okButton, delayMs); + if (delayMs <= 0 || IsDisposed || Disposing) + return; + + if (InvokeRequired) + { + BeginInvoke(new Action(AutoClickOkAfterDelay), delayMs); + return; + } + + StopAutoCloseCountdown(); + okButtonTextBeforeAutoClose = okButton.Text; + autoCloseSecondsRemaining = Math.Max(1, (int)Math.Ceiling(delayMs / 1000D)); + UpdateAutoCloseButtonText(); + + autoCloseTimer = new System.Windows.Forms.Timer { Interval = 1000 }; + autoCloseTimer.Tick += AutoCloseTimer_Tick; + autoCloseTimer.Start(); } - private async Task AutoClickInternal(Button clickButton, int delayMs) + private void AutoCloseTimer_Tick(object sender, EventArgs e) { - await Task.Delay(delayMs); - - if (clickButton.IsHandleCreated && clickButton.Enabled && clickButton.Visible) + autoCloseSecondsRemaining--; + if (autoCloseSecondsRemaining > 0) { - // Invoke on UI thread - if (clickButton.InvokeRequired) - clickButton.BeginInvoke(new Action(() => clickButton.PerformClick())); - else - clickButton.PerformClick(); + UpdateAutoCloseButtonText(); + return; } + + bool canClick = okButton.IsHandleCreated && okButton.Enabled && okButton.Visible; + StopAutoCloseCountdown(); + if (canClick) + okButton.PerformClick(); + } + + private void UpdateAutoCloseButtonText() + { + okButton.Text = string.Format("{0} ({1})", okButtonTextBeforeAutoClose, autoCloseSecondsRemaining); + } + + private void StopAutoCloseCountdown() + { + if (autoCloseTimer != null) + { + autoCloseTimer.Stop(); + autoCloseTimer.Tick -= AutoCloseTimer_Tick; + autoCloseTimer.Dispose(); + autoCloseTimer = null; + } + + if (okButtonTextBeforeAutoClose != null && !okButton.IsDisposed) + okButton.Text = okButtonTextBeforeAutoClose; + + okButtonTextBeforeAutoClose = null; + autoCloseSecondsRemaining = 0; } } } diff --git a/TBF/Rig/DataEntry/Uni/EntryFormCfg.cs b/TBF/Rig/DataEntry/Uni/EntryFormCfg.cs index ea877ef37..ce6748c59 100644 --- a/TBF/Rig/DataEntry/Uni/EntryFormCfg.cs +++ b/TBF/Rig/DataEntry/Uni/EntryFormCfg.cs @@ -346,7 +346,7 @@ namespace TBF.Rig.DataEntry.Uni BgIsCameraPicture = false; BgFormCloseKeys = string.Empty; BgIsAutoReadingSerialNo = false; - BgAutoCloseGap = 10; + BgAutoCloseGap = 5; EnShowForm = false; EnTitle = "Enter water meter data"; diff --git a/TBF/Rig/DataEntry/Uni/TestStartEndForm.cs b/TBF/Rig/DataEntry/Uni/TestStartEndForm.cs index 2fa28d200..246dd3906 100644 --- a/TBF/Rig/DataEntry/Uni/TestStartEndForm.cs +++ b/TBF/Rig/DataEntry/Uni/TestStartEndForm.cs @@ -126,6 +126,9 @@ namespace TBF.Rig.DataEntry.Uni /// Set to 'true' when the form closes public bool Completed { get { return completed; } } bool completed; + private System.Windows.Forms.Timer autoCloseTimer; + private int autoCloseSecondsRemaining; + private string okButtonTextBeforeAutoClose; /// @@ -678,7 +681,7 @@ namespace TBF.Rig.DataEntry.Uni if (iAutocloseGap > 0) { - AutoClickOkAfterDelay(); + AutoClickOkAfterDelay(iAutocloseGap * 1000); } } @@ -1108,6 +1111,7 @@ namespace TBF.Rig.DataEntry.Uni private void okButton_Click(object sender, EventArgs eArgs) { + StopAutoCloseCountdown(); UpdateWMsFromBoxes(); completed = true; @@ -1548,6 +1552,7 @@ namespace TBF.Rig.DataEntry.Uni void OnForceClose(object sender, EventArgs args) { + StopAutoCloseCountdown(); DialogResult = DialogResult.Cancel; Close(); } @@ -1680,23 +1685,62 @@ namespace TBF.Rig.DataEntry.Uni log.Debug("Reading Start Volume DONE!"); } - public void AutoClickOkAfterDelay(int delayMs = 10000) + public void AutoClickOkAfterDelay(int delayMs = 5000) { - _ = AutoClickInternal(okButton, delayMs); + if (delayMs <= 0 || IsDisposed || Disposing) + return; + + if (InvokeRequired) + { + BeginInvoke(new Action(AutoClickOkAfterDelay), delayMs); + return; + } + + StopAutoCloseCountdown(); + okButtonTextBeforeAutoClose = okButton.Text; + autoCloseSecondsRemaining = Math.Max(1, (int)Math.Ceiling(delayMs / 1000D)); + UpdateAutoCloseButtonText(); + + autoCloseTimer = new System.Windows.Forms.Timer { Interval = 1000 }; + autoCloseTimer.Tick += AutoCloseTimer_Tick; + autoCloseTimer.Start(); } - private async Task AutoClickInternal(Button clickButton, int delayMs) + private void AutoCloseTimer_Tick(object sender, EventArgs e) { - await Task.Delay(delayMs); - - if (clickButton.IsHandleCreated && clickButton.Enabled && clickButton.Visible) + autoCloseSecondsRemaining--; + if (autoCloseSecondsRemaining > 0) { - // Invoke on UI thread - if (clickButton.InvokeRequired) - clickButton.BeginInvoke(new Action(() => clickButton.PerformClick())); - else - clickButton.PerformClick(); + UpdateAutoCloseButtonText(); + return; } + + bool canClick = okButton.IsHandleCreated && okButton.Enabled && okButton.Visible; + StopAutoCloseCountdown(); + if (canClick) + okButton.PerformClick(); + } + + private void UpdateAutoCloseButtonText() + { + okButton.Text = string.Format("{0} ({1})", okButtonTextBeforeAutoClose, autoCloseSecondsRemaining); + } + + private void StopAutoCloseCountdown() + { + if (autoCloseTimer != null) + { + autoCloseTimer.Stop(); + autoCloseTimer.Tick -= AutoCloseTimer_Tick; + autoCloseTimer.Dispose(); + autoCloseTimer = null; + } + + if (okButtonTextBeforeAutoClose != null && !okButton.IsDisposed) + okButton.Text = okButtonTextBeforeAutoClose; + + okButtonTextBeforeAutoClose = null; + autoCloseSecondsRemaining = 0; } } }