Browse Source

Fixes TableView not activating after keybinding refactor (#1593)

* Fixes TableView not activating after keybinding refactor

* Fix reading old value not new one
Thomas Nind 3 years ago
parent
commit
acaa7aa7b6
2 changed files with 43 additions and 1 deletions
  1. 5 1
      Terminal.Gui/Views/TableView.cs
  2. 38 0
      UnitTests/TableViewTests.cs

+ 5 - 1
Terminal.Gui/Views/TableView.cs

@@ -177,6 +177,10 @@ namespace Terminal.Gui {
 			set {
 				if (cellActivationKey != value) {
 					ReplaceKeyBinding (cellActivationKey, value);
+					
+					// of API user is mixing and matching old and new methods of keybinding then they may have lost
+					// the old binding (e.g. with ClearKeybindings) so ReplaceKeyBinding alone will fail
+					AddKeyBinding (value, Command.Accept);
 					cellActivationKey = value;
 				}
 			}
@@ -222,7 +226,7 @@ namespace Terminal.Gui {
 			AddCommand (Command.BottomEndExtend, () => { ChangeSelectionToEndOfTable (true); return true; });
 
 			AddCommand (Command.SelectAll, () => { SelectAll(); return true; });
-			AddCommand (Command.Accept, () => { new CellActivatedEventArgs (Table, SelectedColumn, SelectedRow); return true; });
+			AddCommand (Command.Accept, () => { OnCellActivated(new CellActivatedEventArgs (Table, SelectedColumn, SelectedRow)); return true; });
 
 			// Default keybindings for this view
 			AddKeyBinding (Key.CursorLeft, Command.Left);

+ 38 - 0
UnitTests/TableViewTests.cs

@@ -492,6 +492,44 @@ namespace Terminal.Gui.Views {
 			Application.Shutdown ();
 		}
 
+		[Fact]
+		[AutoInitShutdown]
+		public void TableView_Activate()
+		{
+			string activatedValue = null;
+			var tv = new TableView (BuildTable(1,1));
+			tv.CellActivated += (c) => activatedValue = c.Table.Rows[c.Row][c.Col].ToString();
+
+			Application.Top.Add (tv);
+			Application.Begin (Application.Top);
+
+			// pressing enter should activate the first cell (selected cell)
+			tv.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ()));
+			Assert.Equal ("R0C0",activatedValue);
+
+			// reset the test
+			activatedValue = null;
+
+			// clear keybindings and ensure that Enter does not trigger the event anymore
+			tv.ClearKeybindings ();
+			tv.ProcessKey (new KeyEvent (Key.Enter, new KeyModifiers ()));
+			Assert.Null(activatedValue);
+
+			// New method for changing the activation key
+			tv.AddKeyBinding (Key.z, Command.Accept);
+			tv.ProcessKey (new KeyEvent (Key.z, new KeyModifiers ()));
+			Assert.Equal ("R0C0", activatedValue);
+
+			// reset the test
+			activatedValue = null;
+			tv.ClearKeybindings ();
+
+			// Old method for changing the activation key
+			tv.CellActivationKey = Key.z;
+			tv.ProcessKey (new KeyEvent (Key.z, new KeyModifiers ()));
+			Assert.Equal ("R0C0", activatedValue);
+		}
+
 		[Fact]
 		public void TableView_ColorsTest_ColorGetter ()
 		{