#ifndef __creaImageIOTreeHandlerImageAdder_h_INCLUDED__ #define __creaImageIOTreeHandlerImageAdder_h_INCLUDED__ #include #include #include #include // Signal/slot mechanism for progress events #include #include namespace creaImageIO { /** * \ingroup Model */ //======================================================================= /// Object which can add images files to a TreeHandler. Is able to parse (recursively) a part of a filesystem to look for known images and load their attributes in order to add the images to a Tree (submission via a TreeHandler::AddBranch) class TreeHandlerImageAdder { public: //==================================================================== /// Ctor TreeHandlerImageAdder(TreeHandler* tree); /// Dtor ~TreeHandlerImageAdder(); /// Sets the TreeHandler void SetTreeHandler(TreeHandler* tree) { mTreeHandler = tree;} //==================================================================== //==================================================================== /// Structure which holds progress information /// To stop the image adder use SetStop() class Progress { public: Progress() { Reset(); } ~Progress() {} void Reset() { mStop = false; mNumberScannedFiles = 0; mNumberScannedDirs = 0; mNumberHandledFiles = 0; mNumberAddedFiles = 0; } int GetNumberScannedFiles() const { return mNumberScannedFiles; } int GetNumberScannedDirs() const { return mNumberScannedDirs; } int GetNumberHandledFiles() const { return mNumberHandledFiles; } int GetNumberAddedFiles() const { return mNumberAddedFiles; } void IncNumberScannedFiles() { mNumberScannedFiles++; } void IncNumberScannedDirs() { mNumberScannedDirs++; } void IncNumberHandledFiles() { mNumberHandledFiles++; } void IncNumberAddedFiles() { mNumberAddedFiles++; } void SetStop() { mStop = true; } bool GetStop() const { return mStop; } private: bool mStop; int mNumberScannedFiles; int mNumberScannedDirs; int mNumberHandledFiles; int mNumberAddedFiles; }; //============================================= //============================================= const Progress& GetProgress() const { return mProgress; } //============================================= //============================================= typedef boost::signal ProgressSignalType; typedef ProgressSignalType::slot_function_type ProgressCallbackType; //============================================= //================================================================== /// 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: /// ConnectProgressObserver ( boost::bind( &C::f , c, _1 ) ); void ConnectProgressObserver(ProgressCallbackType callback); //================================================================== //==================================================================== /// Returns if the file can be read or not bool IsHandledFile( const std::string& filename); /// Adds a list of files to the TreeHandler void AddFiles( const std::vector& filename ); /// (Recursively) adds the files of a directory to the TreeHandler void AddDirectory( const std::string& directory, bool recurse ); //==================================================================== private: /// Adds a single file to the TreeHandler /// **WITHOUT** testing wether it is handled or not /// hence you have to call IsHandledFile before using AddFile! void AddFile( const std::string& filename ); /// Recursive method which does the main job for AddDirectory void AddDirectoryRecursor( const std::string& directory, bool recurse ); ///Sets the number of children for the tree void SetNumberOfChildren(); ///Sets the number of children recursively for the given node void SetNumberOfChildrenRecursor(tree::Node* node); TreeHandler* mTreeHandler; ImageReader mReader; Progress mProgress; ProgressSignalType mProgressSignal; }; // EO class TreeHandlerImageAdder //======================================================================= } // EO namespace creaImageIO #include inline std::ostream& operator << ( std::ostream& o, const creaImageIO::TreeHandlerImageAdder::Progress& p) { o << p.GetNumberScannedFiles() << " files - " << p.GetNumberScannedDirs() << " dirs - " << p.GetNumberHandledFiles() << " handled -" << p.GetNumberAddedFiles() << " added"; return o; } // EOF #endif