X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src2%2FcreaImageIOGimmickView.h;h=f2baa23406faefbdd82a54255669c1c9b12f0c7a;hb=b44e1db0d66c00e0726e88dd49c5d8fbb775f558;hp=8407a9179cb22008dbcdd940e934862777b0f10d;hpb=633701590bade8ba6d0f8c7b37c033596b4b2c2a;p=creaImageIO.git diff --git a/src2/creaImageIOGimmickView.h b/src2/creaImageIOGimmickView.h index 8407a91..f2baa23 100644 --- a/src2/creaImageIOGimmickView.h +++ b/src2/creaImageIOGimmickView.h @@ -7,12 +7,21 @@ //#include #include +#include + +// Signal/slot mechanism for progress events +#include +#include #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& s, int dim) {} + virtual void GetSelectedImages(std::vector& s, int dim) + { GimmickError("INTERNAL ERROR : GetSelectedImages not implemented"); } + + virtual void GetSelectedFiles(std::vector& s) + { GimmickError("INTERNAL ERROR : GetSelectedFiles not implemented"); } + virtual void OnSelectionChange(std::vector& 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& 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& s,std::vector 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& 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 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 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 ImageEventQueueType; + ImageEventQueueType mImageEventQueue; + + ValidationSignalType mValidationSignal; }; // EO class GimmickView