]> Creatis software - creaMaracasVisu.git/blobdiff - lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramDialog.cxx
creaButtonContainer & creaPanelButtonContainer: Updates in doxygen documentation...
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / pPlotter / HistogramDialog.cxx
index a60429eaad88f0730d6b8eb046f0cb4765048daa..1a2c14093f0a03835514879350d6e7ee66f5a2af 100644 (file)
@@ -1,6 +1,16 @@
 #include "HistogramDialog.h"
 #include <vector>
 
+#include "OpenImage.xpm"
+#include "Save.xpm"
+#include "Ok.xpm"
+#include "Cancel.xpm"
+#include "Delete.xpm"
+
+#include "creaSystem.h"
+
+
+
 // IMPLEMENT_CLASS(HistogramDialog, wxDialog)
 
 
@@ -14,41 +24,60 @@ enum {
 //-------------------------
 //Constructor
 //-------------------------
-HistogramDialog::HistogramDialog(wxWindow *parent,wxString title,vtkImageData* imageData,int type)
+HistogramDialog::HistogramDialog(wxWindow *parent,wxString title,vtkImageData* imageData,bool extracontrols)
 :wxDialog(parent,-1,title,wxDefaultPosition,wxDefaultSize,wxRESIZE_BORDER|wxDEFAULT_DIALOG_STYLE   ,_T("dialogBox"))
 {
 
-       _ctfun=NULL;
+       initializeHistogramDialog(extracontrols);
+       initializeHistogram(imageData);
+
+}
+
+HistogramDialog::HistogramDialog(wxWindow *parent,wxString title,bool extracontrols)
+:wxDialog(parent,-1,title,wxDefaultPosition,wxDefaultSize,wxRESIZE_BORDER|wxDEFAULT_DIALOG_STYLE   ,_T("dialogBox")){
+       
+       initializeHistogramDialog(extracontrols);
+}
+HistogramDialog::~HistogramDialog(){   
+
+}
+
+void HistogramDialog::initializeHistogramDialog(bool extracontrols){
+       _currentcolorselectedbitmap = -1;
+    _ctfun=NULL;
        _tfun=NULL;
+       _panextracontrols=NULL;
+       _maxgreyvalue = 1;
 
        SetBackgroundColour(wxColour(255,255,255));
        /*
        Pointers
        */
-       wxvtkmpr3Dview=NULL;
-       wxvtkclipping3Dview=NULL;
+       //wxvtkmpr3Dview=NULL;
+       //wxvtkclipping3Dview=NULL;
        
        /*
         Histogram
        */
        
-       histogramW=new HistogramWidget(this, -1, wxPoint(0,0), wxSize(400,400),wxNO_BORDER ,imageData,type);
+       histogramW=new HistogramWidget(this, -1);
        
-       refreshed=false;
-
        /*
        Buttons
        */
-       okBtn = new wxButton(this,wxID_OK ,_T("OK"));
-       cancelBtn = new wxButton(this,wxID_CANCEL,_T("Cancel"));
+       wxBitmap bitmap0(Ok_xpm);
+       okBtn = new wxBitmapButton(this, wxID_OK, bitmap0,wxDefaultPosition,wxDefaultSize);             
        
-       saveDataBtn = new wxButton(this,ID_SAVE,_T("Save"));
-       loadDataBtn = new wxButton(this,ID_LOAD,_T("Load"));
-       refreshBtn = new wxButton(this,ID_REFRESH,_T("Refresh"));
+       wxBitmap bitmap1(Cancel_xpm);
+       cancelBtn = new wxBitmapButton(this, wxID_CANCEL, bitmap1,wxDefaultPosition,wxDefaultSize);     
        
-       Connect(saveDataBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnSaveData       );
-       Connect(loadDataBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnLoadData       );
-       Connect(refreshBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnRefreshBtn      );
+       //saveDataBtn = new wxButton(this,ID_SAVE,_T("Save"));
+       //loadDataBtn = new wxButton(this,ID_LOAD,_T("Load"));
+       //refreshBtn = new wxButton(this,ID_REFRESH,_T("Refresh"));
+       
+       //Connect(saveDataBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnSaveData     );
+       //Connect(loadDataBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnLoadData     );
+       //Connect(refreshBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnRefreshBtn    );
        
        //-------------------
        //GUI
@@ -57,20 +86,22 @@ HistogramDialog::HistogramDialog(wxWindow *parent,wxString title,vtkImageData* i
        //Upper Box
        wxBoxSizer * upper_box = new wxBoxSizer( wxHORIZONTAL );
        //Including components for plotter control
-       upper_box->Add( histogramW, 4, wxGROW);
        
+       upper_box->Add( histogramW, 4, wxGROW);
+       upper_box->Add( getControls(extracontrols),wxSizerFlags().Center() );   
 
        //bottom Sizer
        wxBoxSizer *bottomBox = new wxBoxSizer( wxHORIZONTAL );
        bottomBox->Add( okBtn, wxSizerFlags().Center());
        bottomBox->AddSpacer(40);
-       bottomBox->Add( saveDataBtn,wxSizerFlags().Center() );
-       bottomBox->AddSpacer(40);
-       bottomBox->Add( loadDataBtn,wxSizerFlags().Center() );
-       bottomBox->AddSpacer(40);
-       bottomBox->Add( refreshBtn,wxSizerFlags().Center() );
-       bottomBox->AddSpacer(40);
+       //bottomBox->Add( saveDataBtn,wxSizerFlags().Center() );
+       //bottomBox->AddSpacer(40);
+       //bottomBox->Add( loadDataBtn,wxSizerFlags().Center() );
+       //bottomBox->AddSpacer(40);
+       //bottomBox->Add( refreshBtn,wxSizerFlags().Center() );
+       //bottomBox->AddSpacer(40);
        bottomBox->Add( cancelBtn,wxSizerFlags().Center() );
+       
        //Sizer
        wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
        sizer->Add(upper_box,1,wxEXPAND);       
@@ -79,69 +110,222 @@ HistogramDialog::HistogramDialog(wxWindow *parent,wxString title,vtkImageData* i
        SetSizer( sizer );
        SetBestSize(wxSize(600,600));
 }
+wxPanel* HistogramDialog::getPanExtraControls(){
+       wxBoxSizer* sizer0 = new wxBoxSizer(wxVERTICAL);
+    _panextracontrols = new wxPanel(this);     
 
-HistogramDialog::HistogramDialog(wxWindow *parent,wxString title)
-:wxDialog(parent,-1,title,wxDefaultPosition,wxDefaultSize,wxRESIZE_BORDER|wxDEFAULT_DIALOG_STYLE   ,_T("dialogBox")){
-       _ctfun=NULL;
-       _tfun=NULL;
+       _panextracontrols->SetSizer(sizer0);
+       _panextracontrols->SetAutoLayout(true);
 
-       SetBackgroundColour(wxColour(255,255,255));
-       /*
-       Pointers
-       */
-       wxvtkmpr3Dview=NULL;
-       wxvtkclipping3Dview=NULL;
+    return _panextracontrols;
+}
+/**
+** Set to true in the constructor
+**/
+void HistogramDialog::setInfoPanExtraControls(std::vector<HistogramDialogComboBoxItem*> comboitems){
+       _comboitems = comboitems;
+       if(_panextracontrols!=NULL){
+               _panextracontrols->Show(false);
+               for(int i=0; i < comboitems.size();i++){
+
+                       wxBitmap bitmap = comboitems[i]->GetBitmap();
+                       
+                       
+                       _panextracontrols->GetSizer()->Add(getBitmapButtonDelete(bitmap),wxSizerFlags().Center());                      
+                       _panextracontrols->GetSizer()->AddSpacer(5);
+            
+               }       
+               
+               wxButton* button = new wxButton(_panextracontrols,wxID_ANY);                    
+               button->SetToolTip(wxString("Add the current color to the list of predefined",wxConvUTF8));
+               button->SetLabel(wxString(_T("Add")));
+               Connect(button->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&HistogramDialog::OnEditColorsCombo);                             
+               _panextracontrols->GetSizer()->Add(button);                                             
+               _panextracontrols->Layout();            
+               _panextracontrols->Refresh();
+               _panextracontrols->Show(true);
+               this->Layout();
+               this->Refresh();
+
+       }
+}
+wxSizer* HistogramDialog::getBitmapButtonDelete(wxBitmap bitmap){
+       //wxCheckBox* checkbox = new wxCheckBox(_panextracontrols,wxID_ANY,_T(""));
+       wxBitmap bitmap0(Delete_xpm);
+       wxBitmapButton* deletebutton = new wxBitmapButton(_panextracontrols,wxID_ANY,bitmap0,wxDefaultPosition,wxSize(20,20));
+       deletebutton->SetToolTip(wxString("Delete the color from the list",wxConvUTF8));
+       Connect(deletebutton->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&HistogramDialog::OnDeleteColor);
+        _deletebuttonsvector.push_back(deletebutton);
        
-       /*
-        Histogram
-       */
+       //wxBitmap bitmap0(OpenImage_xpm);
+       wxBitmapButton* button = new wxBitmapButton(_panextracontrols,wxID_ANY,bitmap,wxDefaultPosition,wxSize(30,30));                 
+       button->SetToolTip(wxString("Load the current color configuration.",wxConvUTF8));
+       bitmapbuttonsvect.push_back(button);                    
+       Connect(button->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&HistogramDialog::OnEditColorsCombo);
+       /*char c[10];
+       wxString s;
+       s.Printf(_T("%d"),i);*/
        
-       histogramW=new HistogramWidget(this, -1);
+       //button->SetBitmapLabel(comboitems[i]->GetBitmap());
+       // wxStaticBitmap* button = new wxStaticBitmap(_panextracontrols,i,comboitems[i]->GetBitmap(),wxDefaultPosition,wxSize(30,30));                 
+       wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
+       sizer->Add(button,wxSizerFlags().Center());
+       sizer->AddSpacer(5);
+       sizer->Add(deletebutton,wxSizerFlags().Center());
+       return sizer;
+}
+void HistogramDialog::OnDeleteColor(wxCommandEvent& event){
+    for(int i = 0; i < _deletebuttonsvector.size();i++){
+               if(event.GetId()==_deletebuttonsvector[i]->GetId()){
+                       _currentcolorselectedbitmap = -1;
+                       //this->eraseColorPoints();
+                       //this->erasePointsTransferenceFunction();
+                       HistogramDialogComboBoxItem* temp;
+                       temp = _comboitems[i];
+                       _deletebuttonsvector[i]->Hide();
+                       bitmapbuttonsvect[i]->Hide();
+                       delete temp;
+                       //Remove buttons
+                       _panextracontrols->GetSizer()->Remove(i*2);
+                       //Remove Space
+                       _panextracontrols->GetSizer()->Remove(i*2);
+                       for(int k = i; k < _comboitems.size()-1;k++){
+                _comboitems[k] = _comboitems[k+1];
+                               _deletebuttonsvector[k] = _deletebuttonsvector[k+1];
+                               bitmapbuttonsvect[k] = bitmapbuttonsvect[k+1];
+                       }                       
+                       _comboitems.pop_back(); 
+                       _deletebuttonsvector.pop_back();
+                       bitmapbuttonsvect.pop_back();
+               }
+       }
+    _panextracontrols->Layout();
+}
+void HistogramDialog::OnEditColorsCombo(wxCommandEvent& event){
+       bool loadconfig = false;
+       UpdateCurrentComboElement();
+       for(int i = 0; i < bitmapbuttonsvect.size();i++){
+               if(event.GetId()==bitmapbuttonsvect[i]->GetId()){
+                       if(i<_comboitems.size()){
+                               _currentcolorselectedbitmap = i;
+                               loadconfig = true;
+                               HistogramDialogComboBoxItem* currentconfig = _comboitems[i];
+                               std::vector<double> greyvect = currentconfig->getGreyVector();
+                               std::vector<double> _redvect = currentconfig->getRedVector();
+                               std::vector<double> _greenvect = currentconfig->getGreenVector();
+                               std::vector<double> _bluevect= currentconfig->getBlueVector();
+                               this->eraseColorPoints();
+                               this->erasePointsTransferenceFunction();
+                               for(int i = 0; i < currentconfig->getGreyVector().size();i++){
+                                       double greyv = currentconfig->getGreyVector()[i];
+                                       double red = currentconfig->getRedVector()[i];
+                                       double green = currentconfig->getGreenVector()[i];
+                                       double blue = currentconfig->getBlueVector()[i];
+
+                                       this->addColorPoint(greyv*_maxgreyvalue, red*255.0, green*255.0, blue*255.0);
+                               }
+                               for(int i = 0; i < currentconfig->getGreyVectorTransfer().size();i++){
+                                       double greyv = currentconfig->getGreyVectorTransfer()[i];       
+                                       double value = currentconfig->getValueVector()[i];
+                                       std::cout<<"void HistogramDialog::OnEditColorsCombo(wxCommandEvent& event){"<<greyv<<" "<<value<<std::endl;
+                                       this->addPointToTransferenceFunction(greyv*_maxgreyvalue, value*100);
+                               }
+                       }
+               }
+       }
+       if(!loadconfig){                
+               AddNewBitmapButton();           
+       }
        
-       refreshed=false;
+       _panextracontrols->Layout();
+       this->Layout();
+       this->Refresh();
+}
+void HistogramDialog::UpdateCurrentComboElement(){
+       if(_currentcolorselectedbitmap >= 0 && _currentcolorselectedbitmap < _comboitems.size()){
+               setCurrentColorConfigurationIntoButton();
+       }
+}
+void HistogramDialog::AddNewBitmapButton(){    
+       this->eraseColorPoints();
+       this->erasePointsTransferenceFunction();
+       HistogramDialogComboBoxItem* boxitem = new HistogramDialogComboBoxItem();       
+       wxBitmap bitmap = boxitem->GetBitmap();
+       wxSizer* sizer = getBitmapButtonDelete(bitmap);
+    _panextracontrols->GetSizer()->Insert(_comboitems.size()*2,sizer,wxSizerFlags().Center());                 
+       _panextracontrols->GetSizer()->InsertSpacer(_comboitems.size()*2+1,5);
+       _comboitems.push_back(boxitem);         
+       _currentcolorselectedbitmap = _comboitems.size()-1;
+}
+void HistogramDialog::setCurrentColorConfigurationIntoButton(){
+               
+               std::vector<double> greylevel;
+               std::vector<double> red;
+               std::vector<double> green;
+               std::vector<double> blue;
+               std::vector<double> red0;
+               std::vector<double> green0;
+               std::vector<double> blue0;
+               GetValuesColorPointsFunction(greylevel,red,green,blue);
+
+               for(int i = 0;i< greylevel.size();i++){
+                       greylevel[i] = greylevel[i]/_maxgreyvalue;
+                       /*std::cout<<"HistogramDialog::setCurrentColorConfigurationIntoButton(){red"<<red[i]<<std::endl;
+                       std::cout<<"HistogramDialog::setCurrentColorConfigurationIntoButton(){green"<<green[i]<<std::endl;
+                       std::cout<<"HistogramDialog::setCurrentColorConfigurationIntoButton(){blue"<<blue[i]<<std::endl;*/
+                       red0.push_back(red[i]);
+                       green0.push_back(green[i]);
+                       blue0.push_back(blue[i]);                       
+                       /*std::cout<<"HistogramDialog::setCurrentColorConfigurationIntoButton(){red"<<red0[i]<<std::endl;
+                       std::cout<<"HistogramDialog::setCurrentColorConfigurationIntoButton(){green"<<green0[i]<<std::endl;
+                       std::cout<<"HistogramDialog::setCurrentColorConfigurationIntoButton(){blue"<<blue0[i]<<std::endl;*/
+               }
+               
+               std::vector<double> greylevel1;
+               std::vector<double> value;              
+               this->GetValuesPointsFunction(greylevel1,value);                
+
+               for(int i = 0;i< greylevel1.size();i++){
+                       greylevel1[i] = greylevel1[i]/_maxgreyvalue;
+                       value[i] = value[i];
+                       std::cout<<"void HistogramDialog::setCurrentColorConfigurationIntoButton(){"<<greylevel1[i]<<std::endl;
+                       std::cout<<"void HistogramDialog::setCurrentColorConfigurationIntoButton(){"<<value[i]<<std::endl;
+               }
+       if(_currentcolorselectedbitmap >= 0 && _currentcolorselectedbitmap < _comboitems.size()){
+               _comboitems[_currentcolorselectedbitmap]->SetColors(greylevel,red0,green0,blue0);
+               _comboitems[_currentcolorselectedbitmap]->SetTransferFunction(greylevel1,value);        
+               bitmapbuttonsvect[_currentcolorselectedbitmap]->SetBitmapLabel(_comboitems[_currentcolorselectedbitmap]->GetBitmap());
+       }
+}
 
-       /*
-       Buttons
-       */
-       okBtn = new wxButton(this,wxID_OK ,_T("OK"));
-       cancelBtn = new wxButton(this,wxID_CANCEL,_T("Cancel"));
+wxSizer* HistogramDialog::getControls(bool extracontrols){             
+               
+       wxSizer* sizer = new wxBoxSizer(wxVERTICAL);
        
-       saveDataBtn = new wxButton(this,ID_SAVE,_T("Save"));
-       loadDataBtn = new wxButton(this,ID_LOAD,_T("Load"));
-       refreshBtn = new wxButton(this,ID_REFRESH,_T("Refresh"));
+       wxBitmap bitmap0(OpenImage_xpm);
+       wxBitmapButton* opendata = new wxBitmapButton(this, -1, bitmap0,wxDefaultPosition,wxSize(30,30));       
+       Connect(opendata->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&HistogramDialog::OnLoadData);                  
+       sizer->Add(opendata,wxSizerFlags().Center());   
+       sizer->AddSpacer(5);
+
        
-       Connect(saveDataBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnSaveData       );
-       Connect(loadDataBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnLoadData       );
-       Connect(refreshBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnRefreshBtn      );
+
+       wxBitmap bitmap1(Save_xpm);
+       wxBitmapButton* savedata = new wxBitmapButton(this, -1, bitmap1,wxDefaultPosition,wxSize(30,30));       
+       Connect(savedata->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&HistogramDialog::OnSaveData);                  
+       sizer->Add(savedata,wxSizerFlags().Center());
+       sizer->AddSpacer(5);
+
+       if(extracontrols){
+               sizer->Add(getPanExtraControls(),wxSizerFlags().Center());
+       }
+    //sizer->Add(getBitmapCombo(),wxSizerFlags().Center());
        
-       //-------------------
-       //GUI
-       //-------------------
        
-       //Upper Box
-       wxBoxSizer * upper_box = new wxBoxSizer( wxHORIZONTAL );
-       //Including components for plotter control
-       upper_box->Add( histogramW, 4, wxGROW);
        
+       return sizer;
+
 
-       //bottom Sizer
-       wxBoxSizer *bottomBox = new wxBoxSizer( wxHORIZONTAL );
-       bottomBox->Add( okBtn, wxSizerFlags().Center());
-       bottomBox->AddSpacer(40);
-       bottomBox->Add( saveDataBtn,wxSizerFlags().Center() );
-       bottomBox->AddSpacer(40);
-       bottomBox->Add( loadDataBtn,wxSizerFlags().Center() );
-       bottomBox->AddSpacer(40);
-       bottomBox->Add( refreshBtn,wxSizerFlags().Center() );
-       bottomBox->AddSpacer(40);
-       bottomBox->Add( cancelBtn,wxSizerFlags().Center() );
-       //Sizer
-       wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
-       sizer->Add(upper_box,1,wxEXPAND);       
-    sizer->Add(bottomBox,0,wxCENTER);
-       SetAutoLayout( TRUE );
-       SetSizer( sizer );
-       SetBestSize(wxSize(600,600));
 }
 
 //-----------------------
@@ -392,16 +576,16 @@ void HistogramDialog::OnRefreshBtn(wxCommandEvent &event)
         NOTE I NEED THE UPDATE
        */
        //if it was call from the clipping ctnrl panel
-       if(wxvtkclipping3Dview!=NULL)
-       {
-               wxvtkclipping3Dview->Refresh();
+       //if(wxvtkclipping3Dview!=NULL)
+       //{
+       //      wxvtkclipping3Dview->Refresh();
 
-       }
-       else if(wxvtkmpr3Dview!=NULL)
-       {
-               wxvtkmpr3Dview->Refresh();
+       //}
+       //else if(wxvtkmpr3Dview!=NULL)
+       //{
+       //      wxvtkmpr3Dview->Refresh();
 
-       }
+       //}
 }
 
 
@@ -524,14 +708,14 @@ void HistogramDialog::OnRefreshBtn(wxCommandEvent &event)
        {
                newvol=vol;     
        }
-       void HistogramDialog::setMPR3Dview(wxVtkMPR3DView *wxvtkmpr3Dview1)
-       {
-               wxvtkmpr3Dview=wxvtkmpr3Dview1;
-       }
-       void HistogramDialog::setClipping3DView(wxVtkClipping3DView *wxvtkclipping3Dview1)
-       {
-               wxvtkclipping3Dview=wxvtkclipping3Dview1;
-       }
+       //void HistogramDialog::setMPR3Dview(wxVtkMPR3DView *wxvtkmpr3Dview1)
+       //{
+       //      wxvtkmpr3Dview=wxvtkmpr3Dview1;
+       //}
+       //void HistogramDialog::setClipping3DView(wxVtkClipping3DView *wxvtkclipping3Dview1)
+       //{
+       //      wxvtkclipping3Dview=wxvtkclipping3Dview1;
+       //}
 
 
        void  HistogramDialog::setTransferenceFunctionHasPoints(bool hasPoints)
@@ -555,7 +739,8 @@ void HistogramDialog::OnRefreshBtn(wxCommandEvent &event)
 /**
 **     Initialize the histogram 
 */
-       void HistogramDialog::initializeHistogram(vtkImageData* img){
+       void HistogramDialog::initializeHistogram(vtkImageData* img){   
+               _maxgreyvalue = img->GetScalarRange()[1];
                histogramW->initializeHistogram(img);
        }
 /**
@@ -581,4 +766,4 @@ void HistogramDialog::GetValuesColorPointsFunction(std::vector<double>& greyleve
 void HistogramDialog::SetFunctions(vtkPiecewiseFunction* _opac, vtkColorTransferFunction* _color){
        _tfun = _opac;
        _ctfun = _color;        
-}
\ No newline at end of file
+}