Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixes #2575 - TableView to use interface instead of System.Data.DataTable #2576

Merged
merged 20 commits into from
Apr 28, 2023

Conversation

tznind
Copy link
Collaborator

@tznind tznind commented Apr 27, 2023

Fixes #2575 - Changes TableView from being based on System.Data.DataTable to ITableDataSource

This PR makes it super easy to create TableView that presents any arbitrary collection. The user is no longer required to mess about converting their data into System.Data.DataTable in order to render.

[Fact,AutoInitShutdown]
public void TestEnumerableDataSource_BasicTypes()
{
	var tv = new TableView ();
	tv.ColorScheme = Colors.TopLevel;
	tv.Bounds = new Rect (0, 0, 50, 6);

	tv.Table = new EnumerableTableSource<Type> (
		new Type [] { typeof (string), typeof (int), typeof (float) },
		new () {
			{ "Name", (t)=>t.Name},
			{ "Namespace", (t)=>t.Namespace},
			{ "BaseType", (t)=>t.BaseType}
		});

	tv.LayoutSubviews ();

	tv.Redraw (tv.Bounds);

	string expected =
		@"
┌──────┬─────────┬───────────────────────────────┐
│Name  │Namespace│BaseType                       │
├──────┼─────────┼───────────────────────────────┤
│String│System   │System.Object                  │
│Int32 │System   │System.ValueType               │
│Single│System   │System.ValueType               │";

	TestHelpers.AssertDriverContentsAre (expected, output);
}

process-table

ProcessTable scenario

Pull Request checklist:

  • I've named my PR in the form of "Fixes #issue. Terse description."
  • My code follows the style guidelines of Terminal.Gui - if you use Visual Studio, hit CTRL-K-D to automatically reformat your files before committing.
  • My code follows the Terminal.Gui library design guidelines
  • I ran dotnet test before commit
  • I have made corresponding changes to the API documentation (using /// style comments)
  • My changes generate no new warnings
  • I have checked my code and corrected any poor grammar or misspellings
  • I conducted basic QA to assure all features are working

@tznind tznind added breaking-change For PRs that introduces a breaking change (behavior or API) v2 For discussions, issues, etc... relavant for v2 labels Apr 27, 2023
@tznind tznind marked this pull request as ready for review April 27, 2023 11:00
@tznind
Copy link
Collaborator Author

tznind commented Apr 27, 2023

Marking this ready for review as it is good to merge. I do want to update FileDialog to use the new interface but since it was all written with DataTable in mind it will be a bit of work to back that out and probably makes sense to do that as a seperate PR.

Copy link
Collaborator

@tig tig left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See my PR.

UICatalog/Scenarios/ProcessTable.cs Show resolved Hide resolved
@tznind
Copy link
Collaborator Author

tznind commented Apr 27, 2023

I am not a fan of how the columns change width as one scrolls. It's disconcerting:

This is currently 'by design'.

  • It is both for performance (not measuring all the data in the table up front)
  • Defensive, it prevents 1 long value in a column pushing out all the other columns (potentially off the screen so that horizontal scrolling is required).

The current way of dealing with this is to use the ColumnStyle to configure min/max widths etc

I mentioned in your PR about maybe adding something like SizeColumnsToAllData or something but that I think should be a seperate PR?

@tig
Copy link
Collaborator

tig commented Apr 27, 2023

I get it now. I think we should add your explanation in uicatalog.cs where I put all the setup code.

@tznind
Copy link
Collaborator Author

tznind commented Apr 27, 2023

I get it now. I think we should add your explanation in uicatalog.cs where I put all the setup code.

Cool that makes sense, how does this read?
c767aeb

@tznind tznind requested a review from tig April 28, 2023 18:43
@tig tig merged commit 038cf8a into gui-cs:v2_develop Apr 28, 2023
@tig
Copy link
Collaborator

tig commented Apr 28, 2023

Oops. As soon as I merged this, i realized moving to TableView broke CollectionNavigator for the scenario list.

@tznind how hard it is to make CollectionNavigator work with tableview?

@tznind
Copy link
Collaborator Author

tznind commented Apr 28, 2023

Oops. As soon as I merged this, i realized moving to TableView broke CollectionNavigator for the scenario list.

@tznind how hard it is to make CollectionNavigator work with tableview?

Its doable because I did a 'good enough' implementation for FileDialog (see UpdateCollectionNavigator method).

But to add it as a core feature of TableView would require some care as we don't want to compromise performance when working with large tables.

For example if you have 1 million rows then you don't want to be regularly passing them to a new navigator just because the user changed columns.

And you don't want to duplicate all the data at all really because it can change.

I think we would want an interface ICollectionNavigator and then implement GetNextMatchingItem to search the ITableSource data directly (starting at the current offset).

Its definitely doable but requires care.

I am refactoring FileDialog to use ITableSource at the moment (its making the code much cleaner). I can look into the collection navigation next.

@tznind tznind deleted the refactor-tv branch April 28, 2023 20:56
@tznind
Copy link
Collaborator Author

tznind commented Apr 28, 2023

I have documented the breaking change in the breaking changes thread: #2448 (comment)

BDisp pushed a commit to BDisp/Terminal.Gui that referenced this pull request May 2, 2023
….DataTable (gui-cs#2576)

* WIP: Add ITableDataSource

* WIP: Refactor TableView

* WIP: Port CSVEditor

* WIP: Port TableEditor

* WIP: Port MultiColouredTable scenario

* Fix bug of adding duplicate column styles

* Update tests to use DataTableSource

* Tidy up

* Add EnumerableTableDataSource<T>

* Add test for EnumerableTableDataSource

* Add test for EnumerableTableDataSource

* Add code example to xmldoc

* Add ProcessTable scenario

* Rename ITableDataSource to ITableSource and update docs

* Rename EnumerableTableDataSource to EnumerableTableSource

* Fixed Frame != Bounds; changed UICat Scenarios list to use tableview!

* Fix scroll resetting in ProcessTable scenario

* Fix unit tests by setting Frame to same as Bounds

* Document why we have to measure our data for use with TableView

---------

Co-authored-by: Tig Kindel <tig@users.noreply.github.com>
tig added a commit that referenced this pull request May 4, 2023
…ual OnXXX methods. (#2577)

* Fixes #2482. Refactor Redraw - Non-virtual with the right set of virtual OnXXX methods.

* Change documentation comments.

* Fixes #2575 - TableView to use interface instead of System.Data.DataTable (#2576)

* WIP: Add ITableDataSource

* WIP: Refactor TableView

* WIP: Port CSVEditor

* WIP: Port TableEditor

* WIP: Port MultiColouredTable scenario

* Fix bug of adding duplicate column styles

* Update tests to use DataTableSource

* Tidy up

* Add EnumerableTableDataSource<T>

* Add test for EnumerableTableDataSource

* Add test for EnumerableTableDataSource

* Add code example to xmldoc

* Add ProcessTable scenario

* Rename ITableDataSource to ITableSource and update docs

* Rename EnumerableTableDataSource to EnumerableTableSource

* Fixed Frame != Bounds; changed UICat Scenarios list to use tableview!

* Fix scroll resetting in ProcessTable scenario

* Fix unit tests by setting Frame to same as Bounds

* Document why we have to measure our data for use with TableView

---------

Co-authored-by: Tig Kindel <tig@users.noreply.github.com>

* Fixes #2582 - Refactors FileDialog for cleaner data model (#2583)

* WIP: Add ITableDataSource

* WIP: Refactor TableView

* WIP: Port CSVEditor

* WIP: Port TableEditor

* WIP: Port MultiColouredTable scenario

* Fix bug of adding duplicate column styles

* Update tests to use DataTableSource

* Tidy up

* Add EnumerableTableDataSource<T>

* Add test for EnumerableTableDataSource

* Add test for EnumerableTableDataSource

* Add code example to xmldoc

* Add ProcessTable scenario

* Rename ITableDataSource to ITableSource and update docs

* Rename EnumerableTableDataSource to EnumerableTableSource

* Fixed Frame != Bounds; changed UICat Scenarios list to use tableview!

* Fix scroll resetting in ProcessTable scenario

* Fix unit tests by setting Frame to same as Bounds

* Document why we have to measure our data for use with TableView

* WIP: Simplify FileDialogs use of TableView

* WIP start migrating sorter

* WIP new filedialog table source mostly working

* WIP remove sorter class

* Refactor GetOrderByValue to be adjacent to GetColumnValue

* Fix collection navigator back so it ignores icon

* Fix unit tests

* Tidy up

* Fix UseColors

* Add test for UseColors

---------

Co-authored-by: Tig Kindel <tig@users.noreply.github.com>

* Fixes #2196. TextView: Setting Text places cursor at beginning, unlike TextField (#2572)

* Fixes #2196. TextView: Setting Text places cursor at beginning, unlike TextField

* Change all private members to have the _prefix.

* Renamed local member to prevLayoutStyle.

* Helper function for SetNeedsDisplay.

* Fixes #2569. Borders scenarios needed to be refactored. (#2570)

* Fixes #2569. Borders scenarios needed to be refactored.

* Fix border title with width equal to 4 and thickness top grater than 1.

* Improves border manipulation on borders scenarios.

* Prevents null value on the margin, border and padding thickness on the border scenarios.

* Remove NStack using dependence and fix prior commit.

* Refactoring the Frames scenario.

* Deleted borders scenarios.

* I did not realize that it was changed to SetSubViewNeedsDisplay.

* Re-layout; fixed colorpicker; fixed radio group

* Remove Thickness.IsEmpty as requested.

* Change the Frames scenario as requested.

---------

Co-authored-by: Tig Kindel <tig@users.noreply.github.com>

* Builds CollectionNavigator support into UI Catalog for TableView (#2584)

* Builds collectionnav support into UI cat for TableView

* Fixes keyboard mapping

* MultiSelect = false for TableView

* MultiSelect = false doesn't unbind ctrl-a

* Fixes #2581 Refactor CollectionNavigator so it supports TableView (#2586)

* Refactor CollectionNavigator to a base and a collection implementation

* Refactor CollectionNavigatorBase to look for first match smartly

* Add TableCollectionNavigator

* Make TableCollectionNavigator a core part of TableView

* Fix bad merge

* Added tests for tableview collection navigator

* Add FileDialogCollectionNavigator which ignores . and directory separator prefixes on file names

* whitespace fixes

---------

Co-authored-by: Tig <tig@users.noreply.github.com>

* Resolving merge conflicts.

* Fix merge errors.

* Fix merge errors.

* Add Command.Accept and snap to the selected glyph when ShowHorizontalScrollIndicator change to true.

* Reformat.

* Reformat again.

---------

Co-authored-by: Thomas Nind <31306100+tznind@users.noreply.github.com>
Co-authored-by: Tig Kindel <tig@users.noreply.github.com>
@tznind tznind mentioned this pull request May 29, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
breaking-change For PRs that introduces a breaking change (behavior or API) v2 For discussions, issues, etc... relavant for v2
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants