From 9461c52f07a2bf8b9bc25f037b17805cda51b2b0 Mon Sep 17 00:00:00 2001 From: Andrea Diamantini Date: Sun, 10 Mar 2013 19:02:12 +0100 Subject: Supporting panel (again) :) - Move to a pure QWidget base window (instead of TabWidget one) (this to properly store panels position) - Restoring && rewamping panels code - Restoring actions to activate/deactivate them BUG: 312354 --- src/tabwindow/rekonqwindow.cpp | 461 +++++++++-------------------------------- 1 file changed, 101 insertions(+), 360 deletions(-) (limited to 'src/tabwindow/rekonqwindow.cpp') diff --git a/src/tabwindow/rekonqwindow.cpp b/src/tabwindow/rekonqwindow.cpp index ee37eba9..a14dcf15 100644 --- a/src/tabwindow/rekonqwindow.cpp +++ b/src/tabwindow/rekonqwindow.cpp @@ -2,7 +2,7 @@ * * This file is a part of the rekonq project * -* Copyright (C) 2012 by Andrea Diamantini +* Copyright (C) 2013 by Andrea Diamantini * * * This program is free software; you can redistribute it and/or @@ -27,422 +27,163 @@ // Self Includes #include "rekonqwindow.h" #include "rekonqwindow.moc" -#include - -// KDE Includes -#include -#include -#include - -// Qt Includes -#include -#include - - -static bool s_no_query_exit = false; - - -class KRWSessionManager : public KSessionManager -{ - -public: - KRWSessionManager() - { - } - - ~KRWSessionManager() - { - } - - bool dummyInit() - { - return true; - } - - bool saveState(QSessionManager&) - { - KConfig* config = KApplication::kApplication()->sessionConfig(); - int n = 0; - Q_FOREACH(RekonqWindow * rw, RekonqWindow::windowList()) - { - n++; - rw->savePropertiesInternal(config, n); - } - - KConfigGroup group(config, "Number"); - group.writeEntry("NumberOfWindows", n); - return true; - } - - bool commitData(QSessionManager& sm) - { - // not really a fast method but the only compatible one - if (sm.allowsInteraction()) - { - bool canceled = false; - ::s_no_query_exit = true; - - Q_FOREACH(RekonqWindow * window, RekonqWindow::windowList()) - { - if (!window->testAttribute(Qt::WA_WState_Hidden)) - { - QCloseEvent e; - QApplication::sendEvent(window, &e); - canceled = !e.isAccepted(); - if (canceled) - break; - } - } - ::s_no_query_exit = false; - if (canceled) - return false; - - return true; - } - - // the user wants it, the user gets it - return true; - } -}; +// Auto Includes +#include "rekonq.h" -K_GLOBAL_STATIC(KRWSessionManager, ktwsm) -K_GLOBAL_STATIC(QList, sWindowList) +// Local Includes +#include "application.h" +#include "tabwidget.h" +#include "tabbar.h" -// ---------------------------------------------------------------------------------------------------- +#include "webpage.h" +#include "webwindow.h" +// KDE Includes +#include +#include -RekonqWindow::RekonqWindow(QWidget* parent) - : KTabWidget(parent) -{ - // This has to be a window... - setWindowFlags(Qt::Window); - - // Setting attributes (just to be sure...) - setAttribute(Qt::WA_DeleteOnClose, true); - setAttribute(Qt::WA_QuitOnClose, true); - - ktwsm->dummyInit(); - sWindowList->append(this); - - QString geometry; - KCmdLineArgs *args = KCmdLineArgs::parsedArgs("kde"); - if (args && args->isSet("geometry")) - geometry = args->getOption("geometry"); - - if (geometry.isNull()) // if there is no geometry, it doesn't matter - { - KSharedConfig::Ptr cf = KGlobal::config(); - KConfigGroup cg(cf, QL1S("TabWindow")); - restoreWindowSize(cg); - } - else - { - parseGeometry(); - } - - setWindowTitle(KGlobal::caption()); -} - - -RekonqWindow::~RekonqWindow() -{ - sWindowList->removeAll(this); - - KSharedConfig::Ptr cf = KGlobal::config(); - KConfigGroup cg(cf, QL1S("TabWindow")); - saveWindowSize(cg); -} - +// Qt Includes +#include +#include -QSize RekonqWindow::sizeHint() const -{ - QRect desktopRect = QApplication::desktop()->screenGeometry(); - QSize size = desktopRect.size() * 0.8; - return size; -} -QList RekonqWindow::windowList() +RekonqWindow::RekonqWindow(bool withTab, bool privateBrowsingMode, QWidget *parent) + : RWindow(parent) + , _tabWidget(new TabWidget(withTab, privateBrowsingMode, this)) + , _splitter(new QSplitter(this)) { - return *sWindowList; + init(); } -void RekonqWindow::savePropertiesInternal(KConfig *config, int number) +RekonqWindow::RekonqWindow(WebPage *pg, QWidget *parent) + : RWindow(parent) + , _tabWidget(new TabWidget(pg, this)) + , _splitter(new QSplitter(this)) { - QString s; - s.setNum(number); - s.prepend(QL1S("WindowProperties")); - KConfigGroup cg(config, s); - - // store objectName, className, Width and Height for later restoring - // (Only useful for session management) - cg.writeEntry(QL1S("ObjectName"), objectName()); - cg.writeEntry(QL1S("ClassName"), metaObject()->className()); - - saveWindowSize(cg); - - s.setNum(number); - cg = KConfigGroup(config, s); - saveProperties(cg); + init(); } -bool RekonqWindow::readPropertiesInternal(KConfig *config, int number) +RekonqWindow::~RekonqWindow() { - // in order they are in toolbar list - QString s; - s.setNum(number); - s.prepend(QL1S("WindowProperties")); - - KConfigGroup cg(config, s); - - // restore the object name (window role) - if (cg.hasKey(QL1S("ObjectName"))) - setObjectName(cg.readEntry("ObjectName").toLatin1()); // latin1 is right here - - restoreWindowSize(cg); - - s.setNum(number); - KConfigGroup grp(config, s); - readProperties(grp); - - return true; } -void RekonqWindow::restoreWindowSize(const KConfigGroup & _cg) +void RekonqWindow::init() { - int scnum = QApplication::desktop()->screenNumber(window()); - QRect desktopRect = QApplication::desktop()->screenGeometry(scnum); + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - KConfigGroup cg(_cg); + QVBoxLayout *l = new QVBoxLayout(this); + l->setMargin(0); + l->setSpacing(0); - QString geometryKey = QString::fromLatin1("geometry-%1-%2").arg(desktopRect.width()).arg(desktopRect.height()); - QByteArray geometry = cg.readEntry(geometryKey, QByteArray()); + if (ReKonfig::showBookmarksPanel()) + showBookmarksPanel(true); + + if (ReKonfig::showHistoryPanel()) + showHistoryPanel(true); - // if first time run, center window: resize && move.. - if (!restoreGeometry(QByteArray::fromBase64(geometry))) - { - QSize defaultSize = desktopRect.size() * 0.8; - resize(defaultSize); + _splitter->addWidget(_tabWidget); + _tabWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - move((desktopRect.width() - width()) / 2, (desktopRect.height() - height()) / 2); - } + l->addWidget(_splitter); - checkPosition(); + + // fix focus handling + setFocusProxy(_tabWidget); } - -void RekonqWindow::saveWindowSize(const KConfigGroup & _cg) const -{ - int scnum = QApplication::desktop()->screenNumber(window()); - QRect desktopRect = QApplication::desktop()->screenGeometry(scnum); - - int w, h; - if (isMaximized()) - { - w = desktopRect.width() + 1; - h = desktopRect.height() + 1; - } - else - { - w = width(); - h = height(); - } - - KConfigGroup cg(_cg); - - QString widthString = QString::fromLatin1("Width %1").arg(desktopRect.width()); - cg.writeEntry(widthString, w); - - QString heightString = QString::fromLatin1("Height %1").arg(desktopRect.height()); - cg.writeEntry(heightString, h); - - // geometry is saved separately for each resolution - QString geometryKey = QString::fromLatin1("geometry-%1-%2").arg(desktopRect.width()).arg(desktopRect.height()); - QByteArray geometry = saveGeometry(); - cg.writeEntry(geometryKey, geometry.toBase64()); -} +// -------------------------------------------------------------------------------------------------- -void RekonqWindow::parseGeometry() +TabWidget *RekonqWindow::tabWidget() { - QString cmdlineGeometry; - KCmdLineArgs *args = KCmdLineArgs::parsedArgs("kde"); - if (args->isSet("geometry")) - cmdlineGeometry = args->getOption("geometry"); - - Q_ASSERT(!cmdlineGeometry.isNull()); - -// #if defined Q_WS_X11 -// int x, y; -// int w, h; -// int m = XParseGeometry( cmdlineGeometry.toLatin1(), &x, &y, (unsigned int*)&w, (unsigned int*)&h); -// if (parsewidth) { -// const QSize minSize = minimumSize(); -// const QSize maxSize = maximumSize(); -// if ( !(m & WidthValue) ) -// w = width(); -// if ( !(m & HeightValue) ) -// h = height(); -// w = qMin(w,maxSize.width()); -// h = qMin(h,maxSize.height()); -// w = qMax(w,minSize.width()); -// h = qMax(h,minSize.height()); -// resize(w, h); -// } else { -// if ( (m & XNegative) ) -// x = KApplication::desktop()->width() + x - w; -// else if ( (m & XValue) ) -// x = geometry().x(); -// if ( (m & YNegative) ) -// y = KApplication::desktop()->height() + y - h; -// else if ( (m & YValue) ) -// y = geometry().y(); -// -// move(x, y); -// } -// #endif + return _tabWidget; } -void RekonqWindow::resizeEvent(QResizeEvent *event) +TabBar *RekonqWindow::tabBar() { - if (!isFullScreen()) - saveAutoSaveSettings(); - KTabWidget::resizeEvent(event); + return _tabWidget->tabBar(); } -void RekonqWindow::saveAutoSaveSettings() +WebWindow *RekonqWindow::currentWebWindow() const { - kDebug() << "AUTO SAVING SETTINGS..."; - - KSharedConfig::Ptr cf = KGlobal::config(); - KConfigGroup cg(cf, QL1S("TabWindow")); - saveWindowSize(cg); + return _tabWidget->currentWebWindow(); } -bool RekonqWindow::canBeRestored(int number) -{ - if (!qApp->isSessionRestored()) - return false; - KConfig *config = kapp->sessionConfig(); - if (!config) - return false; - - KConfigGroup group(config, "Number"); - const int n = group.readEntry("NumberOfWindows", 1); - return number >= 1 && number <= n; -} +// -------------------------------------------------------------------------------------------------- -bool RekonqWindow::restore(int number, bool show) +void RekonqWindow::loadUrl(const KUrl &url, Rekonq::OpenType type, TabHistory *history) { - if (!canBeRestored(number)) - return false; - KConfig *config = kapp->sessionConfig(); - if (readPropertiesInternal(config, number)) + switch (type) { - if (show) - RekonqWindow::show(); - return true; - } - return false; -} - - -// NOTE: For internal purpose only ------------------------------------------------------ - - -int RekonqWindow::addTab(QWidget *page, const QString &label) -{ - setUpdatesEnabled(false); - int i = KTabWidget::addTab(page, label); - setUpdatesEnabled(true); - - return i; -} - - -int RekonqWindow::addTab(QWidget *page, const QIcon &icon, const QString &label) -{ - setUpdatesEnabled(false); - int i = KTabWidget::addTab(page, icon, label); - setUpdatesEnabled(true); - - return i; -} - - -int RekonqWindow::insertTab(int index, QWidget *page, const QString &label) -{ - if (! ReKonfig::openNewTabsNextToCurrent()) - index = -1; - setUpdatesEnabled(false); - int i = KTabWidget::insertTab(index, page, label); - setUpdatesEnabled(true); + case Rekonq::NewWindow: + case Rekonq::NewPrivateWindow: + rApp->loadUrl(url, type); + return; - return i; + case Rekonq::NewTab: + case Rekonq::NewBackGroundTab: + case Rekonq::NewFocusedTab: + case Rekonq::CurrentTab: + default: + _tabWidget->loadUrl(url, type, history); + break; + }; } -int RekonqWindow::insertTab(int index, QWidget *page, const QIcon &icon, const QString &label) +void RekonqWindow::showBookmarksPanel(bool on) { - if (! ReKonfig::openNewTabsNextToCurrent()) - index = -1; - setUpdatesEnabled(false); - int i = KTabWidget::insertTab(index, page, icon, label); - setUpdatesEnabled(true); + if (on) + { + if (_bookmarksPanel.isNull()) + { + _bookmarksPanel = new BookmarksPanel(i18n("Bookmarks Panel"), this); + connect(_bookmarksPanel.data(), SIGNAL(openUrl(KUrl, Rekonq::OpenType)), this, SLOT(loadUrl(KUrl, Rekonq::OpenType))); - return i; + QAction *a = _tabWidget->actionByName(QL1S("show_bookmarks_panel")); + connect(_bookmarksPanel.data(), SIGNAL(visibilityChanged(bool)), a, SLOT(setChecked(bool))); + } + _splitter->insertWidget(0, _bookmarksPanel.data()); + _bookmarksPanel.data()->show(); + } + else + { + _bookmarksPanel.data()->hide(); + delete _bookmarksPanel.data(); + _bookmarksPanel.clear(); + } } -// -------------------------------------------------------------------------------------- - - -void RekonqWindow::checkPosition() +void RekonqWindow::showHistoryPanel(bool on) { - // no need to check trivial positions... - if (isMaximized()) - return; - - QList wList = RekonqWindow::windowList(); - int wNumber = wList.count(); - - // no need to check first window... - if (wNumber <= 1) - return; - - int div = wNumber % 4; - - int scnum = QApplication::desktop()->screenNumber(window()); - QRect desktopRect = QApplication::desktop()->screenGeometry(scnum); + if (on) + { + if (_historyPanel.isNull()) + { + _historyPanel = new HistoryPanel(i18n("History Panel"), this); + connect(_historyPanel.data(), SIGNAL(openUrl(KUrl, Rekonq::OpenType)), this, SLOT(loadUrl(KUrl, Rekonq::OpenType))); + + QAction *a = _tabWidget->actionByName(QL1S("show_history_panel")); + connect(_historyPanel.data(), SIGNAL(visibilityChanged(bool)), a, SLOT(setChecked(bool))); - switch (div) + } + _splitter->insertWidget(0, _historyPanel.data()); + _historyPanel.data()->show(); + } + else { - case 2: - // left down - move(desktopRect.width() - width(), desktopRect.height() - height()); - break; - case 3: - // right down - move(0, desktopRect.height() - height()); - break; - case 0: - // left top - move(desktopRect.width() - width(), 0); - break; - case 1: - // right top - move(0, 0); - break; - default: - kDebug() << "OOPS...THIS SHOULD NEVER HAPPEN!!"; - break; + _historyPanel.data()->hide(); + delete _historyPanel.data(); + _historyPanel.clear(); } } -- cgit v1.2.1