File tree Expand file tree Collapse file tree
appshell/qml/MuseScore/AppShell/DevTools/Gallery
framework/uicomponents/qml/Muse/UiComponents Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -1108,31 +1108,31 @@ Rectangle {
11081108 valueTitle: " Age"
11091109
11101110 model: ListModel {
1111- ListElement {
1111+ ListElement {
11121112 name: " Alex"
11131113 age: 12
11141114 valueType: " Int"
11151115 min: 1
11161116 max: 15
11171117 }
11181118 ListElement {
1119- name: " Tony "
1120- age: 15
1119+ name: " Anna "
1120+ age: 11
11211121 valueType: " Int"
11221122 }
11231123 ListElement {
1124- name: " Fred "
1125- age: 10
1124+ name: " Emma "
1125+ age: 5
11261126 valueType: " Int"
11271127 }
11281128 ListElement {
1129- name: " Emma "
1130- age: 5
1129+ name: " Fred "
1130+ age: 10
11311131 valueType: " Int"
11321132 }
11331133 ListElement {
1134- name: " Anna "
1135- age: 11
1134+ name: " Tony "
1135+ age: 15
11361136 valueType: " Int"
11371137 }
11381138 }
@@ -1170,6 +1170,10 @@ Rectangle {
11701170 return null
11711171 }
11721172
1173+ sortOrderProvider : function (column ) {
1174+ return tableProxy .columnSortOrder (column)
1175+ }
1176+
11731177 onHorizontalHeaderClicked : function (column ) {
11741178 tableProxy .toggleColumnSort (column)
11751179 }
Original file line number Diff line number Diff line change 3434 property alias model: tableView .model
3535 property var sourceComponentCallback
3636
37+ property var sortOrderProvider: null
38+
3739 property bool showVerticalHeader: false
3840 property bool horizontalHeaderNavigationEnabled: true
3941 property bool displayTruncatedTextOnHover: false
@@ -83,11 +85,18 @@ Item {
8385 QtObject {
8486 id: prv
8587
88+ property int sortRevision: 0
8689 property real valueItemWidth: 126
8790 property real spacing: 4
8891 property real sideMargin: 30
8992 }
9093
94+ Connections {
95+ target: root .model
96+ ignoreUnknownSignals: true
97+ function onSortChanged () { prv .sortRevision ++ }
98+ }
99+
91100 Rectangle {
92101 id: background
93102 anchors .fill : parent
@@ -120,6 +129,8 @@ Item {
120129
121130 headerCapitalization: root .headerCapitalization
122131
132+ sortOrder: root .sortOrderProvider ? (prv .sortRevision , root .sortOrderProvider (index)) : ColumnSortOrder .Unsorted
133+
123134 navigation .panel : root .navigationPanel
124135 navigation .row : 0
125136 navigation .column : index * 100 // * 100 - some extra space for cell controls
Original file line number Diff line number Diff line change 3838
3939 property int headerCapitalization: Font .AllUppercase
4040
41+ property int sortOrder: ColumnSortOrder .Unsorted
42+
4143 property NavigationControl navigation: NavigationControl {
4244 name: root .objectName !== " " ? root .objectName : " TableViewColumn"
4345 enabled: root .enabled && root .visible
@@ -96,6 +98,16 @@ Item {
9698 opacity: ui .theme .buttonOpacityNormal
9799 }
98100
101+ StyledIconLabel {
102+ id: sorterIcon
103+ Layout .alignment : Qt .AlignVCenter
104+
105+ visible: root .sortOrder !== ColumnSortOrder .Unsorted
106+ iconCode: root .sortOrder === ColumnSortOrder .Ascending ? IconCode .SMALL_ARROW_DOWN : IconCode .SMALL_ARROW_UP
107+
108+ opacity: ui .theme .buttonOpacityNormal
109+ }
110+
99111 MenuButton {
100112 Layout .alignment : Qt .AlignVCenter
101113 Layout .preferredWidth : 16
@@ -141,6 +153,11 @@ Item {
141153 target: titleLabel
142154 opacity: ui .theme .buttonOpacityHover
143155 }
156+
157+ PropertyChanges {
158+ target: sorterIcon
159+ opacity: ui .theme .buttonOpacityHover
160+ }
144161 }
145162 ]
146163}
Original file line number Diff line number Diff line change @@ -118,18 +118,29 @@ int TableSortFilterProxyModel::mapRowToSource(int proxyRow) const
118118 return idx.isValid () ? idx.row () : -1 ;
119119}
120120
121+ ColumnSortOrder::Type TableSortFilterProxyModel::columnSortOrder (int column) const
122+ {
123+ const auto it = std::find_if (m_sortPipeline.begin (), m_sortPipeline.end (),
124+ [column](const SortKey& k) { return k.column == column; });
125+ if (it != m_sortPipeline.end () - 1 ) {
126+ return ColumnSortOrder::Type::Unsorted;
127+ }
128+ return it->ascending ? ColumnSortOrder::Type::Ascending : ColumnSortOrder::Type::Descending;
129+ }
130+
121131void TableSortFilterProxyModel::reapplySort ()
122132{
123133 if (!sourceModel ()) {
124134 return ;
125135 }
126136 if (m_sortPipeline.empty ()) {
127137 sort (-1 );
128- return ;
138+ } else {
139+ invalidate ();
140+ // ! Note: trigger a sort - what column and order we specify doesn't matter. The ordering is determined by the sort pipeline in `lessThan()`
141+ sort (0 , Qt::AscendingOrder);
129142 }
130- invalidate ();
131- // ! Note: trigger a sort - what column and order we specify doesn't matter. The ordering is determined by the sort pipeline in `lessThan()`
132- sort (0 , Qt::AscendingOrder);
143+ emit sortChanged ();
133144}
134145
135146bool TableSortFilterProxyModel::filterAcceptsRow (int sourceRow, const QModelIndex& sourceParent) const
Original file line number Diff line number Diff line change 2929#include < vector>
3030
3131namespace muse ::uicomponents {
32+ namespace ColumnSortOrder {
33+ Q_NAMESPACE;
34+ QML_ELEMENT;
35+
36+ enum class Type {
37+ Unsorted = -1 ,
38+ Ascending = 0 ,
39+ Descending = 1
40+ };
41+
42+ Q_ENUM_NS (Type)
43+ }
44+
3245/* *
3346 * @brief Table-aware sort/filter proxy.
3447 *
@@ -56,9 +69,11 @@ class TableSortFilterProxyModel : public QSortFilterProxyModel
5669 Q_INVOKABLE void clearSort ();
5770 Q_INVOKABLE void invalidateFilters ();
5871 Q_INVOKABLE int mapRowToSource (int proxyRow) const ;
72+ Q_INVOKABLE ColumnSortOrder::Type columnSortOrder (int column) const ;
5973
6074signals:
6175 void rowCountChanged ();
76+ void sortChanged ();
6277
6378protected:
6479 bool filterAcceptsRow (int sourceRow, const QModelIndex& sourceParent) const override ;
You can’t perform that action at this time.
0 commit comments