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

Support IList as a data provider for TableView. #2575

Closed
tznind opened this issue Apr 26, 2023 · 1 comment
Closed

Support IList as a data provider for TableView. #2575

tznind opened this issue Apr 26, 2023 · 1 comment
Labels
breaking-change For PRs that introduces a breaking change (behavior or API) v2 For discussions, issues, etc... relavant for v2

Comments

@tznind
Copy link
Collaborator

tznind commented Apr 26, 2023

Refactoring TableView to use a new interface ITableDataSource instead of System.Data.DataTable.

Interface would be something like

interface ITableDataSource
{
    int Rows { get; }
    int Columns { get; }
    string[] ColumnNames { get; }
    object this[int row, int col]
    {
        get;
    }
}

This will be breaking but we are working on v2 I think we should consider it as its a nice feature and it is quite a common use case (to use arbitrary objects as the table data items).

That is the approach taken in TermKit and looks like it will make TableView much more flexible:

/// Protocol that describes a matrix made up of columns and rows, where the columns can be labeled
public protocol DataSource {

https://github.com/migueldeicaza/TermKit/blob/main/Sources/TermKit/Views/DataTable.swift

The Goal

The more I look at it, the more I'm excited about the idea.

Check this out! How cool would it be for an API user to be able to do something like:

var s = new EnumerableTableDataSource<Process>(Process.GetProcesses(),
    new()
    {
        { "Name",(p)=>p.ProcessName},
        { "Id",(p)=>p.Id},
        { "HasExited",(p)=>p.HasExited},
    });

myTableView.Table = s;

The EnumerableTableDataSource<T> class definition would be something like:

class EnumerableTableDataSource<T> : ITableDataSource
{
    private T[] data;
    private string[] cols;
    private Dictionary<string, Func<T, object>> lamdas;

    public EnumerableTableDataSource(IEnumerable<T> data, Dictionary<string, Func<T,object>> columnDefinitions)
    {
        this.data = data.ToArray();
        this.cols = columnDefinitions.Keys.ToArray();
        this.lamdas = columnDefinitions;
    }

    public object this[int row, int col]
    {
        get => this.lamdas[ColumnNames[col]](this.data[row]);
    }

    public int Rows => data.Length;

    public int Columns => cols.Length;

    public string[] ColumnNames => cols;
}

Originally posted by @tznind in #2573 (comment)

@tznind
Copy link
Collaborator Author

tznind commented Apr 26, 2023

I've started this refactor in https://github.com/tznind/gui.cs/tree/refactor-tv

@tznind tznind added the v2 For discussions, issues, etc... relavant for v2 label Apr 26, 2023
@tznind tznind added the breaking-change For PRs that introduces a breaking change (behavior or API) label Apr 27, 2023
tig added a commit that referenced this issue Apr 28, 2023
…able (#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 <[email protected]>
BDisp pushed a commit to BDisp/Terminal.Gui that referenced this issue 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 <[email protected]>
tig added a commit that referenced this issue 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 <[email protected]>

* 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 <[email protected]>

* 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 <[email protected]>

* 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 <[email protected]>

* 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 <[email protected]>
Co-authored-by: Tig Kindel <[email protected]>
@tig tig closed this as completed May 7, 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

No branches or pull requests

2 participants