Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

vuTransferDialog.cpp

Go to the documentation of this file.
00001 #include "vuTransferDialog.h"
00002 
00003 #include <iostream>
00004 #include "vuColourRGBa.h"
00005 #include "../vuUtilityWindow.h"
00006 #include <wx/colordlg.h>
00007 
00008 //----------------------------------------------------------------------------
00009 //------------------------- The vuTransferDialog event table -----------------
00010 //----------------------------------------------------------------------------
00011 
00012 BEGIN_EVENT_TABLE(vuTransferDialog, wxDialog)
00013   EVT_COMMAND(vuTransferDialog::idCANVAS,
00014               vuEVT_TRANSFER_NODE_SELECT, vuTransferDialog::OnSelect)
00015   EVT_COMMAND(vuTransferDialog::idCANVAS,
00016               vuEVT_TRANSFER_NODE_OPEN, vuTransferDialog::OnOpen)
00017   EVT_COMMAND(vuTransferDialog::idCANVAS,
00018               vuEVT_TRANSFER_CHANGE, vuTransferDialog::OnSelect)
00019   EVT_BUTTON(vuTransferDialog::idUPDATE, vuTransferDialog::OnUpdate)
00020   EVT_BUTTON(vuTransferDialog::idLOADTF, vuTransferDialog::OnLoadTF)
00021   EVT_BUTTON(vuTransferDialog::idSAVETF, vuTransferDialog::OnSaveTF)
00022   EVT_BUTTON(wxID_OK, vuTransferDialog::OnOK)
00023   EVT_BUTTON(wxID_CANCEL, wxDialog::OnCancel)
00024 END_EVENT_TABLE()
00025 
00026 //----------------------------------------------------------------------------
00027 //------------------------- The constructor ----------------------------------
00028 //----------------------------------------------------------------------------
00029 
00030 vuTransferDialog::vuTransferDialog(wxWindow *parent, vuTFDesign &tf)
00031     : wxDialog(parent,-1, wxString("Transfer Function Editor"),
00032                wxDefaultPosition,wxDefaultSize,wxDEFAULT_DIALOG_STYLE)
00033 {
00034     //Create the OpenGL canvas.
00035     m_Canvas = new vuTransferCanvas(tf,this,idCANVAS,true);
00036     m_DoSpectral = (tf.getNComponents() != 4);
00037 
00038     //m_Canvas->setTransferFunc(tf);
00039     m_Canvas->SetSize(400,300);
00040 
00041     //Create the text controls, all accepting only numeric input.
00042     wxSize size(35,-1);
00043     tInte = new wxTextCtrl(this,-1,"",wxDefaultPosition,size,0,
00044                            wxTextValidator(wxFILTER_NUMERIC));
00045     tOpac = new wxTextCtrl(this,-1,"",wxDefaultPosition,size,0,
00046                            wxTextValidator(wxFILTER_NUMERIC));
00047     tOpacSmooth = new wxTextCtrl(this,-1,"",wxDefaultPosition,size,0,
00048                                  wxTextValidator(wxFILTER_NUMERIC));
00049     tColSmooth = new wxTextCtrl(this,-1,"",wxDefaultPosition,size,0,
00050                                 wxTextValidator(wxFILTER_NUMERIC));
00051     if(m_DoSpectral) {
00052         //choose small size to make them invisible...
00053         tr = new wxTextCtrl(this,-1,"",wxDefaultPosition,wxSize(1,1),0,
00054                             wxTextValidator(wxFILTER_NUMERIC));
00055         tg = new wxTextCtrl(this,-1,"",wxDefaultPosition,wxSize(1,1),0,
00056                             wxTextValidator(wxFILTER_NUMERIC));
00057         tb = new wxTextCtrl(this,-1,"",wxDefaultPosition,wxSize(1,1),0,
00058                             wxTextValidator(wxFILTER_NUMERIC));
00059     } else {
00060         tr = new wxTextCtrl(this,-1,"",wxDefaultPosition,size,0,
00061                             wxTextValidator(wxFILTER_NUMERIC));
00062         tg = new wxTextCtrl(this,-1,"",wxDefaultPosition,size,0,
00063                             wxTextValidator(wxFILTER_NUMERIC));
00064         tb = new wxTextCtrl(this,-1,"",wxDefaultPosition,size,0,
00065                             wxTextValidator(wxFILTER_NUMERIC));
00066     }
00067     tr->Enable(false);
00068     tg->Enable(false);
00069     tb->Enable(false);
00070 
00071     //Set up the initial values
00072     tInte->Enable(false);
00073     tOpac->Enable(false);
00074     wxString temp;
00075     temp.Printf("%g",tf.getOpacitySmoothing());
00076     tOpacSmooth->SetValue(temp);
00077     temp.Printf("%g",tf.getColourSmoothing());
00078     tColSmooth->SetValue(temp);
00079 
00080     //Now create the UI for the dialog
00081     //First the sizers.
00082     m_MainSizer = new wxBoxSizer(wxHORIZONTAL);
00083     wxBoxSizer *lefSizer = new wxBoxSizer(wxVERTICAL);
00084     wxBoxSizer *rigSizer = new wxBoxSizer(wxVERTICAL);
00085 
00086     //Add the glCanvas.
00087     lefSizer->Add(m_Canvas,1,wxEXPAND);
00088 
00089     //Add the editing controls
00090     wxBoxSizer *inteSizer = new wxBoxSizer(wxHORIZONTAL);
00091     inteSizer->Add(new wxStaticText(this,-1,"Intensity:"),0,wxALL|wxALIGN_LEFT,1);
00092     inteSizer->Add(tInte,1,wxALL|wxEXPAND,1);
00093     rigSizer->Add(inteSizer,0,wxALIGN_CENTER);
00094     wxBoxSizer *opacSizer = new wxBoxSizer(wxHORIZONTAL);
00095     opacSizer->Add(new wxStaticText(this,-1,"Opacity:"),0,wxALL|wxALIGN_LEFT,1);
00096     opacSizer->Add(tOpac,1,wxALL|wxEXPAND,1);
00097     rigSizer->Add(opacSizer,0,wxALIGN_CENTER);
00098     if(!m_DoSpectral) {
00099         wxBoxSizer *colourSizer = new wxStaticBoxSizer(new wxStaticBox(this,-1,"Colour"),
00100                                                        wxHORIZONTAL);
00101         colourSizer->Add(tr,1,wxALL|wxEXPAND,1);
00102         colourSizer->Add(tg,1,wxALL|wxEXPAND,1);
00103         colourSizer->Add(tb,1,wxALL|wxEXPAND,1);
00104         rigSizer->Add(colourSizer,0,wxALIGN_CENTER);
00105     }
00106     wxBoxSizer *opasmSizer = new wxBoxSizer(wxHORIZONTAL);
00107     opasmSizer->Add(new wxStaticText(this,-1,"Opacity Smoothing:"),0,wxALIGN_LEFT|wxALL,1);
00108     opasmSizer->Add(tOpacSmooth,1,wxALL|wxEXPAND,1);
00109     rigSizer->Add(opasmSizer,0,wxALIGN_CENTER);
00110     wxBoxSizer *colsmSizer = new wxBoxSizer(wxHORIZONTAL);
00111     colsmSizer->Add(new wxStaticText(this,-1,"Colour Smoothing:"),0,wxALIGN_LEFT|wxALL,1);
00112     colsmSizer->Add(tColSmooth,1,wxALL|wxEXPAND,1);
00113     rigSizer->Add(colsmSizer,0,wxALIGN_CENTER);
00114     rigSizer->Add(20,5,0,wxALIGN_CENTER|wxALL);
00115     rigSizer->Add(new wxButton(this,idUPDATE,"Update"),0,wxALIGN_CENTER|wxALL,1);
00116     rigSizer->Add(new wxButton(this,idLOADTF,"Load..."),0,wxALIGN_CENTER|wxALL,1);
00117     rigSizer->Add(new wxButton(this,idSAVETF,"Save..."),0,wxALIGN_CENTER|wxALL,1);
00118 
00119     m_CustomSizer = new wxBoxSizer(wxVERTICAL);
00120     buildCustomSizer(); //since it's virtual the basic version will be called
00121     rigSizer->Add(m_CustomSizer,0,wxALIGN_CENTER);
00122     
00123     rigSizer->Add(20,20,1,wxALIGN_CENTER|wxALL|wxEXPAND);
00124     wxBoxSizer *butSizer = new wxBoxSizer(wxHORIZONTAL);
00125     butSizer->Add(new wxButton(this,wxID_OK,"OK"),0,wxALIGN_CENTER|wxALL,1);
00126     butSizer->Add(new wxButton(this,wxID_CANCEL,"Hide"),0,wxALIGN_CENTER|wxALL,1);
00127     rigSizer->Add(butSizer,0,wxALIGN_CENTER);
00128 
00129     //Construct the Dialog architecture.
00130     m_MainSizer->Add(lefSizer,1,wxEXPAND);
00131     m_MainSizer->Add(rigSizer,0,wxEXPAND);
00132 
00133     //Set the Dialog up to use the sizers
00134     SetSizer(m_MainSizer);
00135     SetAutoLayout(true);
00136     m_MainSizer->Layout();
00137         
00138     m_MainSizer->SetSizeHints(this);
00139     m_MainSizer->Fit(this);
00140     m_IsUpdated = true;
00141 }
00142 
00143 void vuTransferDialog::rebuildCustomSizer()
00144 {
00145     if(!m_CustomSizer) return;
00146     //remove all elements from the sizer
00147     while(m_CustomSizer->GetChildren().GetCount() > 0 )
00148                 m_CustomSizer->Remove(0);
00149     
00150         buildCustomSizer();
00151 
00152     //Set the Dialog up to use the sizers
00153     m_CustomSizer->Layout();    // recalc layout
00154     m_MainSizer->Layout();
00155     m_MainSizer->SetSizeHints(this);
00156     m_MainSizer->Fit(this);
00157 }
00158 
00159 //----------------------------------------------------------------------------
00160 //------------------------- private: OnSelect() ------------------------------
00161 //----------------------------------------------------------------------------
00162 
00163 void vuTransferDialog::OnSelect(wxCommandEvent &ev)
00164 {
00165     const vuTFDesign::OpacityNode *con = m_Canvas->getActiveOpacity();
00166     const vuTFDesign::ColourNode *col = m_Canvas->getActiveColour();
00167     wxString temp;
00168 
00169     if (con != 0) 
00170     {
00171         temp.Printf("%i",con->intensity);
00172         tInte->SetValue(temp);
00173         tInte->Enable(true);
00174 
00175         temp.Printf("%g",con->opacity);
00176         tOpac->SetValue(temp);
00177         tOpac->Enable(true);
00178 
00179         tr->SetValue("");
00180         tr->Enable(false); 
00181 
00182         tg->SetValue("");
00183         tg->Enable(false); 
00184 
00185         tb->SetValue("");
00186         tb->Enable(false);
00187     }
00188     else if (col != 0 && !m_DoSpectral)
00189     {
00190         temp.Printf("%i",col->intensity);
00191         tInte->SetValue(temp);
00192         tInte->Enable(true);
00193 
00194         tOpac->SetValue("");
00195         tOpac->Enable(false);
00196 
00197         temp.Printf("%g",col->col[0]);
00198         tr->SetValue(temp);
00199         tr->Enable(true);
00200 
00201         temp.Printf("%g",col->col[1]);
00202         tg->SetValue(temp);
00203         tg->Enable(true);
00204 
00205         temp.Printf("%g",col->col[2]);
00206         tb->SetValue(temp);
00207         tb->Enable(true);
00208     }
00209     else
00210     {
00211         tInte->SetValue("");
00212         tInte->Enable(false);
00213 
00214         tOpac->SetValue("");
00215         tOpac->Enable(false);
00216 
00217         tr->SetValue("");
00218         tr->Enable(false); 
00219 
00220         tg->SetValue("");
00221         tg->Enable(false); 
00222 
00223         tb->SetValue("");
00224         tb->Enable(false);
00225     }
00226 }
00227 
00228 //----------------------------------------------------------------------------
00229 //------------------------- private: OnOpen() --------------------------------
00230 //----------------------------------------------------------------------------
00231 
00232 void vuTransferDialog::OnOpen(wxCommandEvent &ev)
00233 {
00234     const vuTFDesign::ColourNode *coln = m_Canvas->getActiveColour();
00235     
00236     if (coln != 0)
00237     {
00238       if(!m_DoSpectral) {
00239         wxColourData Data;
00240         wxColour Col(byte(coln->col[0]*256),byte(coln->col[1]*256),byte(coln->col[2]*256));
00241         Data.SetCustomColour(0,Col);
00242         Data.SetColour(Col);
00243         wxColourDialog dialog(this,&Data);
00244 
00245         if (dialog.ShowModal() == wxID_OK)
00246         {
00247             Data = dialog.GetColourData();
00248             Col = Data.GetColour();
00249 
00250             vuTFDesign::ColourNode cn(coln->intensity, 4,
00251                                       vuColourRGBa((float)Col.Red()/256,
00252                                                    (float)Col.Green()/256,
00253                                                    (float)Col.Blue()/256));
00254             m_Canvas->setActiveColour(&cn);
00255         }
00256       } else {
00257           vuTFDesign &tf = m_Canvas->getTransferFunc();
00258           editSpecColour(tf.getColourNodeIndex(*coln));
00259       }
00260     }
00261     m_IsUpdated = true;
00262 }
00263 
00264 //----------------------------------------------------------------------------
00265 //------------------------- private: OnOk() ----------------------------------
00266 //----------------------------------------------------------------------------
00267 
00268 void vuTransferDialog::OnOK(wxCommandEvent &ev)
00269 {
00270     m_IsUpdated = true;
00271     EndModal(wxID_OK);
00272 }
00273 
00274 //----------------------------------------------------------------------------
00275 //------------------------- private: OnUpdate() ------------------------------
00276 //----------------------------------------------------------------------------
00277 
00278 void vuTransferDialog::OnUpdate(wxCommandEvent &ev)
00279 {
00280     long intensity; 
00281     double opacity;
00282     double r,g,b;
00283     double OpacSmooth, ColSmooth;
00284 
00285     //Figure out what kind of control node is being edited
00286     //by the text controls that are enabled
00287     if (tOpac->IsEnabled() && tInte->GetValue().ToLong(&intensity) &&
00288         tOpac->GetValue().ToDouble(&opacity))
00289     {
00290         vuTFDesign::OpacityNode cn((byte)intensity,(float)opacity);
00291         m_Canvas->setActiveOpacity(&cn);
00292     }
00293     else if (tr->IsEnabled() && tInte->GetValue().ToLong(&intensity) &&
00294         tr->GetValue().ToDouble(&r) && tg->GetValue().ToDouble(&g) &&
00295         tb->GetValue().ToDouble(&b))
00296     {
00297       vuTFDesign::ColourNode cn((byte)intensity, 4,
00298                                 vuColourRGBa((float)r,(float)g,(float)b));
00299       m_Canvas->setActiveColour(&cn);
00300     }
00301 
00302     //Update the opacity and colour smoothing
00303     if (tOpacSmooth->GetValue().ToDouble(&OpacSmooth) &&
00304         tColSmooth->GetValue().ToDouble(&ColSmooth))
00305     {
00306         m_Canvas->setSmoothing((float)OpacSmooth,(float)ColSmooth);
00307     }
00308     m_IsUpdated = true;
00309 }
00310 
00311 //----------------------------------------------------------------------------
00312 //------------------------- private: OnLoadTF() ------------------------------
00313 //----------------------------------------------------------------------------
00314 
00315 void vuTransferDialog::OnLoadTF(wxCommandEvent &ev)
00316 {
00317   //open load dialog, ...
00318   wxFileDialog fd(this,"Choose a file","","","*.tf",wxOPEN);
00319   if(fd.ShowModal() == wxID_OK)
00320     {
00321 
00322       cout<<"loading... "<<fd.GetPath()<<endl;
00323       try {
00324           vuTFDesign &tf = m_Canvas->getTransferFunc();
00325           if(tf.loadTF(fd.GetPath()))
00326           {
00327               cout<<"successful."<<endl;
00328               tf.generateFunction();
00329                   rebuildCustomSizer();
00330           } else {
00331               cout<<"failed."<<endl;
00332           }
00333       } catch (char *msg) {
00334           printf("%s\n",msg);
00335       }
00336       m_Canvas->redraw();
00337     }
00338     m_IsUpdated = true;
00339 }
00340 
00341 //----------------------------------------------------------------------------
00342 //------------------------- private: OnSaveTF() ------------------------------
00343 //----------------------------------------------------------------------------
00344 
00345 void vuTransferDialog::OnSaveTF(wxCommandEvent &ev)
00346 {
00347   //open save dialog, ...
00348   wxFileDialog fd(this,"Choose a file","","","*.tf",wxSAVE|wxOVERWRITE_PROMPT);
00349   if(fd.ShowModal() == wxID_OK)
00350     {
00351 
00352       cout<<"saving... "<<fd.GetPath()<<endl;
00353       try {
00354           vuTFDesign &tf = m_Canvas->getTransferFunc();
00355           if(tf.saveTF(fd.GetPath()))
00356               cout<<"successful."<<endl;
00357           else
00358               cout<<"failed."<<endl;
00359       } catch (char *msg) {
00360           printf("%s\n",msg);
00361       }
00362     }
00363 }
00364 
00365 
00366 //----------------------------------------------------------------------------
00367 //------------------------- public: getTransferFunc() ------------------------
00368 //----------------------------------------------------------------------------
00369 
00370 const vuTFDesign& vuTransferDialog::getTransferFunc() const
00371 {
00372     return m_Canvas->getTransferFunc();
00373 }
00374 
00375 void vuTransferDialog::repaintParent() const
00376 {
00377     ((vuUtilityWindow*)GetParent())->notifyDataChanged();
00378 }
00379 

Generated on Wed Dec 15 21:20:38 2004 for vuVolume by  doxygen 1.3.9.1