]> Creatis software - creaImageIO.git/blobdiff - src2/creaImageIOWxGimmickView.cpp
Viewer with movie done.
[creaImageIO.git] / src2 / creaImageIOWxGimmickView.cpp
index 5e851a398639fdffe765dd053ec163539d45e1f9..a21617c744a831daa3727994dcbd2338e9e60a93 100644 (file)
@@ -98,7 +98,9 @@ namespace creaImageIO
 
        //Gimmick
        mGimmick=gimmick;
+       mViewer=new WxViewer(this, wxID_ANY, wxT("Gimmick! Viewer"),wxDefaultPosition, wxDefaultSize );
 
+       
        mSelectionMaxDimension= max_dim;
        mSelectionMinDimension= min_dim;
 
@@ -359,12 +361,132 @@ namespace creaImageIO
        std::vector<tree::Node*> sel=* (std::vector<tree::Node*> *) s;
        bool valid=ValidateSelected(sel,mSelectionMinDimension,mSelectionMaxDimension );
        mText->SetLabel(_T("Status: ")+GetMessage());
+       if(valid)
+       {
+               ReadImageThreaded(sel);
+       }
+       else
+       {
+               mViewer->Hide();
+       }
        return valid;
     
    }
-  //=================================================
 
-   //=================================================
+  //==================================================
+
+  //==================================================
+  ///Reads Images (Threaded)
+  void WxGimmickView::ReadImageThreaded(std::vector<tree::Node*> sel)
+  {    
+       int maxprio = GetMaximalPriority();
+       int prio = maxprio + 2000;
+
+       //First load the selected images
+       mCurImageItemToShow = sel.front();
+       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);
+               AddEntryToMap(*selected);
+               prio--;
+       }
+       
+       //Going up
+       prio = maxprio + 1000;
+       std::vector<tree::Node*> up;
+       GetTreeViewMap()["Local database"]->GetNodes(up,true);
+       std::vector<tree::Node*>::iterator iterUp;
+       for(iterUp=up.begin();iterUp!=up.end();++iterUp)
+       {
+               GimmickDebugMessage(5,
+                               "Requesting image from neighbors up "
+                               <<(*iterUp)->GetAttribute("FullFileName")
+                               <<std::endl);
+               RequestReading(*iterUp,prio);
+               AddEntryToMap(*iterUp);
+               prio--;
+       }
+
+       //Going down
+       prio = maxprio + 999;
+       std::vector<tree::Node*> down;
+       GetTreeViewMap()["Local database"]->GetNodes(down,false);
+       std::vector<tree::Node*>::iterator iterDown;
+       for(iterDown=down.begin();iterDown!=down.end();++iterDown)
+       {
+               GimmickDebugMessage(5,
+                               "Requesting image from neighbors down "
+                               <<(*iterDown)->GetAttribute("FullFileName")
+                               <<std::endl);
+               RequestReading(*iterDown,prio);
+               AddEntryToMap(*iterDown);
+               prio--;
+       }       
+  }
+
+  //==================================================
+
+  //==================================================
+  /// Processes the queue of image events 
+  void WxGimmickView::ProcessImageEvents()
+  {
+       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();
+
+       mViewer->ClearImages();
+    while (!IsQueueEmpty())
+      {
+               vtkImageData* image=GetNextImageQueued();
+               tree::Node* node=GetNextNodeQueued();
+               if( image!=0 ) 
+               {
+                       bool found=false;
+                       std::vector<tree::Node*>::iterator i;
+                       for(i=sel.begin();i!=sel.end()&&!found;++i)
+                       {
+                               if((*i)==node)
+                               {
+                                       mViewer->AddImage(image);
+                                       found=true;
+                               }
+                       }
+                       UnqueueNext();
+               }
+         }
+         if(!(mViewer->ImagesEmpty()))
+         {
+               mViewer->ShowImages();
+               mViewer->Show();
+         }
+    ClearQueue();
+       
+
+    MultiThreadImageReaderEventUnlock();
+       GimmickDebugMessage(5,
+                               "Processing Images. Lock Ended"
+                               <<std::endl);
+  }
+  //==================================================
+
+  //==================================================
+   void  WxGimmickView::OnInternalIdle()
+  {
+    ProcessImageEvents();
+  }
+  
+  //=================================================
+  //=================================================
   void WxGimmickView::OnRemove(wxCommandEvent& event)
   {
        //TODO Select current tree handler