Files
qt-creator/src/plugins/coreplugin/sessionview.cpp
Eike Ziller edd1a89807 Move SessionManager to Core plugin
Sessions are independent from projects, and this allows for removal of
e.g. the dependency from Bookmarks to ProjectExplorer.

Includes moving the command line arguments (-lastsession, <session>) to
Core plugin.

Change-Id: I6c578fd15c4990902e7196501de20f39376e90e8
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
2023-05-25 11:15:41 +00:00

153 lines
4.2 KiB
C++

// 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