Skip to content

Commit

Permalink
No correctly sorts the first column
Browse files Browse the repository at this point in the history
  • Loading branch information
unakaroshi committed Jul 28, 2019
1 parent 0076515 commit 676c27e
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 38 deletions.
7 changes: 5 additions & 2 deletions CelestialGUI/CelestialGUI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ CelestialGUI::CelestialGUI(QWidget* parent)

ui.tableView->setSortingEnabled(true);
ui.tableView->setModel(m_pProxyModel);
ui.tableView->setModel(m_pModel);
//ui.tableView->setModel(m_pModel);



Expand All @@ -29,10 +29,13 @@ CelestialGUI::CelestialGUI(QWidget* parent)
auto catalogs = m_pModel->getStarCatalogNames();
std::for_each(catalogs.begin(), catalogs.end(),
[&](const QString &cat) { ui.cb_catalogs->addItem(cat); });
// m_pProxyModel->setSortingColumn(0);


});


//connect(ui.btn_sort, &QPushButton::clicked, [&]() { m_pProxyModel->setSortingColumn(0); });

connect(ui.cb_catalogs, qOverload<const QString&>(&QComboBox::currentTextChanged), [&](const QString& s) {

qDebug() << s;
Expand Down
86 changes: 56 additions & 30 deletions CelestialGUI/SortProxyModel.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,30 @@

#include "ScopedTimer.hpp"

class CSortProxyModel : public QAbstractProxyModel
{
class SortProxyModelLt {
public:
bool operator()(const std::pair<QString, int>& r1, const std::pair<QString, int>& r2) const {
return r1.first < r2.first;
}
};

class SortProxyModelGt {
public:
bool operator()(const std::pair<QString, int>& r1, const std::pair<QString, int>& r2) const {
return r1.first > r2.first;
}

};

class CSortProxyModel : public QAbstractProxyModel {
Q_OBJECT

private:
private:
std::vector<std::pair<QString, int>> m_mapping;

public:
CSortProxyModel(QObject* parent = nullptr)
: QAbstractProxyModel(parent)
{
CSortProxyModel(QObject* parent = nullptr)
: QAbstractProxyModel(parent) {
}

void setSourceModel(QAbstractItemModel* newSourceModel) {
Expand All @@ -48,7 +61,7 @@ class CSortProxyModel : public QAbstractProxyModel
this, SIGNAL(columnsAboutToBeInserted(const QModelIndex&, int, int)));
disconnect(sourceModel(), SIGNAL(columnsInserted(const QModelIndex&, int, int)),
this, SIGNAL(columnsInserted(const QModelIndex&, int, int)));

disconnect(sourceModel(), SIGNAL(columnsAboutToBeRemoved(const QModelIndex&, int, int)),
this, SIGNAL(columnsAboutToBeRemoved(const QModelIndex&, int, int)));
disconnect(sourceModel(), SIGNAL(columnsRemoved(const QModelIndex&, int, int)),
Expand Down Expand Up @@ -97,7 +110,7 @@ class CSortProxyModel : public QAbstractProxyModel
connect(sourceModel(), SIGNAL(columnsInserted(const QModelIndex&, int, int)),
this, SIGNAL(columnsInserted(const QModelIndex&, int, int)));



connect(sourceModel(), SIGNAL(columnsAboutToBeRemoved(const QModelIndex&, int, int)),
this, SIGNAL(columnsAboutToBeRemoved(const QModelIndex&, int, int)));
Expand All @@ -120,13 +133,13 @@ class CSortProxyModel : public QAbstractProxyModel
connect(sourceModel(), SIGNAL(layoutChanged()),
this, SIGNAL(layoutChanged()));
}

endResetModel();
}



Q_SLOT void onRowsInserted(const QModelIndex& parent, int first, int last)
{
Q_SLOT void onRowsInserted(const QModelIndex& parent, int first, int last) {
Q_UNUSED(parent);

m_mapping.reserve(static_cast<size_t>(last) - static_cast<size_t>(first) + 1 + m_mapping.size());
Expand All @@ -135,39 +148,40 @@ class CSortProxyModel : public QAbstractProxyModel

{
ScopedTimer t(__func__);

for (int i = first; i <= last; ++i) {
QModelIndex idx = createIndex(i, 4);
QModelIndex idx = createIndex(i, 0);
m_mapping.emplace_back(data(idx, Qt::DisplayRole).toString(), i);
}
}
}
Q_ASSERT(capacity == m_mapping.capacity());
Q_ASSERT(m_mapping.capacity() == m_mapping.size());

{
ScopedTimer t(__func__);
std::sort(std::execution::par_unseq, m_mapping.begin(), m_mapping.end(), [](const auto &a, const auto &b) {
return a.first < b.first;
});
}
// {

// std::sort(std::execution::par_unseq, m_mapping.begin(), m_mapping.end(), [](const auto &a, const auto &b) {
// return a.first < b.first;
// });
// }
}

QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override {

QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const override {
Q_UNUSED(parent);
if (!sourceModel()) {

if (!sourceModel() || row < 0 || column < 0 || parent.isValid()) {
return QModelIndex();
}

return createIndex(row, column);
}

QModelIndex parent(const QModelIndex& child) const override {
QModelIndex parent(const QModelIndex& child) const override {

// No tree,
return QModelIndex();
}

int rowCount(const QModelIndex& parent = QModelIndex()) const override {
if (!sourceModel()) {
return 0;
Expand All @@ -188,14 +202,14 @@ class CSortProxyModel : public QAbstractProxyModel
return QModelIndex();
}


if (index.row() >= m_mapping.size()) {
return sourceModel()->index(index.row(), index.column());
}

auto elem = m_mapping.at(index.row());

return createIndex(elem.second,index.column());
return createIndex(elem.second, index.column());
}

QModelIndex mapFromSource(const QModelIndex& index) const override {
Expand All @@ -205,12 +219,24 @@ class CSortProxyModel : public QAbstractProxyModel

auto it = std::find_if(std::execution::par_unseq, m_mapping.begin(), m_mapping.end(), [&index](const auto& a) {
return a.second == index.row();
});
});

if (it == m_mapping.end()) {
return QModelIndex();
}

return createIndex(it - m_mapping.begin(), index.column());
}
};

void sort(int column, Qt::SortOrder order) override {
ScopedTimer t(__func__);
beginResetModel();
if (order == Qt::AscendingOrder) {
std::stable_sort(std::execution::par_unseq, m_mapping.begin(), m_mapping.end(), SortProxyModelLt {});
} else {
std::stable_sort(std::execution::par_unseq, m_mapping.begin(), m_mapping.end(), SortProxyModelGt {});
}

endResetModel();
}
};
7 changes: 1 addition & 6 deletions CelestialGUI/StarCatalog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,12 +99,7 @@ bool CStarCatalog::read(QIODevice *device) {
for (auto res : results) {
res.waitForFinished();
}
/*
{
ScopedTimer t("Sorting");
std::stable_sort(std::execution::par, m_stars.begin(), m_stars.end());
}
*/

return true;
}

Expand Down

0 comments on commit 676c27e

Please sign in to comment.