00001 #include "vuTransferDialog.h"
00002
00003 #include <iostream>
00004 #include "vuColourRGBa.h"
00005 #include "../vuUtilityWindow.h"
00006 #include <wx/colordlg.h>
00007
00008
00009
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
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
00035 m_Canvas = new vuTransferCanvas(tf,this,idCANVAS,true);
00036 m_DoSpectral = (tf.getNComponents() != 4);
00037
00038
00039 m_Canvas->SetSize(400,300);
00040
00041
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
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
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
00081
00082 m_MainSizer = new wxBoxSizer(wxHORIZONTAL);
00083 wxBoxSizer *lefSizer = new wxBoxSizer(wxVERTICAL);
00084 wxBoxSizer *rigSizer = new wxBoxSizer(wxVERTICAL);
00085
00086
00087 lefSizer->Add(m_Canvas,1,wxEXPAND);
00088
00089
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();
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
00130 m_MainSizer->Add(lefSizer,1,wxEXPAND);
00131 m_MainSizer->Add(rigSizer,0,wxEXPAND);
00132
00133
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
00147 while(m_CustomSizer->GetChildren().GetCount() > 0 )
00148 m_CustomSizer->Remove(0);
00149
00150 buildCustomSizer();
00151
00152
00153 m_CustomSizer->Layout();
00154 m_MainSizer->Layout();
00155 m_MainSizer->SetSizeHints(this);
00156 m_MainSizer->Fit(this);
00157 }
00158
00159
00160
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
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
00266
00267
00268 void vuTransferDialog::OnOK(wxCommandEvent &ev)
00269 {
00270 m_IsUpdated = true;
00271 EndModal(wxID_OK);
00272 }
00273
00274
00275
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
00286
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
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
00313
00314
00315 void vuTransferDialog::OnLoadTF(wxCommandEvent &ev)
00316 {
00317
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
00343
00344
00345 void vuTransferDialog::OnSaveTF(wxCommandEvent &ev)
00346 {
00347
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
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