]> Creatis software - creaImageIO.git/blobdiff - src2/creaImageIOGimmickView.h
Added boost signal to validate
[creaImageIO.git] / src2 / creaImageIOGimmickView.h
index 8407a9179cb22008dbcdd940e934862777b0f10d..f2baa23406faefbdd82a54255669c1c9b12f0c7a 100644 (file)
@@ -7,12 +7,21 @@
 
 //#include <map>
 #include <vtkImageData.h>
+#include <creaImageIOMultiThreadImageReader.h>
+
+// Signal/slot mechanism for progress events
+#include <boost/signal.hpp>
+#include <boost/bind.hpp>
 
 #define GIMMICK_NO_IMAGE_SELECTION 0
 #define GIMMICK_2D_IMAGE_SELECTION 2
 #define GIMMICK_3D_IMAGE_SELECTION 3
 #define GIMMICK_4D_IMAGE_SELECTION 4
 
+#define NATIVE 0
+#define _2D 2
+#define _3D 3
+
 
 namespace creaImageIO
 {
@@ -23,15 +32,13 @@ namespace creaImageIO
     
     //=====================================================================
     ///Abstract class that handles views, attributes and previews (GUI) for Gimmick.
-       class GimmickView
+       class GimmickView: public MultiThreadImageReaderUser
     {
     public:
       /// Ctor
-      GimmickView(Gimmick* );
+      GimmickView(Gimmick*, int number_of_threads = 0 );
       /// Virtual destructor
       virtual ~GimmickView();
-
-
       /// Initializes the view : 
       /// Creates the TreeViews for all the TreeHandler of the Controller
       /// 
@@ -49,12 +56,46 @@ namespace creaImageIO
 
       /// Finalize 
       virtual void Finalize();
+
+         //Returns the maximal priority
+         int GetMaximalPriority(){return mReader.GetMaximalPriority();}
+
          ///Returns the selected Images and validates to see if they comply with the given parameter(<4D)
          vtkImageData* GetSelectedImage(int dim);
       ///Adds the selected Images to the given vector and validates to see if they comply with the given parameter (4D)
-      virtual void GetSelectedImages(std::vector<vtkImageData*>& s, int dim) {}
+      virtual void GetSelectedImages(std::vector<vtkImageData*>& s, int dim) 
+         { GimmickError("INTERNAL ERROR : GetSelectedImages not implemented"); }
+
+         virtual void GetSelectedFiles(std::vector<std::string>& s)
+         { GimmickError("INTERNAL ERROR : GetSelectedFiles not implemented"); }
+         virtual void OnSelectionChange(std::vector<tree::Node*>& s)
+         { GimmickError("INTERNAL ERROR : OnSelectionChange not implemented"); }
+
+         ///Validates the dimension compliance of the images with the maximum and minimum given, and between their sizes
+         bool ValidateSelected (std::vector<tree::Node*>& sel, int min_dim, int max_dim);
+
+         ///Reads the vector of nodes, builds images in the dimension required and returns them in the supplied vector.
+         void ReadImagesNotThreaded(std::vector<vtkImageData*>& s,std::vector<tree::Node*> im, int dim);
+         ///Requests the reading of an image
+         void RequestReading(tree::Node* n, int prio){mReader.Request(this,n->GetAttribute("FullFileName"),prio);}
+         ///Adds an entry to the filename to node map
+         void AddEntryToMap(tree::Node* node){mImageFileNameToNode[node->GetAttribute("FullFileName")] = node;}
+         ///Returns true if the ImageEventQueue is empty
+         bool IsQueueEmpty(){return mImageEventQueue.empty();}
+         ///Clears the queue
+         void ClearQueue(){mImageEventQueue.clear();}
+         ///Returns the next in line EventType's image
+         vtkImageData* GetNextImageQueued(){return mImageEventQueue.front().image;}
+         ///Returns the next in line EventType's node
+         tree::Node* GetNextNodeQueued(){return mImageEventQueue.front().node;}
+         ///Unqueus the next in line EventType
+         void UnqueueNext(){mImageEventQueue.pop_front();}
+  
 
-      virtual void GetSelectedFiles(std::vector<std::string>& s) {}
+         ///Obtains the message of the state
+         std::string GetMessage(){return mMess;}
+         ///Obtains the message of the state
+         void SetMessage(std::string mess){mMess=mess;}
 
       /// Create the tree views 
       void CreateTreeViews();
@@ -66,12 +107,55 @@ namespace creaImageIO
       /// Updates the TreeView of given name from level l to bottom
       /// (calls the virtual method TreeView::UpdateLevel(l))
       virtual void UpdateTreeViewLevel(const std::string&, int l);
+         // Multi-thread image reader callback
+         void OnMultiThreadImageReaderEvent(const std::string& filename,
+                                      MultiThreadImageReaderUser::EventType t,
+                                      vtkImageData* image);
+
+         //=============================================
+      typedef boost::signal<void (bool)>  ValidationSignalType;
+      typedef ValidationSignalType::slot_function_type ValidationCallbackType;
+      //=============================================
+
+     //==================================================================
+      /// Adds the function f to the list of functions to call 
+      /// when the addition progresses.
+      /// f is of type ProgressCallbackType which is:
+      /// void (*ProgressCallbackType)(Progress&)
+      /// To pass a member function 'f' of an instance 'c' of a class 'C' 
+      /// as callback you have to 'bind' it, i.e. call:
+      /// ConnectValidationObserver ( boost::bind( &C::f , c, _1 ) );
+      void ConnectValidationObserver(ValidationCallbackType callback);
+     //==================================================================
 
     private:
       /// Controller which manages the interaction with the model
       Gimmick* mGimmick;
       /// The views 
       TreeViewMapType mTreeViewMap;
+         /// The message that results from the validation
+         std::string mMess;
+         /// Multi-thread image reader
+         MultiThreadImageReader mReader;
+         /// Map of images' names to nodes
+         std::map<std::string,tree::Node*> mImageFileNameToNode;
+         /// type of image event
+         /// If the image pointer is non null then the image is available (loaded)
+      /// else it has been unloaded
+      struct ImageEventType
+      {
+                 ImageEventType( tree::Node* no,  vtkImageData* im )
+         : node(no), image(im) {}
+        ImageEventType(vtkImageData* im )
+         : image(im) {}
+        tree::Node* node;
+        vtkImageData* image;
+      };
+      // queue of image event 
+      typedef std::deque<ImageEventType> ImageEventQueueType;
+      ImageEventQueueType mImageEventQueue;
+
+         ValidationSignalType mValidationSignal;
       
     };
     // EO class GimmickView