ProjectExplorer: Make the session list in the management dialog sortable

Fixes: QTCREATORBUG-22911
Change-Id: I2110e00428d65f347fa83cd7b11f54084517be9a
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Christian Kandeler
2019-10-01 16:47:45 +02:00
parent 092bdbc0a1
commit 8c0906e8fb
3 changed files with 29 additions and 4 deletions

View File

@@ -46,18 +46,19 @@ namespace Internal {
SessionModel::SessionModel(QObject *parent) SessionModel::SessionModel(QObject *parent)
: QAbstractTableModel(parent) : QAbstractTableModel(parent)
{ {
m_sortedSessions = SessionManager::sessions();
connect(SessionManager::instance(), &SessionManager::sessionLoaded, connect(SessionManager::instance(), &SessionManager::sessionLoaded,
this, &SessionModel::resetSessions); this, &SessionModel::resetSessions);
} }
int SessionModel::indexOfSession(const QString &session) int SessionModel::indexOfSession(const QString &session)
{ {
return SessionManager::sessions().indexOf(session); return m_sortedSessions.indexOf(session);
} }
QString SessionModel::sessionAt(int row) const QString SessionModel::sessionAt(int row) const
{ {
return SessionManager::sessions().value(row, QString()); return m_sortedSessions.value(row, QString());
} }
QVariant SessionModel::headerData(int section, Qt::Orientation orientation, int role) const QVariant SessionModel::headerData(int section, Qt::Orientation orientation, int role) const
@@ -92,7 +93,7 @@ int SessionModel::columnCount(const QModelIndex &) const
int SessionModel::rowCount(const QModelIndex &) const int SessionModel::rowCount(const QModelIndex &) const
{ {
return SessionManager::sessions().count(); return m_sortedSessions.count();
} }
QStringList pathsToBaseNames(const QStringList &paths) QStringList pathsToBaseNames(const QStringList &paths)
@@ -113,7 +114,7 @@ QVariant SessionModel::data(const QModelIndex &index, int role) const
{ {
QVariant result; QVariant result;
if (index.isValid()) { if (index.isValid()) {
QString sessionName = SessionManager::sessions().at(index.row()); QString sessionName = m_sortedSessions.at(index.row());
switch (role) { switch (role) {
case Qt::DisplayRole: case Qt::DisplayRole:
@@ -175,6 +176,23 @@ QHash<int, QByteArray> SessionModel::roleNames() const
return QAbstractTableModel::roleNames().unite(extraRoles); return QAbstractTableModel::roleNames().unite(extraRoles);
} }
void SessionModel::sort(int column, Qt::SortOrder order)
{
beginResetModel();
const auto cmp = [column, order](const QString &s1, const QString &s2) {
bool isLess;
if (column == 0)
isLess = s1 < s2;
else
isLess = SessionManager::sessionDateTime(s1) < SessionManager::sessionDateTime(s2);
if (order == Qt::DescendingOrder)
isLess = !isLess;
return isLess;
};
Utils::sort(m_sortedSessions, cmp);
endResetModel();
}
bool SessionModel::isDefaultVirgin() const bool SessionModel::isDefaultVirgin() const
{ {
return SessionManager::isDefaultVirgin(); return SessionManager::isDefaultVirgin();
@@ -183,6 +201,7 @@ bool SessionModel::isDefaultVirgin() const
void SessionModel::resetSessions() void SessionModel::resetSessions()
{ {
beginResetModel(); beginResetModel();
m_sortedSessions = SessionManager::sessions();
endResetModel(); endResetModel();
} }
@@ -244,6 +263,7 @@ void SessionModel::runSessionNameInputDialog(SessionNameInputDialog *sessionInpu
return; return;
beginResetModel(); beginResetModel();
createSession(newSession); createSession(newSession);
m_sortedSessions = SessionManager::sessions();
endResetModel(); endResetModel();
if (sessionInputDialog->isSwitchToRequested()) if (sessionInputDialog->isSwitchToRequested())

View File

@@ -61,6 +61,7 @@ public:
QVariant headerData(int section, Qt::Orientation orientation, int role) const override; QVariant headerData(int section, Qt::Orientation orientation, int role) const override;
QVariant data(const QModelIndex &index, int role) const override; QVariant data(const QModelIndex &index, int role) const override;
QHash<int, QByteArray> roleNames() const override; QHash<int, QByteArray> roleNames() const override;
void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override;
Q_SCRIPTABLE bool isDefaultVirgin() const; Q_SCRIPTABLE bool isDefaultVirgin() const;
@@ -78,6 +79,8 @@ public slots:
private: private:
void runSessionNameInputDialog(ProjectExplorer::Internal::SessionNameInputDialog *sessionInputDialog, std::function<void(const QString &)> createSession); void runSessionNameInputDialog(ProjectExplorer::Internal::SessionNameInputDialog *sessionInputDialog, std::function<void(const QString &)> createSession);
QStringList m_sortedSessions;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -63,8 +63,10 @@ SessionView::SessionView(QWidget *parent)
setSelectionMode(QAbstractItemView::ExtendedSelection); setSelectionMode(QAbstractItemView::ExtendedSelection);
setWordWrap(false); setWordWrap(false);
setRootIsDecorated(false); setRootIsDecorated(false);
setSortingEnabled(true);
setModel(&m_sessionModel); setModel(&m_sessionModel);
sortByColumn(0, Qt::AscendingOrder);
// Ensure that the full session name is visible. // Ensure that the full session name is visible.
header()->setSectionResizeMode(0, QHeaderView::ResizeToContents); header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);