00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00040 #ifdef _USE_WXWIDGETS_
00041
00042 #include "bbwxSlider.h"
00043 #include "bbwxPackage.h"
00044 #include "bbtkUtilities.h"
00045
00046 namespace bbwx
00047 {
00048
00049
00050 class SliderWidget : public wxPanel
00051 {
00052 public:
00056 SliderWidget(Slider* box, wxWindow *parent,
00057 int orientation,
00058 bool changeresolution,
00059 bool label,
00060 wxString title,
00061 int vmin,
00062 int vmax,
00063 int value,
00064 int track);
00066 ~SliderWidget();
00069 void OnSliderTrack(wxScrollEvent& event);
00071 void OnSliderRelease(wxScrollEvent& event);
00074 void OnResolutionOfSlider(wxScrollEvent& event);
00075
00076
00077 int GetValue() { return mwxSlider->GetValue(); }
00078 void SetRange(int min, int max);
00079
00080 void RefreshLabels();
00081
00082 private:
00083 Slider* mBox;
00084 wxSlider *mwxSlider;
00085 wxSlider *mResolutionOfSlider;
00086 int min;
00087 int max;
00088 int reactiveOnTrack;
00089 wxStaticText *label_vertical;
00090 wxStaticText *label_min;
00091 wxStaticText *label_max;
00092 };
00093
00094
00095
00096
00097
00098
00099
00100 SliderWidget::SliderWidget(Slider* box, wxWindow *parent,
00101 int orientation,
00102 bool changeresolution,
00103 bool labels,
00104 wxString title,
00105 int vmin,
00106 int vmax,
00107 int value,
00108 int reactiveontrack)
00109 :
00110 wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL),
00111 mBox(box),
00112 min(vmin),
00113 max(vmax),
00114 reactiveOnTrack(reactiveontrack)
00115 {
00116 wxPanel * panel = this;
00117
00118 label_min = NULL;
00119 label_max = NULL;
00120 label_vertical = NULL;
00121 mResolutionOfSlider = NULL;
00122
00123 int sizeX,sizeY;
00124 long wxlabels=0;
00125 long wxorientation=0;
00126 if (orientation==0)
00127 {
00128 sizeX = 2;
00129 sizeY = 40;
00130 wxorientation = wxSL_HORIZONTAL;
00131 if (labels==true)
00132 {
00133 wxlabels = wxSL_LABELS;
00134 }
00135 }
00136 else
00137 {
00138 sizeX = 20;
00139 sizeY = 2;
00140 wxorientation = wxSL_VERTICAL;
00141 }
00142
00143
00144
00145
00146
00147 mwxSlider = new wxSlider( panel,
00148 -1, 0 , 0, 500 ,
00149 wxDefaultPosition,
00150 wxSize(sizeX,sizeY),
00151 wxorientation | wxlabels );
00152
00153
00154
00155
00156 mwxSlider->SetRange(min,max);
00157 mwxSlider->SetValue(value);
00158
00159
00160
00161
00162 Connect( mwxSlider->GetId(),
00163 wxEVT_SCROLL_THUMBRELEASE,
00164 (wxObjectEventFunction)
00165 (void (wxPanel::*)(wxScrollEvent&))
00166 &SliderWidget::OnSliderRelease );
00167
00168 Connect( mwxSlider->GetId(),
00169 wxEVT_SCROLL_THUMBTRACK,
00170 (wxObjectEventFunction)
00171 (void (wxPanel::*)(wxScrollEvent&))
00172 &SliderWidget::OnSliderTrack );
00173
00174 Connect( mwxSlider->GetId(),
00175 wxEVT_SCROLL_CHANGED,
00176 (wxObjectEventFunction)
00177 (void (wxPanel::*)(wxScrollEvent&))
00178 &SliderWidget::OnSliderTrack );
00179
00180
00181
00182 if (changeresolution==true){
00183
00184 mResolutionOfSlider = new wxSlider(panel,
00185 -1,5,1,10,
00186 wxDefaultPosition,
00187 wxSize(25,45),
00188 wxSL_VERTICAL |
00189 wxSL_AUTOTICKS |
00190 wxSL_LEFT );
00191
00192
00193 mResolutionOfSlider->SetRange(1,8);
00194 mResolutionOfSlider->SetValue(5);
00195
00196
00197 Connect(mResolutionOfSlider->GetId(),
00198 wxEVT_COMMAND_SLIDER_UPDATED,
00199 (wxObjectEventFunction)
00200 (void (wxPanel::*)(wxScrollEvent&))
00201 &SliderWidget::OnResolutionOfSlider );
00202 }
00203
00204
00205
00206
00207
00208
00209 wxFlexGridSizer *sizer;
00210
00211
00212 if (orientation==0)
00213 {
00214
00215 if (mResolutionOfSlider!=NULL)
00216 {
00217 sizer = new wxFlexGridSizer(2);
00218 if (title!=_T(""))
00219 {
00220 sizer -> Add( new wxStaticText(panel,-1, title ) );
00221 sizer -> Add( new wxStaticText(panel,-1, _T("") ) );
00222 }
00223 }
00224 else
00225 {
00226 sizer = new wxFlexGridSizer(1);
00227 if (title!=_T(""))
00228 {
00229 sizer -> Add( new wxStaticText(panel,-1, title ) );
00230 }
00231 }
00232 sizer -> Add( mwxSlider,1,wxGROW );
00233 sizer -> AddGrowableCol(0);
00234 if (mResolutionOfSlider!=NULL)
00235 {
00236 sizer -> Add( mResolutionOfSlider );
00237 }
00238 }
00239 else
00240 {
00241
00242 sizer = new wxFlexGridSizer(1);
00243 if (labels==true)
00244 {
00245 label_vertical = new wxStaticText(panel,-1,_T(""));
00246 label_min = new wxStaticText(panel,-1,_T(""));
00247 label_max = new wxStaticText(panel,-1,_T(""));
00248 if (title!=_T(""))
00249 {
00250 sizer -> Add( new wxStaticText(panel,-1, title ) );
00251 sizer -> AddGrowableRow(3);
00252 }
00253 else
00254 {
00255 sizer -> AddGrowableRow(2);
00256 }
00257 sizer -> Add( label_vertical );
00258 sizer -> Add( label_min );
00259 sizer -> Add( mwxSlider,1,wxGROW );
00260 sizer -> Add( label_max );
00261 if (mResolutionOfSlider!=NULL)
00262 {
00263 sizer -> Add( mResolutionOfSlider );
00264 }
00265 }
00266 else
00267 {
00268 if (title!=_T(""))
00269 {
00270 sizer -> Add( new wxStaticText(panel,-1, title ) );
00271 sizer -> AddGrowableRow(1);
00272 }
00273 else
00274 {
00275 sizer -> AddGrowableRow(0);
00276 }
00277 sizer -> Add( mwxSlider,1,wxGROW );
00278 if (mResolutionOfSlider!=NULL)
00279 {
00280 sizer -> Add( mResolutionOfSlider );
00281 }
00282 }
00283 }
00284
00285 RefreshLabels();
00286
00287 panel->SetSizer(sizer);
00288 }
00289
00290
00291
00292
00293 SliderWidget::~SliderWidget()
00294 {
00295 }
00296
00297
00298
00299
00300 void SliderWidget::OnResolutionOfSlider(wxScrollEvent& event)
00301 {
00302 int value = mwxSlider->GetValue();
00303 int delta = (int) (pow( 4 , mResolutionOfSlider->GetValue() ));
00304 int minTmp = value - delta/2;
00305 int maxTmp = value + delta/2;
00306 if (minTmp<min)
00307 {
00308 minTmp = min;
00309
00310 }
00311 if (maxTmp>max)
00312 {
00313 maxTmp = max;
00314 }
00315 mwxSlider->SetRange(minTmp,maxTmp);
00316 RefreshLabels();
00317 }
00318
00319
00320
00321
00322
00323 void SliderWidget::OnSliderTrack(wxScrollEvent& event)
00324 {
00325 if(reactiveOnTrack)
00326 {
00327
00328
00329
00330 mBox->bbSetOutputOut( mwxSlider->GetValue() );
00331 mBox->bbSetInputIn( mwxSlider->GetValue() );
00332
00333 mBox->bbSignalOutputModification(std::string("Out"));
00334 }
00335 RefreshLabels();
00336 }
00337
00338
00339
00340
00341 void SliderWidget::OnSliderRelease(wxScrollEvent& event)
00342 {
00343
00344
00345 mBox->bbSetOutputOut( mwxSlider->GetValue() );
00346 mBox->bbSetInputIn( mwxSlider->GetValue() );
00347
00348 mBox->bbSignalOutputModification(std::string("Out"));
00349 }
00350
00351
00352
00353
00354 void SliderWidget::RefreshLabels()
00355 {
00356 wxString strValue;
00357 if (label_vertical!=NULL)
00358 {
00359 strValue.Printf( _T("%d"), mwxSlider->GetValue() );
00360 label_vertical->SetLabel(strValue);
00361 }
00362 if (label_min!=NULL)
00363 {
00364 strValue.Printf( _T("%d"), mwxSlider->GetMin() );
00365 label_min->SetLabel(strValue);
00366 }
00367 if (label_max!=NULL)
00368 {
00369 strValue.Printf( _T("%d"), mwxSlider->GetMax() );
00370 label_max->SetLabel(strValue);
00371 }
00372 }
00373
00374
00375
00376
00377 void SliderWidget::SetRange(int min, int max)
00378 {
00379 this->min = min;
00380 this->max = max;
00381 mwxSlider->SetRange(min,max);
00382 RefreshLabels();
00383 }
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396 BBTK_BLACK_BOX_IMPLEMENTATION(Slider,bbtk::WxBlackBox);
00397 BBTK_ADD_BLACK_BOX_TO_PACKAGE(wx,Slider);
00398
00399
00400 void Slider::bbUserConstructor()
00401 {
00402 bbSetInputIn(0);
00403 bbSetInputMin(0);
00404 bbSetInputMax(500);
00405 bbSetOutputOut(0);
00406 bbSetInputOrientation("HORIZONTAL");
00407 bbSetInputChangeResolution(false);
00408 bbSetInputLabel(true);
00409 bbSetInputReactiveOnTrack(0);
00410 }
00411
00412
00413 void Slider::Process()
00414 {
00415 bbSetOutputOut( bbGetInputIn() );
00416 }
00417
00418 void Slider::CreateWidget(wxWindow* parent)
00419 {
00420
00421 int orientation=0;
00422 if (bbtk::Utilities::loosematch(bbGetInputOrientation(),"0|H|HORIZONTAL")==true) { orientation=0; }
00423 if (bbtk::Utilities::loosematch(bbGetInputOrientation(),"1|V|VERTICAL")==true) { orientation=1; }
00424
00425
00426
00427 SliderWidget *w = new SliderWidget(this,
00428 parent,
00429 orientation ,
00430 bbGetInputChangeResolution(),
00431 bbGetInputLabel(),
00432 bbtk::std2wx( bbGetInputTitle() ),
00433 bbGetInputMin(),
00434 bbGetInputMax(),
00435 bbGetInputIn(),
00436 bbGetInputReactiveOnTrack()
00437 );
00438
00439
00440
00441 bbSetOutputWidget( w );
00442 }
00443
00444
00445 }
00446
00447 #endif // _USE_WXWIDGETS_
00448
00449