aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/coreplugin/sessionview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/coreplugin/sessionview.cpp')
-rw-r--r--src/plugins/coreplugin/sessionview.cpp152
1 files changed, 152 insertions, 0 deletions
diff --git a/src/plugins/coreplugin/sessionview.cpp b/src/plugins/coreplugin/sessionview.cpp
new file mode 100644
index 0000000000..c3d7ed25b3
--- /dev/null
+++ b/src/plugins/coreplugin/sessionview.cpp
@@ -0,0 +1,152 @@
+// Copyright (C) 2023 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#include "sessionview.h"
+
+#include "session.h"
+
+#include <utils/algorithm.h>
+
+#include <QHeaderView>
+#include <QItemSelection>
+#include <QStringList>
+#include <QStyledItemDelegate>
+
+namespace Core {
+namespace Internal {
+
+// custom item delegate class
+class RemoveItemFocusDelegate : public QStyledItemDelegate
+{
+public:
+ RemoveItemFocusDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {
+ }
+
+protected:
+ void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
+};
+
+void RemoveItemFocusDelegate::paint(QPainter* painter, const QStyleOptionViewItem & option, const QModelIndex &index) const
+{
+ QStyleOptionViewItem opt = option;
+ opt.state &= ~QStyle::State_HasFocus;
+ QStyledItemDelegate::paint(painter, opt, index);
+}
+
+SessionView::SessionView(QWidget *parent)
+ : Utils::TreeView(parent)
+{
+ setItemDelegate(new RemoveItemFocusDelegate(this));
+ setSelectionBehavior(QAbstractItemView::SelectRows);
+ setSelectionMode(QAbstractItemView::ExtendedSelection);
+ setWordWrap(false);
+ setRootIsDecorated(false);
+ setSortingEnabled(true);
+
+ setModel(&m_sessionModel);
+ sortByColumn(0, Qt::AscendingOrder);
+
+ // Ensure that the full session name is visible.
+ header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
+
+ QItemSelection firstRow(m_sessionModel.index(0,0), m_sessionModel.index(
+ 0, m_sessionModel.columnCount() - 1));
+ selectionModel()->select(firstRow, QItemSelectionModel::QItemSelectionModel::
+ SelectCurrent);
+
+ connect(this, &Utils::TreeView::activated, [this](const QModelIndex &index){
+ emit sessionActivated(m_sessionModel.sessionAt(index.row()));
+ });
+ connect(selectionModel(), &QItemSelectionModel::selectionChanged, [this] {
+ emit sessionsSelected(selectedSessions());
+ });
+
+ connect(&m_sessionModel, &SessionModel::sessionSwitched,
+ this, &SessionView::sessionSwitched);
+ connect(&m_sessionModel, &SessionModel::modelReset,
+ this, &SessionView::selectActiveSession);
+ connect(&m_sessionModel, &SessionModel::sessionCreated,
+ this, &SessionView::selectSession);
+ }
+
+void SessionView::createNewSession()
+{
+ m_sessionModel.newSession(this);
+}
+
+void SessionView::deleteSelectedSessions()
+{
+ deleteSessions(selectedSessions());
+}
+
+void SessionView::deleteSessions(const QStringList &sessions)
+{
+ m_sessionModel.deleteSessions(sessions);
+}
+
+void SessionView::cloneCurrentSession()
+{
+ m_sessionModel.cloneSession(this, currentSession());
+}
+
+void SessionView::renameCurrentSession()
+{
+ m_sessionModel.renameSession(this, currentSession());
+}
+
+void SessionView::switchToCurrentSession()
+{
+ m_sessionModel.switchToSession(currentSession());
+}
+
+QString SessionView::currentSession()
+{
+ return m_sessionModel.sessionAt(selectionModel()->currentIndex().row());
+}
+
+SessionModel *SessionView::sessionModel()
+{
+ return &m_sessionModel;
+}
+
+void SessionView::selectActiveSession()
+{
+ selectSession(SessionManager::activeSession());
+}
+
+void SessionView::selectSession(const QString &sessionName)
+{
+ int row = m_sessionModel.indexOfSession(sessionName);
+ selectionModel()->setCurrentIndex(model()->index(row, 0),
+ QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
+}
+
+void SessionView::showEvent(QShowEvent *event)
+{
+ Utils::TreeView::showEvent(event);
+ selectActiveSession();
+ setFocus();
+}
+
+void SessionView::keyPressEvent(QKeyEvent *event)
+{
+ if (event->key() != Qt::Key_Delete && event->key() != Qt::Key_Backspace) {
+ TreeView::keyPressEvent(event);
+ return;
+ }
+ const QStringList sessions = selectedSessions();
+ if (!sessions.contains("default") && !Utils::anyOf(sessions,
+ [](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 Core