]> Creatis software - bbtk.git/blob - packages/wx/src/bbwxSlider.cxx
Recreated the complete cvs tree because the project architecture deeply changed
[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/01/22 15:02:00 $
7   Version:   $Revision: 1.1.1.1 $
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
35
36
37
38 namespace bbwx
39 {
40   
41   //-------------------------------------------------------------------------
42   SliderWidget::SliderWidget(Slider* box, wxWindow *parent,
43                              int orientation,
44                              bool changeresolution,
45                              bool labels,
46                              wxString title,
47                              int vmin,
48                              int vmax,
49                              int value,
50               int reactiveontrack)
51     :  
52     wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL),
53     mBox(box),
54     min(vmin),
55     max(vmax),
56     reactiveOnTrack(reactiveontrack)
57   {
58     wxPanel * panel = this;
59
60     label_min           = NULL;
61     label_max           = NULL;
62     label_vertical      = NULL;
63     mResolutionOfSlider = NULL;
64     
65     int sizeX,sizeY;
66     long wxlabels=0;
67     long wxorientation=0;
68     if (orientation==0) 
69       {
70         sizeX                   = 2;
71         sizeY                   = 40;
72         wxorientation   = wxSL_HORIZONTAL;
73         if (labels==true)
74           {
75             wxlabels = wxSL_LABELS;
76           }
77       } 
78     else 
79       {
80         sizeX                   = 20;
81         sizeY                   = 2;
82         wxorientation   = wxSL_VERTICAL;
83       }
84     
85     //---------------------------------------------------------------------
86     // 1) Creation of the components of the widget
87     // Any top level sub-widget must have the panel returned by panel
88     // for parent
89     mwxSlider = new wxSlider( panel, 
90                               -1, 0 , 0, 500 , 
91                               wxDefaultPosition, 
92                               wxSize(sizeX,sizeY), 
93                               wxorientation  | wxlabels );
94
95     //    mwxSlider->SetInitialSize(wxSize(sizeX,sizeY));
96
97     //  mwxSlider->SetTickFreq(100,0);
98     mwxSlider->SetRange(min,max);
99     mwxSlider->SetValue(value);
100
101     //    RefreshLabels();
102
103     // Connecting events to callbacks
104     Connect( mwxSlider->GetId(), 
105              wxEVT_SCROLL_THUMBRELEASE, 
106
107              (wxObjectEventFunction) 
108              (void (wxPanel::*)(wxScrollEvent&))
109              &SliderWidget::OnSliderRelease ); 
110
111     Connect( mwxSlider->GetId(),  
112              wxEVT_SCROLL_THUMBTRACK, 
113
114              (wxObjectEventFunction) 
115              (void (wxPanel::*)(wxScrollEvent&))
116               &SliderWidget::OnSliderTrack ); 
117     
118
119     // If asked : creation of the other little slider which allows to change 
120     // the resolution of the main slider
121     if (changeresolution==true){
122       // has panel for parent too
123       mResolutionOfSlider = new wxSlider(panel,
124                                          -1,5,1,10,
125                                          wxDefaultPosition,
126                                          wxSize(25,45),
127                                          wxSL_VERTICAL | 
128                                          wxSL_AUTOTICKS |
129                                          wxSL_LEFT  );
130    
131
132       mResolutionOfSlider->SetRange(1,8);
133       mResolutionOfSlider->SetValue(5);
134       // Is wxEVT_COMMAND_SLIDER_UPDATED event 
135       // is connected to the method OnResolutionOfSlider
136       Connect(mResolutionOfSlider->GetId(),
137               wxEVT_COMMAND_SLIDER_UPDATED,
138               (wxObjectEventFunction) 
139               (void (wxPanel::*)(wxScrollEvent&))
140               &SliderWidget::OnResolutionOfSlider ); 
141     }
142     //---------------------------------------------------------------------
143
144     //---------------------------------------------------------------------
145     // 2) Insertion of the components in the window
146     
147     // We use a FlexGridSizer
148     wxFlexGridSizer *sizer;
149
150
151     if (orientation==0) 
152       {
153         // HORIZONTAL
154         if (mResolutionOfSlider!=NULL) 
155           {
156             sizer       = new wxFlexGridSizer(2);
157             if (title!=_T(""))
158               {
159                 sizer   -> Add( new wxStaticText(panel,-1, title ) ); 
160                 sizer   -> Add( new wxStaticText(panel,-1, _T("") ) ); 
161               }
162           } 
163         else 
164           {
165             sizer       = new wxFlexGridSizer(1);
166             if (title!=_T(""))
167               {
168                 sizer   -> Add( new wxStaticText(panel,-1, title ) ); 
169               }
170           }
171         sizer   -> Add( mwxSlider,1,wxGROW ); 
172         sizer   -> AddGrowableCol(0);
173         if (mResolutionOfSlider!=NULL) 
174           {
175             sizer       -> Add( mResolutionOfSlider ); 
176           }
177       } 
178     else 
179       {
180         // VERTICAL 
181         sizer   = new wxFlexGridSizer(1);
182         if (labels==true)  // with lable
183           {
184             label_vertical = new wxStaticText(panel,-1,_T(""));
185             label_min = new wxStaticText(panel,-1,_T(""));
186             label_max = new wxStaticText(panel,-1,_T(""));
187             if (title!=_T(""))
188               {
189                 sizer   -> Add( new wxStaticText(panel,-1, title ) );
190                 sizer   -> AddGrowableRow(3);
191               } 
192             else 
193               {
194                 sizer   -> AddGrowableRow(2);
195               }
196             sizer       -> Add( label_vertical );
197             sizer       -> Add( label_min );
198             sizer       -> Add( mwxSlider,1,wxGROW );
199             sizer       -> Add( label_max );
200             if (mResolutionOfSlider!=NULL) 
201               {
202                 sizer   -> Add( mResolutionOfSlider ); 
203               }
204           } 
205         else 
206           {
207             if (title!=_T(""))
208               {
209                 sizer   -> Add( new wxStaticText(panel,-1, title ) );
210                 sizer   -> AddGrowableRow(1);
211               } 
212             else 
213               {
214                 sizer   -> AddGrowableRow(0);
215               }
216             sizer       -> Add( mwxSlider,1,wxGROW );
217             if (mResolutionOfSlider!=NULL) 
218               {
219                 sizer   -> Add( mResolutionOfSlider ); 
220               }
221           }
222       }
223     // Initialize the labels 
224     RefreshLabels();  
225     // Insert the sizer in the main panel and refresh the layout
226     panel->SetSizer(sizer);
227     //   panel->SetAutoLayout(true);
228     //    panel->Layout();
229   }
230   //-------------------------------------------------------------------------
231   
232
233   //-------------------------------------------------------------------------
234   SliderWidget::~SliderWidget()
235   {
236   }
237   //-------------------------------------------------------------------------
238
239
240   //-------------------------------------------------------------------------
241   void SliderWidget::OnResolutionOfSlider(wxScrollEvent& event)
242   {
243     int value = mwxSlider->GetValue();
244     int delta = (int) (pow( 4 , mResolutionOfSlider->GetValue() ));
245     int minTmp   = value - delta/2;
246     int maxTmp   = value + delta/2;
247     if (minTmp<min)
248       {
249         minTmp = min;
250         //              maxTmp = delta;
251       }
252     if (maxTmp>max)
253       {
254         maxTmp = max;
255       }
256     mwxSlider->SetRange(minTmp,maxTmp);
257     RefreshLabels();
258   }
259   //-------------------------------------------------------------------------
260
261
262
263   //-------------------------------------------------------------------------
264   void SliderWidget::OnSliderTrack(wxScrollEvent& event)
265   {
266     if(reactiveOnTrack)
267     {
268     // When user releases the slider 
269     // we update the output of the box
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_USER_BLACK_BOX_IMPLEMENTATION(Slider,bbtk::WxBlackBox);
337   BBTK_ADD_BLACK_BOX_TO_PACKAGE(wx,Slider);
338   //--------------------------------------------------------------------------
339
340   //--------------------------------------------------------------------------
341   void Slider::bbUserConstructor() 
342   { 
343     bbSetInputIn(0);
344     bbSetInputMin(0);
345     bbSetInputMax(500);
346     bbSetOutputOut(0);
347     bbSetInputOrientation(0);
348     bbSetInputChangeResolution(false);
349     bbSetInputLabel(true);
350     bbSetInputReactiveOnTrack(0);    
351   }
352   //--------------------------------------------------------------------------
353
354   //--------------------------------------------------------------------------
355   void Slider::Process() 
356   {
357     int val = bbGetInputIn();
358     bbSetOutputOut( bbGetInputIn() );
359
360     if (bbGetOutputWidget()==0) 
361       {
362         bbSetOutputWidget( new SliderWidget(this, 
363                                             bbGetWxParent(),
364                                             bbGetInputOrientation() , 
365                                             bbGetInputChangeResolution(), 
366                                             bbGetInputLabel(), 
367                                             bbtk::std2wx( bbGetInputTitle() ),
368                                             bbGetInputMin(), 
369                                             bbGetInputMax(),
370                                             val,
371                                             bbGetInputReactiveOnTrack()
372                                             )
373                            );
374       }
375   }
376   //--------------------------------------------------------------------------  
377   /*
378   //--------------------------------------------------------------------------
379   bbtk::WxBlackBoxWidget* Slider::bbUserCreateWidget(wxWindow *parent)
380   {
381    
382
383   }
384   //--------------------------------------------------------------------------
385   */
386
387
388 } //namespace bbwx
389
390 #endif // _USE_WXWIDGETS_ 
391
392