1
mirror of https://invent.kde.org/network/falkon.git synced 2024-09-21 17:52:10 +02:00

BrowserWindow: Save ui state separately for each window

This commit is contained in:
David Rosca 2018-01-02 18:05:19 +01:00
parent 423e06c7d6
commit 6b08e17dcd
4 changed files with 76 additions and 26 deletions

View File

@ -85,7 +85,7 @@
#include <xcb/xcb_atom.h> #include <xcb/xcb_atom.h>
#endif #endif
static const int savedWindowVersion = 1; static const int savedWindowVersion = 2;
BrowserWindow::SavedWindow::SavedWindow() BrowserWindow::SavedWindow::SavedWindow()
{ {
@ -95,6 +95,7 @@ BrowserWindow::SavedWindow::SavedWindow(BrowserWindow *window)
{ {
windowState = window->isFullScreen() ? QByteArray() : window->saveState(); windowState = window->isFullScreen() ? QByteArray() : window->saveState();
windowGeometry = window->saveGeometry(); windowGeometry = window->saveGeometry();
windowUiState = window->saveUiState();
#ifdef QZ_WS_X11 #ifdef QZ_WS_X11
virtualDesktop = window->getCurrentVirtualDesktop(); virtualDesktop = window->getCurrentVirtualDesktop();
#endif #endif
@ -148,6 +149,8 @@ QDataStream &operator<<(QDataStream &stream, const BrowserWindow::SavedWindow &w
stream << window.tabs.at(i); stream << window.tabs.at(i);
} }
stream << window.windowUiState;
return stream; return stream;
} }
@ -175,6 +178,10 @@ QDataStream &operator>>(QDataStream &stream, BrowserWindow::SavedWindow &window)
window.tabs.append(tab); window.tabs.append(tab);
} }
if (version >= 2) {
stream >> window.windowUiState;
}
return stream; return stream;
} }
@ -329,8 +336,7 @@ void BrowserWindow::postLaunch()
void BrowserWindow::setupUi() void BrowserWindow::setupUi()
{ {
int locationBarWidth; QHash<QString, QVariant> uiState;
int websearchBarWidth;
QDesktopWidget* desktop = mApp->desktop(); QDesktopWidget* desktop = mApp->desktop();
int windowWidth = desktop->availableGeometry().width() / 1.3; int windowWidth = desktop->availableGeometry().width() / 1.3;
@ -365,8 +371,18 @@ void BrowserWindow::setupUi()
#endif #endif
} }
locationBarWidth = settings.value("LocationBarWidth", 480).toInt(); const QStringList keys = {
websearchBarWidth = settings.value("WebSearchBarWidth", 140).toInt(); QSL("LocationBarWidth"),
QSL("WebSearchBarWidth"),
QSL("SideBarWidth"),
QSL("WebViewWidth")
};
for (const QString &key : keys) {
if (settings.contains(key)) {
uiState[key] = settings.value(key);
}
}
settings.endGroup(); settings.endGroup();
QWidget* widget = new QWidget(this); QWidget* widget = new QWidget(this);
@ -381,7 +397,6 @@ void BrowserWindow::setupUi()
m_tabWidget = new TabWidget(this); m_tabWidget = new TabWidget(this);
m_superMenu = new QMenu(this); m_superMenu = new QMenu(this);
m_navigationToolbar = new NavigationBar(this); m_navigationToolbar = new NavigationBar(this);
m_navigationToolbar->setSplitterSizes(locationBarWidth, websearchBarWidth);
m_bookmarksToolbar = new BookmarksToolbar(this); m_bookmarksToolbar = new BookmarksToolbar(this);
m_navigationContainer = new NavigationContainer(this); m_navigationContainer = new NavigationContainer(this);
@ -414,6 +429,8 @@ void BrowserWindow::setupUi()
pal.setColor(QPalette::Window, col); pal.setColor(QPalette::Window, col);
QToolTip::setPalette(pal); QToolTip::setPalette(pal);
restoreUiState(uiState);
// Set some sane minimum width // Set some sane minimum width
setMinimumWidth(300); setMinimumWidth(300);
} }
@ -513,6 +530,28 @@ void BrowserWindow::createEncodingSubMenu(const QString &name, QStringList &code
menu->addMenu(subMenu); menu->addMenu(subMenu);
} }
QHash<QString, QVariant> BrowserWindow::saveUiState()
{
saveSideBarWidth();
QHash<QString, QVariant> state;
state[QSL("LocationBarWidth")] = m_navigationToolbar->splitter()->sizes().at(0);
state[QSL("WebSearchBarWidth")] = m_navigationToolbar->splitter()->sizes().at(1);
state[QSL("SideBarWidth")] = m_sideBarWidth;
state[QSL("WebViewWidth")] = m_webViewWidth;
return state;
}
void BrowserWindow::restoreUiState(const QHash<QString, QVariant> &state)
{
const int locationBarWidth = state.value(QSL("LocationBarWidth"), 480).toInt();
const int websearchBarWidth = state.value(QSL("WebSearchBarWidth"), 140).toInt();
m_navigationToolbar->setSplitterSizes(locationBarWidth, websearchBarWidth);
m_sideBarWidth = state.value(QSL("SideBarWidth"), 250).toInt();
m_webViewWidth = state.value(QSL("WebViewWidth"), 2000).toInt();
}
void BrowserWindow::loadSettings() void BrowserWindow::loadSettings()
{ {
Settings settings; Settings settings;
@ -533,8 +572,6 @@ void BrowserWindow::loadSettings()
bool showBookmarksToolbar = settings.value("showBookmarksToolbar", true).toBool(); bool showBookmarksToolbar = settings.value("showBookmarksToolbar", true).toBool();
bool showNavigationToolbar = settings.value("showNavigationToolbar", true).toBool(); bool showNavigationToolbar = settings.value("showNavigationToolbar", true).toBool();
bool showMenuBar = settings.value("showMenubar", false).toBool(); bool showMenuBar = settings.value("showMenubar", false).toBool();
m_sideBarWidth = settings.value("SideBarWidth", 250).toInt();
m_webViewWidth = settings.value("WebViewWidth", 2000).toInt();
const QString activeSideBar = settings.value("SideBar", "None").toString(); const QString activeSideBar = settings.value("SideBar", "None").toString();
// Make sure both menubar and navigationbar are not hidden // Make sure both menubar and navigationbar are not hidden
@ -796,7 +833,6 @@ SideBar* BrowserWindow::addSideBar()
m_mainSplitter->insertWidget(0, m_sideBar.data()); m_mainSplitter->insertWidget(0, m_sideBar.data());
m_mainSplitter->setCollapsible(0, false); m_mainSplitter->setCollapsible(0, false);
m_mainSplitter->setSizes(QList<int>() << m_sideBarWidth << m_webViewWidth); m_mainSplitter->setSizes(QList<int>() << m_sideBarWidth << m_webViewWidth);
return m_sideBar.data(); return m_sideBar.data();
@ -804,9 +840,12 @@ SideBar* BrowserWindow::addSideBar()
void BrowserWindow::saveSideBarWidth() void BrowserWindow::saveSideBarWidth()
{ {
if (!m_sideBar) {
return;
}
// That +1 is important here, without it, the sidebar width would // That +1 is important here, without it, the sidebar width would
// decrease by 1 pixel every close // decrease by 1 pixel every close
m_sideBarWidth = m_mainSplitter->sizes().at(0) + 1; m_sideBarWidth = m_mainSplitter->sizes().at(0) + 1;
m_webViewWidth = width() - m_sideBarWidth; m_webViewWidth = width() - m_sideBarWidth;
} }
@ -979,6 +1018,7 @@ void BrowserWindow::restoreWindow(const SavedWindow &window)
{ {
restoreState(window.windowState); restoreState(window.windowState);
restoreGeometry(window.windowGeometry); restoreGeometry(window.windowGeometry);
restoreUiState(window.windowUiState);
#ifdef QZ_WS_X11 #ifdef QZ_WS_X11
moveToVirtualDesktop(window.virtualDesktop); moveToVirtualDesktop(window.virtualDesktop);
#endif #endif
@ -1494,20 +1534,20 @@ void BrowserWindow::closeWindow()
void BrowserWindow::saveSettings() void BrowserWindow::saveSettings()
{ {
if (m_sideBar) { if (mApp->isPrivate()) {
saveSideBarWidth(); return;
} }
if (!mApp->isPrivate()) { Settings settings;
Settings settings; settings.beginGroup("Browser-View-Settings");
settings.beginGroup("Browser-View-Settings"); settings.setValue("WindowGeometry", saveGeometry());
settings.setValue("LocationBarWidth", m_navigationToolbar->splitter()->sizes().at(0));
settings.setValue("WebSearchBarWidth", m_navigationToolbar->splitter()->sizes().at(1)); const auto state = saveUiState();
settings.setValue("SideBarWidth", m_sideBarWidth); for (auto it = state.constBegin(); it != state.constEnd(); ++it) {
settings.setValue("WebViewWidth", m_webViewWidth); settings.setValue(it.key(), it.value());
settings.setValue("WindowGeometry", saveGeometry());
settings.endGroup();
} }
settings.endGroup();
} }
void BrowserWindow::closeTab() void BrowserWindow::closeTab()

View File

@ -61,6 +61,7 @@ public:
struct SavedWindow { struct SavedWindow {
QByteArray windowState; QByteArray windowState;
QByteArray windowGeometry; QByteArray windowGeometry;
QHash<QString, QVariant> windowUiState;
int virtualDesktop = -1; int virtualDesktop = -1;
int currentTab = -1; int currentTab = -1;
QVector<WebTab::SavedTab> tabs; QVector<WebTab::SavedTab> tabs;
@ -82,7 +83,6 @@ public:
void setStartPage(WebPage* page); void setStartPage(WebPage* page);
void restoreWindow(const SavedWindow &window); void restoreWindow(const SavedWindow &window);
void saveSideBarWidth();
bool fullScreenNavigationVisible() const; bool fullScreenNavigationVisible() const;
void showNavigationWithFullScreen(); void showNavigationWithFullScreen();
@ -101,6 +101,7 @@ public:
void removeActions(const QList<QAction*> &actions); void removeActions(const QList<QAction*> &actions);
SideBar* addSideBar(); SideBar* addSideBar();
void saveSideBarWidth();
TabbedWebView* weView() const; TabbedWebView* weView() const;
TabbedWebView* weView(int index) const; TabbedWebView* weView(int index) const;
@ -186,10 +187,12 @@ private:
void setupMenu(); void setupMenu();
void updateStartupFocus(); void updateStartupFocus();
QAction *createEncodingAction(const QString &codecName, const QString &activeCodecName, QAction *createEncodingAction(const QString &codecName, const QString &activeCodecName, QMenu *menu);
QMenu *menu);
void createEncodingSubMenu(const QString &name, QStringList &codecNames, QMenu *menu); void createEncodingSubMenu(const QString &name, QStringList &codecNames, QMenu *menu);
QHash<QString, QVariant> saveUiState();
void restoreUiState(const QHash<QString, QVariant> &state);
QUrl m_startUrl; QUrl m_startUrl;
QUrl m_homepage; QUrl m_homepage;
Qz::BrowserWindowType m_windowType; Qz::BrowserWindowType m_windowType;

View File

@ -1,6 +1,6 @@
/* ============================================================ /* ============================================================
* Falkon - Qt web browser * Falkon - Qt web browser
* Copyright (C) 2010-2014 David Rosca <nowrep@gmail.com> * Copyright (C) 2010-2018 David Rosca <nowrep@gmail.com>
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -46,6 +46,11 @@ void Settings::syncSettings()
s_settings->sync(); s_settings->sync();
} }
bool Settings::contains(const QString &key) const
{
return s_settings->contains(key);
}
void Settings::setValue(const QString &key, const QVariant &defaultValue) void Settings::setValue(const QString &key, const QVariant &defaultValue)
{ {
s_settings->setValue(key, defaultValue); s_settings->setValue(key, defaultValue);

View File

@ -1,6 +1,6 @@
/* ============================================================ /* ============================================================
* Falkon - Qt web browser * Falkon - Qt web browser
* Copyright (C) 2010-2014 David Rosca <nowrep@gmail.com> * Copyright (C) 2010-2018 David Rosca <nowrep@gmail.com>
* *
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -38,6 +38,8 @@ public:
static QSettings* globalSettings(); static QSettings* globalSettings();
static QzSettings* staticSettings(); static QzSettings* staticSettings();
bool contains(const QString &key) const;
void setValue(const QString &key, const QVariant &defaultValue = QVariant()); void setValue(const QString &key, const QVariant &defaultValue = QVariant());
QVariant value(const QString &key, const QVariant &defaultValue = QVariant()); QVariant value(const QString &key, const QVariant &defaultValue = QVariant());