diff --git a/Essentials Core/PepperDashEssentialsBase/Touchpanels/Keyboards/HabaneroKeyboardController.cs b/Essentials Core/PepperDashEssentialsBase/Touchpanels/Keyboards/HabaneroKeyboardController.cs index b69f9887..5e068c12 100644 --- a/Essentials Core/PepperDashEssentialsBase/Touchpanels/Keyboards/HabaneroKeyboardController.cs +++ b/Essentials Core/PepperDashEssentialsBase/Touchpanels/Keyboards/HabaneroKeyboardController.cs @@ -36,6 +36,8 @@ namespace PepperDash.Essentials.Core.Touchpanels.Keyboards public Action HideAction { get; set; } + CTimer BackspaceTimer; + /// /// /// @@ -88,7 +90,8 @@ namespace PepperDash.Essentials.Core.Touchpanels.Keyboards TriList.SetSigTrueAction(2947, () => Press('.')); TriList.SetSigTrueAction(2948, () => Press('@')); TriList.SetSigTrueAction(2949, () => Press(' ')); - TriList.SetSigTrueAction(2950, Backspace); + TriList.SetSigHeldAction(2950, 500, StartBackspaceRepeat, StopBackspaceRepeat, Backspace); + //TriList.SetSigTrueAction(2950, Backspace); TriList.SetSigTrueAction(2951, Shift); TriList.SetSigTrueAction(2952, NumShift); TriList.SetSigTrueAction(2953, Clear); @@ -204,6 +207,28 @@ namespace PepperDash.Essentials.Core.Touchpanels.Keyboards char Y(int i) { return new char[] { 'y', 'Y', '6', '^' }[i]; } char Z(int i) { return new char[] { 'z', 'Z', ',', ',' }[i]; } + /// + /// Does what it says + /// + void StartBackspaceRepeat() + { + if (BackspaceTimer == null) + { + BackspaceTimer = new CTimer(o => Backspace(), null, 0, 175); + } + } + + /// + /// Does what it says + /// + void StopBackspaceRepeat() + { + if (BackspaceTimer != null) + { + BackspaceTimer.Stop(); + BackspaceTimer = null; + } + } void Backspace() { diff --git a/Essentials Core/PepperDashEssentialsBase/Touchpanels/TriListExtensions.cs b/Essentials Core/PepperDashEssentialsBase/Touchpanels/TriListExtensions.cs index 2e529306..d183abc4 100644 --- a/Essentials Core/PepperDashEssentialsBase/Touchpanels/TriListExtensions.cs +++ b/Essentials Core/PepperDashEssentialsBase/Touchpanels/TriListExtensions.cs @@ -77,7 +77,7 @@ namespace PepperDash.Essentials.Core /// Sets an action to a held sig as well as a released-without-hold action /// /// - public static BoolOutputSig SetSigHeldAction(this BoolOutputSig sig, uint heldMs, Action heldAction, Action releaseAction) + public static BoolOutputSig SetSigHeldAction(this BoolOutputSig sig, uint heldMs, Action heldAction, Action holdReleasedAction, Action releaseAction) { CTimer heldTimer = null; bool wasHeld = false; @@ -98,12 +98,18 @@ namespace PepperDash.Essentials.Core } }, heldMs); } - else if (!wasHeld) // released + else if (!press && !wasHeld) // released, no hold { heldTimer.Stop(); if (releaseAction != null) releaseAction(); } + else // !press && wasHeld // released after held + { + heldTimer.Stop(); + if (holdReleasedAction != null) + holdReleasedAction(); + } }); } @@ -114,9 +120,19 @@ namespace PepperDash.Essentials.Core /// The sig public static BoolOutputSig SetSigHeldAction(this BasicTriList tl, uint sigNum, uint heldMs, Action heldAction, Action releaseAction) { - return tl.BooleanOutput[sigNum].SetSigHeldAction(heldMs, heldAction, releaseAction); + return tl.BooleanOutput[sigNum].SetSigHeldAction(heldMs, heldAction, null, releaseAction); } + /// + /// Sets an action to a held sig, an action for the release of hold, as well as a released-without-hold action + /// + /// + public static BoolOutputSig SetSigHeldAction(this BasicTriList tl, uint sigNum, uint heldMs, Action heldAction, + Action holdReleasedAction, Action releaseAction) + { + return tl.BooleanOutput[sigNum].SetSigHeldAction(heldMs, heldAction, holdReleasedAction, releaseAction); + } + /// /// /// diff --git a/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/EssentialsHuddleVtc1PanelAvFunctionsDriver.cs b/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/EssentialsHuddleVtc1PanelAvFunctionsDriver.cs index 6286c70d..62f75105 100644 --- a/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/EssentialsHuddleVtc1PanelAvFunctionsDriver.cs +++ b/Essentials/PepperDashEssentials/UIDrivers/EssentialsHuddleVTC/EssentialsHuddleVtc1PanelAvFunctionsDriver.cs @@ -908,6 +908,7 @@ namespace PepperDash.Essentials HeaderGearButton.SetIcon(HeaderListButton.Gear); HeaderGearButton.OutputSig.SetSigHeldAction(2000, ShowTech, + null, () => { if (CurrentRoom.OnFeedback.BoolValue) diff --git a/Essentials/PepperDashEssentials/UIDrivers/JoinedSigInterlock.cs b/Essentials/PepperDashEssentials/UIDrivers/JoinedSigInterlock.cs index 09df5b1d..4de87788 100644 --- a/Essentials/PepperDashEssentials/UIDrivers/JoinedSigInterlock.cs +++ b/Essentials/PepperDashEssentials/UIDrivers/JoinedSigInterlock.cs @@ -22,11 +22,13 @@ namespace PepperDash.Essentials } /// - /// Hides CurrentJoin and shows join. Does nothing when resending CurrentJoin + /// Hides CurrentJoin and shows join. Will check and re-set signal if join + /// equals CurrentJoin /// public void ShowInterlocked(uint join) { - if (CurrentJoin == join) + Debug.Console(2, "Trilist {0:X2}, interlock swapping {1} for {2}", TriList.ID, CurrentJoin, join); + if (CurrentJoin == join && TriList.BooleanInput[join].BoolValue) return; SetButDontShow(join); TriList.SetBool(CurrentJoin, true); @@ -38,7 +40,8 @@ namespace PepperDash.Essentials /// public void ShowInterlockedWithToggle(uint join) { - if (CurrentJoin == join) + Debug.Console(2, "Trilist {0:X2}, interlock swapping {1} for {2}", TriList.ID, CurrentJoin, join); + if (CurrentJoin == join) HideAndClear(); else { @@ -53,6 +56,7 @@ namespace PepperDash.Essentials /// public void HideAndClear() { + Debug.Console(2, "Trilist {0:X2}, interlock hiding {1}", TriList.ID, CurrentJoin); Hide(); CurrentJoin = 0; } @@ -63,7 +67,8 @@ namespace PepperDash.Essentials /// public void Hide() { - if (CurrentJoin > 0) + Debug.Console(2, "Trilist {0:X2}, interlock hiding {1}", TriList.ID, CurrentJoin); + if (CurrentJoin > 0) TriList.BooleanInput[CurrentJoin].BoolValue = false; } @@ -72,7 +77,8 @@ namespace PepperDash.Essentials /// public void Show() { - if (CurrentJoin > 0) + Debug.Console(2, "Trilist {0:X2}, interlock showing {1}", TriList.ID, CurrentJoin); + if (CurrentJoin > 0) TriList.BooleanInput[CurrentJoin].BoolValue = true; } diff --git a/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs b/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs index 4c58e3f2..1205c24a 100644 --- a/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs +++ b/Essentials/PepperDashEssentials/UIDrivers/VC/EssentialsVideoCodecUiDriver.cs @@ -88,6 +88,8 @@ namespace PepperDash.Essentials.UIDrivers.VC bool CodecHasFavorites; + CTimer BackspaceTimer; + /// /// /// @@ -176,7 +178,9 @@ namespace PepperDash.Essentials.UIDrivers.VC TriList.SetSigFalseAction(UIBoolJoin.VCDirectorySearchTextPress, RevealKeyboard); - TriList.SetSigFalseAction(UIBoolJoin.VCDirectoryBackspacePress, SearchKeypadBackspacePress); + //TriList.SetSigFalseAction(UIBoolJoin.VCDirectoryBackspacePress, SearchKeypadBackspacePress); + TriList.SetSigHeldAction(UIBoolJoin.VCDirectoryBackspacePress, 500, + StartSearchBackspaceRepeat, StopSearchBackspaceRepeat, SearchKeypadBackspacePress); CallSharingInfoVisibleFeedback = new BoolFeedback(() => !string.IsNullOrEmpty(Codec.SharingSourceFeedback.StringValue)); CallSharingInfoVisibleFeedback.LinkInputSig(triList.BooleanInput[UIBoolJoin.CallSharedSourceInfoEnable]); @@ -253,7 +257,7 @@ namespace PepperDash.Essentials.UIDrivers.VC KeypadMode = eKeypadMode.DTMF; DialStringBuilder.Remove(0, DialStringBuilder.Length); DialStringFeedback.FireUpdate(); - TriList.SetBool(UIBoolJoin.VCKeypadVisible, false); + DialStringTextCheckEnables(); Parent.ShowNotificationRibbon("Connected", 2000); StagingButtonsFeedbackInterlock.ShowInterlocked(UIBoolJoin.VCStagingKeypadPress); VCControlsInterlock.ShowInterlocked(UIBoolJoin.VCKeypadVisible); @@ -432,7 +436,9 @@ namespace PepperDash.Essentials.UIDrivers.VC DialKeypad.Misc1.SetSigFalseAction(() => DialKeypadPress("*")); DialKeypad.Misc2SigName = "#"; DialKeypad.Misc2.SetSigFalseAction(() => DialKeypadPress("#")); - TriList.SetSigFalseAction(UIBoolJoin.VCKeypadBackspacePress, DialKeypadBackspacePress); + //TriList.SetSigFalseAction(UIBoolJoin.VCKeypadBackspacePress, DialKeypadBackspacePress); + TriList.SetSigHeldAction(UIBoolJoin.VCKeypadBackspacePress, 500, + StartBackspaceRepeat, StopBackspaceRepeat, DialKeypadBackspacePress); } else Debug.Console(0, "Trilist {0:x2}, VC dial keypad object {1} not found. Check SGD file or VTP", @@ -769,17 +775,19 @@ namespace PepperDash.Essentials.UIDrivers.VC if (VCControlsInterlock.CurrentJoin == UIBoolJoin.VCKeypadWithFavoritesVisible && KeypadMode == eKeypadMode.Dial) { var kb = Parent.Keyboard; - kb.KeyPress += new EventHandler(Keyboard_KeyPress); + kb.KeyPress -= Keyboard_DialKeyPress; + kb.KeyPress += Keyboard_DialKeyPress; kb.HideAction = this.DetachDialKeyboard; kb.GoButtonText = "Connect"; kb.GoButtonVisible = true; - DialStringKeypadCheckEnables(); + DialStringTextCheckEnables(); kb.Show(); } else if(VCControlsInterlock.CurrentJoin == UIBoolJoin.VCDirectoryVisible) { var kb = Parent.Keyboard; - kb.KeyPress += new EventHandler(Search_KeyPress); + kb.KeyPress -= Keyboard_SearchKeyPress; + kb.KeyPress += Keyboard_SearchKeyPress; kb.HideAction = this.DetachSearchKeyboard; kb.GoButtonText = "Search"; kb.GoButtonVisible = true; @@ -789,33 +797,37 @@ namespace PepperDash.Essentials.UIDrivers.VC } /// - /// + /// Event handler for keyboard dialing /// - void Keyboard_KeyPress(object sender, PepperDash.Essentials.Core.Touchpanels.Keyboards.KeyboardControllerPressEventArgs e) + void Keyboard_DialKeyPress(object sender, PepperDash.Essentials.Core.Touchpanels.Keyboards.KeyboardControllerPressEventArgs e) { - if (VCControlsInterlock.CurrentJoin == UIBoolJoin.VCKeypadVisible) + if (VCControlsInterlock.CurrentJoin == UIBoolJoin.VCKeypadWithFavoritesVisible && KeypadMode == eKeypadMode.Dial) { - if (KeypadMode == eKeypadMode.Dial) - if (e.Text != null) - DialStringBuilder.Append(e.Text); - else - { - if (e.SpecialKey == KeyboardSpecialKey.Backspace) - DialKeypadBackspacePress(); - else if (e.SpecialKey == KeyboardSpecialKey.Clear) - DialKeypadClear(); - else if (e.SpecialKey == KeyboardSpecialKey.GoButton) - { - ConnectPress(); - Parent.Keyboard.Hide(); - } - } + if (e.Text != null) + DialStringBuilder.Append(e.Text); + else + { + if (e.SpecialKey == KeyboardSpecialKey.Backspace) + DialKeypadBackspacePress(); + else if (e.SpecialKey == KeyboardSpecialKey.Clear) + DialKeypadClear(); + else if (e.SpecialKey == KeyboardSpecialKey.GoButton) + { + ConnectPress(); + Parent.Keyboard.Hide(); + } + } DialStringFeedback.FireUpdate(); - DialStringKeypadCheckEnables(); + DialStringTextCheckEnables(); } } - void Search_KeyPress(object sender, KeyboardControllerPressEventArgs e) + /// + /// Event handler for keyboard directory searches + /// + /// + /// + void Keyboard_SearchKeyPress(object sender, KeyboardControllerPressEventArgs e) { if (VCControlsInterlock.CurrentJoin == UIBoolJoin.VCDirectoryVisible) { @@ -838,14 +850,17 @@ namespace PepperDash.Essentials.UIDrivers.VC } } + /// + /// Call + /// void DetachDialKeyboard() { - Parent.Keyboard.KeyPress -= Keyboard_KeyPress; + Parent.Keyboard.KeyPress -= Keyboard_DialKeyPress; } void DetachSearchKeyboard() { - Parent.Keyboard.KeyPress -= Search_KeyPress; + Parent.Keyboard.KeyPress -= Keyboard_SearchKeyPress; } /// @@ -917,7 +932,7 @@ namespace PepperDash.Essentials.UIDrivers.VC { DialStringBuilder.Append(i); DialStringFeedback.FireUpdate(); - DialStringKeypadCheckEnables(); + DialStringTextCheckEnables(); } else { @@ -926,16 +941,44 @@ namespace PepperDash.Essentials.UIDrivers.VC DialStringFeedback.FireUpdate(); // no delete key in this mode! } - } + } + + /// + /// Does what it says + /// + void StartBackspaceRepeat() + { + if (BackspaceTimer == null) + { + BackspaceTimer = new CTimer(o => DialKeypadBackspacePress(), null, 0, 175); + } + } + + /// + /// Does what it says + /// + void StopBackspaceRepeat() + { + if (BackspaceTimer != null) + { + BackspaceTimer.Stop(); + BackspaceTimer = null; + } + } /// /// /// void DialKeypadBackspacePress() { - DialStringBuilder.Remove(DialStringBuilder.Length - 1, 1); - DialStringFeedback.FireUpdate(); - DialStringKeypadCheckEnables(); + if (KeypadMode == eKeypadMode.Dial) + { + DialStringBuilder.Remove(DialStringBuilder.Length - 1, 1); + DialStringFeedback.FireUpdate(); + DialStringTextCheckEnables(); + } + else + DialKeypadClear(); } /// @@ -945,13 +988,13 @@ namespace PepperDash.Essentials.UIDrivers.VC { DialStringBuilder.Remove(0, DialStringBuilder.Length); DialStringFeedback.FireUpdate(); - DialStringKeypadCheckEnables(); + DialStringTextCheckEnables(); } /// /// Checks the enabled states of various elements around the keypad /// - void DialStringKeypadCheckEnables() + void DialStringTextCheckEnables() { var textIsEntered = DialStringBuilder.Length > 0; TriList.SetBool(UIBoolJoin.VCKeypadBackspaceVisible, textIsEntered); @@ -962,19 +1005,48 @@ namespace PepperDash.Essentials.UIDrivers.VC Parent.Keyboard.DisableGoButton(); } - + /// + /// + /// void SearchPress() { (Codec as IHasDirectory).SearchDirectory(SearchStringBuilder.ToString()); } - void SearchKeypadPress(string i) + /// + /// + /// + /// + void SearchKeyboardPress(string i) { SearchStringBuilder.Append(i); SearchStringFeedback.FireUpdate(); SearchStringKeypadCheckEnables(); } + /// + /// Does what it says + /// + void StartSearchBackspaceRepeat() + { + if (BackspaceTimer == null) + { + BackspaceTimer = new CTimer(o => SearchKeypadBackspacePress(), null, 0, 175); + } + } + + /// + /// Does what it says + /// + void StopSearchBackspaceRepeat() + { + if (BackspaceTimer != null) + { + BackspaceTimer.Stop(); + BackspaceTimer = null; + } + } + /// /// /// diff --git a/Release Package/PepperDashEssentials.cpz b/Release Package/PepperDashEssentials.cpz index 80fa09fa..05677172 100644 Binary files a/Release Package/PepperDashEssentials.cpz and b/Release Package/PepperDashEssentials.cpz differ diff --git a/Release Package/PepperDashEssentials.dll b/Release Package/PepperDashEssentials.dll index f8a5cb88..068ec36e 100644 Binary files a/Release Package/PepperDashEssentials.dll and b/Release Package/PepperDashEssentials.dll differ