]> Creatis software - creaImageIO.git/blobdiff - src2/creaImageIOWxGimmickView.cpp
*** empty log message ***
[creaImageIO.git] / src2 / creaImageIOWxGimmickView.cpp
index bdbb325620ed14a67901f5a4959136dc8317f368..5b87845400cd574b220c6011c5294055a1d05f05 100644 (file)
@@ -12,9 +12,11 @@ using namespace crea;
 #include "icons/help.xpm"
 
 #include <wx/imaglist.h>
+#include<boost/filesystem/operations.hpp>
 
 namespace creaImageIO
 {
+   
   //======================================================================
   // The ids of the different tools
   enum
@@ -110,25 +112,30 @@ namespace creaImageIO
     // Bottom panel 
     mBottomPanel = new wxPanel(mSplitter,-1);
     
-    wxBoxSizer *bottom_sizer = new wxBoxSizer(wxHORIZONTAL);
+         wxBoxSizer    *bottom_sizer = new wxBoxSizer(wxVERTICAL); //HORIZONTAL);
     
-    mText = new wxStaticText(mBottomPanel, wxID_ANY, wxT("Status: Welcome to Gimmick!"));
-    bottom_sizer->Add(mText,1,wxGROW,0);
     
     // Previewer
     mViewer = new WxViewer(mBottomPanel, wxID_ANY, wxT("Gimmick! Viewer"),wxDefaultPosition, wxDefaultSize );
-       mViewer->SetMovieSize(1);
-       mViewer->SetImage(0,GetDefaultImage());
+       pointers.push_back(new ImagePointerHolder(GetDefaultImage()));
+       mViewer->SetImageVector(pointers);
+       mViewer->StartPlayer();
+
 
-    bottom_sizer->Add(mViewer,1,wxGROW,0);
+    bottom_sizer->Add(mViewer,1,wxGROW,1);
     //    mViewer->Show();
 
+         mText = new wxStaticText(mBottomPanel, wxID_ANY, wxT("Welcome to Gimmick!"));
+         bottom_sizer->Add(mText,0,wxGROW,0);
+
+         
+         
     mBottomPanel->SetSizer(bottom_sizer);
 
     // Splitting
     int hsize = size.GetHeight();
 
-    int top_minsize = 500;
+    int top_minsize = 450;
     int bottom_minsize = 50;
 
     mSplitter->SetMinimumPaneSize( bottom_minsize );
@@ -150,6 +157,8 @@ namespace creaImageIO
   /// Destructor
   WxGimmickView::~WxGimmickView()
   {
+       // stop the viewer before application exit.
+       mViewer->StopPlayer();
     GimmickDebugMessage(1,"WxGimmickView::~WxGimmickView"
                        <<std::endl);
   }
@@ -197,13 +206,13 @@ namespace creaImageIO
  
   //======================================================================
   /// Create the tree view for TreeHandler provided
-  void WxGimmickView::CreateTreeView( TreeHandler* h)
+  void WxGimmickView::CreateTreeView( TreeHandler* h, TimestampDatabaseHandler* tdh)
   {
     std::string name(h->GetTree().GetAttribute("Name"));
     GimmickMessage(2,"Creating the tree view for '"<<
                   name<<"'"<<std::endl);
     // Create the WxTreeView
-    WxTreeView* view = new WxTreeView(h,this,mNotebook,-1);
+    WxTreeView* view = new WxTreeView(h,tdh,this,mNotebook,-1);
 
     // TO DO : TEST THAT A VIEW WITH SAME NAME IS NOT
     // ALREADY IN THE MAP
@@ -215,19 +224,31 @@ namespace creaImageIO
   }
 
   //======================================================================
-  /// Returns the selected Images so that they comply with the given parameter(4D)
   void WxGimmickView::GetSelectedImages(std::vector<vtkImageData*>& s, int dim)
   {
-       int level=GetTreeViewMap()["Local database"]->GetNumberOfLevels();
-       std::vector<tree::Node*> im=GetTreeViewMap()["Local database"]->GetSelected(level+1);
-       ReadImagesNotThreaded(s,im,dim);
+       std::vector<std::string> files;
+       GetTreeViewMap()["Local database"]->GetSelectedAsString(files);
+       ReadImagesNotThreaded(s,files,dim);
   }
   //======================================================================
-  /// Returns the selected Images so that they comply with the given parameter(4D)
+
+  //======================================================================
   void WxGimmickView::GetSelectedFiles(std::vector<std::string>& s)
   {
        GetTreeViewMap()["Local database"]->GetSelectedAsString(s);
   }
+  //======================================================================
+
+  //======================================================================
+  void WxGimmickView::GetImages(int dim, 
+                               const std::vector<std::string>& files, 
+                               std::vector<vtkImageData*>& s)
+  {
+       ReadImagesNotThreaded(s,files,dim);
+  }
+  //======================================================================
+
+
   //=================================================
   void WxGimmickView::CreateIconList()
   {
@@ -268,6 +289,7 @@ namespace creaImageIO
   //=================================================
   void WxGimmickView::OnAddFiles(wxCommandEvent& event)
   {
+    mViewer->StopPlayer();
    long style = wxOPEN | wxFILE_MUST_EXIST | wxFD_MULTIPLE;
     std::string wc("*.*");
     wxFileDialog* FD = new wxFileDialog( 0, 
@@ -310,14 +332,16 @@ namespace creaImageIO
        UpdateTreeViewLevel("Local database",1);
        delete mProgressDialog;
        DisplayAddSummary();    
+
       }
-       
+       mViewer->StartPlayer(); 
   }
   //=================================================
 
   //=================================================
   void WxGimmickView::OnAddDir(wxCommandEvent& event)
   {
+    mViewer->StopPlayer();
     long style = wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST;
     wxDirDialog* FD = 
       new wxDirDialog( 0, 
@@ -327,64 +351,116 @@ namespace creaImageIO
     
     if (FD->ShowModal()==wxID_OK)
       {
+
        
-       bool recurse = false;
-       if (wxMessageBox(_T("Recurse into sub-directories ?"),
-                        _T("Scan directory"),
-                        wxYES_NO,this ) == wxYES)
-         {
-           recurse = true;
+                 std::string dirname = wx2std (FD->GetPath());
+                 bool recurse =  isNeedRecursive(dirname);
+                 if (recurse)
+                {
+             recurse = wxMessageBox(_T("Recurse into sub-directories ?"),  _T("Scan directory"),        wxYES_NO,this ) == wxYES ? true : false;
+                }
+               
+               wxBusyCursor busy;
+               wxString title(_T("Adding directory"));
+               if (recurse) 
+               title = _T("Adding directory (recursive)");
+               mProgressDialog = 
+               new wxProgressDialog(_T("Adding directory"),
+                                       _T(""),
+                                       1000,
+                                       this,
+                                       wxPD_ELAPSED_TIME |
+                                       //                             wxPD_ESTIMATED_TIME | 
+                                       //                             wxPD_REMAINING_TIME |
+                                       wxPD_CAN_ABORT );
+               
+               mCurrentDirectory = FD->GetPath();  
+               
+               // TO DO : select the current tree handler
+               mGimmick->AddDir("Local database",dirname,recurse);
+               
+               mProgressDialog->Pulse(_T("Updating view..."));
+               
+               UpdateTreeViewLevel("Local database",1);
+               delete mProgressDialog;
+               DisplayAddSummary();
+
          }
-       
-       wxBusyCursor busy;
-       wxString title(_T("Adding directory"));
-       if (recurse) 
-         title = _T("Adding directory (recursive)");
-       mProgressDialog = 
-         new wxProgressDialog(_T("Adding directory"),
-                              _T(""),
-                              1000,
-                              this,
-                              wxPD_ELAPSED_TIME |
-                              //                              wxPD_ESTIMATED_TIME | 
-                              //                              wxPD_REMAINING_TIME |
-                              wxPD_CAN_ABORT );
-       std::string dirname = wx2std (FD->GetPath()) ;
-       mCurrentDirectory = FD->GetPath();  
-       
-       // TO DO : select the current tree handler
-       mGimmick->AddDir("Local database",dirname,recurse);
-       
-       mProgressDialog->Pulse(_T("Updating view..."));
-       
-       UpdateTreeViewLevel("Local database",1);
-       delete mProgressDialog;
-       DisplayAddSummary();
-      }
+    mViewer->StartPlayer();
+  }
+
+    //=================================================
+   // Test a directory to know if contains sub-directory to analyze
+  bool WxGimmickView::isNeedRecursive(std::string i_name)
+  {
+      boost::filesystem::directory_iterator iter(i_name), end_iter;
+         bool bfindir = false;
+                 for(; iter != end_iter; ++iter)
+                 {
+                         if(boost::filesystem::is_directory(*iter))
+                         {
+                                 return true;
+                         }
+                 }
+                 return false;
   }
   //=================================================
 
   //=================================================
-  void WxGimmickView::OnSelectionChange(std::vector<tree::Node*>& sel)
+  void WxGimmickView::OnSelectionChange(const std::vector<tree::Node*>& sel, bool isSelection, int selection, bool needProcess)
   {      
     GimmickDebugMessage(5,
                        "WxGimmickView::OnSelectionChange"
                        <<std::endl);
     wxBusyCursor busy;
-    bool valid = ValidateSelected(sel,
-                                 mSelectionMinDimension,
-                                 mSelectionMaxDimension );
-    mText->SetLabel(_T("Status: ")+crea::std2wx(GetMessage()));
-    if(valid)
+       bool valid=true;
+       
+       if(sel.size()==0)
+       {
+               
+               valid= ValidateSelected(NULL,
+                               mSelectionMinDimension,
+                               mSelectionMaxDimension );
+       }
+       else if(needProcess)
+       {
+               ResetExtent();
+               std::vector<tree::Node*>::const_iterator i;
+               for(i=sel.begin();i!=sel.end()&&valid;++i)
+               {
+                       valid= ValidateSelected((*i),
+                               mSelectionMinDimension,
+                               mSelectionMaxDimension );
+               }
+       }
+       else if(isSelection)
+       {
+               valid= ValidateSelected(sel.front(),
+                               mSelectionMinDimension,
+                               mSelectionMaxDimension );
+       }
+       else
+       {
+               ResetExtent();
+               std::vector<tree::Node*>::const_iterator i;
+               for(i=sel.begin();i!=sel.end()&&valid;++i)
+               {
+                       valid= ValidateSelected((*i),
+                               mSelectionMinDimension,
+                               mSelectionMaxDimension );
+               }
+       }
+       
+    mText->SetLabel(crea::std2wx(GetMessage()));
+    /*if(valid)
       {
        ReadImageThreaded(sel);
       }
     else
       {
-       mViewer->SetMovieSize(1);
-       mViewer->SetImage(0,GetDefaultImage());
-       //      mViewer->Hide();
-      }
+                 ClearSelection();
+      }*/
+       ReadImageThreaded(sel);
 
     
    }
@@ -393,7 +469,7 @@ namespace creaImageIO
 
   //==================================================
   ///Reads Images (Threaded)
-  void WxGimmickView::ReadImageThreaded(std::vector<tree::Node*> sel)
+  void WxGimmickView::ReadImageThreaded(const std::vector<tree::Node*>& sel)
   {    
    GimmickDebugMessage(5,
                       "ReadImageThreaded"
@@ -401,24 +477,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;
+   std::vector<tree::Node*>::const_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;
@@ -430,7 +509,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;
@@ -447,82 +527,53 @@ 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;
-       }       
+       }
+   }
+   else
+   {
+          pointers.clear();
+          ImagePointerHolder* ph=new ImagePointerHolder(GetDefaultImage());
+          pointers.push_back(ph);
+          mViewer->SetImageVector(pointers);
+   }
   }
 
   //==================================================
 
-  //==================================================
-  /// 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())
-      {
-       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)
+   {
+          mViewer->RefreshIfNecessary();
+   }
+  }
 
-   if (mViewer->RefreshIfNecessary())
-     {
-       // mViewer->Refresh();
-       //       mViewer->SetFocus();
-     }
+   //==================================================
+
+  //==================================================
+   void  WxGimmickView::ClearSelection()
+  {
+       pointers.clear();
+       pointers.push_back(new ImagePointerHolder(GetDefaultImage()));
+       mViewer->SetImageVector(pointers);
+       mViewer->RefreshIfNecessary();
+       ResetExtent();
   }
   
   //=================================================
@@ -530,9 +581,11 @@ namespace creaImageIO
   //=================================================
   void WxGimmickView::OnRemove(wxCommandEvent& event)
   {
-       //TODO Select current tree handler       
+       //TODO Select current tree handler       
     wxBusyCursor busy;
-    GetTreeViewMap()["Local database"]->RemoveSelected(1);
+    GetTreeViewMap()["Local database"]->RemoveSelected();
+
+       ClearSelection();
   }
   //=================================================
 
@@ -542,7 +595,8 @@ namespace creaImageIO
   {
 
     char mess[200];
-    sprintf(mess,"%i dirs - %i files - %i handled - %i added",
+   
+       sprintf(mess,"%i dirs : %i files :\n            %i handled - %i added",
           p.GetNumberScannedDirs(),
           p.GetNumberScannedFiles(),
           p.GetNumberHandledFiles(),