]> Creatis software - bbtk.git/blob - packages/wx/src/bbwxSlider.cxx
=== MAJOR RELEASE ====
[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/04/18 12:59:53 $
7   Version:   $Revision: 1.11 $
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
114     // If asked : creation of the other little slider which allows to change 
115     // the resolution of the main slider
116     if (changeresolution==true){
117       // has panel for parent too
118       mResolutionOfSlider = new wxSlider(panel,
119                                          -1,5,1,10,
120                                          wxDefaultPosition,
121                                          wxSize(25,45),
122                                          wxSL_VERTICAL | 
123                                          wxSL_AUTOTICKS |
124                                          wxSL_LEFT  );
125    
126
127       mResolutionOfSlider->SetRange(1,8);
128       mResolutionOfSlider->SetValue(5);
129       // Is wxEVT_COMMAND_SLIDER_UPDATED event 
130       // is connected to the method OnResolutionOfSlider
131       Connect(mResolutionOfSlider->GetId(),
132               wxEVT_COMMAND_SLIDER_UPDATED,
133               (wxObjectEventFunction) 
134               (void (wxPanel::*)(wxScrollEvent&))
135               &SliderWidget::OnResolutionOfSlider ); 
136     }
137     //---------------------------------------------------------------------
138
139     //---------------------------------------------------------------------
140     // 2) Insertion of the components in the window
141     
142     // We use a FlexGridSizer
143     wxFlexGridSizer *sizer;
144
145
146     if (orientation==0) 
147       {
148         // HORIZONTAL
149         if (mResolutionOfSlider!=NULL) 
150           {
151             sizer       = new wxFlexGridSizer(2);
152             if (title!=_T(""))
153               {
154                 sizer   -> Add( new wxStaticText(panel,-1, title ) ); 
155                 sizer   -> Add( new wxStaticText(panel,-1, _T("") ) ); 
156               }
157           } 
158         else 
159           {
160             sizer       = new wxFlexGridSizer(1);
161             if (title!=_T(""))
162               {
163                 sizer   -> Add( new wxStaticText(panel,-1, title ) ); 
164               }
165           }
166         sizer   -> Add( mwxSlider,1,wxGROW ); 
167         sizer   -> AddGrowableCol(0);
168         if (mResolutionOfSlider!=NULL) 
169           {
170             sizer       -> Add( mResolutionOfSlider ); 
171           }
172       } 
173     else 
174       {
175         // VERTICAL 
176         sizer   = new wxFlexGridSizer(1);
177         if (labels==true)  // with lable
178           {
179             label_vertical = new wxStaticText(panel,-1,_T(""));
180             label_min = new wxStaticText(panel,-1,_T(""));
181             label_max = new wxStaticText(panel,-1,_T(""));
182             if (title!=_T(""))
183               {
184                 sizer   -> Add( new wxStaticText(panel,-1, title ) );
185                 sizer   -> AddGrowableRow(3);
186               } 
187             else 
188               {
189                 sizer   -> AddGrowableRow(2);
190               }
191             sizer       -> Add( label_vertical );
192             sizer       -> Add( label_min );
193             sizer       -> Add( mwxSlider,1,wxGROW );
194             sizer       -> Add( label_max );
195             if (mResolutionOfSlider!=NULL) 
196               {
197                 sizer   -> Add( mResolutionOfSlider ); 
198               }
199           } 
200         else 
201           {
202             if (title!=_T(""))
203               {
204                 sizer   -> Add( new wxStaticText(panel,-1, title ) );
205                 sizer   -> AddGrowableRow(1);
206               } 
207             else 
208               {
209                 sizer   -> AddGrowableRow(0);
210               }
211             sizer       -> Add( mwxSlider,1,wxGROW );
212             if (mResolutionOfSlider!=NULL) 
213               {
214                 sizer   -> Add( mResolutionOfSlider ); 
215               }
216           }
217       }
218     // Initialize the labels 
219     RefreshLabels();  
220     // Insert the sizer in the main panel and refresh the layout
221     panel->SetSizer(sizer);
222   }
223   //-------------------------------------------------------------------------
224   
225
226   //-------------------------------------------------------------------------
227   SliderWidget::~SliderWidget()
228   {
229   }
230   //-------------------------------------------------------------------------
231
232
233   //-------------------------------------------------------------------------
234   void SliderWidget::OnResolutionOfSlider(wxScrollEvent& event)
235   {
236     int value = mwxSlider->GetValue();
237     int delta = (int) (pow( 4 , mResolutionOfSlider->GetValue() ));
238     int minTmp   = value - delta/2;
239     int maxTmp   = value + delta/2;
240     if (minTmp<min)
241       {
242         minTmp = min;
243         //              maxTmp = delta;
244       }
245     if (maxTmp>max)
246       {
247         maxTmp = max;
248       }
249     mwxSlider->SetRange(minTmp,maxTmp);
250     RefreshLabels();
251   }
252   //-------------------------------------------------------------------------
253
254
255
256   //-------------------------------------------------------------------------
257   void SliderWidget::OnSliderTrack(wxScrollEvent& event)
258   {
259     if(reactiveOnTrack)
260     {
261     // When user releases the slider 
262     // we update the output of the box
263     mBox->bbSetOutputOut( mwxSlider->GetValue() );
264     mBox->bbSetInputIn( mwxSlider->GetValue() );
265     // and signal that the output has changed
266     mBox->bbSignalOutputModification("Out");    
267     }
268     RefreshLabels();  
269   }
270   //-------------------------------------------------------------------------
271
272
273   //-------------------------------------------------------------------------
274   void SliderWidget::OnSliderRelease(wxScrollEvent& event)
275   {
276     // When user releases the slider 
277     // we update the output of the box
278     mBox->bbSetOutputOut( mwxSlider->GetValue() );
279     mBox->bbSetInputIn( mwxSlider->GetValue() );
280     // and signal that the output has changed
281     mBox->bbSignalOutputModification("Out");
282   }
283   //-------------------------------------------------------------------------
284   
285
286   //-------------------------------------------------------------------------
287   void SliderWidget::RefreshLabels()
288   {
289     wxString strValue;
290     if (label_vertical!=NULL)
291       {
292         strValue.Printf( _T("%d"), mwxSlider->GetValue() );
293         label_vertical->SetLabel(strValue);
294       }
295     if (label_min!=NULL)
296       {
297         strValue.Printf( _T("%d"), mwxSlider->GetMin() );
298         label_min->SetLabel(strValue);
299       }
300     if (label_max!=NULL)
301       {
302         strValue.Printf( _T("%d"), mwxSlider->GetMax() );
303         label_max->SetLabel(strValue);
304       }  
305   }
306   //-------------------------------------------------------------------------
307   
308
309   //-------------------------------------------------------------------------
310   void SliderWidget::SetRange(int min, int max)
311   {
312     this->min = min;
313     this->max = max;
314     mwxSlider->SetRange(min,max);
315     RefreshLabels();
316   }
317   //-------------------------------------------------------------------------
318
319  
320
321
322   //--------------------------------------------------------------------------
323   //-------------------------------------------------------------------------
324   // WxBlackBox implementation
325   //--------------------------------------------------------------------------
326   //--------------------------------------------------------------------------
327
328   //--------------------------------------------------------------------------
329   BBTK_BLACK_BOX_IMPLEMENTATION(Slider,bbtk::WxBlackBox);
330   BBTK_ADD_BLACK_BOX_TO_PACKAGE(wx,Slider);
331   
332   //--------------------------------------------------------------------------
333   void Slider::bbUserConstructor() 
334   { 
335     bbSetInputIn(0);
336     bbSetInputMin(0);
337     bbSetInputMax(500);
338     bbSetOutputOut(0);
339     bbSetInputOrientation("HORIZONTAL");
340     bbSetInputChangeResolution(false);
341     bbSetInputLabel(true);
342     bbSetInputReactiveOnTrack(0);    
343   }
344   
345   //--------------------------------------------------------------------------
346   void Slider::Process() 
347   {
348     bbSetOutputOut( bbGetInputIn() );
349   }
350
351   void Slider::CreateWidget()
352   {
353
354     int orientation=0;
355     if (bbtk::Utilities::loosematch(bbGetInputOrientation(),"0|H|HORIZONTAL")==true)  { orientation=0; }
356     if (bbtk::Utilities::loosematch(bbGetInputOrientation(),"1|V|VERTICAL")==true)    { orientation=1; }
357     
358     
359     //    std::cout << "bbGetWxParent = "<<bbGetWxParent()<<std::endl;
360     SliderWidget *w =  new SliderWidget(this, 
361                                         bbGetWxParent(),
362                                         orientation , 
363                                         bbGetInputChangeResolution(), 
364                                         bbGetInputLabel(), 
365                                         bbtk::std2wx( bbGetInputTitle() ),
366                                         bbGetInputMin(), 
367                                         bbGetInputMax(),
368                                         bbGetInputIn(),
369                                         bbGetInputReactiveOnTrack()
370                                         ); 
371     //    std::cout << "w = "<<w<<std::endl;
372     //  w->SetName( bbtk::std2wx( bbGetInputWinTitle() ) );
373           
374     bbSetOutputWidget( w );
375   }
376   
377
378 } //namespace bbwx
379
380 #endif // _USE_WXWIDGETS_ 
381
382