From 82026cc5a9a36392c481513cd86091714eca51d1 Mon Sep 17 00:00:00 2001 From: caballero Date: Mon, 23 Mar 2009 10:10:02 +0000 Subject: [PATCH] Changed reading and viewing method by adding ImagePointerHolders --- src2/CMakeLists.txt | 1 + src2/creaImageIOGimmickView.cpp | 50 +++++++++++----- src2/creaImageIOGimmickView.h | 19 +++--- src2/creaImageIOWxGimmickView.cpp | 98 ++++++++----------------------- src2/creaImageIOWxGimmickView.h | 8 +-- src2/creaImageIOWxTreeView.cpp | 25 +++++++- src2/creaImageIOWxTreeView.h | 2 +- src2/creaImageIOWxViewer.cpp | 46 +++++++++++---- src2/creaImageIOWxViewer.h | 9 ++- 9 files changed, 144 insertions(+), 114 deletions(-) diff --git a/src2/CMakeLists.txt b/src2/CMakeLists.txt index cac05e5..b3c1c0a 100644 --- a/src2/CMakeLists.txt +++ b/src2/CMakeLists.txt @@ -50,6 +50,7 @@ SET( SRCS # Viewer creaImageIOWxViewer +creaImageIOImagePointerHolder.h ) diff --git a/src2/creaImageIOGimmickView.cpp b/src2/creaImageIOGimmickView.cpp index 3ce0f5c..0afd753 100644 --- a/src2/creaImageIOGimmickView.cpp +++ b/src2/creaImageIOGimmickView.cpp @@ -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" - <second); - e.image = image; - mImageEventQueue.push_back(e); - mImageEventMap.erase(i); + GimmickDebugMessage(5, + "Putting image of file '"<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); + } + } } diff --git a/src2/creaImageIOGimmickView.h b/src2/creaImageIOGimmickView.h index 7e7a247..86948c5 100644 --- a/src2/creaImageIOGimmickView.h +++ b/src2/creaImageIOGimmickView.h @@ -4,6 +4,7 @@ #include #include #include +#include //#include #include @@ -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& s,std::vector 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 ImageEventTypeMap; /// Map of images' names to ImageEventType @@ -322,4 +327,4 @@ namespace creaImageIO } // EO namespace creaImageIO // EOF -#endif +#endif diff --git a/src2/creaImageIOWxGimmickView.cpp b/src2/creaImageIOWxGimmickView.cpp index 53aa4a8..cd23af7 100644 --- a/src2/creaImageIOWxGimmickView.cpp +++ b/src2/creaImageIOWxGimmickView.cpp @@ -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::iterator selected; - for(selected=sel.begin();selected!=sel.end();++selected) { GimmickDebugMessage(5, "Requesting image from selected " <<(*selected)->GetAttribute("FullFileName") <SetImageVector(pointers); //Going up prio = maxprio + 20; std::vector up; @@ -435,7 +437,8 @@ namespace creaImageIO "Requesting image from neighbors up " <<(*iterUp)->GetAttribute("FullFileName") <GetAttribute("FullFileName") <GetNumberOfLevels(); - // std::vector sel=GetTreeViewMap()["Local database"]->GetSelected(level+1); - /* - GimmickDebugMessage(5, - "Processing Images. Lock Started" - <StartPlayer(); - - GimmickDebugMessage(5, - "Queue not empty" - <=0) - { - mViewer->SetImage(index,image); - } - - } - UnqueueNext(); - } - - ClearQueue(); - - MultiThreadImageReaderEventUnlock(); - /* - GimmickDebugMessage(5, - "Processing Images. Lock Ended" - <SetMovieSize(1); - mViewer->SetImage(0,GetDefaultImage()); - first_time = false; + { + first_time = false; } // GimmickMessage(1,"WxGimmickView : Refresh viewer"<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(); } diff --git a/src2/creaImageIOWxGimmickView.h b/src2/creaImageIOWxGimmickView.h index 63ac154..6c236cb 100644 --- a/src2/creaImageIOWxGimmickView.h +++ b/src2/creaImageIOWxGimmickView.h @@ -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 pointers; wxString mCurrentDirectory; diff --git a/src2/creaImageIOWxTreeView.cpp b/src2/creaImageIOWxTreeView.cpp index 4066315..1d5663f 100644 --- a/src2/creaImageIOWxTreeView.cpp +++ b/src2/creaImageIOWxTreeView.cpp @@ -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 (levelClearSelection(); } 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); } + } diff --git a/src2/creaImageIOWxTreeView.h b/src2/creaImageIOWxTreeView.h index a2c6026..2332533 100644 --- a/src2/creaImageIOWxTreeView.h +++ b/src2/creaImageIOWxTreeView.h @@ -104,7 +104,7 @@ namespace creaImageIO std::vector mColorPalette; ///Boolean declaring if the last level selection has been made bool mSelectionMade; - + bool mProcess; DECLARE_EVENT_TABLE() }; diff --git a/src2/creaImageIOWxViewer.cpp b/src2/creaImageIOWxViewer.cpp index 8639888..d6871d9 100644 --- a/src2/creaImageIOWxViewer.cpp +++ b/src2/creaImageIOWxViewer.cpp @@ -14,7 +14,7 @@ using namespace crea; namespace creaImageIO { - + //===================================================================== //===================================================================== @@ -125,7 +125,12 @@ namespace creaImageIO } //================================================================ - + void WxViewer::SetImageVector(std::vector& pointers) + { + wxMutexLocker lock(mMutex); + GimmickMessage(1,"WxViewer::SetImageVector"<= images.size()) mCurrent = 0; + if(imagePointers.size()>0) + { + if (mCurrentGet(); + 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++; + } + } } //================================================================ diff --git a/src2/creaImageIOWxViewer.h b/src2/creaImageIOWxViewer.h index dff169d..e9ea7a1 100644 --- a/src2/creaImageIOWxViewer.h +++ b/src2/creaImageIOWxViewer.h @@ -10,6 +10,7 @@ #include #include +#include // 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& pointers); + + private: ///Shows the image passed as parameter void ShowImage(vtkImageData* im); @@ -82,7 +86,10 @@ namespace creaImageIO /// bool mNeedRefresh; + + vtkImageData* mLastImageShown; + std::vector imagePointers; }; -- 2.45.2