+#ifndef __creaImageIOGimmickView_h_INCLUDED__
+#define __creaImageIOGimmickView_h_INCLUDED__
+
+#include <creaImageIOGimmick.h>
+#include <creaImageIOTreeView.h>
+#include <creaImageIOSystem.h>
+
+//#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
{
/**
//=====================================================================
///Abstract class that handles views, attributes and previews (GUI) for Gimmick.
- class GimmickView
+ class GimmickView: public MultiThreadImageReaderUser
{
public:
/// Ctor
- GimmickView();
+ GimmickView(Gimmick*, int number_of_threads = 0 );
/// Virtual destructor
virtual ~GimmickView();
+ /// Initializes the view :
+ /// Creates the TreeViews for all the TreeHandler of the Controller
+ ///
+ virtual void Initialize();
+
+ /// Type of map from View name to TreeView*
+ /// (This map is equivalent for Views of the TreeHandlerMap of Gimmick)
+ typedef std::map<std::string, TreeView*> TreeViewMapType;
+
+ /// Returns the TreeViewMap (ref)
+ TreeViewMapType& GetTreeViewMap() { return mTreeViewMap; }
+ /// Returns the TreeViewMap (const ref)
+ const TreeViewMapType& GetTreeViewMap() const
+ { return mTreeViewMap; }
+
+ /// 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)
+ { 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();}
+
+
+ ///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();
+
+ /// Create the tree view for TreeHandler provided
+ virtual void CreateTreeView( TreeHandler*)
+ { GimmickError("INTERNAL ERROR : CreateTreeView not implemented"); }
+
+ /// 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
+ //=====================================================================
+
+
+ /*
+
+
+
+
+
+
+
//====================================================================
// General
MultiThreadImageReader mReader;
// map of images name to node
std::map<std::string,DicomNode*> mImageFileNameToNode;
-
- //Controller which manages the interaction with the model
- Gimmick* controller;
-
- };
- // EO class GimmickView
- //=====================================================================
-
+ */
+
} // EO namespace creaImageIO
// EOF
-#endif
\ No newline at end of file
+#endif