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

List:       kde-commits
Subject:    koffice/libs/flake
From:       Thomas Zander <zander () kde ! org>
Date:       2007-02-14 19:57:55
Message-ID: 1171483075.349905.3419.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 633678 by zander:

Refactor toolManager to remember the active tool per canvas.
A refactor of the toolbox is needed to see the real effects.


 M  +96 -104   KoToolManager.cpp  


--- trunk/koffice/libs/flake/KoToolManager.cpp #633677:633678
@@ -1,7 +1,7 @@
 /* This file is part of the KDE project
  *
  * Copyright (c) 2005-2006 Boudewijn Rempt <boud@valdyas.org>
- * Copyright (C) 2006 Thomas Zander <zander@kde.org>
+ * Copyright (C) 2006-2007 Thomas Zander <zander@kde.org>
  * Copyright (C) 2006 Thorsten Zachmann <zachmann@kde.org>
  *
  * This library is free software; you can redistribute it and/or
@@ -51,29 +51,28 @@
 #include <kaction.h>
 #include <QStack>
 #include <QLabel>
+struct CanvasData {
+    CanvasData() : activeTool(0), canvas(0) {}
+    KoTool *activeTool;     // active Tool
+    QString activeToolId;   // the id of the active Tool
+    QString activationShapeId; // the shape-type (KoShape::shapeId()) the activeTool \
'belongs' to. +    QHash<QString, KoTool*> allTools; // all the tools that are \
created for this canvas. +    QStack<QString> stack; // stack of temporary tools
+    KoCanvasController *canvas;
+};
 
-/*
- TODO
-    * We now have one d->activeTool, we should allow a different active tool per \
                canvas.
-    * We now have one set of all tools per canvas, but this should be per canvas, \
                per input device.
-*/
-
 class KoToolManager::Private {
 public:
-    Private() : activeCanvas(0), activeTool(0), defaultTool(0) {}
+    Private() : defaultTool(0) {}
 
-    QList<ToolHelper*> tools;
-    QList<KoCanvasController*> canvases;
-    KoCanvasController *activeCanvas;
-    KoTool *activeTool;
+    QList<ToolHelper*> tools; // list of all available tools via their factories.
     ToolHelper *defaultTool; // the pointer thingy
-    QString activeToolId;
-    QString activationShapeId;
 
     QHash<KoTool*, int> uniqueToolIds; // for the changedTool signal
-    QHash<KoCanvasController*, QHash<QString, KoTool*> > allTools;
+    QHash<KoCanvasController*, CanvasData> canvasses;
     QHash<KoCanvasBase*, KoToolProxy*> proxies;
-    QStack<QString> stack; // stack of temporary tools
+
+    CanvasData canvasData; // data about the active canvas.
 };
 
 // ******** KoToolManager **********
@@ -149,8 +148,8 @@
         tsa->setText(i18n("Activate %1", th->name()));
     }
 
-    QHash<QString, KoTool*> toolsHash = d->allTools.value(controller);
-    foreach(KoTool *tool, toolsHash.values()) {
+    CanvasData cd = d->canvasses.value(controller);
+    foreach(KoTool *tool, cd.allTools) {
         QHash<QString, QAction*> actions = tool->actions();
         foreach(QString name, actions.keys())
             ac->addAction(name, actions[name]);
@@ -158,12 +157,11 @@
 }
 
 void KoToolManager::addController(KoCanvasController *controller ) {
-    if (d->canvases.contains(controller))
+    if (d->canvasses.keys().contains(controller))
         return;
     setup();
-    d->canvases.append(controller);
-    if (d->activeCanvas == 0)
-        d->activeCanvas = controller;
+    if (d->canvasData.canvas == 0)
+        d->canvasData.canvas = controller;
     if (controller->canvas())
         attachCanvas(controller);
     connect(controller, SIGNAL(canvasRemoved(KoCanvasController*)), this, \
SLOT(detachCanvas(KoCanvasController*))); @@ -171,96 +169,88 @@
 }
 
 void KoToolManager::removeCanvasController(KoCanvasController *controller) {
-    d->canvases.removeAll(controller);
-    QHash<QString, KoTool*> toolsHash = d->allTools.value(controller);
-    foreach(KoTool *tool, toolsHash.values()) {
+    CanvasData cd = d->canvasses.value(controller);
+    foreach(KoTool *tool, cd.allTools.values()) {
         d->uniqueToolIds.remove(tool);
         delete tool;
     }
-    d->allTools.remove(controller);
-    if (controller->canvas()) {
+    d->canvasses.remove(controller);
+    if (controller->canvas())
         detachCanvas(controller);
-        d->proxies.remove(controller->canvas());
-    }
     disconnect(controller, SIGNAL(canvasRemoved(KoCanvasController*)), this, \
                SLOT(detachCanvas(KoCanvasController*)));
     disconnect(controller, SIGNAL(canvasSet(KoCanvasController*)), this, \
SLOT(attachCanvas(KoCanvasController*)));  }
 
 void KoToolManager::toolActivated(ToolHelper *tool) {
-    Q_ASSERT(d->activeCanvas);
-    QHash<QString, KoTool*> toolsHash = d->allTools.value(d->activeCanvas);
-    KoTool *t = toolsHash.value(tool->id());
+    KoTool *t = d->canvasData.allTools.value(tool->id());
+    Q_ASSERT(t);
 
-    d->activeToolId = tool->id();
-    d->activationShapeId = tool->activationShapeId();
+    d->canvasData.activeToolId = tool->id();
+    d->canvasData.activationShapeId = tool->activationShapeId();
 
     switchTool(t);
 }
 
 void KoToolManager::switchTool(const QString &id, bool temporary) {
-
-    if (!d->activeCanvas) kDebug(30004) << kBacktrace();
-    Q_ASSERT(d->activeCanvas);
-    if (d->activeTool && temporary)
-        d->stack.push(d->activeToolId);
-    d->activeToolId = id;
-    QHash<QString, KoTool*> toolsHash = d->allTools.value(d->activeCanvas);
-    KoTool *tool = toolsHash.value(id);
+    if (d->canvasData.activeTool && temporary)
+        d->canvasData.stack.push(d->canvasData.activeToolId);
+    d->canvasData.activeToolId = id;
+    KoTool *tool = d->canvasData.allTools.value(id);
     if (! tool) {
-        kWarning(30004) << "Tool requested " << (temporary?"temporary":"") << \
"switch to unknown tool: '" << id << "'\n"; +        kWarning(30006) << "Tool \
requested " << (temporary?"temporary":"") << "switch to unknown tool: '" << id << \
"'\n";  return;
     }
+
     switchTool(tool);
 }
 
 void KoToolManager::switchTool(KoTool *tool) {
     Q_ASSERT(tool);
-    if (d->activeCanvas == 0) {
+    if (d->canvasData.canvas == 0)
         return;
-    }
-    if (d->activeTool) {
-        foreach(QAction *action, d->activeTool->actions().values())
+    if (d->canvasData.activeTool) {
+        foreach(QAction *action, d->canvasData.activeTool->actions().values())
             action->setEnabled(false);
-        d->activeTool->deactivate();
-        disconnect(d->activeTool, SIGNAL(sigCursorChanged(QCursor)),
+        d->canvasData.activeTool->deactivate();
+        disconnect(d->canvasData.activeTool, SIGNAL(sigCursorChanged(QCursor)),
                 this, SLOT(updateCursor(QCursor)));
-        disconnect(d->activeTool, SIGNAL(sigActivateTool(const QString &)),
+        disconnect(d->canvasData.activeTool, SIGNAL(sigActivateTool(const QString \
&)),  this, SLOT(switchToolRequested(const QString &)));
-        disconnect(d->activeTool, SIGNAL(sigActivateTemporary(const QString &)),
+        disconnect(d->canvasData.activeTool, SIGNAL(sigActivateTemporary(const \
                QString &)),
                 this, SLOT(switchToolTemporaryRequested(const QString &)));
-        disconnect(d->activeTool, SIGNAL(sigDone()), this, \
SLOT(switchBackRequested())); +        disconnect(d->canvasData.activeTool, \
SIGNAL(sigDone()), this, SLOT(switchBackRequested()));  }
-    d->activeTool = tool;
-    connect(d->activeTool, SIGNAL(sigCursorChanged(QCursor)),
+    d->canvasData.activeTool = tool;
+    connect(d->canvasData.activeTool, SIGNAL(sigCursorChanged(QCursor)),
             this, SLOT(updateCursor(QCursor)));
-    connect(d->activeTool, SIGNAL(sigActivateTool(const QString &)),
+    connect(d->canvasData.activeTool, SIGNAL(sigActivateTool(const QString &)),
             this, SLOT(switchToolRequested(const QString &)));
-    connect(d->activeTool, SIGNAL(sigActivateTemporary(const QString &)),
+    connect(d->canvasData.activeTool, SIGNAL(sigActivateTemporary(const QString &)),
             this, SLOT(switchToolTemporaryRequested(const QString &)));
-    connect(d->activeTool, SIGNAL(sigDone()), this, SLOT(switchBackRequested()));
+    connect(d->canvasData.activeTool, SIGNAL(sigDone()), this, \
SLOT(switchBackRequested()));  
     // and set it.
-    foreach(KoCanvasController *controller, d->canvases) {
+    foreach(KoCanvasController *controller, d->canvasses.keys()) {
         if (!controller->canvas())
             continue;
         // we expect the tool to emit a cursor on activation.  This is for \
                quick-fail :)
         controller->canvas()->canvasWidget()->setCursor(Qt::ForbiddenCursor);
     }
-    foreach(QAction *action, d->activeTool->actions().values())
+    foreach(QAction *action, d->canvasData.activeTool->actions().values())
         action->setEnabled(true);
-    d->activeTool->activate();
+    d->canvasData.activeTool->activate();
 
-    if(d->activeCanvas->canvas()) {
-        KoToolProxy *tp = d->proxies.value(d->activeCanvas->canvas());
+    if(d->canvasData.canvas->canvas()) {
+        KoToolProxy *tp = d->proxies.value(d->canvasData.canvas->canvas());
         if(tp)
-            tp->setActiveTool(d->activeTool);
+            tp->setActiveTool(d->canvasData.activeTool);
     }
 
-    QWidget *toolWidget = d->activeTool->optionWidget();
+    QWidget *toolWidget = d->canvasData.activeTool->optionWidget();
     if(toolWidget == 0) { // no option widget.
         QString name;
         foreach( ToolHelper * tool, d->tools ) {
-            if ( tool->id() == d->activeTool->toolId() ) {
+            if ( tool->id() == d->canvasData.activeTool->toolId() ) {
                 name = tool->name();
                 break;
             }
@@ -273,15 +263,14 @@
         layout->addItem(new QSpacerItem(1, 1, QSizePolicy::Minimum, \
QSizePolicy::Expanding));  toolWidget->setLayout(layout);
     }
-    d->activeCanvas->setToolOptionWidget(toolWidget);
-    emit changedTool(d->uniqueToolIds.value(d->activeTool));
+    d->canvasData.canvas->setToolOptionWidget(toolWidget);
+    emit changedTool(d->uniqueToolIds.value(d->canvasData.activeTool));
 }
 
 void KoToolManager::attachCanvas(KoCanvasController *controller) {
-    //detachCanvas(controller); // so we don't end up with a lot of unused instances
     QHash<QString, KoTool*> toolsHash;
     foreach(ToolHelper *tool, d->tools) {
-        kDebug(30004) << "Creating tool " << tool->id() << ", " << \
tool->activationShapeId() << endl; +        kDebug(30006) << "Creating tool " << \
tool->id() << ", " << tool->activationShapeId() << endl;  KoTool *tl = \
tool->createTool(controller->canvas());  d->uniqueToolIds.insert(tl, \
tool->uniqueId());  toolsHash.insert(tool->id(), tl);
@@ -294,14 +283,17 @@
     QString id = KoShapeRegistry::instance()->keys()[0];
     createTool->setShapeId(id);
 
-    d->allTools.insert(controller, toolsHash);
+    CanvasData cd;
+    cd.allTools = toolsHash;
+    cd.canvas = controller;
+    d->canvasses.insert(controller, cd);
+    if(d->canvasData.canvas == controller)
+        d->canvasData = cd;
 
-    if (d->activeTool == 0) {
+    if (cd.activeTool == 0)
         toolActivated(d->defaultTool);
-    }
-    else {
+    else
         controller->canvas()->canvasWidget()->setCursor(Qt::ForbiddenCursor);
-    }
 
     Connector *connector = new Connector(controller->canvas()->shapeManager());
     connect(connector, SIGNAL(selectionChanged(QList<KoShape*>)), this,
@@ -310,12 +302,12 @@
 
 void KoToolManager::movedFocus(QWidget *from, QWidget *to) {
     Q_UNUSED(from);
-    if (to == 0 || to == d->activeCanvas)
+    if (to == 0 || to == d->canvasData.canvas)
         return;
 
     KoCanvasController *newCanvas = 0;
     // if the 'to' is one of our canvasses, or one of its children, then switch.
-    foreach(KoCanvasController* canvas, d->canvases) {
+    foreach(KoCanvasController* canvas, d->canvasses.keys()) {
         if (canvas == to || canvas->canvas()->canvasWidget() == to) {
             newCanvas = canvas;
             break;
@@ -324,37 +316,40 @@
 
     if (newCanvas == 0)
         return;
-    if (newCanvas == d->activeCanvas)
+    if (newCanvas == d->canvasData.canvas)
         return;
-    if (d->activeCanvas) {
-        d->activeCanvas->canvas()->canvasWidget()->setCursor(Qt::ForbiddenCursor);
-    }
-    d->activeCanvas = newCanvas;
+//   if (d->canvasData.canvas)
+//       d->canvasData.canvas->canvas()->canvasWidget()->setCursor(Qt::ForbiddenCursor);
  
-    switchTool(d->activeToolId, false);
-    selectionChanged(d->activeCanvas->canvas()->shapeManager()->selection()->selectedShapes());
 +    if(d->canvasData.canvas) // backup
+        d->canvasses[d->canvasData.canvas] = d->canvasData;
+    d->canvasData = d->canvasses.value(newCanvas);
+
+    //switchTool(d->canvasData.activeToolId, false);
+    //selectionChanged(d->canvasData.canvas->canvas()->shapeManager()->selection()->selectedShapes());
  }
 
 void KoToolManager::detachCanvas(KoCanvasController *controller) {
     if(controller == 0)
         return;
-    if (d->activeCanvas == controller)
-        d->activeCanvas = 0;
-    d->activeTool = 0;
-    QHash<QString, KoTool*> toolsHash = d->allTools.value(controller);
-    qDeleteAll(toolsHash);
-    d->allTools.remove(controller);
+    if (d->canvasData.canvas == controller) {
+        CanvasData cd;
+        d->canvasData = cd; // replace with a blank one
+    }
+    CanvasData cd = d->canvasses.value(controller);
+    qDeleteAll(cd.allTools);
+    d->canvasses.remove(controller);
 }
 
 void KoToolManager::updateCursor(QCursor cursor) {
-    Q_ASSERT(d->activeCanvas);
-    Q_ASSERT(d->activeCanvas->canvas());
-    d->activeCanvas->canvas()->canvasWidget()->setCursor(cursor);
+    Q_ASSERT(d->canvasData.canvas);
+    Q_ASSERT(d->canvasData.canvas->canvas());
+    d->canvasData.canvas->canvas()->canvasWidget()->setCursor(cursor);
 }
 
 void KoToolManager::switchToolRequested(const QString & id) {
-    while (!d->stack.isEmpty()) // switching means to flush the stack
-        d->stack.pop();
+    while (!d->canvasData.stack.isEmpty()) // switching means to flush the stack
+        d->canvasData.stack.pop();
     switchTool(id, false);
 }
 
@@ -363,21 +358,20 @@
 }
 
 void KoToolManager::switchBackRequested() {
-    if (d->stack.isEmpty()) {
+    if (d->canvasData.stack.isEmpty()) {
         // default to changing to the interactionTool
         switchTool(KoInteractionTool_ID, false);
         return;
     }
-    switchTool(d->stack.pop(), false);
+    switchTool(d->canvasData.stack.pop(), false);
 }
 
 KoCreateShapesTool * KoToolManager::shapeCreatorTool(KoCanvasBase *canvas) const
 {
-    foreach(KoCanvasController *controller, d->canvases) {
+    foreach(KoCanvasController *controller, d->canvasses.keys()) {
         if (controller->canvas() == canvas) {
-            QHash<QString, KoTool*> tools = d->allTools.value(controller);
-
-            KoCreateShapesTool *createTool = \
dynamic_cast<KoCreateShapesTool*>(tools.value(KoCreateShapesTool_ID)); +            \
KoCreateShapesTool *createTool = dynamic_cast<KoCreateShapesTool*> +                \
(d->canvasData.allTools.value(KoCreateShapesTool_ID));  Q_ASSERT(createTool /* ID \
changed? */);  return createTool;
         }
@@ -401,16 +395,14 @@
 
     // check if there is still a shape selected the active tool can work on
     // if not change the current tool to the default tool
-    if ( ! d->activationShapeId.isNull() && ! types.contains( d->activationShapeId ) \
                )
-    {
+    if ( ! d->canvasData.activationShapeId.isNull() && ! types.contains( \
d->canvasData.activationShapeId ) )  switchTool(KoInteractionTool_ID, false);
-    }
 
     emit toolCodesSelected(types);
 }
 
 KoCanvasController *KoToolManager::activeCanvasController() const {
-    return d->activeCanvas;
+    return d->canvasData.canvas;
 }
 
 KoToolProxy *KoToolManager::createToolProxy(KoCanvasBase *parentCanvas) {


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

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