瀏覽代碼

Add factory of ctkVTKConnection for custom connections

Julien Finet 14 年之前
父節點
當前提交
cabdf765af

+ 31 - 48
Libs/Visualization/VTK/Core/ctkVTKConnection.cpp

@@ -27,6 +27,7 @@
 
 // CTK includes
 #include "ctkVTKConnection.h"
+#include "ctkVTKConnection_p.h"
 
 // VTK includes
 #include <vtkObject.h>
@@ -42,49 +43,6 @@ QString convertPointerToString(void* pointer)
 }
 
 //-----------------------------------------------------------------------------
-class ctkVTKConnectionPrivate
-{
-  Q_DECLARE_PUBLIC(ctkVTKConnection);
-protected:
-  ctkVTKConnection* const q_ptr;
-public:
-  enum
-    {
-    ARG_UNKNOWN = 0,
-    ARG_VTKOBJECT_AND_VTKOBJECT,
-    ARG_VTKOBJECT_VOID_ULONG_VOID
-    };
-
-  typedef ctkVTKConnectionPrivate Self;
-  ctkVTKConnectionPrivate(ctkVTKConnection& object);
-  ~ctkVTKConnectionPrivate();
-
-  void connect();
-  void disconnect();
-
-  /// 
-  /// VTK Callback
-  static void DoCallback(vtkObject* vtk_obj, unsigned long event,
-                         void* client_data, void* call_data);
-
-  /// 
-  /// Called by 'DoCallback' to emit signal
-  void execute(vtkObject* vtk_obj, unsigned long vtk_event, void* client_data, void* call_data);
-
-  vtkSmartPointer<vtkCallbackCommand> Callback;
-  vtkObject*                          VTKObject;
-  const QObject*                      QtObject;
-  unsigned long                       VTKEvent;
-  QString                             QtSlot;
-  float                               Priority;
-  int                                 SlotType;
-  bool                                Connected;
-  bool                                Blocked;
-  QString                             Id;
-  bool                                ObserveDeletion;
-};
-
-//-----------------------------------------------------------------------------
 // ctkVTKConnectionPrivate methods
 
 //-----------------------------------------------------------------------------
@@ -126,11 +84,11 @@ void ctkVTKConnectionPrivate::connect()
     {
     case ctkVTKConnectionPrivate::ARG_VTKOBJECT_AND_VTKOBJECT:
       QObject::connect(q, SIGNAL(emitExecute(vtkObject*, vtkObject*)),
-        this->QtObject, this->QtSlot.toLatin1().data(), Qt::AutoConnection);
+        this->QtObject, this->QtSlot.toLatin1(), Qt::AutoConnection);
       break;
     case ctkVTKConnectionPrivate::ARG_VTKOBJECT_VOID_ULONG_VOID:
       QObject::connect(q, SIGNAL(emitExecute(vtkObject*, void*, unsigned long, void*)),
-                       this->QtObject, this->QtSlot.toLatin1().data(), Qt::AutoConnection);
+                       this->QtObject, this->QtSlot.toLatin1(), Qt::AutoConnection);
       break;
     default:
       Q_ASSERT(false);
@@ -142,7 +100,7 @@ void ctkVTKConnectionPrivate::connect()
     }
 
   // Make a connection between this and the vtk object
-  this->VTKObject->AddObserver(this->VTKEvent, this->Callback, this->Priority);
+  q->addObserver(this->VTKObject, this->VTKEvent, this->Callback, this->Priority);
 
   // If necessary, observe vtk DeleteEvent
   if(this->ObserveDeletion)
@@ -193,7 +151,8 @@ void ctkVTKConnectionPrivate::disconnect()
 
   if (this->VTKObject)
     {
-    this->VTKObject->RemoveObserver(this->Callback);
+    q->removeObserver(this->VTKObject, this->VTKEvent, this->Callback);
+    this->VTKObject->RemoveObservers(vtkCommand::DeleteEvent, this->Callback);
     }
 
   if (this->ObserveDeletion && this->QtObject)
@@ -222,7 +181,7 @@ ctkVTKConnection::~ctkVTKConnection()
   Q_D(ctkVTKConnection);
   if (d->ObserveDeletion)
     {
-    d->disconnect();
+    this->disconnect();
     }
 }
 
@@ -431,18 +390,28 @@ void ctkVTKConnectionPrivate::execute(vtkObject* vtk_obj, unsigned long vtk_even
     }
 }
 
+//-----------------------------------------------------------------------------
 void ctkVTKConnection::observeDeletion(bool enable)
 {
   Q_D(ctkVTKConnection);
   d->ObserveDeletion = enable;
 }
 
+//-----------------------------------------------------------------------------
 bool ctkVTKConnection::deletionObserved()const
 {
   Q_D(const ctkVTKConnection);
   return d->ObserveDeletion;
 }
 
+//-----------------------------------------------------------------------------
+void ctkVTKConnection::disconnect()
+{
+  Q_D(ctkVTKConnection);
+  d->disconnect();
+}
+
+//-----------------------------------------------------------------------------
 void ctkVTKConnection::vtkObjectDeleted()
 {
   Q_D(ctkVTKConnection);
@@ -451,6 +420,7 @@ void ctkVTKConnection::vtkObjectDeleted()
   emit isBroke();
 }
 
+//-----------------------------------------------------------------------------
 void ctkVTKConnection::qobjectDeleted()
 {
   Q_D(ctkVTKConnection);
@@ -458,3 +428,16 @@ void ctkVTKConnection::qobjectDeleted()
   d->disconnect();
   emit isBroke();
 }
+
+//-----------------------------------------------------------------------------
+void ctkVTKConnection::addObserver(vtkObject* caller, unsigned long vtk_event,
+  vtkCallbackCommand* callback, float priority)
+{
+  caller->AddObserver(vtk_event, callback, priority);
+}
+
+//-----------------------------------------------------------------------------
+void ctkVTKConnection::removeObserver(vtkObject* caller, unsigned long vtk_event, vtkCallbackCommand* callback)
+{
+  caller->RemoveObservers(vtk_event, callback);
+}

+ 5 - 0
Libs/Visualization/VTK/Core/ctkVTKConnection.h

@@ -32,6 +32,7 @@
 
 class vtkObject;
 class ctkVTKConnectionPrivate;
+class vtkCallbackCommand;
 
 /// Warning the slot must have its signature order:
 /// vtkObject*, vtkObject* : sender, callData
@@ -113,6 +114,10 @@ protected slots:
 protected:
   QScopedPointer<ctkVTKConnectionPrivate> d_ptr;
 
+  void disconnect();
+  virtual void addObserver(vtkObject* caller, unsigned long vtk_event, vtkCallbackCommand* callback, float priority=0.0f);
+  virtual void removeObserver(vtkObject* caller, unsigned long vtk_event, vtkCallbackCommand* callback);
+
 private:
   Q_DECLARE_PRIVATE(ctkVTKConnection);
   Q_DISABLE_COPY(ctkVTKConnection);

+ 79 - 0
Libs/Visualization/VTK/Core/ctkVTKConnection_p.h

@@ -0,0 +1,79 @@
+/*=========================================================================
+
+  Library:   CTK
+
+  Copyright (c) Kitware Inc.
+
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+      http://www.commontk.org/LICENSE
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+
+=========================================================================*/
+
+#ifndef __ctkVTKConnection_p_h
+#define __ctkVTKConnection_p_h
+
+// Qt includes
+#include <QString>
+class QObject;
+
+// CTK includes
+#include "ctkVTKConnection.h"
+
+// VTK includes
+#include <vtkSmartPointer.h>
+class vtkObject;
+class vtkCallbackCommand;
+
+//-----------------------------------------------------------------------------
+class ctkVTKConnectionPrivate
+{
+  Q_DECLARE_PUBLIC(ctkVTKConnection);
+protected:
+  ctkVTKConnection* const q_ptr;
+public:
+  enum
+    {
+    ARG_UNKNOWN = 0,
+    ARG_VTKOBJECT_AND_VTKOBJECT,
+    ARG_VTKOBJECT_VOID_ULONG_VOID
+    };
+
+  typedef ctkVTKConnectionPrivate Self;
+  ctkVTKConnectionPrivate(ctkVTKConnection& object);
+  ~ctkVTKConnectionPrivate();
+
+  void connect();
+  void disconnect();
+
+  /// 
+  /// VTK Callback
+  static void DoCallback(vtkObject* vtk_obj, unsigned long event,
+                         void* client_data, void* call_data);
+
+  /// 
+  /// Called by 'DoCallback' to emit signal
+  void execute(vtkObject* vtk_obj, unsigned long vtk_event, void* client_data, void* call_data);
+
+  vtkSmartPointer<vtkCallbackCommand> Callback;
+  vtkObject*                          VTKObject;
+  const QObject*                      QtObject;
+  unsigned long                       VTKEvent;
+  QString                             QtSlot;
+  float                               Priority;
+  int                                 SlotType;
+  bool                                Connected;
+  bool                                Blocked;
+  QString                             Id;
+  bool                                ObserveDeletion;
+};
+
+#endif

+ 13 - 1
Libs/Visualization/VTK/Core/ctkVTKObjectEventsObserver.cpp

@@ -34,6 +34,17 @@
 #include <vtkSmartPointer.h>
 
 //-----------------------------------------------------------------------------
+ctkVTKConnection* ctkVTKObjectEventsObserver::ctkVTKConnectionFactory::createConnection(
+  ctkVTKObjectEventsObserver* parent)const
+{
+  return new ctkVTKConnection(parent);
+}
+
+//-----------------------------------------------------------------------------
+ctkVTKObjectEventsObserver::ctkVTKConnectionFactory* ctkVTKObjectEventsObserver::connectionFactory
+  = new ctkVTKConnectionFactory;
+
+//-----------------------------------------------------------------------------
 class ctkVTKObjectEventsObserverPrivate
 {
   Q_DECLARE_PUBLIC(ctkVTKObjectEventsObserver);
@@ -267,7 +278,8 @@ QString ctkVTKObjectEventsObserver::addConnection(vtkObject* vtk_obj, unsigned l
     }
 
   // Instantiate a new connection, set its parameters and add it to the list
-  ctkVTKConnection * connection = new ctkVTKConnection(this);
+  ctkVTKConnection * connection =
+    ctkVTKObjectEventsObserver::connectionFactory->createConnection(this);//new ctkVTKConnection(this);
   connection->observeDeletion(d->ObserveDeletion);
   connection->setup(vtk_obj, vtk_event, qt_obj, qt_slot, priority);
 

+ 8 - 0
Libs/Visualization/VTK/Core/ctkVTKObjectEventsObserver.h

@@ -136,6 +136,14 @@ public:
   bool containsConnection(vtkObject* vtk_obj, unsigned long vtk_event = vtkCommand::NoEvent,
                           const QObject* qt_obj =0, const char* qt_slot =0)const;
 
+  //-----------------------------------------------------------------------------
+  class ctkVTKConnectionFactory
+  {
+  public:
+    virtual ctkVTKConnection* createConnection(ctkVTKObjectEventsObserver*)const;
+  };
+  static ctkVTKConnectionFactory* connectionFactory;
+
 protected:
   QScopedPointer<ctkVTKObjectEventsObserverPrivate> d_ptr;