[kgraphviewer-devel] [KGraphViewer] c697702: Use some polymorphism for getting the canvas eleme

Kevin Funk krf at electrostorm.net
Fri Dec 10 18:21:48 CET 2010


commit c6977021cac9faa58ba41fc4cc0ca0e1eaf7de62
branch libkgraphviz
Author: Kevin Funk <krf at electrostorm.net>
Date:   Fri Dec 10 17:30:31 2010 +0100

    Use some polymorphism for getting the canvas element
    
    * There's no need to down-cast stuff around here as far as I can see.
    * Make CanvasElement base of CanvasEdge to be consistent with CanvasNode

diff --git a/src/kgraphviz/canvasedge.cpp b/src/kgraphviz/canvasedge.cpp
index cb67644..c6aaf8e 100644
--- a/src/kgraphviz/canvasedge.cpp
+++ b/src/kgraphviz/canvasedge.cpp
@@ -29,7 +29,6 @@
 #include "canvaselement.h"
 #include "dotgraphview.h"
 #include "graphedge.h"
-#include "graphnode.h"
 #include "support/dotdefaults.h"
 #include "support/dot2qtconsts.h"
 #include "support/FontsCache.h"
@@ -52,12 +51,14 @@
 namespace KGraphViewer
 {
 
-CanvasEdge::CanvasEdge(DotGraphView* view, GraphEdge* e,
+CanvasEdge::CanvasEdge(DotGraphView* view,
+                       GraphEdge* e,
+                       QGraphicsScene* scene,
                        qreal scaleX, qreal scaleY,
                        qreal xMargin, qreal yMargin, qreal gh,
                        qreal wdhcf, qreal hdvcf,
-                       QGraphicsItem* parent)
-                       : QAbstractGraphicsShapeItem(parent),
+                       QGraphicsItem* parent) :
+    CanvasElement(view, e, scene, parent),
     m_scaleX(scaleX), m_scaleY(scaleY),
     m_xMargin(xMargin), m_yMargin(yMargin),
     m_gh(/*gh*/0), m_wdhcf(wdhcf), m_hdvcf(hdvcf), m_edge(e),
diff --git a/src/kgraphviz/canvasedge.h b/src/kgraphviz/canvasedge.h
index 4efe8e3..f2e4b70 100644
--- a/src/kgraphviz/canvasedge.h
+++ b/src/kgraphviz/canvasedge.h
@@ -28,16 +28,12 @@
 #ifndef CANVAS_EDGE_H
 #define CANVAS_EDGE_H
 
-#include <QGraphicsScene>
-#include <QGraphicsPathItem>
-#include <QAbstractGraphicsShapeItem>
-#include <QWidget>
-#include <QMap>
-#include <QFont>
+#include "canvaselement.h"
 
 #include "graphexporter.h"
 
-
+class QGraphicsScene;
+class QFont;
 class QMenu;
 
 /*
@@ -56,14 +52,18 @@ class GraphEdge;
 class DotGraphView;
 
 
-class CanvasEdge : public QObject, public QAbstractGraphicsShapeItem
+class CanvasEdge : public CanvasElement
 {
-Q_OBJECT
+  Q_OBJECT
+
 public:
-  explicit CanvasEdge(DotGraphView* v, GraphEdge*,
+  explicit CanvasEdge(DotGraphView* v,
+                      GraphEdge*,
+                      QGraphicsScene* scene,
              qreal scaleX, qreal scaleY,
              qreal xMargin, qreal yMargin, qreal gh,
-             qreal wdhcf, qreal hdvcf, QGraphicsItem* parent = 0);
+             qreal wdhcf, qreal hdvcf,
+             QGraphicsItem* parent = 0);
 
   virtual ~CanvasEdge();
   
diff --git a/src/kgraphviz/canvaselement.h b/src/kgraphviz/canvaselement.h
index d37a208..b0205f2 100644
--- a/src/kgraphviz/canvaselement.h
+++ b/src/kgraphviz/canvaselement.h
@@ -38,7 +38,8 @@ class DotGraphView;
 
 class CanvasElement: public QObject, public QAbstractGraphicsShapeItem
 {
-Q_OBJECT
+  Q_OBJECT
+
 public:
   CanvasElement(
       DotGraphView* v, 
diff --git a/src/kgraphviz/dotgraph.cpp b/src/kgraphviz/dotgraph.cpp
index 59696e0..8e2ef82 100644
--- a/src/kgraphviz/dotgraph.cpp
+++ b/src/kgraphviz/dotgraph.cpp
@@ -492,9 +492,9 @@ void DotGraph::updateWithGraph(graph_t* newGraph)
         kDebug() << "edge known" << nge->id;
 //         edges()[nge->name]->setZ(nge->z());
         edges()[edgeName]->updateWithEdge(nge);
-        if (edges()[edgeName]->canvasEdge()!=0)
+        if (edges()[edgeName]->canvasElement()!=0)
         {
-          //         edges()[nge->id()]->canvasEdge()->setGh(m_height);
+          //         edges()[nge->id()]->canvasElement()->setGh(m_height);
         }
       }
       else
@@ -591,9 +591,9 @@ void DotGraph::updateWithGraph(const DotGraph& newGraph)
       kDebug() << "edge known" << nge->id();
       edges()[nge->id()]->setZ(nge->z());
       edges()[nge->id()]->updateWithEdge(*nge);
-      if (edges()[nge->id()]->canvasEdge()!=0)
+      if (edges()[nge->id()]->canvasElement()!=0)
       {
-//         edges()[nge->id()]->canvasEdge()->setGh(m_height);
+//         edges()[nge->id()]->canvasElement()->setGh(m_height);
       }
     }
     else
@@ -631,10 +631,10 @@ void DotGraph::removeNodeNamed(const QString& nodeName)
         || it.value()->toNode() == node )
     {
       GraphEdge* edge = it.value();
-      if (edge->canvasEdge() != 0)
+      if (edge->canvasElement() != 0)
       {
-        edge->canvasEdge()->hide();
-        delete edge->canvasEdge();
+        edge->canvasElement()->hide();
+        delete edge->canvasElement();
         delete edge;
       }
       it = edges().erase(it);
@@ -645,11 +645,11 @@ void DotGraph::removeNodeNamed(const QString& nodeName)
     }
   }
 
-  if (node->canvasNode() != 0)
+  if (node->canvasElement() != 0)
   {
-    node->canvasNode()->hide();
-    delete node->canvasNode();
-    node->setCanvasNode(0);
+    node->canvasElement()->hide();
+    delete node->canvasElement();
+    node->setCanvasElement(0);
   }
   nodes().remove(nodeName);
   delete node;
@@ -700,10 +700,10 @@ void DotGraph::removeSubgraphNamed(const QString& subgraphName)
         || it.value()->toNode() == subgraph )
     {
       GraphEdge* edge = it.value();
-      if (edge->canvasEdge() != 0)
+      if (edge->canvasElement() != 0)
       {
-        edge->canvasEdge()->hide();
-        delete edge->canvasEdge();
+        edge->canvasElement()->hide();
+        delete edge->canvasElement();
         delete edge;
       }
       it = edges().erase(it);
@@ -750,10 +750,10 @@ void DotGraph::removeEdge(const QString& id)
     GraphEdge* edge = it.value();
     if (edge->id() ==id)
     {
-      if (edge->canvasEdge() != 0)
+      if (edge->canvasElement() != 0)
       {
-        edge->canvasEdge()->hide();
-        delete edge->canvasEdge();
+        edge->canvasElement()->hide();
+        delete edge->canvasElement();
         delete edge;
       }
       edges().remove(id);
diff --git a/src/kgraphviz/dotgraphview.cpp b/src/kgraphviz/dotgraphview.cpp
index 1c00951..5d73c8d 100644
--- a/src/kgraphviz/dotgraphview.cpp
+++ b/src/kgraphviz/dotgraphview.cpp
@@ -382,7 +382,7 @@ int DotGraphViewPrivate::displaySubgraph(GraphSubgraph* gsubgraph, int zValue, C
   foreach (GraphElement* element, gsubgraph->content())
   {
     GraphNode* gnode = dynamic_cast<GraphNode*>(element);
-    if (gnode->canvasNode()==0)
+    if (gnode->canvasElement()==0)
     {
       kDebug() << "Creating canvas node for:" << gnode->id();
       CanvasNode *cnode = new CanvasNode(q, gnode, m_canvas);
@@ -390,13 +390,13 @@ int DotGraphViewPrivate::displaySubgraph(GraphSubgraph* gsubgraph, int zValue, C
       cnode->initialize(
         scaleX, scaleY, m_xMargin, m_yMargin, gh,
         m_graph->wdhcf(), m_graph->hdvcf());
-      gnode->setCanvasNode(cnode);
+      gnode->setCanvasElement(cnode);
       m_canvas->addItem(cnode);
       //       cnode->setZValue(gnode->z());
       cnode->setZValue(zValue+1);
       cnode->show();
     }
-    gnode->canvasNode()->computeBoundingRect();
+    gnode->canvasElement()->computeBoundingRect();
   }
   gsubgraph->canvasSubgraph()->computeBoundingRect();
   
@@ -843,7 +843,8 @@ bool DotGraphView::loadDot(const QString& dotFileName)
 
 bool DotGraphView::loadLibrary(const QString& dotFileName)
 {
-  kDebug() << "'" << dotFileName << "'";
+  kDebug() << "Load file:" << dotFileName;
+  
   Q_D(DotGraphView);
   if (d->m_canvas)
     d->m_canvas->clear();
@@ -960,8 +961,8 @@ bool DotGraphView::displayGraph()
     GraphNode* gnode = it.value();
     kDebug() << "Handling" << id << (void*)gnode;
     kDebug() << "  gnode id=" << gnode->id();
-    kDebug()<<  "  canvasNode=" << (void*)gnode->canvasNode();
-    if (gnode->canvasNode()==0)
+    kDebug()<<  "  canvasElement=" << (void*)gnode->canvasElement();
+    if (gnode->canvasElement()==0)
     {
       kDebug() << "Creating canvas node for" << gnode->id();
       CanvasNode *cnode = new CanvasNode(this, gnode, d->m_canvas);
@@ -969,20 +970,20 @@ bool DotGraphView::displayGraph()
       cnode->initialize(
         scaleX, scaleY, d->m_xMargin, d->m_yMargin, gh,
         d->m_graph->wdhcf(), d->m_graph->hdvcf());
-      gnode->setCanvasNode(cnode);
+      gnode->setCanvasElement(cnode);
       d->m_canvas->addItem(cnode);
 //       cnode->setZValue(gnode->z());
       cnode->setZValue(zvalue+1);
       cnode->show();
     }
-    gnode->canvasNode()->computeBoundingRect();
+    gnode->canvasElement()->computeBoundingRect();
   }
 
   kDebug() << "Creating" << d->m_graph->edges().size() << "edges from" << d->m_graph;
   foreach (GraphEdge* gedge, d->m_graph->edges())
   {
     kDebug() << "One GraphEdge:" << gedge->id();
-    if (gedge->canvasEdge() == 0
+    if (gedge->canvasElement() == 0
       && gedge->fromNode() != 0
       && gedge->toNode() != 0)
     {
@@ -991,18 +992,18 @@ bool DotGraphView::displayGraph()
       kDebug() << "              "<< gedge->fromNode()->id();
       kDebug() << "edge toNode=" << (void*)gedge->toNode();
       kDebug() << "              "<< gedge->toNode()->id();
-      CanvasEdge* cedge = new CanvasEdge(this, gedge, scaleX, scaleY, d->m_xMargin,
+      CanvasEdge* cedge = new CanvasEdge(this, gedge, d->m_canvas, scaleX, scaleY, d->m_xMargin,
           d->m_yMargin, gh, d->m_graph->wdhcf(), d->m_graph->hdvcf());
 
-      gedge->setCanvasEdge(cedge);
+      gedge->setCanvasElement(cedge);
   //     std::cerr << "setting z = " << gedge->z() << std::endl;
   //    cedge->setZValue(gedge->z());
       cedge->setZValue(zvalue+2);
       cedge->show();
       d->m_canvas->addItem(cedge);
     }
-    if (gedge->canvasEdge() != 0)
-      gedge->canvasEdge()->computeBoundingRect();
+    if (gedge->canvasElement() != 0)
+      gedge->canvasElement()->computeBoundingRect();
   }
   kDebug() << "Adding graph render operations: " << d->m_graph->renderOperations().size();
   foreach (const DotRenderOp& dro, d->m_graph->renderOperations())
@@ -1274,7 +1275,7 @@ void DotGraphView::mousePressEvent(QMouseEvent* e)
     newCNode->initialize(
       scaleX, scaleY, d->m_xMargin, d->m_yMargin, gh,
       d->m_graph->wdhcf(), d->m_graph->hdvcf());
-    newNode->setCanvasNode(newCNode);
+    newNode->setCanvasElement(newCNode);
     scene()->addItem(newCNode);
     kDebug() << "setting pos to " << pos;
     newCNode->setPos(pos);
@@ -1313,7 +1314,7 @@ void DotGraphView::mousePressEvent(QMouseEvent* e)
       {
         if (e->isSelected()) {
           e->setSelected(false);
-          e->canvasEdge()->update();
+          e->canvasElement()->update();
         }
       }
       foreach(GraphNode* n, d->m_graph->nodes())
@@ -1881,7 +1882,7 @@ void DotGraphView::finishNewEdgeTo(CanvasElement* node)
 //   CanvasEdge* cedge = new CanvasEdge(this, gedge, scaleX, scaleY, d->m_xMargin,
 //         d->m_yMargin, gh, d->m_graph->wdhcf(), d->m_graph->hdvcf());
 // 
-//   gedge->setCanvasEdge(cedge);
+//   gedge->setCanvasElement(cedge);
 // //     std::cerr << "setting z = " << gedge->z() << std::endl;
 //   cedge->setZValue(gedge->z());
 //   cedge->show();
@@ -1922,16 +1923,16 @@ void DotGraphView::slotEdgeSelected(CanvasEdge* edge, Qt::KeyboardModifiers modi
   {
     foreach(GraphEdge* e, d->m_graph->edges())
     {
-      if (e->canvasEdge() != edge)
+      if (e->canvasElement() != edge)
       {
         e->setSelected(false);
-        e->canvasEdge()->update();
+        e->canvasElement()->update();
       }
     }
     foreach(GraphNode* n, d->m_graph->nodes())
     {
       n->setSelected(false);
-      n->canvasNode()->update();
+      n->canvasElement()->update();
     }
     foreach(GraphSubgraph* s, d->m_graph->subgraphs())
     {
@@ -1942,7 +1943,7 @@ void DotGraphView::slotEdgeSelected(CanvasEdge* edge, Qt::KeyboardModifiers modi
   {
     foreach(GraphEdge* e, d->m_graph->edges())
     {
-      if (e->canvasEdge() != edge)
+      if (e->canvasElement() != edge)
       {
         if (e->isSelected())
         {
@@ -1980,7 +1981,7 @@ void DotGraphView::slotElementSelected(CanvasElement* element, Qt::KeyboardModif
     {
       if (e->isSelected()) {
         e->setSelected(false);
-        e->canvasEdge()->update();
+        e->canvasElement()->update();
       }
     }
     foreach(GraphNode* e, d->m_graph->nodes())
@@ -2172,10 +2173,10 @@ void DotGraphView::slotSelectNode(const QString& nodeName)
   GraphNode* node = dynamic_cast<GraphNode*>(graph()->elementNamed(nodeName));
   if (node == 0) return;
   node->setSelected(true);
-  if (node->canvasNode()!=0)
+  if (node->canvasElement()!=0)
   {
-    node->canvasNode()->modelChanged();
-    slotElementSelected(node->canvasNode(),Qt::NoModifier);
+    node->canvasElement()->modelChanged();
+    slotElementSelected(node->canvasElement(),Qt::NoModifier);
   }
 }
 
@@ -2183,9 +2184,9 @@ void DotGraphView::centerOnNode(const QString& nodeId)
 {
   GraphNode* node = dynamic_cast<GraphNode*>(graph()->elementNamed(nodeId));
   if (node == 0) return;
-  if (node->canvasNode()!=0)
+  if (node->canvasElement()!=0)
   {
-    centerOn(node->canvasNode());
+    centerOn(node->canvasElement());
   }
 }
 
diff --git a/src/kgraphviz/graphedge.cpp b/src/kgraphviz/graphedge.cpp
index de12caa..18e3862 100644
--- a/src/kgraphviz/graphedge.cpp
+++ b/src/kgraphviz/graphedge.cpp
@@ -101,10 +101,10 @@ void GraphEdge::updateWithEdge(const GraphEdge& edge)
   m_colors = edge.colors();
   m_dir = edge.dir();
   GraphElement::updateWithElement(edge);
-  if (canvasEdge())
+  if (canvasElement())
   {
-    canvasEdge()->computeBoundingRect();
-    canvasEdge()->modelChanged();
+    canvasElement()->computeBoundingRect();
+    canvasElement()->modelChanged();
   }
 }
 
diff --git a/src/kgraphviz/graphedge.h b/src/kgraphviz/graphedge.h
index d439adc..67d27f1 100644
--- a/src/kgraphviz/graphedge.h
+++ b/src/kgraphviz/graphedge.h
@@ -55,14 +55,10 @@ class KGRAPHVIZ_EXPORT GraphEdge : public GraphElement
 
 public:
   GraphEdge();
-  virtual ~GraphEdge();
-
   GraphEdge(const GraphEdge& edge);
   GraphEdge(Agedge_t* edge);
-  
-  CanvasEdge* canvasEdge() { return (CanvasEdge*)canvasElement(); }
-  const CanvasEdge* canvasEdge() const { return (CanvasEdge*)canvasElement(); }
-  void setCanvasEdge(CanvasEdge* ce) { setCanvasElement((CanvasElement*)ce); }
+
+  virtual ~GraphEdge();
 
   bool isVisible() { return m_visible; }
   void setVisible(bool v) { m_visible = v; }
diff --git a/src/kgraphviz/graphnode.cpp b/src/kgraphviz/graphnode.cpp
index 3bc844a..883474d 100644
--- a/src/kgraphviz/graphnode.cpp
+++ b/src/kgraphviz/graphnode.cpp
@@ -70,10 +70,10 @@ void GraphNode::updateWithNode(const GraphNode& node)
 {
   kDebug() << id() << node.id();
   GraphElement::updateWithElement(node);
-  if (canvasNode())
+  if (canvasElement())
   {
-    canvasNode()->computeBoundingRect();
-    canvasNode()->modelChanged();
+    canvasElement()->computeBoundingRect();
+    canvasElement()->modelChanged();
   }
 //   kDebug() << "done";
 }
@@ -106,16 +106,6 @@ void GraphNode::updateWithNode(node_t* node)
   }
 }
 
-CanvasNode* GraphNode::canvasNode()
-{
-    return dynamic_cast<CanvasNode*>(canvasElement());
-}
-
-const KGraphViewer::CanvasNode* GraphNode::canvasNode() const
-{
-    return dynamic_cast<const CanvasNode*>(canvasElement());
-}
-
 QTextStream& operator<<(QTextStream& s, const GraphNode& n)
 {
   s << n.id() << "  ["
diff --git a/src/kgraphviz/graphnode.h b/src/kgraphviz/graphnode.h
index 532d55a..2758c78 100644
--- a/src/kgraphviz/graphnode.h
+++ b/src/kgraphviz/graphnode.h
@@ -62,16 +62,9 @@ public:
   GraphNode(Agnode_t* gn);
   
   virtual ~GraphNode() {}  
-  
-  CanvasNode* canvasNode();
-  const CanvasNode* canvasNode() const;
-  inline void setCanvasNode(CanvasNode* cn) { setCanvasElement((CanvasElement*)cn); }
 
   virtual void updateWithNode(const GraphNode& node);
   virtual void updateWithNode(Agnode_t* node);
-
-  
-private:
 };
 
 /** A map associating the ids of a graph's nodes to these nodes */


More information about the kgraphviewer-devel mailing list