]> Creatis software - bbtk.git/blob - packages/wx/src/bbwxSlider.cxx
Descr
[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/10/06 09:05:07 $
7   Version:   $Revision: 1.13 $
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 #ifdef _USE_WXWIDGETS_
28
29 #include "bbwxSlider.h"
30 #include "bbwxPackage.h"
31 #include "bbtkUtilities.h"
32
33 namespace bbwx
34 {
35   
36   //-------------------------------------------------------------------------
37   SliderWidget::SliderWidget(Slider* box, wxWindow *parent,
38                              int orientation,
39                              bool changeresolution,
40                              bool labels,
41                              wxString title,
42                              int vmin,
43                              int vmax,
44                              int value,
45                              int reactiveontrack)
46     :  
47     wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL),
48     mBox(box),
49     min(vmin),
50     max(vmax),
51     reactiveOnTrack(reactiveontrack)
52   {
53     wxPanel * panel = this;
54     
55     label_min           = NULL;
56     label_max           = NULL;
57     label_vertical      = NULL;
58     mResolutionOfSlider = NULL;
59
60     int sizeX,sizeY;
61     long wxlabels=0;
62     long wxorientation=0;
63     if (orientation==0) 
64       {
65         sizeX                   = 2;
66         sizeY                   = 40;
67         wxorientation   = wxSL_HORIZONTAL;
68         if (labels==true)
69           {
70             wxlabels = wxSL_LABELS;
71           }
72       } 
73     else 
74       {
75         sizeX                   = 20;
76         sizeY                   = 2;
77         wxorientation   = wxSL_VERTICAL;
78       }
79     
80     //---------------------------------------------------------------------
81     // 1) Creation of the components of the widget
82     // Any top level sub-widget must have the panel returned by panel
83     // for parent
84     mwxSlider = new wxSlider( panel, 
85                               -1, 0 , 0, 500 , 
86                               wxDefaultPosition, 
87                               wxSize(sizeX,sizeY), 
88                               wxorientation  | wxlabels );
89
90     //    mwxSlider->SetInitialSize(wxSize(sizeX,sizeY));
91
92     //  mwxSlider->SetTickFreq(100,0);
93     mwxSlider->SetRange(min,max);
94     mwxSlider->SetValue(value);
95
96     //    RefreshLabels();
97
98     // Connecting events to callbacks
99     Connect( mwxSlider->GetId(), 
100              wxEVT_SCROLL_THUMBRELEASE, 
101
102              (wxObjectEventFunction) 
103              (void (wxPanel::*)(wxScrollEvent&))
104              &SliderWidget::OnSliderRelease ); 
105
106     Connect( mwxSlider->GetId(),  
107              wxEVT_SCROLL_THUMBTRACK, 
108
109              (wxObjectEventFunction) 
110              (void (wxPanel::*)(wxScrollEvent&))
111               &SliderWidget::OnSliderTrack ); 
112     
113     Connect( mwxSlider->GetId(),  
114              wxEVT_SCROLL_CHANGED, 
115
116              (wxObjectEventFunction) 
117              (void (wxPanel::*)(wxScrollEvent&))
118               &SliderWidget::OnSliderTrack );
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   }
229   //-------------------------------------------------------------------------
230   
231
232   //-------------------------------------------------------------------------
233   SliderWidget::~SliderWidget()
234   {
235   }
236   //-------------------------------------------------------------------------
237
238
239   //-------------------------------------------------------------------------
240   void SliderWidget::OnResolutionOfSlider(wxScrollEvent& event)
241   {
242     int value = mwxSlider->GetValue();
243     int delta = (int) (pow( 4 , mResolutionOfSlider->GetValue() ));
244     int minTmp   = value - delta/2;
245     int maxTmp   = value + delta/2;
246     if (minTmp<min)
247       {
248         minTmp = min;
249         //              maxTmp = delta;
250       }
251     if (maxTmp>max)
252       {
253         maxTmp = max;
254       }
255     mwxSlider->SetRange(minTmp,maxTmp);
256     RefreshLabels();
257   }
258   //-------------------------------------------------------------------------
259
260
261
262   //-------------------------------------------------------------------------
263   void SliderWidget::OnSliderTrack(wxScrollEvent& event)
264   {
265     if(reactiveOnTrack)
266     {
267     // When user releases the slider 
268     // we update the output of the box
269     
270     mBox->bbSetOutputOut( mwxSlider->GetValue() );
271     mBox->bbSetInputIn( mwxSlider->GetValue() );
272     // and signal that the output has changed
273     mBox->bbSignalOutputModification("Out");    
274     }
275     RefreshLabels();
276   }
277   //-------------------------------------------------------------------------
278
279
280   //-------------------------------------------------------------------------
281   void SliderWidget::OnSliderRelease(wxScrollEvent& event)
282   {
283     // When user releases the slider 
284     // we update the output of the box
285     mBox->bbSetOutputOut( mwxSlider->GetValue() );
286     mBox->bbSetInputIn( mwxSlider->GetValue() );
287     // and signal that the output has changed
288     mBox->bbSignalOutputModification("Out");
289   }
290   //-------------------------------------------------------------------------
291   
292
293   //-------------------------------------------------------------------------
294   void SliderWidget::RefreshLabels()
295   {
296     wxString strValue;
297     if (label_vertical!=NULL)
298       {
299         strValue.Printf( _T("%d"), mwxSlider->GetValue() );
300         label_vertical->SetLabel(strValue);
301       }
302     if (label_min!=NULL)
303       {
304         strValue.Printf( _T("%d"), mwxSlider->GetMin() );
305         label_min->SetLabel(strValue);
306       }
307     if (label_max!=NULL)
308       {
309         strValue.Printf( _T("%d"), mwxSlider->GetMax() );
310         label_max->SetLabel(strValue);
311       }  
312   }
313   //-------------------------------------------------------------------------
314   
315
316   //-------------------------------------------------------------------------
317   void SliderWidget::SetRange(int min, int max)
318   {
319     this->min = min;
320     this->max = max;
321     mwxSlider->SetRange(min,max);
322     RefreshLabels();
323   }
324   //-------------------------------------------------------------------------
325
326  
327
328
329   //--------------------------------------------------------------------------
330   //-------------------------------------------------------------------------
331   // WxBlackBox implementation
332   //--------------------------------------------------------------------------
333   //--------------------------------------------------------------------------
334
335   //--------------------------------------------------------------------------
336   BBTK_BLACK_BOX_IMPLEMENTATION(Slider,bbtk::WxBlackBox);
337   BBTK_ADD_BLACK_BOX_TO_PACKAGE(wx,Slider);
338   
339   //--------------------------------------------------------------------------
340   void Slider::bbUserConstructor() 
341   { 
342     bbSetInputIn(0);
343     bbSetInputMin(0);
344     bbSetInputMax(500);
345     bbSetOutputOut(0);
346     bbSetInputOrientation("HORIZONTAL");
347     bbSetInputChangeResolution(false);
348     bbSetInputLabel(true);
349     bbSetInputReactiveOnTrack(0);    
350   }
351   
352   //--------------------------------------------------------------------------
353   void Slider::Process() 
354   {
355     bbSetOutputOut( bbGetInputIn() );
356   }
357
358   void Slider::CreateWidget()
359   {
360
361     int orientation=0;
362     if (bbtk::Utilities::loosematch(bbGetInputOrientation(),"0|H|HORIZONTAL")==true)  { orientation=0; }
363     if (bbtk::Utilities::loosematch(bbGetInputOrientation(),"1|V|VERTICAL")==true)    { orientation=1; }
364     
365     
366     //    std::cout << "bbGetWxParent = "<<bbGetWxParent()<<std::endl;
367     SliderWidget *w =  new SliderWidget(this, 
368                                         bbGetWxParent(),
369                                         orientation , 
370                                         bbGetInputChangeResolution(), 
371                                         bbGetInputLabel(), 
372                                         bbtk::std2wx( bbGetInputTitle() ),
373                                         bbGetInputMin(), 
374                                         bbGetInputMax(),
375                                         bbGetInputIn(),
376                                         bbGetInputReactiveOnTrack()
377                                         ); 
378     //    std::cout << "w = "<<w<<std::endl;
379     //  w->SetName( bbtk::std2wx( bbGetInputWinTitle() ) );
380           
381     bbSetOutputWidget( w );
382   }
383   
384
385 } //namespace bbwx
386
387 #endif // _USE_WXWIDGETS_ 
388
389