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