mirror of
https://invent.kde.org/network/falkon.git
synced 2024-12-20 18:56:34 +01:00
SessionManager: Add Session Manager dialog instead of menu structure
See #2331
This commit is contained in:
parent
bc65a0a038
commit
93d4d66054
@ -81,6 +81,11 @@ void MainMenu::initSuperMenu(QMenu* superMenu) const
|
|||||||
superMenu->addAction(m_actions[QSL("File/NewPrivateWindow")]);
|
superMenu->addAction(m_actions[QSL("File/NewPrivateWindow")]);
|
||||||
superMenu->addAction(m_actions[QSL("File/OpenFile")]);
|
superMenu->addAction(m_actions[QSL("File/OpenFile")]);
|
||||||
superMenu->addSeparator();
|
superMenu->addSeparator();
|
||||||
|
QMenu* sessionsSubmenu = new QMenu(tr("Sessions"));
|
||||||
|
connect(sessionsSubmenu, SIGNAL(aboutToShow()), mApp->sessionManager(), SLOT(aboutToShowSessionsMenu()));
|
||||||
|
superMenu->addMenu(sessionsSubmenu);
|
||||||
|
superMenu->addAction(m_actions[QSL("File/SessionManager")]);
|
||||||
|
superMenu->addSeparator();
|
||||||
superMenu->addAction(m_actions[QSL("File/SendLink")]);
|
superMenu->addAction(m_actions[QSL("File/SendLink")]);
|
||||||
superMenu->addAction(m_actions[QSL("File/Print")]);
|
superMenu->addAction(m_actions[QSL("File/Print")]);
|
||||||
superMenu->addSeparator();
|
superMenu->addSeparator();
|
||||||
@ -529,17 +534,13 @@ void MainMenu::init()
|
|||||||
m_menuFile->addSeparator();
|
m_menuFile->addSeparator();
|
||||||
|
|
||||||
if (!mApp->isPrivate()) {
|
if (!mApp->isPrivate()) {
|
||||||
action = new QAction(tr("New Session..."), this);
|
|
||||||
connect(action, SIGNAL(triggered()), mApp->sessionManager(), SLOT(newSession()));
|
|
||||||
m_actions[QSL("File/NewSession")] = action;
|
|
||||||
m_menuFile->addAction(action);
|
|
||||||
action = new QAction(tr("Save Session..."), this);
|
|
||||||
connect(action, SIGNAL(triggered()), mApp->sessionManager(), SLOT(saveSession()));
|
|
||||||
m_actions[QSL("File/SaveSession")] = action;
|
|
||||||
m_menuFile->addAction(action);
|
|
||||||
QMenu* sessionsSubmenu = new QMenu(tr("Sessions"));
|
QMenu* sessionsSubmenu = new QMenu(tr("Sessions"));
|
||||||
connect(sessionsSubmenu, SIGNAL(aboutToShow()), mApp->sessionManager(), SLOT(aboutToShowSessionsMenu()));
|
connect(sessionsSubmenu, SIGNAL(aboutToShow()), mApp->sessionManager(), SLOT(aboutToShowSessionsMenu()));
|
||||||
m_menuFile->addMenu(sessionsSubmenu);
|
m_menuFile->addMenu(sessionsSubmenu);
|
||||||
|
action = new QAction(tr("Session Manager"), this);
|
||||||
|
connect(action, SIGNAL(triggered()), mApp->sessionManager(), SLOT(openSessionManagerDialog()));
|
||||||
|
m_actions[QSL("File/SessionManager")] = action;
|
||||||
|
m_menuFile->addAction(action);
|
||||||
m_menuFile->addSeparator();
|
m_menuFile->addSeparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,6 +167,7 @@ SOURCES += \
|
|||||||
session/recoveryjsobject.cpp \
|
session/recoveryjsobject.cpp \
|
||||||
session/restoremanager.cpp \
|
session/restoremanager.cpp \
|
||||||
session/sessionmanager.cpp \
|
session/sessionmanager.cpp \
|
||||||
|
session/sessionmanagerdialog.cpp \
|
||||||
sidebar/bookmarkssidebar.cpp \
|
sidebar/bookmarkssidebar.cpp \
|
||||||
sidebar/historysidebar.cpp \
|
sidebar/historysidebar.cpp \
|
||||||
sidebar/sidebar.cpp \
|
sidebar/sidebar.cpp \
|
||||||
@ -202,11 +203,13 @@ SOURCES += \
|
|||||||
tools/progressbar.cpp \
|
tools/progressbar.cpp \
|
||||||
tools/qzregexp.cpp \
|
tools/qzregexp.cpp \
|
||||||
tools/qztools.cpp \
|
tools/qztools.cpp \
|
||||||
|
tools/removeitemfocusdelegate.cpp \
|
||||||
tools/scripts.cpp \
|
tools/scripts.cpp \
|
||||||
tools/sqldatabase.cpp \
|
tools/sqldatabase.cpp \
|
||||||
tools/toolbutton.cpp \
|
tools/toolbutton.cpp \
|
||||||
tools/treewidget.cpp \
|
tools/treewidget.cpp \
|
||||||
tools/widget.cpp \
|
tools/widget.cpp \
|
||||||
|
tools/wheelhelper.cpp \
|
||||||
webengine/javascript/autofilljsobject.cpp \
|
webengine/javascript/autofilljsobject.cpp \
|
||||||
webengine/javascript/externaljsobject.cpp \
|
webengine/javascript/externaljsobject.cpp \
|
||||||
webengine/loadrequest.cpp \
|
webengine/loadrequest.cpp \
|
||||||
@ -219,7 +222,6 @@ SOURCES += \
|
|||||||
webtab/searchtoolbar.cpp \
|
webtab/searchtoolbar.cpp \
|
||||||
webtab/tabbedwebview.cpp \
|
webtab/tabbedwebview.cpp \
|
||||||
webtab/webtab.cpp \
|
webtab/webtab.cpp \
|
||||||
tools/wheelhelper.cpp \
|
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
3rdparty/fancytabwidget.h \
|
3rdparty/fancytabwidget.h \
|
||||||
@ -349,6 +351,7 @@ HEADERS += \
|
|||||||
session/recoveryjsobject.h \
|
session/recoveryjsobject.h \
|
||||||
session/restoremanager.h \
|
session/restoremanager.h \
|
||||||
session/sessionmanager.h \
|
session/sessionmanager.h \
|
||||||
|
session/sessionmanagerdialog.h \
|
||||||
sidebar/bookmarkssidebar.h \
|
sidebar/bookmarkssidebar.h \
|
||||||
sidebar/historysidebar.h \
|
sidebar/historysidebar.h \
|
||||||
sidebar/sidebar.h \
|
sidebar/sidebar.h \
|
||||||
@ -385,11 +388,13 @@ HEADERS += \
|
|||||||
tools/progressbar.h \
|
tools/progressbar.h \
|
||||||
tools/qzregexp.h \
|
tools/qzregexp.h \
|
||||||
tools/qztools.h \
|
tools/qztools.h \
|
||||||
|
tools/removeitemfocusdelegate.h \
|
||||||
tools/scripts.h \
|
tools/scripts.h \
|
||||||
tools/sqldatabase.h \
|
tools/sqldatabase.h \
|
||||||
tools/toolbutton.h \
|
tools/toolbutton.h \
|
||||||
tools/treewidget.h \
|
tools/treewidget.h \
|
||||||
tools/widget.h \
|
tools/widget.h \
|
||||||
|
tools/wheelhelper.h \
|
||||||
webengine/javascript/autofilljsobject.h \
|
webengine/javascript/autofilljsobject.h \
|
||||||
webengine/javascript/externaljsobject.h \
|
webengine/javascript/externaljsobject.h \
|
||||||
webengine/loadrequest.h \
|
webengine/loadrequest.h \
|
||||||
@ -402,7 +407,6 @@ HEADERS += \
|
|||||||
webtab/searchtoolbar.h \
|
webtab/searchtoolbar.h \
|
||||||
webtab/tabbedwebview.h \
|
webtab/tabbedwebview.h \
|
||||||
webtab/webtab.h \
|
webtab/webtab.h \
|
||||||
tools/wheelhelper.h \
|
|
||||||
|
|
||||||
FORMS += \
|
FORMS += \
|
||||||
adblock/adblockaddsubscriptiondialog.ui \
|
adblock/adblockaddsubscriptiondialog.ui \
|
||||||
@ -437,6 +441,7 @@ FORMS += \
|
|||||||
preferences/preferences.ui \
|
preferences/preferences.ui \
|
||||||
preferences/thememanager.ui \
|
preferences/thememanager.ui \
|
||||||
preferences/useragentdialog.ui \
|
preferences/useragentdialog.ui \
|
||||||
|
session/sessionmanagerdialog.ui \
|
||||||
sidebar/bookmarkssidebar.ui \
|
sidebar/bookmarkssidebar.ui \
|
||||||
sidebar/historysidebar.ui \
|
sidebar/historysidebar.ui \
|
||||||
tools/certificateinfowidget.ui \
|
tools/certificateinfowidget.ui \
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "mainapplication.h"
|
#include "mainapplication.h"
|
||||||
#include "restoremanager.h"
|
#include "restoremanager.h"
|
||||||
#include "sessionmanager.h"
|
#include "sessionmanager.h"
|
||||||
|
#include "sessionmanagerdialog.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
|
|
||||||
#include <QAction>
|
#include <QAction>
|
||||||
@ -42,99 +43,28 @@ SessionManager::SessionManager(QObject* parent)
|
|||||||
{
|
{
|
||||||
QFileSystemWatcher* sessionFilesWatcher = new QFileSystemWatcher({DataPaths::path(DataPaths::Sessions)}, this);
|
QFileSystemWatcher* sessionFilesWatcher = new QFileSystemWatcher({DataPaths::path(DataPaths::Sessions)}, this);
|
||||||
connect(sessionFilesWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(sessionsDirectoryChanged()));
|
connect(sessionFilesWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(sessionsDirectoryChanged()));
|
||||||
|
connect(sessionFilesWatcher, &QFileSystemWatcher::directoryChanged, this, &SessionManager::sessionsMetaDataChanged);
|
||||||
|
|
||||||
loadSettings();
|
loadSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void addSessionSubmenu(QObject* receiver, QMenu* menu, const QString &title, const QString &filePath, const QFileInfo &lastActiveSessionFileInfo)
|
|
||||||
{
|
|
||||||
QMenu* sessionSubmenu = new QMenu(title, menu);
|
|
||||||
QObject::connect(sessionSubmenu, SIGNAL(aboutToShow()), receiver, SLOT(aboutToShowSessionSubmenu()));
|
|
||||||
|
|
||||||
QAction* action = menu->addMenu(sessionSubmenu);
|
|
||||||
action->setData(filePath);
|
|
||||||
action->setCheckable(true);
|
|
||||||
action->setChecked(QFileInfo(filePath) == lastActiveSessionFileInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void addSessionsMetaDataToMenu(QObject* receiver, QMenu* menu, const QFileInfo &lastActiveSessionFileInfo, const QList<SessionManager::SessionMetaData> &sessionsMetaDataList)
|
|
||||||
{
|
|
||||||
for (const SessionManager::SessionMetaData &metaData : sessionsMetaDataList) {
|
|
||||||
addSessionSubmenu(receiver, menu, metaData.name, metaData.filePath, lastActiveSessionFileInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SessionManager::aboutToShowSessionsMenu()
|
void SessionManager::aboutToShowSessionsMenu()
|
||||||
{
|
{
|
||||||
QMenu* menu = qobject_cast<QMenu*>(sender());
|
QMenu* menu = qobject_cast<QMenu*>(sender());
|
||||||
menu->clear();
|
menu->clear();
|
||||||
|
|
||||||
const QFileInfo lastActiveSessionInfo(m_lastActiveSessionPath);
|
QActionGroup *group = new QActionGroup(menu);
|
||||||
|
|
||||||
fillSessionsMetaDataListIfNeeded();
|
const auto sessions = sessionMetaData(/*withBackups*/ false);
|
||||||
|
for (const SessionManager::SessionMetaData &metaData : sessions) {
|
||||||
addSessionsMetaDataToMenu(this, menu, lastActiveSessionInfo, m_sessionsMetaDataList);
|
QAction* action = menu->addAction(metaData.name);
|
||||||
|
action->setCheckable(true);
|
||||||
menu->addSeparator();
|
action->setChecked(metaData.isActive);
|
||||||
|
group->addAction(action);
|
||||||
if (QFile::exists(m_firstBackupSession))
|
connect(action, &QAction::triggered, this, [=]() {
|
||||||
addSessionSubmenu(this, menu, tr("First Backup"), m_firstBackupSession, lastActiveSessionInfo);
|
switchToSession(metaData.filePath);
|
||||||
if (QFile::exists(m_secondBackupSession))
|
});
|
||||||
addSessionSubmenu(this, menu, tr("Second Backup"), m_secondBackupSession, lastActiveSessionInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SessionManager::aboutToShowSessionSubmenu()
|
|
||||||
{
|
|
||||||
QMenu* menu = qobject_cast<QMenu*>(sender());
|
|
||||||
menu->clear();
|
|
||||||
|
|
||||||
const QString sessionFilePath = menu->menuAction()->data().toString();
|
|
||||||
|
|
||||||
const QFileInfo currentSessionFileInfo(m_lastActiveSessionPath);
|
|
||||||
const QFileInfo sessionFileInfo(sessionFilePath);
|
|
||||||
|
|
||||||
QList<QAction*> actions;
|
|
||||||
QAction* action;
|
|
||||||
|
|
||||||
if (sessionFileInfo != currentSessionFileInfo || mApp->restoreManager()) {
|
|
||||||
if (sessionFileInfo != QFileInfo(m_firstBackupSession) && sessionFileInfo != QFileInfo(m_secondBackupSession)) {
|
|
||||||
action = new QAction(SessionManager::tr("Switch To"), menu);
|
|
||||||
action->setData(sessionFilePath);
|
|
||||||
QObject::connect(action, SIGNAL(triggered(bool)), this, SLOT(switchToSession()));
|
|
||||||
actions << action;
|
|
||||||
}
|
|
||||||
|
|
||||||
action = new QAction(SessionManager::tr("Open"), menu);
|
|
||||||
action->setData(sessionFilePath);
|
|
||||||
QObject::connect(action, SIGNAL(triggered(bool)), this, SLOT(openSession()));
|
|
||||||
actions << action;
|
|
||||||
|
|
||||||
action = new QAction(menu);
|
|
||||||
action->setSeparator(true);
|
|
||||||
actions << action;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
action = new QAction(SessionManager::tr("Clone"), menu);
|
|
||||||
action->setData(sessionFilePath);
|
|
||||||
QObject::connect(action, SIGNAL(triggered(bool)), this, SLOT(cloneSession()));
|
|
||||||
actions << action;
|
|
||||||
|
|
||||||
if (sessionFileInfo != currentSessionFileInfo) {
|
|
||||||
action = new QAction(SessionManager::tr("Rename"), menu);
|
|
||||||
action->setData(sessionFilePath);
|
|
||||||
QObject::connect(action, SIGNAL(triggered(bool)), this, SLOT(renameSession()));
|
|
||||||
actions << action;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sessionFileInfo != currentSessionFileInfo && sessionFileInfo != QFileInfo(defaultSessionPath()) &&
|
|
||||||
sessionFileInfo != QFileInfo(m_firstBackupSession) && sessionFileInfo != QFileInfo(m_secondBackupSession)) {
|
|
||||||
action = new QAction(SessionManager::tr("Remove"), menu);
|
|
||||||
action->setData(sessionFilePath);
|
|
||||||
QObject::connect(action, SIGNAL(triggered(bool)), this, SLOT(deleteSession()));
|
|
||||||
actions << action;
|
|
||||||
}
|
|
||||||
|
|
||||||
menu->addActions(actions);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SessionManager::sessionsDirectoryChanged()
|
void SessionManager::sessionsDirectoryChanged()
|
||||||
@ -142,15 +72,6 @@ void SessionManager::sessionsDirectoryChanged()
|
|||||||
m_sessionsMetaDataList.clear();
|
m_sessionsMetaDataList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SessionManager::switchToSession()
|
|
||||||
{
|
|
||||||
QAction* action = qobject_cast<QAction*>(sender());
|
|
||||||
if (!action)
|
|
||||||
return;
|
|
||||||
|
|
||||||
openSession(action->data().toString(), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SessionManager::openSession(QString sessionFilePath, bool switchSession)
|
void SessionManager::openSession(QString sessionFilePath, bool switchSession)
|
||||||
{
|
{
|
||||||
if (sessionFilePath.isEmpty()) {
|
if (sessionFilePath.isEmpty()) {
|
||||||
@ -161,6 +82,10 @@ void SessionManager::openSession(QString sessionFilePath, bool switchSession)
|
|||||||
sessionFilePath = action->data().toString();
|
sessionFilePath = action->data().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isActive(sessionFilePath)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
QVector<RestoreManager::WindowData> sessionData;
|
QVector<RestoreManager::WindowData> sessionData;
|
||||||
RestoreManager::createFromFile(sessionFilePath, sessionData);
|
RestoreManager::createFromFile(sessionFilePath, sessionData);
|
||||||
|
|
||||||
@ -178,6 +103,7 @@ void SessionManager::openSession(QString sessionFilePath, bool switchSession)
|
|||||||
}
|
}
|
||||||
|
|
||||||
m_lastActiveSessionPath = QFileInfo(sessionFilePath).canonicalFilePath();
|
m_lastActiveSessionPath = QFileInfo(sessionFilePath).canonicalFilePath();
|
||||||
|
m_sessionsMetaDataList.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
mApp->openSession(window, sessionData);
|
mApp->openSession(window, sessionData);
|
||||||
@ -214,34 +140,15 @@ void SessionManager::renameSession(QString sessionFilePath, bool clone)
|
|||||||
QMessageBox::information(mApp->activeWindow(), tr("Error!"), tr("An error occurred when cloning session file."));
|
QMessageBox::information(mApp->activeWindow(), tr("Error!"), tr("An error occurred when cloning session file."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else if (!QFile::rename(sessionFilePath, newSessionPath)) {
|
if (!QFile::rename(sessionFilePath, newSessionPath)) {
|
||||||
QMessageBox::information(mApp->activeWindow(), tr("Error!"), tr("An error occurred when renaming session file."));
|
QMessageBox::information(mApp->activeWindow(), tr("Error!"), tr("An error occurred when renaming session file."));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
if (isActive(sessionFilePath)) {
|
||||||
|
m_lastActiveSessionPath = newSessionPath;
|
||||||
void SessionManager::cloneSession()
|
m_sessionsMetaDataList.clear();
|
||||||
{
|
}
|
||||||
QAction* action = qobject_cast<QAction*>(sender());
|
|
||||||
if (!action)
|
|
||||||
return;
|
|
||||||
|
|
||||||
renameSession(action->data().toString(), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SessionManager::deleteSession()
|
|
||||||
{
|
|
||||||
QAction* action = qobject_cast<QAction*>(sender());
|
|
||||||
if (!action)
|
|
||||||
return;
|
|
||||||
|
|
||||||
const QString filePath = action->data().toString();
|
|
||||||
|
|
||||||
QMessageBox::StandardButton result = QMessageBox::information(mApp->activeWindow(), tr("Warning!"), tr("Are you sure to delete following session?\n%1")
|
|
||||||
.arg(QDir::toNativeSeparators(filePath)), QMessageBox::Yes | QMessageBox::No);
|
|
||||||
if (result == QMessageBox::Yes) {
|
|
||||||
QFile::remove(filePath);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -265,6 +172,25 @@ void SessionManager::saveSession()
|
|||||||
writeCurrentSession(filePath);
|
writeCurrentSession(filePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SessionManager::switchToSession(const QString &filePath)
|
||||||
|
{
|
||||||
|
openSession(filePath, /*switchSession*/ true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SessionManager::cloneSession(const QString &filePath)
|
||||||
|
{
|
||||||
|
renameSession(filePath, /*clone*/ true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SessionManager::deleteSession(const QString &filePath)
|
||||||
|
{
|
||||||
|
QMessageBox::StandardButton result = QMessageBox::information(mApp->activeWindow(), tr("Warning!"), tr("Are you sure to delete following session?\n%1")
|
||||||
|
.arg(QDir::toNativeSeparators(filePath)), QMessageBox::Yes | QMessageBox::No);
|
||||||
|
if (result == QMessageBox::Yes) {
|
||||||
|
QFile::remove(filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SessionManager::newSession()
|
void SessionManager::newSession()
|
||||||
{
|
{
|
||||||
bool ok;
|
bool ok;
|
||||||
@ -294,6 +220,40 @@ void SessionManager::newSession()
|
|||||||
autoSaveLastSession();
|
autoSaveLastSession();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QList<SessionManager::SessionMetaData> SessionManager::sessionMetaData(bool withBackups)
|
||||||
|
{
|
||||||
|
fillSessionsMetaDataListIfNeeded();
|
||||||
|
|
||||||
|
auto out = m_sessionsMetaDataList;
|
||||||
|
|
||||||
|
if (withBackups && QFile::exists(m_firstBackupSession)) {
|
||||||
|
SessionMetaData data;
|
||||||
|
data.name = tr("First Backup");
|
||||||
|
data.filePath = m_firstBackupSession;
|
||||||
|
data.isBackup = true;
|
||||||
|
out.append(data);
|
||||||
|
}
|
||||||
|
if (withBackups && QFile::exists(m_secondBackupSession)) {
|
||||||
|
SessionMetaData data;
|
||||||
|
data.name = tr("Second Backup");
|
||||||
|
data.filePath = m_secondBackupSession;
|
||||||
|
data.isBackup = true;
|
||||||
|
out.append(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SessionManager::isActive(const QString &filePath) const
|
||||||
|
{
|
||||||
|
return QFileInfo(filePath) == QFileInfo(m_lastActiveSessionPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SessionManager::isActive(const QFileInfo &fileInfo) const
|
||||||
|
{
|
||||||
|
return fileInfo == QFileInfo(m_lastActiveSessionPath);
|
||||||
|
}
|
||||||
|
|
||||||
void SessionManager::fillSessionsMetaDataListIfNeeded()
|
void SessionManager::fillSessionsMetaDataListIfNeeded()
|
||||||
{
|
{
|
||||||
if (!m_sessionsMetaDataList.isEmpty())
|
if (!m_sessionsMetaDataList.isEmpty())
|
||||||
@ -316,12 +276,18 @@ void SessionManager::fillSessionsMetaDataListIfNeeded()
|
|||||||
SessionMetaData metaData;
|
SessionMetaData metaData;
|
||||||
metaData.name = fileInfo.baseName();
|
metaData.name = fileInfo.baseName();
|
||||||
|
|
||||||
if (fileInfo == QFileInfo(defaultSessionPath()))
|
if (fileInfo == QFileInfo(defaultSessionPath())) {
|
||||||
metaData.name = tr("Default Session");
|
metaData.name = tr("Default Session");
|
||||||
else if (fileNames.contains(fileInfo.baseName()))
|
metaData.isDefault = true;
|
||||||
|
} else if (fileNames.contains(fileInfo.baseName())) {
|
||||||
metaData.name = fileInfo.fileName();
|
metaData.name = fileInfo.fileName();
|
||||||
else
|
} else {
|
||||||
metaData.name = fileInfo.baseName();
|
metaData.name = fileInfo.baseName();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isActive(fileInfo)) {
|
||||||
|
metaData.isActive = true;
|
||||||
|
}
|
||||||
|
|
||||||
fileNames << metaData.name;
|
fileNames << metaData.name;
|
||||||
metaData.filePath = fileInfo.canonicalFilePath();
|
metaData.filePath = fileInfo.canonicalFilePath();
|
||||||
@ -385,6 +351,12 @@ void SessionManager::writeCurrentSession(const QString &filePath)
|
|||||||
file.commit();
|
file.commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SessionManager::openSessionManagerDialog()
|
||||||
|
{
|
||||||
|
SessionManagerDialog *dialog = new SessionManagerDialog(mApp->getWindow());
|
||||||
|
dialog->open();
|
||||||
|
}
|
||||||
|
|
||||||
void SessionManager::autoSaveLastSession()
|
void SessionManager::autoSaveLastSession()
|
||||||
{
|
{
|
||||||
if (mApp->isPrivate() || mApp->isRestoring() || mApp->windowCount() == 0 || mApp->restoreManager()) {
|
if (mApp->isPrivate() || mApp->isRestoring() || mApp->windowCount() == 0 || mApp->restoreManager()) {
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
class QAction;
|
class QAction;
|
||||||
class QMenu;
|
class QMenu;
|
||||||
|
class QFileInfo;
|
||||||
|
|
||||||
class QUPZILLA_EXPORT SessionManager : public QObject
|
class QUPZILLA_EXPORT SessionManager : public QObject
|
||||||
{
|
{
|
||||||
@ -34,6 +34,9 @@ public:
|
|||||||
struct SessionMetaData {
|
struct SessionMetaData {
|
||||||
QString name;
|
QString name;
|
||||||
QString filePath;
|
QString filePath;
|
||||||
|
bool isActive = false;
|
||||||
|
bool isDefault = false;
|
||||||
|
bool isBackup = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
void loadSettings();
|
void loadSettings();
|
||||||
@ -46,22 +49,30 @@ public:
|
|||||||
void backupSavedSessions();
|
void backupSavedSessions();
|
||||||
void writeCurrentSession(const QString &filePath);
|
void writeCurrentSession(const QString &filePath);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void sessionsMetaDataChanged();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void autoSaveLastSession();
|
void autoSaveLastSession();
|
||||||
|
void openSessionManagerDialog();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void aboutToShowSessionsMenu();
|
void aboutToShowSessionsMenu();
|
||||||
void aboutToShowSessionSubmenu();
|
|
||||||
void sessionsDirectoryChanged();
|
void sessionsDirectoryChanged();
|
||||||
void switchToSession();
|
|
||||||
void openSession(QString sessionFilePath = QString(), bool switchSession = false);
|
void openSession(QString sessionFilePath = QString(), bool switchSession = false);
|
||||||
void renameSession(QString sessionFilePath = QString(), bool clone = false);
|
void renameSession(QString sessionFilePath = QString(), bool clone = false);
|
||||||
void cloneSession();
|
|
||||||
void deleteSession();
|
|
||||||
void saveSession();
|
void saveSession();
|
||||||
|
|
||||||
|
void switchToSession(const QString &filePath);
|
||||||
|
void cloneSession(const QString &filePath);
|
||||||
|
void deleteSession(const QString &filePath);
|
||||||
void newSession();
|
void newSession();
|
||||||
|
|
||||||
|
QList<SessionMetaData> sessionMetaData(bool withBackups = true);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool isActive(const QString &filePath) const;
|
||||||
|
bool isActive(const QFileInfo &fileInfo) const;
|
||||||
void fillSessionsMetaDataListIfNeeded();
|
void fillSessionsMetaDataListIfNeeded();
|
||||||
|
|
||||||
QList<SessionMetaData> m_sessionsMetaDataList;
|
QList<SessionMetaData> m_sessionsMetaDataList;
|
||||||
@ -69,6 +80,8 @@ private:
|
|||||||
QString m_firstBackupSession;
|
QString m_firstBackupSession;
|
||||||
QString m_secondBackupSession;
|
QString m_secondBackupSession;
|
||||||
QString m_lastActiveSessionPath;
|
QString m_lastActiveSessionPath;
|
||||||
|
|
||||||
|
friend class SessionManagerDialog;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SESSIONMANAGER_H
|
#endif // SESSIONMANAGER_H
|
||||||
|
182
src/lib/session/sessionmanagerdialog.cpp
Normal file
182
src/lib/session/sessionmanagerdialog.cpp
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
/* ============================================================
|
||||||
|
* QupZilla - Qt web browser
|
||||||
|
* Copyright (C) 2017 David Rosca <nowrep@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
* ============================================================ */
|
||||||
|
#include "sessionmanagerdialog.h"
|
||||||
|
#include "ui_sessionmanagerdialog.h"
|
||||||
|
#include "mainapplication.h"
|
||||||
|
#include "sessionmanager.h"
|
||||||
|
#include "removeitemfocusdelegate.h"
|
||||||
|
|
||||||
|
#include <QFileInfo>
|
||||||
|
#include <QDateTime>
|
||||||
|
|
||||||
|
SessionManagerDialog::SessionManagerDialog(QWidget *parent) :
|
||||||
|
QDialog(parent),
|
||||||
|
ui(new Ui::SessionManagerDialog)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
setAttribute(Qt::WA_DeleteOnClose);
|
||||||
|
|
||||||
|
ui->treeWidget->setItemDelegate(new RemoveItemFocusDelegate(ui->treeWidget));
|
||||||
|
|
||||||
|
connect(ui->newButton, &QPushButton::clicked, this, &SessionManagerDialog::newSession);
|
||||||
|
connect(ui->renameButton, &QPushButton::clicked, this, &SessionManagerDialog::renameSession);
|
||||||
|
connect(ui->cloneButton, &QPushButton::clicked, this, &SessionManagerDialog::cloneSession);
|
||||||
|
connect(ui->deleteButton, &QPushButton::clicked, this, &SessionManagerDialog::deleteSession);
|
||||||
|
connect(ui->switchToButton, &QPushButton::clicked, this, &SessionManagerDialog::switchToSession);
|
||||||
|
connect(ui->treeWidget, &QTreeWidget::currentItemChanged, this, &SessionManagerDialog::updateButtons);
|
||||||
|
|
||||||
|
refresh();
|
||||||
|
connect(mApp->sessionManager(), &SessionManager::sessionsMetaDataChanged, this, &SessionManagerDialog::refresh);
|
||||||
|
}
|
||||||
|
|
||||||
|
SessionManagerDialog::~SessionManagerDialog()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SessionManagerDialog::newSession()
|
||||||
|
{
|
||||||
|
mApp->sessionManager()->newSession();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SessionManagerDialog::renameSession()
|
||||||
|
{
|
||||||
|
QTreeWidgetItem *item = ui->treeWidget->currentItem();
|
||||||
|
if (!item) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const QString filePath = item->data(0, SessionFileRole).toString();
|
||||||
|
if (!filePath.isEmpty()) {
|
||||||
|
mApp->sessionManager()->renameSession(filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SessionManagerDialog::cloneSession()
|
||||||
|
{
|
||||||
|
QTreeWidgetItem *item = ui->treeWidget->currentItem();
|
||||||
|
if (!item) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const QString filePath = item->data(0, SessionFileRole).toString();
|
||||||
|
if (!filePath.isEmpty()) {
|
||||||
|
mApp->sessionManager()->cloneSession(filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SessionManagerDialog::deleteSession()
|
||||||
|
{
|
||||||
|
QTreeWidgetItem *item = ui->treeWidget->currentItem();
|
||||||
|
if (!item) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const QString filePath = item->data(0, SessionFileRole).toString();
|
||||||
|
if (!filePath.isEmpty()) {
|
||||||
|
mApp->sessionManager()->deleteSession(filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SessionManagerDialog::switchToSession()
|
||||||
|
{
|
||||||
|
QTreeWidgetItem *item = ui->treeWidget->currentItem();
|
||||||
|
if (!item) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const QString filePath = item->data(0, SessionFileRole).toString();
|
||||||
|
if (!filePath.isEmpty()) {
|
||||||
|
close();
|
||||||
|
mApp->sessionManager()->switchToSession(filePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SessionManagerDialog::refresh()
|
||||||
|
{
|
||||||
|
ui->treeWidget->clear();
|
||||||
|
|
||||||
|
const auto sessions = mApp->sessionManager()->sessionMetaData();
|
||||||
|
for (const auto &session : sessions) {
|
||||||
|
QTreeWidgetItem *item = new QTreeWidgetItem;
|
||||||
|
item->setText(0, session.name);
|
||||||
|
item->setText(1, QFileInfo(session.filePath).lastModified().toString(Qt::DefaultLocaleShortDate));
|
||||||
|
item->setData(0, SessionFileRole, session.filePath);
|
||||||
|
item->setData(0, IsBackupSessionRole, session.isBackup);
|
||||||
|
item->setData(0, IsActiveSessionRole, session.isActive);
|
||||||
|
item->setData(0, IsDefaultSessionRole, session.isDefault);
|
||||||
|
updateItem(item);
|
||||||
|
ui->treeWidget->addTopLevelItem(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SessionManagerDialog::updateButtons()
|
||||||
|
{
|
||||||
|
QTreeWidgetItem *item = ui->treeWidget->currentItem();
|
||||||
|
const bool isBackup = item && item->data(0, IsBackupSessionRole).toBool();
|
||||||
|
const bool isActive = item && item->data(0, IsActiveSessionRole).toBool();
|
||||||
|
const bool isDefault = item && item->data(0, IsDefaultSessionRole).toBool();
|
||||||
|
|
||||||
|
ui->renameButton->setEnabled(item && !isDefault && !isBackup);
|
||||||
|
ui->cloneButton->setEnabled(item && !isBackup);
|
||||||
|
ui->deleteButton->setEnabled(item && !isBackup && !isDefault && !isActive);
|
||||||
|
ui->switchToButton->setEnabled(item && !isActive && !isBackup);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SessionManagerDialog::updateItem(QTreeWidgetItem *item)
|
||||||
|
{
|
||||||
|
const bool isBackup = item->data(0, IsBackupSessionRole).toBool();
|
||||||
|
const bool isActive = item->data(0, IsActiveSessionRole).toBool();
|
||||||
|
const bool isDefault = item->data(0, IsDefaultSessionRole).toBool();
|
||||||
|
|
||||||
|
QFont font = item->font(0);
|
||||||
|
|
||||||
|
if (isBackup) {
|
||||||
|
const QColor color = palette().color(QPalette::Disabled, QPalette::WindowText);
|
||||||
|
item->setForeground(0, color);
|
||||||
|
item->setForeground(1, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isActive) {
|
||||||
|
font.setBold(true);
|
||||||
|
item->setFont(0, font);
|
||||||
|
item->setFont(1, font);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isDefault) {
|
||||||
|
font.setItalic(true);
|
||||||
|
item->setFont(0, font);
|
||||||
|
item->setFont(1, font);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SessionManagerDialog::showEvent(QShowEvent *e)
|
||||||
|
{
|
||||||
|
QDialog::showEvent(e);
|
||||||
|
resizeViewHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SessionManagerDialog::resizeEvent(QResizeEvent *e)
|
||||||
|
{
|
||||||
|
QDialog::resizeEvent(e);
|
||||||
|
resizeViewHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SessionManagerDialog::resizeViewHeader()
|
||||||
|
{
|
||||||
|
const int headerWidth = ui->treeWidget->header()->width();
|
||||||
|
ui->treeWidget->header()->resizeSection(0, headerWidth - headerWidth / 2.5);
|
||||||
|
}
|
62
src/lib/session/sessionmanagerdialog.h
Normal file
62
src/lib/session/sessionmanagerdialog.h
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
/* ============================================================
|
||||||
|
* QupZilla - Qt web browser
|
||||||
|
* Copyright (C) 2017 David Rosca <nowrep@gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
* ============================================================ */
|
||||||
|
#ifndef SESSIONMANAGERDIALOG_H
|
||||||
|
#define SESSIONMANAGERDIALOG_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class SessionManagerDialog;
|
||||||
|
}
|
||||||
|
|
||||||
|
class QTreeWidgetItem;
|
||||||
|
|
||||||
|
class SessionManagerDialog : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit SessionManagerDialog(QWidget *parent = 0);
|
||||||
|
~SessionManagerDialog();
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum Roles {
|
||||||
|
SessionFileRole = Qt::UserRole + 10,
|
||||||
|
IsBackupSessionRole,
|
||||||
|
IsActiveSessionRole,
|
||||||
|
IsDefaultSessionRole
|
||||||
|
};
|
||||||
|
|
||||||
|
void newSession();
|
||||||
|
void renameSession();
|
||||||
|
void cloneSession();
|
||||||
|
void deleteSession();
|
||||||
|
void switchToSession();
|
||||||
|
|
||||||
|
void refresh();
|
||||||
|
void updateButtons();
|
||||||
|
void updateItem(QTreeWidgetItem *item);
|
||||||
|
|
||||||
|
void showEvent(QShowEvent *e) override;
|
||||||
|
void resizeEvent(QResizeEvent *e) override;
|
||||||
|
void resizeViewHeader();
|
||||||
|
|
||||||
|
Ui::SessionManagerDialog *ui;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SESSIONMANAGERDIALOG_H
|
133
src/lib/session/sessionmanagerdialog.ui
Normal file
133
src/lib/session/sessionmanagerdialog.ui
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>SessionManagerDialog</class>
|
||||||
|
<widget class="QDialog" name="SessionManagerDialog">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>466</width>
|
||||||
|
<height>323</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Session Manager</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QTreeWidget" name="treeWidget">
|
||||||
|
<property name="rootIsDecorated">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Session</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Last Modified</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="1">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="newButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>New</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="renameButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Rename</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="cloneButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Clone</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="deleteButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Delete</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="switchToButton">
|
||||||
|
<property name="text">
|
||||||
|
<string>Switch to</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="verticalSpacer">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0">
|
||||||
|
<size>
|
||||||
|
<width>20</width>
|
||||||
|
<height>40</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0" colspan="2">
|
||||||
|
<widget class="QDialogButtonBox" name="buttonBox">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="standardButtons">
|
||||||
|
<set>QDialogButtonBox::Close</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>accepted()</signal>
|
||||||
|
<receiver>SessionManagerDialog</receiver>
|
||||||
|
<slot>accept()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>248</x>
|
||||||
|
<y>254</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>157</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
<connection>
|
||||||
|
<sender>buttonBox</sender>
|
||||||
|
<signal>rejected()</signal>
|
||||||
|
<receiver>SessionManagerDialog</receiver>
|
||||||
|
<slot>reject()</slot>
|
||||||
|
<hints>
|
||||||
|
<hint type="sourcelabel">
|
||||||
|
<x>316</x>
|
||||||
|
<y>260</y>
|
||||||
|
</hint>
|
||||||
|
<hint type="destinationlabel">
|
||||||
|
<x>286</x>
|
||||||
|
<y>274</y>
|
||||||
|
</hint>
|
||||||
|
</hints>
|
||||||
|
</connection>
|
||||||
|
</connections>
|
||||||
|
</ui>
|
Loading…
Reference in New Issue
Block a user