]> Creatis software - bbtk.git/blob - packages/wx/src/bbwxSlider.cxx
*** empty log message ***
[bbtk.git] / packages / wx / src / bbwxSlider.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbwxSlider.cxx,v $
5   Language:  C++
6   Date:      $Date: 2008/02/12 20:08:12 $
7   Version:   $Revision: 1.7 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18 /**
19  * \file 
20  * \brief Short description in one line
21  *
22  * Long 
23  * description
24  *  
25  */
26
27
28 #ifdef _USE_WXWIDGETS_
29
30
31
32 #include "bbwxSlider.h"
33 #include "bbwxPackage.h"
34 #include "bbtkUtilities.h"
35
36
37
38
39 namespace bbwx
40 {
41   
42   //-------------------------------------------------------------------------
43   SliderWidget::SliderWidget(Slider* box, wxWindow *parent,
44                              int orientation,
45                              bool changeresolution,
46                              bool labels,
47                              wxString title,
48                              int vmin,
49                              int vmax,
50                              int value,
51               int reactiveontrack)
52     :  
53     wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL),
54     mBox(box),
55     min(vmin),
56     max(vmax),
57     reactiveOnTrack(reactiveontrack)
58   {
59     wxPanel * panel = this;
60     
61     label_min           = NULL;
62     label_max           = NULL;
63     label_vertical      = NULL;
64     mResolutionOfSlider = NULL;
65
66     int sizeX,sizeY;
67     long wxlabels=0;
68     long wxorientation=0;
69     if (orientation==0) 
70       {
71         sizeX                   = 2;
72         sizeY                   = 40;
73         wxorientation   = wxSL_HORIZONTAL;
74         if (labels==true)
75           {
76             wxlabels = wxSL_LABELS;
77           }
78       } 
79     else 
80       {
81         sizeX                   = 20;
82         sizeY                   = 2;
83         wxorientation   = wxSL_VERTICAL;
84       }
85     
86     //---------------------------------------------------------------------
87     // 1) Creation of the components of the widget
88     // Any top level sub-widget must have the panel returned by panel
89     // for parent
90     mwxSlider = new wxSlider( panel, 
91                               -1, 0 , 0, 500 , 
92                               wxDefaultPosition, 
93                               wxSize(sizeX,sizeY), 
94                               wxorientation  | wxlabels );
95
96     //    mwxSlider->SetInitialSize(wxSize(sizeX,sizeY));
97
98     //  mwxSlider->SetTickFreq(100,0);
99     mwxSlider->SetRange(min,max);
100     mwxSlider->SetValue(value);
101
102     //    RefreshLabels();
103
104     // Connecting events to callbacks
105     Connect( mwxSlider->GetId(), 
106              wxEVT_SCROLL_THUMBRELEASE, 
107
108              (wxObjectEventFunction) 
109              (void (wxPanel::*)(wxScrollEvent&))
110              &SliderWidget::OnSliderRelease ); 
111
112     Connect( mwxSlider->GetId(),  
113              wxEVT_SCROLL_THUMBTRACK, 
114
115              (wxObjectEventFunction) 
116              (void (wxPanel::*)(wxScrollEvent&))
117               &SliderWidget::OnSliderTrack ); 
118     
119
120     // If asked : creation of the other little slider which allows to change 
121     // the resolution of the main slider
122     if (changeresolution==true){
123       // has panel for parent too
124       mResolutionOfSlider = new wxSlider(panel,
125                                          -1,5,1,10,
126                                          wxDefaultPosition,
127                                          wxSize(25,45),
128                                          wxSL_VERTICAL | 
129                                          wxSL_AUTOTICKS |
130                                          wxSL_LEFT  );
131    
132
133       mResolutionOfSlider->SetRange(1,8);
134       mResolutionOfSlider->SetValue(5);
135       // Is wxEVT_COMMAND_SLIDER_UPDATED event 
136       // is connected to the method OnResolutionOfSlider
137       Connect(mResolutionOfSlider->GetId(),
138               wxEVT_COMMAND_SLIDER_UPDATED,
139               (wxObjectEventFunction) 
140               (void (wxPanel::*)(wxScrollEvent&))
141               &SliderWidget::OnResolutionOfSlider ); 
142     }
143     //---------------------------------------------------------------------
144
145     //---------------------------------------------------------------------
146     // 2) Insertion of the components in the window
147     
148     // We use a FlexGridSizer
149     wxFlexGridSizer *sizer;
150
151
152     if (orientation==0) 
153       {
154         // HORIZONTAL
155         if (mResolutionOfSlider!=NULL) 
156           {
157             sizer       = new wxFlexGridSizer(2);
158             if (title!=_T(""))
159               {
160                 sizer   -> Add( new wxStaticText(panel,-1, title ) ); 
161                 sizer   -> Add( new wxStaticText(panel,-1, _T("") ) ); 
162               }
163           } 
164         else 
165           {
166             sizer       = new wxFlexGridSizer(1);
167             if (title!=_T(""))
168               {
169                 sizer   -> Add( new wxStaticText(panel,-1, title ) ); 
170               }
171           }
172         sizer   -> Add( mwxSlider,1,wxGROW ); 
173         sizer   -> AddGrowableCol(0);
174         if (mResolutionOfSlider!=NULL) 
175           {
176             sizer       -> Add( mResolutionOfSlider ); 
177           }
178       } 
179     else 
180       {
181         // VERTICAL 
182         sizer   = new wxFlexGridSizer(1);
183         if (labels==true)  // with lable
184           {
185             label_vertical = new wxStaticText(panel,-1,_T(""));
186             label_min = new wxStaticText(panel,-1,_T(""));
187             label_max = new wxStaticText(panel,-1,_T(""));
188             if (title!=_T(""))
189               {
190                 sizer   -> Add( new wxStaticText(panel,-1, title ) );
191                 sizer   -> AddGrowableRow(3);
192               } 
193             else 
194               {
195                 sizer   -> AddGrowableRow(2);
196               }
197             sizer       -> Add( label_vertical );
198             sizer       -> Add( label_min );
199             sizer       -> Add( mwxSlider,1,wxGROW );
200             sizer       -> Add( label_max );
201             if (mResolutionOfSlider!=NULL) 
202               {
203                 sizer   -> Add( mResolutionOfSlider ); 
204               }
205           } 
206         else 
207           {
208             if (title!=_T(""))
209               {
210                 sizer   -> Add( new wxStaticText(panel,-1, title ) );
211                 sizer   -> AddGrowableRow(1);
212               } 
213             else 
214               {
215                 sizer   -> AddGrowableRow(0);
216               }
217             sizer       -> Add( mwxSlider,1,wxGROW );
218             if (mResolutionOfSlider!=NULL) 
219               {
220                 sizer   -> Add( mResolutionOfSlider ); 
221               }
222           }
223       }
224     // Initialize the labels 
225     RefreshLabels();  
226     // Insert the sizer in the main panel and refresh the layout
227     panel->SetSizer(sizer);
228     //   panel->SetAutoLayout(true);
229     //    panel->Layout();
230   }
231   //-------------------------------------------------------------------------
232   
233
234   //-------------------------------------------------------------------------
235   SliderWidget::~SliderWidget()
236   {
237   }
238   //-------------------------------------------------------------------------
239
240
241   //-------------------------------------------------------------------------
242   void SliderWidget::OnResolutionOfSlider(wxScrollEvent& event)
243   {
244     int value = mwxSlider->GetValue();
245     int delta = (int) (pow( 4 , mResolutionOfSlider->GetValue() ));
246     int minTmp   = value - delta/2;
247     int maxTmp   = value + delta/2;
248     if (minTmp<min)
249       {
250         minTmp = min;
251         //              maxTmp = delta;
252       }
253     if (maxTmp>max)
254       {
255         maxTmp = max;
256       }
257     mwxSlider->SetRange(minTmp,maxTmp);
258     RefreshLabels();
259   }
260   //-------------------------------------------------------------------------
261
262
263
264   //-------------------------------------------------------------------------
265   void SliderWidget::OnSliderTrack(wxScrollEvent& event)
266   {
267     if(reactiveOnTrack)
268     {
269     // When user releases the slider 
270     // we update the output of the box
271     mBox->bbSetOutputOut( mwxSlider->GetValue() );
272     mBox->bbSetInputIn( mwxSlider->GetValue() );
273     // and signal that the output has changed
274     mBox->bbSignalOutputModification("Out");    
275     }
276     RefreshLabels();  
277   }
278   //-------------------------------------------------------------------------
279
280
281   //-------------------------------------------------------------------------
282   void SliderWidget::OnSliderRelease(wxScrollEvent& event)
283   {
284     // When user releases the slider 
285     // we update the output of the box
286     mBox->bbSetOutputOut( mwxSlider->GetValue() );
287     mBox->bbSetInputIn( mwxSlider->GetValue() );
288     // and signal that the output has changed
289     mBox->bbSignalOutputModification("Out");
290   }
291   //-------------------------------------------------------------------------
292   
293
294   //-------------------------------------------------------------------------
295   void SliderWidget::RefreshLabels()
296   {
297     wxString strValue;
298     if (label_vertical!=NULL)
299       {
300         strValue.Printf( _T("%d"), mwxSlider->GetValue() );
301         label_vertical->SetLabel(strValue);
302       }
303     if (label_min!=NULL)
304       {
305         strValue.Printf( _T("%d"), mwxSlider->GetMin() );
306         label_min->SetLabel(strValue);
307       }
308     if (label_max!=NULL)
309       {
310         strValue.Printf( _T("%d"), mwxSlider->GetMax() );
311         label_max->SetLabel(strValue);
312       }  
313   }
314   //-------------------------------------------------------------------------
315   
316
317   //-------------------------------------------------------------------------
318   void SliderWidget::SetRange(int min, int max)
319   {
320     this->min = min;
321     this->max = max;
322     mwxSlider->SetRange(min,max);
323     RefreshLabels();
324   }
325   //-------------------------------------------------------------------------
326
327  
328
329
330   //--------------------------------------------------------------------------
331   //-------------------------------------------------------------------------
332   // WxBlackBox implementation
333   //--------------------------------------------------------------------------
334   //--------------------------------------------------------------------------
335
336   //--------------------------------------------------------------------------
337   BBTK_USER_BLACK_BOX_IMPLEMENTATION(Slider,bbtk::WxBlackBox);
338   BBTK_ADD_BLACK_BOX_TO_PACKAGE(wx,Slider);
339   
340   //--------------------------------------------------------------------------
341   void Slider::bbUserConstructor() 
342   { 
343     bbSetInputIn(0);
344     bbSetInputMin(0);
345     bbSetInputMax(500);
346     bbSetOutputOut(0);
347     bbSetInputOrientation("HORIZONTAL");
348     bbSetInputChangeResolution(false);
349     bbSetInputLabel(true);
350     bbSetInputReactiveOnTrack(0);    
351   }
352   
353   //--------------------------------------------------------------------------
354   void Slider::Process() 
355   {
356     bbSetOutputOut( bbGetInputIn() );
357   }
358
359   void Slider::CreateWidget()
360   {
361
362          int orientation=0;
363          if (bbtk::Utilities::loosematch(bbGetInputOrientation(),"0|H|HORIZONTAL")==true)  { orientation=0; }
364          if (bbtk::Utilities::loosematch(bbGetInputOrientation(),"1|V|VERTICAL")==true)    { orientation=1; }
365           
366           SliderWidget *w =  new SliderWidget(this, 
367                                                 bbGetWxParent(),
368                                                 orientation , 
369                                                 bbGetInputChangeResolution(), 
370                                                 bbGetInputLabel(), 
371                                                 bbtk::std2wx( bbGetInputTitle() ),
372                                                 bbGetInputMin(), 
373                                                 bbGetInputMax(),
374                                                 bbGetInputIn(),
375                                                 bbGetInputReactiveOnTrack()
376                                                 ); 
377           //    w->SetName( bbtk::std2wx( bbGetInputWinTitle() ) );
378           
379     bbSetOutputWidget( w );
380   }
381   
382
383 } //namespace bbwx
384
385 #endif // _USE_WXWIDGETS_ 
386
387