]> Creatis software - creaImageIO.git/commitdiff
Changed reading and viewing method by adding ImagePointerHolders
authorcaballero <caballero>
Mon, 23 Mar 2009 10:10:02 +0000 (10:10 +0000)
committercaballero <caballero>
Mon, 23 Mar 2009 10:10:02 +0000 (10:10 +0000)
src2/CMakeLists.txt
src2/creaImageIOGimmickView.cpp
src2/creaImageIOGimmickView.h
src2/creaImageIOWxGimmickView.cpp
src2/creaImageIOWxGimmickView.h
src2/creaImageIOWxTreeView.cpp
src2/creaImageIOWxTreeView.h
src2/creaImageIOWxViewer.cpp
src2/creaImageIOWxViewer.h

index cac05e519f880b8209d4625ddd49f9d1f030184a..b3c1c0a9dd989fcc458e1c16d78926d6a4e23de7 100644 (file)
@@ -50,6 +50,7 @@ SET( SRCS
 
   #  Viewer
   creaImageIOWxViewer
+creaImageIOImagePointerHolder.h
 
 
 )
index 3ce0f5c398da4a2af06f89b6a0e59e90083b6341..0afd753353e7352663831cab8ad349ea8868950a 100644 (file)
@@ -7,6 +7,7 @@ namespace fs = boost::filesystem;
 
 namespace creaImageIO
 {
+
   //======================================================================
   // CTor
   GimmickView::GimmickView(Gimmick* gimmick, int threads)
@@ -281,10 +282,10 @@ namespace creaImageIO
   //======================================================================
   ///Requests the reading of an image
   void GimmickView::RequestReading(tree::Node* n, 
-                                  int prio, int selection_index)
+                                  int prio, int selection_index, ImagePointerHolder *p)
   {
-         mReader.Start();
-    ImageEventType t(n,0,selection_index);
+       mReader.Start();
+    ImageEventType t(n,selection_index, p);
     mImageEventMap[n->GetAttribute("FullFileName")] = t;    
     mReader.Request(this,n->GetAttribute("FullFileName"),prio);
   }
@@ -302,23 +303,23 @@ namespace creaImageIO
        {
     if (filename.size()==0)
       {
-       GimmickDebugMessage(5,
-                           "Pushing unknown image in queue"
-                           <<std::endl);
-       mImageEventQueue.push_back(ImageEventType(image));
-       return;
+               GimmickDebugMessage(5,
+                                       "Pushing unknown image in queue"
+                                       <<std::endl);
+               mImageEventQueue.push_back(ImageEventType(image));
+               return;
       }
     ImageEventTypeMap::iterator i;
     i = mImageEventMap.find(filename);
     if (i!=mImageEventMap.end())
       {
-       GimmickDebugMessage(5,
-                           "Pushing image of file '"<<filename<<"' in queue"
-                           <<std::endl);
-       ImageEventType e(i->second);
-       e.image = image;
-       mImageEventQueue.push_back(e);
-       mImageEventMap.erase(i);
+               GimmickDebugMessage(5,
+                                       "Putting image of file '"<<filename<<"' on pointer"
+                                       <<std::endl);
+               ImageEventType ie(i->second);
+               ie.image = image;
+               ie.pointerHolder->Set(ie.image);
+               //mImageEventMap.erase(i);
       }
        }
        else if (e==Error)
@@ -327,6 +328,15 @@ namespace creaImageIO
                mess+=filename;
                mess+="\n";
                GimmickMessage(1,mess);
+               ImageEventTypeMap::iterator i;
+               i = mImageEventMap.find(filename);
+               if (i!=mImageEventMap.end())
+               {
+               ImageEventType ie(i->second);
+               ie.image = image;
+               ie.pointerHolder->Set(GetDefaultImage());
+               //mImageEventMap.erase(i);
+               }
        }
 
        else if (e==ImageUnloaded)
@@ -335,6 +345,16 @@ namespace creaImageIO
                mess+=filename;
                mess+="\n";
                GimmickMessage(1,mess);
+                               ImageEventTypeMap::iterator i;
+               i = mImageEventMap.find(filename);
+               if (i!=mImageEventMap.end())
+               {
+               ImageEventType ie(i->second);
+               ie.image = image;
+               ie.pointerHolder->Set(GetDefaultImage());
+               //mImageEventMap.erase(i);
+               }
+
        }
   }
 
index 7e7a2471d8b2e8e3a0fdcf576d94472955d64bd4..86948c503100f9d4bec7769ffefb59954cadf35d 100644 (file)
@@ -4,6 +4,7 @@
 #include <creaImageIOGimmick.h>
 #include <creaImageIOTreeView.h>
 #include <creaImageIOSystem.h>
+#include <creaImageIOImagePointerHolder.h>
 
 //#include <map>
 #include <vtkImageData.h>
@@ -28,6 +29,8 @@ namespace creaImageIO
        /**
        * \ingroup View
        */
+        
+
     //=====================================================================
     
     //=====================================================================
@@ -35,6 +38,7 @@ namespace creaImageIO
        class GimmickView: public MultiThreadImageReaderUser
     {
     public:
+       
       /// Ctor
       GimmickView(Gimmick*, int number_of_threads = 0 );
       /// Virtual destructor
@@ -79,7 +83,7 @@ namespace creaImageIO
       void ReadImagesNotThreaded(std::vector<vtkImageData*>& s,std::vector<tree::Node*> im, 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);
+      void RequestReading(tree::Node* n, int prio, int selection_index , ImagePointerHolder *p);
 
       ///Returns true if the ImageEventQueue is empty
       bool IsQueueEmpty(){return mImageEventQueue.empty();}
@@ -150,15 +154,16 @@ namespace creaImageIO
       /// else it has been unloaded
       struct ImageEventType
       {
-       ImageEventType( tree::Node* no = 0,  
-                       vtkImageData* im = 0, 
-                       int sel_index = -1)
-         : node(no), image(im), index(sel_index) {}
+       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;
+               int index;
+               ImagePointerHolder* pointerHolder;
       };
       typedef std::map<std::string,ImageEventType> ImageEventTypeMap;
       /// Map of images' names to ImageEventType
@@ -322,4 +327,4 @@ namespace creaImageIO
 } // EO namespace creaImageIO
 
 // EOF
-#endif  
+#endif
index 53aa4a8c8969af1668c305ae175c9819628ba5b8..cd23af7625236228405a889ff5be677d6f27d310 100644 (file)
@@ -15,6 +15,7 @@ using namespace crea;
 
 namespace creaImageIO
 {
+   
   //======================================================================
   // The ids of the different tools
   enum
@@ -115,9 +116,10 @@ namespace creaImageIO
     
     // Previewer
     mViewer = new WxViewer(mBottomPanel, wxID_ANY, wxT("Gimmick! Viewer"),wxDefaultPosition, wxDefaultSize );
-       mViewer->SetMovieSize(1);
-       mViewer->SetImage(0,GetDefaultImage());
-         mViewer->ShowNextImage();
+       pointers.push_back(new ImagePointerHolder(GetDefaultImage()));
+       mViewer->SetImageVector(pointers);
+       mViewer->StartPlayer();
+
 
     bottom_sizer->Add(mViewer,1,wxGROW,1);
     //    mViewer->Show();
@@ -385,9 +387,7 @@ namespace creaImageIO
       }
     else
       {
-       mViewer->SetMovieSize(1);
-       mViewer->SetImage(0,GetDefaultImage());
-       //      mViewer->Hide();
+                 ClearSelection();
       }
 
     
@@ -405,25 +405,27 @@ namespace creaImageIO
    int maxprio = GetMaximalPriority();
    int prio = maxprio + 2000;
 
-   mViewer->SetMovieSize(sel.size());//ClearImages();
-   
+   if(sel.size()>0)
+   {
    //First load the selected images
    mCurImageItemToShow = sel.front();
+   pointers.clear();
    int index = 0;
    std::vector<tree::Node*>::iterator selected;
    for(selected=sel.begin();selected!=sel.end();++selected)
      {
        GimmickDebugMessage(5,
                           "Requesting image from selected "
                           <<(*selected)->GetAttribute("FullFileName")
                           <<std::endl);
-       RequestReading(*selected,prio,index);
+          ImagePointerHolder* ph=new ImagePointerHolder(GetDefaultImage());
+          pointers.push_back(ph);
+       RequestReading(*selected,prio,index,ph);
        //       AddEntryToMap(*selected);
        prio--;
        index++;
      }
-       
+       mViewer->SetImageVector(pointers);
        //Going up
        prio = maxprio + 20;
        std::vector<tree::Node*> up;
@@ -435,7 +437,8 @@ namespace creaImageIO
                                "Requesting image from neighbors up "
                                <<(*iterUp)->GetAttribute("FullFileName")
                                <<std::endl);
-               RequestReading(*iterUp,prio,-1);
+               ImagePointerHolder* ph=new ImagePointerHolder(GetDefaultImage());
+               RequestReading(*iterUp,prio,-1,ph);
                //              AddEntryToMap(*iterUp);
                prio--;
                if (prio == maxprio) break;
@@ -452,83 +455,31 @@ namespace creaImageIO
                                "Requesting image from neighbors down "
                                <<(*iterDown)->GetAttribute("FullFileName")
                                <<std::endl);
-               RequestReading(*iterDown,prio,-1);
+               ImagePointerHolder* ph=new ImagePointerHolder(GetDefaultImage());
+               RequestReading(*iterDown,prio,-1,ph);
                //              AddEntryToMap(*iterDown);
                prio--;
                if (prio == maxprio) break;
-       }       
+       }
+   }
   }
 
   //==================================================
 
-  //==================================================
-  /// Processes the queue of image events 
-  void WxGimmickView::ProcessImageEvents()
-  {
-    if (!mConstructed) return;
-
-    //    int level=GetTreeViewMap()["Local database"]->GetNumberOfLevels();
-    //    std::vector<tree::Node*> sel=GetTreeViewMap()["Local database"]->GetSelected(level+1);
-    /*
-    GimmickDebugMessage(5,
-                       "Processing Images. Lock Started"
-                       <<std::endl);
-    */
-    MultiThreadImageReaderEventLock();
-    
-
-    while (!IsQueueEmpty())
-      {
-                 mViewer->StartPlayer();
-
-       GimmickDebugMessage(5,
-                           "Queue not empty"
-                           <<std::endl);
-       
-       vtkImageData* image = GetNextImageQueued();
-       if( image!=0 ) 
-         {
-           int index =  GetNextSelectionIndexQueued();
-           if (index>=0) 
-             {
-               mViewer->SetImage(index,image);
-             }
-           
-         }
-       UnqueueNext();
-      }
-    
-    ClearQueue();
-
-    MultiThreadImageReaderEventUnlock();
-    /*
-       GimmickDebugMessage(5,
-                               "Processing Images. Lock Ended"
-                               <<std::endl);
-    */
-  }
   //==================================================
 
   //==================================================
    void  WxGimmickView::OnInternalIdle()
   {
    if (!mConstructed) return;
-   ProcessImageEvents();
    static bool first_time = true;
    if (false)
-     {
-       mViewer->SetMovieSize(1);
-       mViewer->SetImage(0,GetDefaultImage());
-       first_time = false;
+   {
+       first_time = false;
      }
    //   GimmickMessage(1,"WxGimmickView : Refresh viewer"<<std::endl);
        //  mViewer->StartPlayer();
-   if (mViewer->RefreshIfNecessary())
-     {
-       // mViewer->Refresh();
-       //       mViewer->SetFocus();
-     }
+       mViewer->RefreshIfNecessary();
   }
 
    //==================================================
@@ -536,8 +487,9 @@ namespace creaImageIO
   //==================================================
    void  WxGimmickView::ClearSelection()
   {
-       mViewer->SetMovieSize(1);
-       mViewer->SetImage(0,GetDefaultImage());
+       pointers.clear();
+       pointers.push_back(new ImagePointerHolder(GetDefaultImage()));
+       mViewer->SetImageVector(pointers);
        mViewer->RefreshIfNecessary();
   }
   
index 63ac15473102d5ea7241763060b7f6ab8adf482f..6c236cb9fa02dcff2d7b522ed5aaf37a8d473ee1 100644 (file)
@@ -21,9 +21,11 @@ namespace creaImageIO
   
   //=====================================================================
   /// Concrete derivative of GimmickView which implements a wxWidgets-based view
+
   class WxGimmickView : public wxPanel, virtual public GimmickView
     {
     public:
+         
       typedef int EventType;
 
       /// Ctor
@@ -101,10 +103,6 @@ namespace creaImageIO
 
       /// AddProgress Gimmick callback
       void OnAddProgress( Gimmick::AddProgress& );
-         /// Processes the queue of image events 
-         /// Called in OnInternalIdle();
-      /// (locks the MultiThreadImageReaderEvent mutex)
-      void ProcessImageEvents();
       /// Called upon to refresh the viewer once there are no actions to be done
       void OnInternalIdle();
      
@@ -118,6 +116,8 @@ namespace creaImageIO
          WxViewer* mViewer;
          ///Currently Displayed Node
          tree::Node* mCurImageItemToShow;
+         //Pointer holders for images to be shown
+         std::vector<ImagePointerHolder*> pointers;
 
 
       wxString mCurrentDirectory;
index 4066315d60cabc1158890932f09fd9e93fd0b017..1d5663fd83e02f56263fecc49b48c46927845a85 100644 (file)
@@ -155,6 +155,7 @@ namespace creaImageIO
        mLastSelected=0;
        mDirection=true;
        mSelectionMade=false;
+       mProcess=true;
        CreateColorPalette();
     UpdateLevel(1);
 
@@ -426,10 +427,14 @@ namespace creaImageIO
                {
                mSelected=GetSelected(level+2);
                }
-               else
+               else if(mProcess)
                {
                mLastLevelSelected=GetSelected(level+2);
                }
+               else
+               {
+                       event.Veto();
+               }
                
                if (level<mLevelList.size()-1) 
                {
@@ -437,7 +442,10 @@ namespace creaImageIO
                        GetGimmickView()->ClearSelection();
                }
                if (level==mLevelList.size()-2) SelectLowerLevel();
-               if (level==mLevelList.size()-1) ValidateSelectedImages ();
+               if (level==(mLevelList.size()-1)&&mProcess) 
+               {
+                       ValidateSelectedImages ();
+               }
        }
        else
        {
@@ -450,6 +458,7 @@ namespace creaImageIO
                
        }
        
+       
   }
   //================================================================
 
@@ -458,17 +467,29 @@ namespace creaImageIO
   {
        long item = -1;
        int level=mLevelList.size()-1;
+       
     for ( ;; )
     {
                item = GetCtrl(level)->GetNextItem(item,
                                      wxLIST_NEXT_ALL);
         if ( item == -1 )
             break;
+
+               if(item==(GetCtrl(level)->GetItemCount()-1))
+               {
+                       mProcess=true;
+               }
+               else
+               {
+                       mProcess=false;
+               }
+
                if(item!=0)
                {
                GetCtrl(level)->SetItemState(item,wxLIST_STATE_SELECTED, wxLIST_MASK_STATE 
                | wxLIST_MASK_TEXT |wxLIST_MASK_IMAGE | wxLIST_MASK_DATA | wxLIST_MASK_WIDTH | wxLIST_MASK_FORMAT);
                }
+               
     }
 
        
index a2c6026d493a56a4c0aff6e347e7e95c6af32993..23325339e94dbeb800a8998bfc56757520d57270 100644 (file)
@@ -104,7 +104,7 @@ namespace creaImageIO
          std::vector<std::string> mColorPalette;
          ///Boolean declaring if the last level selection has been made
          bool mSelectionMade;
-         
+         bool mProcess;
 
       DECLARE_EVENT_TABLE()
     };
index 8639888215e9e2cacd2658e939589078d534ab25..d6871d9657d822b321eb784487079b0420b0235c 100644 (file)
@@ -14,7 +14,7 @@ using namespace crea;
 
 namespace creaImageIO
 {
-
+  
   //=====================================================================
 
   //=====================================================================
@@ -125,7 +125,12 @@ namespace creaImageIO
   }
 
   //================================================================
-   
+  void WxViewer::SetImageVector(std::vector<ImagePointerHolder*>& pointers)
+  {
+       wxMutexLocker lock(mMutex);
+       GimmickMessage(1,"WxViewer::SetImageVector"<<std::endl);
+       imagePointers=pointers;
+  }
 
 
   //================================================================
@@ -168,15 +173,34 @@ namespace creaImageIO
                   <<mCurrent+1<<"/"
                   <<images.size()<<std::endl);
     
-    
-    if (mCurrent<images.size()) 
-      {
-       ShowImage(images[mCurrent]);
-       if ( images[mCurrent] != mLastImageShown ) mNeedRefresh = true;
-       mLastImageShown = images[mCurrent];
-      }
-    mCurrent++;
-    if (mCurrent >= images.size()) mCurrent = 0;
+    if(imagePointers.size()>0)
+       {
+               if (mCurrent<imagePointers.size()) 
+               {
+                       ImagePointerHolder* iph=imagePointers[mCurrent];
+                       vtkImageData* currIm=iph->Get();
+                       ShowImage(currIm);
+                       if ( currIm != mLastImageShown ) 
+                       {
+                               mNeedRefresh = true;
+                               mLastImageShown = currIm;
+                       }
+               mCurrent++;
+           }
+               else
+               {
+                       mCurrent = 0;
+                       ImagePointerHolder* iph=imagePointers[mCurrent];
+                       vtkImageData* currIm=iph->Get();
+                       ShowImage(currIm);
+                       if ( currIm != mLastImageShown ) 
+                       {
+                               mNeedRefresh = true;
+                               mLastImageShown = currIm;
+                       }
+                       mCurrent++;
+               }
+       }
   }
   //================================================================
 
index dff169d0d29da5696133321c4b91f27f7651fbd5..e9ea7a193cfd347597047f5cc2059050722d400c 100644 (file)
@@ -10,6 +10,7 @@
 #include <wx/splitter.h>
 
 #include <creaImageIOSystem.h>
+#include <creaImageIOImagePointerHolder.h>
 
 // For image preview 
 // vtk and wxvtk classes
@@ -23,7 +24,7 @@ namespace creaImageIO
 
   class WxViewer : public wxPanel
   {
-
   public:
     //   friend class ThreadedMovie;
     /// Ctor 
@@ -56,6 +57,9 @@ namespace creaImageIO
 
     bool RefreshIfNecessary();
 
+       void SetImageVector(std::vector<ImagePointerHolder*>& pointers);
+  
+
   private:
    ///Shows the image passed as parameter
     void ShowImage(vtkImageData* im);
@@ -82,7 +86,10 @@ namespace creaImageIO
 
     /// 
     bool mNeedRefresh;
+
+       
     vtkImageData* mLastImageShown;
+       std::vector<ImagePointerHolder*> imagePointers;
 
   };