forked from qt-creator/qt-creator
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>
153 lines
4.2 KiB
C++
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
|