Skip to content

Commit 39fdfd3

Browse files
committed
sort-order icon
1 parent e880e06 commit 39fdfd3

5 files changed

Lines changed: 71 additions & 13 deletions

File tree

src/appshell/qml/MuseScore/AppShell/DevTools/Gallery/GeneralComponentsGallery.qml

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff 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
}

src/framework/uicomponents/qml/Muse/UiComponents/StyledTableView.qml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ Item {
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

src/framework/uicomponents/qml/Muse/UiComponents/internal/StyledTableViewColumn.qml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ Item {
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
}

src/framework/uicomponents/qml/Muse/UiComponents/tablesortfilterproxymodel.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff 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+
121131
void 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

135146
bool TableSortFilterProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const

src/framework/uicomponents/qml/Muse/UiComponents/tablesortfilterproxymodel.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,19 @@
2929
#include <vector>
3030

3131
namespace 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

6074
signals:
6175
void rowCountChanged();
76+
void sortChanged();
6277

6378
protected:
6479
bool filterAcceptsRow(int sourceRow, const QModelIndex& sourceParent) const override;

0 commit comments

Comments
 (0)