forked from qt-creator/qt-creator
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>
This commit is contained in:
152
src/plugins/coreplugin/sessionview.cpp
Normal file
152
src/plugins/coreplugin/sessionview.cpp
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user