#include <creaImageIOGimmick.h>
#include <creaImageIOTreeView.h>
#include <creaImageIOSystem.h>
+#include <creaImageIOImagePointerHolder.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
/**
* \ingroup View
*/
+
+ class ImageExtent;
//=====================================================================
//=====================================================================
//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"); }
-
- ///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)
+ { GimmickError("INTERNAL ERROR : GetSelectedFiles not implemented"); }
+
+ virtual void GetImages(int dim, std::vector<std::string> files, std::vector<vtkImageData*>& s)
+ { GimmickError("INTERNAL ERROR : GetImages not implemented"); }
+
+ virtual void OnSelectionChange(const std::vector<tree::Node*>& s, bool isSelection, int selection, bool mProcess)
+ { GimmickError("INTERNAL ERROR : OnSelectionChange not implemented"); }
+
+ virtual void ClearSelection()
+ { GimmickError("INTERNAL ERROR : ClearSelection not implemented"); }
- ///Obtains the message of the state
- std::string GetMessage(){return mMess;}
- ///Obtains the message of the state
- void SetMessage(std::string mess){mMess=mess;}
+ ///Adds a file to ignore
+ virtual void AddIgnoreFile(tree::Node* toRemove)
+ { GimmickError("INTERNAL ERROR : AddIgnoreFile not implemented"); }
+
+
+ ///Validates the dimension compliance of the images with the maximum and minimum given, and between their sizes
+ bool ValidateSelected (tree::Node* sel, int min_dim, int max_dim);
+
+ ///Reads the vector of images, builds it in the dimension required and returns them in the supplied vector.
+ void ReadImagesNotThreaded(std::vector<vtkImageData*>& s,std::vector<std::string> files, int dim);
+ ///Requests the reading of an image with priority and index in the
+ /// current selection (-1 if not in selection)
+ void RequestReading(tree::Node* n, int prio, int selection_index , ImagePointerHolder *p);
+
+
+ ///Obtains the message of the state
+ std::string GetMessage(){return mMess;}
+ ///Obtains the message of the state
+ void SetMessage(std::string mess){mMess=mess;}
+ ///Resets the data of the extent and begins a new selection
+ void ResetExtent();
/// Create the tree views
void CreateTreeViews();
+ /// Create a tree view with a given name
+ void CreateSingleTreeView(std::string &i_name);
+
/// Create the tree view for TreeHandler provided
- virtual void CreateTreeView( TreeHandler*)
+ virtual void CreateTreeView( TreeHandler* )
{ GimmickError("INTERNAL ERROR : CreateTreeView not implemented"); }
/// Updates the TreeView of given name from level l to bottom
MultiThreadImageReaderUser::EventType t,
vtkImageData* image);
+ vtkImageData* GetDefaultImage() { return mReader.GetImage(""); }
+
+
+ //=============================================
+ 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);
+ //==================================================================
+
+ void modifyValidationSignal(bool ivalid);
+
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)
+ /// The message that results from the validation
+ std::string mMess;
+
+ /// Multi-thread image reader
+ MultiThreadImageReader mReader;
+ /// Internal type of image reading 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( tree::Node* no = 0,
+ int sel_index = -1,
+ ImagePointerHolder* ph= 0)
+ : node(no), index(sel_index), pointerHolder(ph){}
ImageEventType(vtkImageData* im )
: image(im) {}
tree::Node* node;
vtkImageData* image;
+ int index;
+ ImagePointerHolder* pointerHolder;
};
+ typedef std::map<std::string,ImageEventType> ImageEventTypeMap;
+ /// Map of images' names to ImageEventType
+ /// Used to associated a filename to a the data of a request
+ ImageEventTypeMap mImageEventMap;
// queue of image event
typedef std::deque<ImageEventType> ImageEventQueueType;
- ImageEventQueueType mImageEventQueue;
+ //ImageEventQueueType mImageEventQueue;
+
+ ///The current image extent
+ ImageExtent* mImageExtent;
+ ///The validation signal
+ ValidationSignalType mValidationSignal;
+ ///Boolean that determines if the selection is valid
+ bool valid;
+ ///Boolean that determines if the reader has been started
+ bool mReaderStarted;
- };
- // EO class GimmickView
+ };
+ // EO class GimmickView
//=====================================================================
} // EO namespace creaImageIO
// EOF
-#endif
+#endif