ProjectExplorer: Let users delete several sessions at once

Task-number: QTCREATORBUG-17668
Change-Id: I90dea6721ef8e7c1496f3a2c934f74edb62bbc96
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Christian Kandeler
2019-05-09 16:21:42 +02:00
parent 881b59c36e
commit 4197746095
9 changed files with 69 additions and 35 deletions

View File

@@ -399,7 +399,7 @@ public:
else if (m_activeActionRects[1].contains(pos)) else if (m_activeActionRects[1].contains(pos))
sessionModel->renameSession(ICore::mainWindow(), sessionName); sessionModel->renameSession(ICore::mainWindow(), sessionName);
else if (m_activeActionRects[2].contains(pos)) else if (m_activeActionRects[2].contains(pos))
sessionModel->deleteSession(sessionName); sessionModel->deleteSessions(QStringList(sessionName));
return true; return true;
} }
} }

View File

@@ -792,11 +792,15 @@ bool SessionManager::renameSession(const QString &original, const QString &newNa
/*! /*!
\brief Shows a dialog asking the user to confirm deleting the session \p session \brief Shows a dialog asking the user to confirm deleting the session \p session
*/ */
bool SessionManager::confirmSessionDelete(const QString &session) bool SessionManager::confirmSessionDelete(const QStringList &sessions)
{ {
const QString title = sessions.size() == 1 ? tr("Delete Session") : tr("Delete Sessions");
const QString question = sessions.size() == 1
? tr("Delete session %1?").arg(sessions.first())
: tr("Delete these sessions?\n %1").arg(sessions.join("\n "));
return QMessageBox::question(ICore::mainWindow(), return QMessageBox::question(ICore::mainWindow(),
tr("Delete Session"), title,
tr("Delete session %1?").arg(session), question,
QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes; QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes;
} }
@@ -814,6 +818,12 @@ bool SessionManager::deleteSession(const QString &session)
return false; return false;
} }
void SessionManager::deleteSessions(const QStringList &sessions)
{
for (const QString &session : sessions)
deleteSession(session);
}
bool SessionManager::cloneSession(const QString &original, const QString &clone) bool SessionManager::cloneSession(const QString &original, const QString &clone)
{ {
if (!d->m_sessions.contains(original)) if (!d->m_sessions.contains(original))

View File

@@ -63,8 +63,9 @@ public:
static bool createSession(const QString &session); static bool createSession(const QString &session);
static bool confirmSessionDelete(const QString &session); static bool confirmSessionDelete(const QStringList &sessions);
static bool deleteSession(const QString &session); static bool deleteSession(const QString &session);
static void deleteSessions(const QStringList &sessions);
static bool cloneSession(const QString &original, const QString &clone); static bool cloneSession(const QString &original, const QString &clone);
static bool renameSession(const QString &original, const QString &newName); static bool renameSession(const QString &original, const QString &newName);

View File

@@ -26,6 +26,8 @@
#include "sessiondialog.h" #include "sessiondialog.h"
#include "session.h" #include "session.h"
#include <utils/algorithm.h>
#include <QInputDialog> #include <QInputDialog>
#include <QValidator> #include <QValidator>
@@ -131,7 +133,7 @@ SessionDialog::SessionDialog(QWidget *parent) : QDialog(parent)
connect(m_ui.btClone, &QAbstractButton::clicked, connect(m_ui.btClone, &QAbstractButton::clicked,
m_ui.sessionView, &SessionView::cloneCurrentSession); m_ui.sessionView, &SessionView::cloneCurrentSession);
connect(m_ui.btDelete, &QAbstractButton::clicked, connect(m_ui.btDelete, &QAbstractButton::clicked,
m_ui.sessionView, &SessionView::deleteCurrentSession); m_ui.sessionView, &SessionView::deleteSelectedSessions);
connect(m_ui.btSwitch, &QAbstractButton::clicked, connect(m_ui.btSwitch, &QAbstractButton::clicked,
m_ui.sessionView, &SessionView::switchToCurrentSession); m_ui.sessionView, &SessionView::switchToCurrentSession);
connect(m_ui.btRename, &QAbstractButton::clicked, connect(m_ui.btRename, &QAbstractButton::clicked,
@@ -157,21 +159,23 @@ bool SessionDialog::autoLoadSession() const
return m_ui.autoLoadCheckBox->checkState() == Qt::Checked; return m_ui.autoLoadCheckBox->checkState() == Qt::Checked;
} }
void SessionDialog::updateActions(const QString &session) void SessionDialog::updateActions(const QStringList &sessions)
{ {
if (session.isEmpty()) { if (sessions.isEmpty()) {
m_ui.btDelete->setEnabled(false); m_ui.btDelete->setEnabled(false);
m_ui.btRename->setEnabled(false); m_ui.btRename->setEnabled(false);
m_ui.btClone->setEnabled(false); m_ui.btClone->setEnabled(false);
m_ui.btSwitch->setEnabled(false); m_ui.btSwitch->setEnabled(false);
} else { return;
bool isDefault = (session == QLatin1String("default"));
bool isActive = (session == SessionManager::activeSession());
m_ui.btDelete->setEnabled(!isActive && !isDefault);
m_ui.btRename->setEnabled(!isDefault);
m_ui.btClone->setEnabled(true);
m_ui.btSwitch->setEnabled(true);
} }
const bool defaultIsSelected = sessions.contains("default");
const bool activeIsSelected = Utils::anyOf(sessions, [](const QString &session) {
return session == SessionManager::activeSession();
});
m_ui.btDelete->setEnabled(!defaultIsSelected && !activeIsSelected);
m_ui.btRename->setEnabled(sessions.size() == 1 && !defaultIsSelected);
m_ui.btClone->setEnabled(sessions.size() == 1);
m_ui.btSwitch->setEnabled(sessions.size() == 1);
} }
} // namespace Internal } // namespace Internal

View File

@@ -49,7 +49,7 @@ public:
bool autoLoadSession() const; bool autoLoadSession() const;
private: private:
void updateActions(const QString &session); void updateActions(const QStringList &sessions);
Ui::SessionDialog m_ui; Ui::SessionDialog m_ui;
}; };

View File

@@ -55,7 +55,7 @@ int SessionModel::indexOfSession(const QString &session)
return SessionManager::sessions().indexOf(session); return SessionManager::sessions().indexOf(session);
} }
QString SessionModel::sessionAt(int row) QString SessionModel::sessionAt(int row) const
{ {
return SessionManager::sessions().value(row, QString()); return SessionManager::sessions().value(row, QString());
} }
@@ -209,12 +209,12 @@ void SessionModel::cloneSession(QWidget *parent, const QString &session)
}); });
} }
void SessionModel::deleteSession(const QString &session) void SessionModel::deleteSessions(const QStringList &sessions)
{ {
if (!SessionManager::confirmSessionDelete(session)) if (!SessionManager::confirmSessionDelete(sessions))
return; return;
beginResetModel(); beginResetModel();
SessionManager::deleteSession(session); SessionManager::deleteSessions(sessions);
endResetModel(); endResetModel();
} }

View File

@@ -53,7 +53,7 @@ public:
explicit SessionModel(QObject *parent = nullptr); explicit SessionModel(QObject *parent = nullptr);
int indexOfSession(const QString &session); int indexOfSession(const QString &session);
QString sessionAt(int row); QString sessionAt(int row) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const override; int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override; int columnCount(const QModelIndex &parent = QModelIndex()) const override;
@@ -72,7 +72,7 @@ public slots:
void resetSessions(); void resetSessions();
void newSession(QWidget *parent); void newSession(QWidget *parent);
void cloneSession(QWidget *parent, const QString &session); void cloneSession(QWidget *parent, const QString &session);
void deleteSession(const QString &session); void deleteSessions(const QStringList &sessions);
void renameSession(QWidget *parent, const QString &session); void renameSession(QWidget *parent, const QString &session);
void switchToSession(const QString &session); void switchToSession(const QString &session);

View File

@@ -27,9 +27,12 @@
#include "session.h" #include "session.h"
#include <QItemSelection> #include <utils/algorithm.h>
#include <QStyledItemDelegate>
#include <QHeaderView> #include <QHeaderView>
#include <QItemSelection>
#include <QStringList>
#include <QStyledItemDelegate>
namespace ProjectExplorer { namespace ProjectExplorer {
namespace Internal { namespace Internal {
@@ -57,7 +60,7 @@ SessionView::SessionView(QWidget *parent)
{ {
setItemDelegate(new RemoveItemFocusDelegate(this)); setItemDelegate(new RemoveItemFocusDelegate(this));
setSelectionBehavior(QAbstractItemView::SelectRows); setSelectionBehavior(QAbstractItemView::SelectRows);
setSelectionMode(QAbstractItemView::SingleSelection); setSelectionMode(QAbstractItemView::ExtendedSelection);
setWordWrap(false); setWordWrap(false);
setRootIsDecorated(false); setRootIsDecorated(false);
@@ -74,9 +77,8 @@ SessionView::SessionView(QWidget *parent)
connect(this, &Utils::TreeView::activated, [this](const QModelIndex &index){ connect(this, &Utils::TreeView::activated, [this](const QModelIndex &index){
emit activated(m_sessionModel.sessionAt(index.row())); emit activated(m_sessionModel.sessionAt(index.row()));
}); });
connect(selectionModel(), &QItemSelectionModel::currentRowChanged, [this] connect(selectionModel(), &QItemSelectionModel::selectionChanged, [this] {
(const QModelIndex &index) { emit selected(selectedSessions());
emit selected(m_sessionModel.sessionAt(index.row()));
}); });
connect(&m_sessionModel, &SessionModel::sessionSwitched, connect(&m_sessionModel, &SessionModel::sessionSwitched,
@@ -92,9 +94,14 @@ void SessionView::createNewSession()
m_sessionModel.newSession(this); m_sessionModel.newSession(this);
} }
void SessionView::deleteCurrentSession() void SessionView::deleteSelectedSessions()
{ {
m_sessionModel.deleteSession(currentSession()); deleteSessions(selectedSessions());
}
void SessionView::deleteSessions(const QStringList &sessions)
{
m_sessionModel.deleteSessions(sessions);
} }
void SessionView::cloneCurrentSession() void SessionView::cloneCurrentSession()
@@ -147,9 +154,18 @@ void SessionView::keyPressEvent(QKeyEvent *event)
TreeView::keyPressEvent(event); TreeView::keyPressEvent(event);
return; return;
} }
const QString session = currentSession(); const QStringList sessions = selectedSessions();
if (!session.isEmpty() && session != "default" && session != SessionManager::activeSession()) if (!sessions.contains("default") && !Utils::anyOf(sessions,
deleteCurrentSession(); [](const QString &session) { return session == SessionManager::activeSession(); })) {
deleteSessions(sessions);
}
}
QStringList SessionView::selectedSessions() const
{
return Utils::transform(selectionModel()->selectedRows(), [this](const QModelIndex &index) {
return m_sessionModel.sessionAt(index.row());
});
} }
} // namespace Internal } // namespace Internal

View File

@@ -41,7 +41,7 @@ public:
explicit SessionView(QWidget *parent = nullptr); explicit SessionView(QWidget *parent = nullptr);
void createNewSession(); void createNewSession();
void deleteCurrentSession(); void deleteSelectedSessions();
void cloneCurrentSession(); void cloneCurrentSession();
void renameCurrentSession(); void renameCurrentSession();
void switchToCurrentSession(); void switchToCurrentSession();
@@ -53,13 +53,16 @@ public:
signals: signals:
void activated(const QString &session); void activated(const QString &session);
void selected(const QString &session); void selected(const QStringList &sessions);
void sessionSwitched(); void sessionSwitched();
private: private:
void showEvent(QShowEvent* event) override; void showEvent(QShowEvent* event) override;
void keyPressEvent(QKeyEvent *event) override; void keyPressEvent(QKeyEvent *event) override;
void deleteSessions(const QStringList &sessions);
QStringList selectedSessions() const;
SessionModel m_sessionModel; SessionModel m_sessionModel;
}; };