[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [Calligra/all-tooldocker-boemann] f58bb93: Move handling of toolbars
From:       Casper Boemann <cbo () boemann ! dk>
Date:       2010-12-31 20:00:27
Message-ID: 20101231200027.3AE47A6090 () git ! kde ! org
[Download RAW message or body]

commit f58bb93e2bc4f51dc41049412c46c92edf06b44e
branch all-tooldocker-boemann
Author: Casper Boemann <cbo@boemann.dk>
Date:   Fri Dec 31 17:49:02 2010 +0100

    Move handling of toolbars docker from komainwindow to KoDockerManager
    Also make sure the toolbarsdocker only steals toolbars while visible

diff --git a/libs/main/KoDockerManager.cpp b/libs/main/KoDockerManager.cpp
index 8bbe014..90fd541 100644
--- a/libs/main/KoDockerManager.cpp
+++ b/libs/main/KoDockerManager.cpp
@@ -26,12 +26,16 @@
 #include <kconfig.h>
 #include <kconfiggroup.h>
 #include <kdebug.h>
+#include <ktoolbar.h>
 
 #include "KoToolDocker_p.h"
 
 #include "KoView.h"
 #include "KoMainWindow.h"
 
+#include <QList>
+#include <QGridLayout>
+
 class ToolDockerFactory : public KoDockFactoryBase
 {
 public:
@@ -51,25 +55,98 @@ public:
     }
 };
 
+class ToolBarsDockerFactory : public KoDockFactoryBase
+{
+public:
+    ToolBarsDockerFactory() : KoDockFactoryBase() { }
+
+    QString id() const {
+        return "ToolBarDocker";
+    }
+
+    QDockWidget* createDockWidget() {
+        return new QDockWidget(i18n("Tool Bars Docker"));
+    }
+
+    DockPosition defaultDockPosition() const {
+        return DockTop;
+    }
+};
 
 class KoDockerManager::Private
 {
 public:
-    Private() {};
-    KoToolDocker *docker;
+    Private(KoMainWindow *mw) :
+        dockedToolBarsLayout(0)
+        ,mainWindow(mw)
+        ,ignore(true)
+    {
+    }
+
+    KoToolDocker *toolOptionsDocker;
+    QDockWidget *toolBarsDocker;
+    QGridLayout *dockedToolBarsLayout;
+    QList<KToolBar *> toolBarList;
+    KoMainWindow *mainWindow;
+    bool ignore;
+
+    void restoringDone()
+    {
+        ignore = false;
+        moveToolBars();
+    }
 
-    void makeDockVisible()
+    void moveToolBarsBack()
     {
+        foreach(KToolBar *toolBar, toolBarList) {
+            mainWindow->addToolBar(toolBar);
+        }
+        toolBarList.clear();
+    }
+
+    void moveToolBars()
+    {
+        if(ignore)
+            return;
+
+        // Move toolbars to docker or back depending on visibllity of docker
+        if (toolBarsDocker->isVisible()) {
+            QList<KToolBar *> tmpList = mainWindow->toolBars();
+            toolBarList.append(tmpList);
+            foreach(KToolBar *toolBar, tmpList) {
+                dockedToolBarsLayout->addWidget(toolBar);
+        }
+        } else {
+            moveToolBarsBack();
+        }
     }
 };
 
 KoDockerManager::KoDockerManager(KoMainWindow *mainWindow)
-    : QObject(mainWindow), d( new Private() )
+    : QObject(mainWindow), d( new Private(mainWindow) )
 {
-    ToolDockerFactory factory;
-    d->docker = qobject_cast<KoToolDocker*>(mainWindow->createDockWidget(&factory));
-    Q_ASSERT(d->docker);
-    connect(mainWindow, SIGNAL(restoringDone()), this, SLOT(makeDockVisible()));
+    ToolDockerFactory toolDockerFactory;
+    ToolBarsDockerFactory toolBarsDockerFactory;
+    d->toolOptionsDocker =
+            qobject_cast<KoToolDocker*>(mainWindow->createDockWidget(&toolDockerFactory));
+    Q_ASSERT(d->toolOptionsDocker);
+    d->toolBarsDocker = mainWindow->createDockWidget(&toolBarsDockerFactory);
+    Q_ASSERT(d->toolBarsDocker);
+
+    QWidget *dockedToolBarsWidget = new QWidget();
+    d->dockedToolBarsLayout = new QGridLayout();
+    d->dockedToolBarsLayout->setHorizontalSpacing(2);
+    d->dockedToolBarsLayout->setVerticalSpacing(0);
+    dockedToolBarsWidget->setLayout(d->dockedToolBarsLayout);
+    d->toolBarsDocker->setAllowedAreas(Qt::TopDockWidgetArea);
+    d->toolBarsDocker->setFeatures(QDockWidget::DockWidgetClosable);
+    d->toolBarsDocker->setWidget(dockedToolBarsWidget);
+    d->toolBarsDocker->setTitleBarWidget(new QWidget());
+
+    connect(mainWindow, SIGNAL(restoringDone()), this, SLOT(restoringDone()));
+    connect(d->toolBarsDocker, SIGNAL(visibilityChanged(bool)), this, SLOT(moveToolBars()));
+    connect(mainWindow, SIGNAL(beforeHandlingToolBars()), this, SLOT(moveToolBarsBack()));
+    connect(mainWindow, SIGNAL(afterHandlingToolBars()), this, SLOT(moveToolBars()));
 }
 
 KoDockerManager::~KoDockerManager()
@@ -79,7 +156,7 @@ KoDockerManager::~KoDockerManager()
 
 void KoDockerManager::newOptionWidgets(const QMap<QString, QWidget *> &optionWidgetMap)
 {
-    d->docker->setOptionWidgets(optionWidgetMap);
+    d->toolOptionsDocker->setOptionWidgets(optionWidgetMap);
 }
 
 #include <KoDockerManager.moc>
diff --git a/libs/main/KoDockerManager.h b/libs/main/KoDockerManager.h
index 85c1252..3ec84b9 100644
--- a/libs/main/KoDockerManager.h
+++ b/libs/main/KoDockerManager.h
@@ -46,7 +46,9 @@ public slots:
 
 
 private:
-    Q_PRIVATE_SLOT(d, void makeDockVisible())
+    Q_PRIVATE_SLOT(d, void moveToolBarsBack())
+    Q_PRIVATE_SLOT(d, void moveToolBars())
+    Q_PRIVATE_SLOT(d, void restoringDone())
     class Private;
     Private * const d;
 };
diff --git a/libs/main/KoMainWindow.cpp b/libs/main/KoMainWindow.cpp
index f4be52a..78604bd 100644
--- a/libs/main/KoMainWindow.cpp
+++ b/libs/main/KoMainWindow.cpp
@@ -128,46 +128,13 @@ public:
         readOnly = false;
         dockWidgetMenu = 0;
         dockerManager = 0;
-        toolBarsDock = 0;
-        dockedToolBarsLayout = 0;
     }
     ~KoMainWindowPrivate() {
         qDeleteAll(toolbarList);
     }
 
-    void moveToolBarsToDocker()
-    {
-        if(!toolBarsDock) {
-            toolBarsDock = new QDockWidget(parent);
-            toolBarsDock->setTitleBarWidget(new QWidget());
-            toolBarsDock->setObjectName("ToolBarDocker");
-            QWidget *dockedToolBarsWidget = new QWidget();
-            dockedToolBarsLayout = new QGridLayout();
-            dockedToolBarsLayout->setHorizontalSpacing(2);
-            dockedToolBarsLayout->setVerticalSpacing(0);
-            dockedToolBarsWidget->setLayout(dockedToolBarsLayout);
-            toolBarsDock->setAllowedAreas(Qt::TopDockWidgetArea);
-            toolBarsDock->setFeatures(QDockWidget::NoDockWidgetFeatures);
-            toolBarsDock->setWidget(dockedToolBarsWidget);
-            parent->addDockWidget(Qt::TopDockWidgetArea, toolBarsDock);
-            dockWidgets.push_back(toolBarsDock);
-        }
-        QList<KToolBar *> tmpList = parent->toolBars();
-        toolBarList.append(tmpList);
-        foreach(KToolBar *toolBar, tmpList) {
-            dockedToolBarsLayout->addWidget(toolBar);
-        }
-    }
-
     void moveToolBarsBack()
     {
-        if(toolBarsDock) {
-            foreach(KToolBar *toolBar, toolBarList) {
-                parent->addToolBar(toolBar);
-            }
-            //toolBarsDock = 0;
-            toolBarList.clear();
-        }
     }
 
     void applyDefaultSettings(QPrinter &printer) {
@@ -249,9 +216,6 @@ public:
     KActionMenu *dockWidgetMenu;
     QMap<QDockWidget *, bool> dockWidgetVisibilityMap;
     KoDockerManager *dockerManager;
-    QDockWidget *toolBarsDock;
-    QGridLayout *dockedToolBarsLayout;
-    QList<KToolBar *> toolBarList;
     QList<QDockWidget *> dockWidgets;
     QList<QDockWidget *> hiddenDockwidgets; // List of dockers hiddent by the call to hideDocker
 };
@@ -1604,8 +1568,9 @@ void KoMainWindow::slotActivePartChanged(KParts::Part *newPart)
         //kDebug(30003) <<"no need to change the GUI";
         return;
     }
-        // move the ToolBars back so their status can be saved
-        d->moveToolBarsBack();
+
+    // important so dockermanager can move toolbars back
+    emit beforeHandlingToolBars();
 
 
     KXMLGUIFactory *factory = guiFactory();
@@ -1671,9 +1636,6 @@ void KoMainWindow::slotActivePartChanged(KParts::Part *newPart)
         }
         plugActionList("toolbarlist", d->toolbarList);
 
-        // This call is what actually puts the toolbars into the toolbars docker
-        d->moveToolBarsToDocker();
-
         // Send the GUIActivateEvent only now, since it might show/hide toolbars too
         // (and this has priority over applyMainWindowSettings)
         KParts::GUIActivateEvent ev(true);
@@ -1683,6 +1645,8 @@ void KoMainWindow::slotActivePartChanged(KParts::Part *newPart)
         d->activeView = 0;
         d->activePart = 0;
     }
+    // important so dockermanager can move toolbars where wanted
+    emit afterHandlingToolBars();
 // ###  setUpdatesEnabled( true );
 }
 
@@ -1823,8 +1787,6 @@ QDockWidget* KoMainWindow::createDockWidget(KoDockFactoryBase* factory)
 {
     QDockWidget* dockWidget = 0;
 
-    d->moveToolBarsToDocker();
-    
     if (!d->dockWidgetsMap.contains(factory->id())) {
         dockWidget = factory->createDockWidget();
 
diff --git a/libs/main/KoMainWindow.h b/libs/main/KoMainWindow.h
index 33b161e..31fa4b4 100644
--- a/libs/main/KoMainWindow.h
+++ b/libs/main/KoMainWindow.h
@@ -99,11 +99,6 @@ public:
     virtual KParts::PartManager *partManager();
 
     /**
-     * Move the toolbars into a dedicated dockWidget.
-     */
-    void moveToolbarsToDocker();
-
-    /**
      * The application should call this to show or hide a toolbar.
      * It also takes care of the corresponding action in the settings menu.
      */
@@ -194,6 +189,12 @@ signals:
     /// This signal is emitted right after the docker states have been succefully restored from config
     void restoringDone();
 
+    /// This signal is emitted right before we handle loading or saving of toolbars
+    void beforeHandlingToolBars();
+
+    /// This signal is emitted right after we handled loading or saving of toolbars
+    void afterHandlingToolBars();
+
 public slots:
 
     /**
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic