2023-05-23 15:05:38 +02:00
|
|
|
// Copyright (C) 2023 The Qt Company Ltd.
|
2022-12-21 10:12:09 +01:00
|
|
|
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
|
2016-09-26 12:44:25 +02:00
|
|
|
|
|
|
|
|
#include "sessionview.h"
|
|
|
|
|
|
|
|
|
|
#include "session.h"
|
|
|
|
|
|
2019-05-09 16:21:42 +02:00
|
|
|
#include <utils/algorithm.h>
|
|
|
|
|
|
|
|
|
|
#include <QHeaderView>
|
2016-09-26 12:44:25 +02:00
|
|
|
#include <QItemSelection>
|
2019-05-09 16:21:42 +02:00
|
|
|
#include <QStringList>
|
2016-09-26 12:44:25 +02:00
|
|
|
#include <QStyledItemDelegate>
|
|
|
|
|
|
2023-05-23 15:05:38 +02:00
|
|
|
namespace Core {
|
2016-09-26 12:44:25 +02:00
|
|
|
namespace Internal {
|
|
|
|
|
|
|
|
|
|
// custom item delegate class
|
|
|
|
|
class RemoveItemFocusDelegate : public QStyledItemDelegate
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
RemoveItemFocusDelegate(QObject *parent = nullptr) : QStyledItemDelegate(parent) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected:
|
2018-07-12 22:17:17 +02:00
|
|
|
void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override;
|
2016-09-26 12:44:25 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
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)
|
2017-03-30 20:51:27 +02:00
|
|
|
: Utils::TreeView(parent)
|
2016-09-26 12:44:25 +02:00
|
|
|
{
|
|
|
|
|
setItemDelegate(new RemoveItemFocusDelegate(this));
|
|
|
|
|
setSelectionBehavior(QAbstractItemView::SelectRows);
|
2019-05-09 16:21:42 +02:00
|
|
|
setSelectionMode(QAbstractItemView::ExtendedSelection);
|
2016-09-26 12:44:25 +02:00
|
|
|
setWordWrap(false);
|
|
|
|
|
setRootIsDecorated(false);
|
2019-10-01 16:47:45 +02:00
|
|
|
setSortingEnabled(true);
|
2016-09-26 12:44:25 +02:00
|
|
|
|
|
|
|
|
setModel(&m_sessionModel);
|
2019-10-01 16:47:45 +02:00
|
|
|
sortByColumn(0, Qt::AscendingOrder);
|
2016-09-26 12:44:25 +02:00
|
|
|
|
2017-05-26 13:13:13 +02:00
|
|
|
// Ensure that the full session name is visible.
|
|
|
|
|
header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
|
|
|
|
|
|
2016-09-23 19:14:50 +02:00
|
|
|
QItemSelection firstRow(m_sessionModel.index(0,0), m_sessionModel.index(
|
|
|
|
|
0, m_sessionModel.columnCount() - 1));
|
|
|
|
|
selectionModel()->select(firstRow, QItemSelectionModel::QItemSelectionModel::
|
|
|
|
|
SelectCurrent);
|
2016-09-26 12:44:25 +02:00
|
|
|
|
2017-03-30 20:51:27 +02:00
|
|
|
connect(this, &Utils::TreeView::activated, [this](const QModelIndex &index){
|
2020-11-17 14:18:49 +01:00
|
|
|
emit sessionActivated(m_sessionModel.sessionAt(index.row()));
|
2016-09-26 12:44:25 +02:00
|
|
|
});
|
2019-05-09 16:21:42 +02:00
|
|
|
connect(selectionModel(), &QItemSelectionModel::selectionChanged, [this] {
|
2020-11-17 14:18:49 +01:00
|
|
|
emit sessionsSelected(selectedSessions());
|
2016-09-26 12:44:25 +02:00
|
|
|
});
|
2016-09-27 12:40:46 +02:00
|
|
|
|
2016-09-26 12:44:25 +02:00
|
|
|
connect(&m_sessionModel, &SessionModel::sessionSwitched,
|
|
|
|
|
this, &SessionView::sessionSwitched);
|
|
|
|
|
connect(&m_sessionModel, &SessionModel::modelReset,
|
|
|
|
|
this, &SessionView::selectActiveSession);
|
2016-09-27 12:40:46 +02:00
|
|
|
connect(&m_sessionModel, &SessionModel::sessionCreated,
|
|
|
|
|
this, &SessionView::selectSession);
|
2016-09-26 12:44:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SessionView::createNewSession()
|
|
|
|
|
{
|
2018-01-23 19:02:46 +01:00
|
|
|
m_sessionModel.newSession(this);
|
2016-09-26 12:44:25 +02:00
|
|
|
}
|
|
|
|
|
|
2019-05-09 16:21:42 +02:00
|
|
|
void SessionView::deleteSelectedSessions()
|
|
|
|
|
{
|
|
|
|
|
deleteSessions(selectedSessions());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SessionView::deleteSessions(const QStringList &sessions)
|
2016-09-26 12:44:25 +02:00
|
|
|
{
|
2019-05-09 16:21:42 +02:00
|
|
|
m_sessionModel.deleteSessions(sessions);
|
2016-09-26 12:44:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SessionView::cloneCurrentSession()
|
|
|
|
|
{
|
2018-01-23 19:02:46 +01:00
|
|
|
m_sessionModel.cloneSession(this, currentSession());
|
2016-09-26 12:44:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SessionView::renameCurrentSession()
|
|
|
|
|
{
|
2018-01-23 19:02:46 +01:00
|
|
|
m_sessionModel.renameSession(this, currentSession());
|
2016-09-26 12:44:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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()
|
|
|
|
|
{
|
2016-09-27 12:40:46 +02:00
|
|
|
selectSession(SessionManager::activeSession());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SessionView::selectSession(const QString &sessionName)
|
|
|
|
|
{
|
|
|
|
|
int row = m_sessionModel.indexOfSession(sessionName);
|
2016-09-26 12:44:25 +02:00
|
|
|
selectionModel()->setCurrentIndex(model()->index(row, 0),
|
|
|
|
|
QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SessionView::showEvent(QShowEvent *event)
|
|
|
|
|
{
|
2017-03-30 20:51:27 +02:00
|
|
|
Utils::TreeView::showEvent(event);
|
2016-09-26 12:44:25 +02:00
|
|
|
selectActiveSession();
|
|
|
|
|
setFocus();
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-09 15:17:31 +02:00
|
|
|
void SessionView::keyPressEvent(QKeyEvent *event)
|
|
|
|
|
{
|
2020-03-09 10:30:41 +01:00
|
|
|
if (event->key() != Qt::Key_Delete && event->key() != Qt::Key_Backspace) {
|
2019-05-09 15:17:31 +02:00
|
|
|
TreeView::keyPressEvent(event);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2019-05-09 16:21:42 +02:00
|
|
|
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());
|
|
|
|
|
});
|
2019-05-09 15:17:31 +02:00
|
|
|
}
|
|
|
|
|
|
2016-09-26 12:44:25 +02:00
|
|
|
} // namespace Internal
|
2023-05-23 15:05:38 +02:00
|
|
|
} // namespace Core
|