From 65806b1ba2fc4aa8b8642be9f5d046b2062ba0ef Mon Sep 17 00:00:00 2001 From: tznind Date: Tue, 29 Dec 2020 09:54:50 +0000 Subject: [PATCH] Added SelectedCellChangedEventArgs and tests --- Terminal.Gui/Views/TableView.cs | 69 ++++++++++++++++++++++++++++++--- UnitTests/TableViewTests.cs | 60 ++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+), 6 deletions(-) diff --git a/Terminal.Gui/Views/TableView.cs b/Terminal.Gui/Views/TableView.cs index 55504e14a..5395e70b6 100644 --- a/Terminal.Gui/Views/TableView.cs +++ b/Terminal.Gui/Views/TableView.cs @@ -179,7 +179,7 @@ namespace Terminal.Gui { selectedColumn = Table == null ? 0 : Math.Min (Table.Columns.Count - 1, Math.Max (0, value)); if(oldValue != selectedColumn) - OnSelectedCellChanged(); + OnSelectedCellChanged(new SelectedCellChangedEventArgs(Table,oldValue,SelectedColumn,SelectedRow,SelectedRow)); } } @@ -190,12 +190,12 @@ namespace Terminal.Gui { get => selectedRow; set { - var oldValue = selectedColumn; + var oldValue = selectedRow; selectedRow = Table == null ? 0 : Math.Min (Table.Rows.Count - 1, Math.Max (0, value)); if(oldValue != selectedRow) - OnSelectedCellChanged(); + OnSelectedCellChanged(new SelectedCellChangedEventArgs(Table,SelectedColumn,SelectedColumn,oldValue,selectedRow)); } } @@ -217,7 +217,7 @@ namespace Terminal.Gui { /// /// This event is raised when the selected cell in the table changes. /// - public event Action SelectedCellChanged; + public event Action SelectedCellChanged; /// /// Initialzies a class using layout. @@ -715,9 +715,9 @@ namespace Terminal.Gui { /// /// Invokes the event /// - protected virtual void OnSelectedCellChanged() + protected virtual void OnSelectedCellChanged(SelectedCellChangedEventArgs args) { - SelectedCellChanged?.Invoke(new EventArgs()); + SelectedCellChanged?.Invoke(args); } /// @@ -853,4 +853,61 @@ namespace Terminal.Gui { X = x; } } + + /// + /// Defines the event arguments for + /// + public class SelectedCellChangedEventArgs : EventArgs + { + /// + /// The current table to which the new indexes refer. May be null e.g. if selection change is the result of clearing the table from the view + /// + /// + public DataTable Table {get;} + + + /// + /// The previous selected column index. May be invalid e.g. when the selection has been changed as a result of replacing the existing Table with a smaller one + /// + /// + public int OldCol {get;} + + + /// + /// The newly selected column index. + /// + /// + public int NewCol {get;} + + + /// + /// The previous selected row index. May be invalid e.g. when the selection has been changed as a result of deleting rows from the table + /// + /// + public int OldRow {get;} + + + /// + /// The newly selected row index. + /// + /// + public int NewRow {get;} + + /// + /// Creates a new instance of arguments describing a change in selected cell in a + /// + /// + /// + /// + /// + /// + public SelectedCellChangedEventArgs(DataTable t, int oldCol, int newCol, int oldRow, int newRow) + { + Table = t; + OldCol = oldCol; + NewCol = newCol; + OldRow = oldRow; + NewRow = newRow; + } + } } diff --git a/UnitTests/TableViewTests.cs b/UnitTests/TableViewTests.cs index c4819d251..481facd06 100644 --- a/UnitTests/TableViewTests.cs +++ b/UnitTests/TableViewTests.cs @@ -67,6 +67,66 @@ namespace UnitTests { Assert.Equal(1,tableView.RowOffset); Assert.Equal(1,tableView.ColumnOffset); } + + [Fact] + public void SelectedCellChanged_NotFiredForSameValue() + { + var tableView = new TableView(){ + Table = BuildTable(25,50) + }; + + bool called = false; + tableView.SelectedCellChanged += (e)=>{called=true;}; + + Assert.Equal(0,tableView.SelectedColumn); + Assert.False(called); + + // Changing value to same as it already was should not raise an event + tableView.SelectedColumn = 0; + + Assert.False(called); + + tableView.SelectedColumn = 10; + Assert.True(called); + } + + + + [Fact] + public void SelectedCellChanged_SelectedColumnIndexesCorrect() + { + var tableView = new TableView(){ + Table = BuildTable(25,50) + }; + + bool called = false; + tableView.SelectedCellChanged += (e)=>{ + called=true; + Assert.Equal(0,e.OldCol); + Assert.Equal(10,e.NewCol); + }; + + tableView.SelectedColumn = 10; + Assert.True(called); + } + + [Fact] + public void SelectedCellChanged_SelectedRowIndexesCorrect() + { + var tableView = new TableView(){ + Table = BuildTable(25,50) + }; + + bool called = false; + tableView.SelectedCellChanged += (e)=>{ + called=true; + Assert.Equal(0,e.OldRow); + Assert.Equal(10,e.NewRow); + }; + + tableView.SelectedRow = 10; + Assert.True(called); + } /// /// Builds a simple table of string columns with the requested number of columns and rows