From ea2aa495b3172b42ef93c142a0d012c05cf5337a Mon Sep 17 00:00:00 2001 From: Manuel Date: Thu, 28 Mar 2019 05:05:27 +0100 Subject: [PATCH] Visual sort indicators for multi-column sorting (#1810) This adds visual sort indicators to the already working multi-column sorting. Qt sort indicator is disabled, so only one indicator per column is visible. Unicode characters are used to indicate direction (triangles) and sort column order (superscript numbers). See issue #1761 --- src/FilterTableHeader.cpp | 3 ++- src/MainWindow.cpp | 12 ------------ src/MainWindow.ui | 3 --- src/sqlitetablemodel.cpp | 33 ++++++++++++++++++++++++++++++--- 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/FilterTableHeader.cpp b/src/FilterTableHeader.cpp index 73171f24..f0b0959a 100644 --- a/src/FilterTableHeader.cpp +++ b/src/FilterTableHeader.cpp @@ -10,7 +10,8 @@ FilterTableHeader::FilterTableHeader(QTableView* parent) : { // Activate the click signals to allow sorting setSectionsClickable(true); - setSortIndicatorShown(true); + // But use our own indicators allowing multi-column sorting + setSortIndicatorShown(false); // Do some connects: Basically just resize and reposition the input widgets whenever anything changes connect(this, SIGNAL(sectionResized(int,int,int)), this, SLOT(adjustPositions())); diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index b2437563..06ea7a0b 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -749,9 +749,6 @@ void MainWindow::populateTable() for(int i=1;icolumnCount();i++) ui->dataTable->setColumnWidth(i, ui->dataTable->horizontalHeader()->defaultSectionSize()); - // Sorting - ui->dataTable->filterHeader()->setSortIndicator(0, Qt::AscendingOrder); - // Encoding m_browseTableModel->setEncoding(defaultBrowseTableEncoding); @@ -849,15 +846,6 @@ void MainWindow::applyBrowseTableSettings(BrowseDataTableSettings storedData, bo for(auto widthIt=storedData.columnWidths.constBegin();widthIt!=storedData.columnWidths.constEnd();++widthIt) ui->dataTable->setColumnWidth(widthIt.key(), widthIt.value()); - // Sorting - // For now just use the first sort column for the sort indicator - if(storedData.query.orderBy().size()) - { - ui->dataTable->filterHeader()->setSortIndicator( - storedData.query.orderBy().front().column, - storedData.query.orderBy().front().direction == sqlb::Ascending ? Qt::AscendingOrder : Qt::DescendingOrder); - } - // Filters if(!skipFilters) { diff --git a/src/MainWindow.ui b/src/MainWindow.ui index b2854262..07de2ffc 100644 --- a/src/MainWindow.ui +++ b/src/MainWindow.ui @@ -222,9 +222,6 @@ You can drag SQL statements from an object row and drop them into other applicat QAbstractItemView::ContiguousSelection - - true - diff --git a/src/sqlitetablemodel.cpp b/src/sqlitetablemodel.cpp index d24f1b7d..4dcdc8c5 100644 --- a/src/sqlitetablemodel.cpp +++ b/src/sqlitetablemodel.cpp @@ -217,6 +217,23 @@ int SqliteTableModel::filterCount() const return m_query.where().size(); } +// Convert a number to string using the Unicode superscript characters +static QString toSuperScript(int number) +{ + QString superScript = QString::number(number); + superScript.replace("0", "⁰"); + superScript.replace("1", "¹"); + superScript.replace("2", "²"); + superScript.replace("3", "³"); + superScript.replace("4", "⁴"); + superScript.replace("5", "⁵"); + superScript.replace("6", "⁶"); + superScript.replace("7", "⁷"); + superScript.replace("8", "⁸"); + superScript.replace("9", "⁹"); + return superScript; +} + QVariant SqliteTableModel::headerData(int section, Qt::Orientation orientation, int role) const { if (role != Qt::DisplayRole) @@ -225,9 +242,19 @@ QVariant SqliteTableModel::headerData(int section, Qt::Orientation orientation, if (orientation == Qt::Horizontal) { // if we have a VIRTUAL table the model will not be valid, with no header data - if(section < m_headers.size()) - return m_headers.at(section); - + if(section < m_headers.size()) { + QString sortIndicator; + for(int i = 0; i < m_query.orderBy().size(); i++) { + const sqlb::SortedColumn sortedColumn = m_query.orderBy()[i]; + // Append sort indicator with direction and ordinal number in superscript style + if (sortedColumn.column == section) { + sortIndicator = sortedColumn.direction == sqlb::Ascending ? " ▾" : " ▴"; + sortIndicator.append(toSuperScript(i+1)); + break; + } + } + return m_headers.at(section) + sortIndicator; + } return QString("%1").arg(section + 1); } else