From 29f6f4f2537e05e872259ef63aa91874bfea206b Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Fri, 23 Sep 2016 19:14:50 +0200 Subject: [PATCH] Sessions: introduce a sessionDateTime This can show the last modified time of a session and will be used in a next commit to make it more clear when session was saved. Change-Id: I9f73f62652efc9287563f833f25c49f79c39d936 Task-number: QTCREATORBUG-15790 Reviewed-by: Eike Ziller --- src/plugins/projectexplorer/session.cpp | 17 +++++++-- src/plugins/projectexplorer/session.h | 2 ++ src/plugins/projectexplorer/sessionmodel.cpp | 37 ++++++++++++++++++-- src/plugins/projectexplorer/sessionmodel.h | 7 ++-- src/plugins/projectexplorer/sessionview.cpp | 7 ++-- 5 files changed, 60 insertions(+), 10 deletions(-) diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp index d825df0b519..54f4947e4e4 100644 --- a/src/plugins/projectexplorer/session.cpp +++ b/src/plugins/projectexplorer/session.cpp @@ -99,6 +99,7 @@ public: bool m_casadeSetActive = false; mutable QStringList m_sessions; + mutable QHash m_sessionDateTimes; mutable QHash m_projectFileCache; @@ -466,7 +467,9 @@ bool SessionManager::save() data.insert(QLatin1String("valueKeys"), keys); bool result = d->m_writer->save(data, ICore::mainWindow()); - if (!result) { + if (result) { + d->m_sessionDateTimes.insert(activeSession(), QDateTime::currentDateTime()); + } else { QMessageBox::warning(ICore::dialogParent(), tr("Error while saving session"), tr("Could not save session to file %1").arg(d->m_writer->fileName().toUserOutput())); } @@ -750,14 +753,21 @@ QStringList SessionManager::sessions() QDir sessionDir(ICore::userResourcePath()); QList sessionFiles = sessionDir.entryInfoList(QStringList() << QLatin1String("*.qws"), QDir::NoFilter, QDir::Time); foreach (const QFileInfo &fileInfo, sessionFiles) { - if (fileInfo.completeBaseName() != QLatin1String("default")) - d->m_sessions << fileInfo.completeBaseName(); + const QString &name = fileInfo.completeBaseName(); + d->m_sessionDateTimes.insert(name, fileInfo.lastModified()); + if (name != QLatin1String("default")) + d->m_sessions << name; } d->m_sessions.prepend(QLatin1String("default")); } return d->m_sessions; } +QDateTime SessionManager::sessionDateTime(const QString &session) +{ + return d->m_sessionDateTimes.value(session); +} + FileName SessionManager::sessionNameToFileName(const QString &session) { return FileName::fromString(ICore::userResourcePath() + QLatin1Char('/') + session + QLatin1String(".qws")); @@ -820,6 +830,7 @@ bool SessionManager::cloneSession(const QString &original, const QString &clone) // If the file does not exist, we can still clone if (!fi.exists() || fi.copy(sessionNameToFileName(clone).toString())) { d->m_sessions.insert(1, clone); + d->m_sessionDateTimes.insert(clone, QFileInfo(sessionNameToFileName(clone).toString()).lastModified()); return true; } return false; diff --git a/src/plugins/projectexplorer/session.h b/src/plugins/projectexplorer/session.h index 66dd86cda07..0680c6e40ea 100644 --- a/src/plugins/projectexplorer/session.h +++ b/src/plugins/projectexplorer/session.h @@ -33,6 +33,7 @@ #include #include +#include namespace Core { class IEditor; } @@ -61,6 +62,7 @@ public: static QString activeSession(); static QString lastSession(); static QStringList sessions(); + static QDateTime sessionDateTime(const QString &session); static bool createSession(const QString &session); diff --git a/src/plugins/projectexplorer/sessionmodel.cpp b/src/plugins/projectexplorer/sessionmodel.cpp index 66226de8f8e..31f984a0835 100644 --- a/src/plugins/projectexplorer/sessionmodel.cpp +++ b/src/plugins/projectexplorer/sessionmodel.cpp @@ -39,7 +39,7 @@ namespace ProjectExplorer { namespace Internal { SessionModel::SessionModel(QObject *parent) - : QAbstractListModel(parent) + : QAbstractTableModel(parent) { connect(SessionManager::instance(), &SessionManager::sessionLoaded, this, &SessionModel::resetSessions); @@ -55,6 +55,36 @@ QString SessionModel::sessionAt(int row) return SessionManager::sessions().value(row, QString()); } +QVariant SessionModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + QVariant result; + if (orientation == Qt::Horizontal) { + switch (role) { + case Qt::DisplayRole: + switch (section) { + case 0: result = tr("Session"); + break; + case 1: result = tr("Last Modified"); + break; + } // switch (section) + break; + } // switch (role) { + } + return result; +} + +int SessionModel::columnCount(const QModelIndex &) const +{ + static int sectionCount = 0; + if (sectionCount == 0) { + // headers sections defining possible columns + while (!headerData(sectionCount, Qt::Horizontal, Qt::DisplayRole).isNull()) + sectionCount++; + } + + return sectionCount; +} + int SessionModel::rowCount(const QModelIndex &) const { return SessionManager::sessions().count(); @@ -85,6 +115,8 @@ QVariant SessionModel::data(const QModelIndex &index, int role) const switch (index.column()) { case 0: result = sessionName; break; + case 1: result = SessionManager::sessionDateTime(sessionName); + break; } // switch (section) break; case DefaultSessionRole: @@ -118,7 +150,7 @@ QHash SessionModel::roleNames() const {ProjectsPathRole, "projectsPath"}, {ProjectsDisplayRole, "projectsName"} }; - return QAbstractListModel::roleNames().unite(extraRoles); + return QAbstractTableModel::roleNames().unite(extraRoles); } bool SessionModel::isDefaultVirgin() const @@ -186,5 +218,6 @@ void SessionModel::runNewSessionDialog(const QString &suggestedName, std::functi switchToSession(newSession); } } + } // namespace Internal } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/sessionmodel.h b/src/plugins/projectexplorer/sessionmodel.h index a1829d804e9..42a4c0df4d0 100644 --- a/src/plugins/projectexplorer/sessionmodel.h +++ b/src/plugins/projectexplorer/sessionmodel.h @@ -25,14 +25,14 @@ #pragma once -#include +#include #include namespace ProjectExplorer { namespace Internal { -class SessionModel : public QAbstractListModel +class SessionModel : public QAbstractTableModel { Q_OBJECT @@ -45,6 +45,9 @@ public: QString sessionAt(int row); int rowCount(const QModelIndex &parent = QModelIndex()) const override; + int columnCount(const QModelIndex &parent = QModelIndex()) const override; + + QVariant headerData(int section, Qt::Orientation orientation, int role) const override; QVariant data(const QModelIndex &index, int role) const override; QHash roleNames() const override; diff --git a/src/plugins/projectexplorer/sessionview.cpp b/src/plugins/projectexplorer/sessionview.cpp index a47f92f85d0..1958a20e875 100644 --- a/src/plugins/projectexplorer/sessionview.cpp +++ b/src/plugins/projectexplorer/sessionview.cpp @@ -63,9 +63,10 @@ SessionView::SessionView(QWidget *parent) setModel(&m_sessionModel); - QItemSelection firstRow(m_sessionModel.index(0,0), m_sessionModel.index(0, 0)); - selectionModel()->select(firstRow, - QItemSelectionModel::QItemSelectionModel::SelectCurrent); + QItemSelection firstRow(m_sessionModel.index(0,0), m_sessionModel.index( + 0, m_sessionModel.columnCount() - 1)); + selectionModel()->select(firstRow, QItemSelectionModel::QItemSelectionModel:: + SelectCurrent); connect(this, &QTreeView::activated, [this](const QModelIndex &index){ emit activated(m_sessionModel.sessionAt(index.row()));