Chromium Code Reviews| Index: runtime/bin/vmservice/client/lib/src/app/view_model.dart |
| diff --git a/runtime/bin/vmservice/client/lib/src/app/view_model.dart b/runtime/bin/vmservice/client/lib/src/app/view_model.dart |
| index 3be79ea94e132ec56432d3507b0c120f989831bc..b5e3ec1c5aae9d425da1f61dc566c3d006c87070 100644 |
| --- a/runtime/bin/vmservice/client/lib/src/app/view_model.dart |
| +++ b/runtime/bin/vmservice/client/lib/src/app/view_model.dart |
| @@ -99,3 +99,99 @@ class TableTree extends Observable { |
| rows.removeRange(index + 1, index + 1 + childCount); |
| } |
| } |
| + |
| +typedef String ValueFormatter(dynamic value); |
| + |
| +class SortedTableColumn { |
| + static String toStringFormatter(dynamic v) => v != null ? v.toString() : '<null>'; |
|
turnidge
2014/04/17 20:18:54
Line is long.
Cutch
2014/04/17 22:12:39
Done.
|
| + final String label; |
| + final ValueFormatter formatter; |
| + SortedTableColumn.withFormatter(this.label, this.formatter); |
| + SortedTableColumn(this.label) |
| + : formatter = toStringFormatter; |
| +} |
| + |
| +class SortedTableRow { |
| + final List values; |
| + SortedTableRow(this.values); |
| +} |
| + |
| +class SortedTable extends Observable { |
| + final List<SortedTableColumn> columns; |
| + final List<SortedTableRow> rows = new List<SortedTableRow>(); |
| + final List<int> _order = []; |
|
turnidge
2014/04/17 20:18:54
name - maybe _sortedRows?
Cutch
2014/04/17 22:12:39
Done.
Cutch
2014/04/17 22:12:39
Done.
|
| + |
| + SortedTable(this.columns) { |
|
turnidge
2014/04/17 20:18:54
drop constructor body -> SortedTable(this.columns)
Cutch
2014/04/17 22:12:39
Done.
|
| + |
| + } |
| + |
| + int _sortColumnIndex = 0; |
| + set sortColumnIndex(var index) { |
| + assert(index >= 0); |
| + assert(index < columns.length); |
| + _sortColumnIndex = index; |
| + notifyPropertyChange(#getColumnLabel, 0, 1); |
| + } |
| + int get sortColumnIndex => _sortColumnIndex; |
| + bool _sortDescending = true; |
| + |
| + void sort() { |
| + assert(_sortColumnIndex >= 0); |
| + assert(_sortColumnIndex < columns.length); |
| + _order.sort((i, j) { |
| + var a = rows[i].values[_sortColumnIndex]; |
| + var b = rows[j].values[_sortColumnIndex]; |
| + if (_sortDescending) { |
| + return b.compareTo(a); |
| + } else { |
| + return a.compareTo(b); |
| + } |
| + }); |
| + notifyPropertyChange(#sortedRows, 0, 1); |
| + } |
| + |
| + @observable List<int> get sortedRows => _order; |
| + |
| + void clearRows() { |
| + rows.clear(); |
| + _order.clear(); |
| + } |
| + |
| + void addRow(SortedTableRow row) { |
| + _order.add(rows.length); |
| + rows.add(row); |
| + notifyPropertyChange(#sortedRows, 0, 1); |
| + } |
| + |
| + @reflectable String getFormattedValue(int row, int column) { |
| + var value = getValue(row, column); |
| + var formatter = columns[column].formatter; |
| + return formatter(value); |
| + } |
| + |
| + @reflectable String getColumnLabel(int column) { |
| + assert(column >= 0); |
| + assert(column < columns.length); |
| + const arrowUp = '\u25BC'; |
| + const arrowDown = '\u25B2'; |
| + const none = ''; |
|
turnidge
2014/04/17 20:18:54
Is 'none' used?
Cutch
2014/04/17 22:12:39
Dead.
|
| + if (column != _sortColumnIndex) { |
| + return columns[column].label; |
| + } |
| + return columns[column].label + (_sortDescending ? arrowUp : arrowDown); |
| + } |
| + |
| + @reflectable dynamic getValue(int row, int column) { |
| + return rows[row].values[column]; |
| + } |
| + |
| + void dump() { |
| + for (var i = 0; i < rows.length; i++) { |
| + String row = ''; |
|
turnidge
2014/04/17 20:18:54
Does it make sense to use StringBuffer here?
Cutch
2014/04/17 22:12:39
This code was only used for debugging. Removed.
|
| + for (var j = 0; j < columns.length; j++) { |
| + row += getFormattedValue(i, j) + ' '; |
| + } |
| + print(row); |
| + } |
| + } |
| +} |