1 /*=========================================================================
4 Module: $RCSfile: bbwxSlider.cxx,v $
6 Date: $Date: 2008/02/12 20:08:12 $
7 Version: $Revision: 1.7 $
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.
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.
17 =========================================================================*/
20 * \brief Short description in one line
28 #ifdef _USE_WXWIDGETS_
32 #include "bbwxSlider.h"
33 #include "bbwxPackage.h"
34 #include "bbtkUtilities.h"
42 //-------------------------------------------------------------------------
43 SliderWidget::SliderWidget(Slider* box, wxWindow *parent,
45 bool changeresolution,
53 wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL),
57 reactiveOnTrack(reactiveontrack)
59 wxPanel * panel = this;
63 label_vertical = NULL;
64 mResolutionOfSlider = NULL;
73 wxorientation = wxSL_HORIZONTAL;
76 wxlabels = wxSL_LABELS;
83 wxorientation = wxSL_VERTICAL;
86 //---------------------------------------------------------------------
87 // 1) Creation of the components of the widget
88 // Any top level sub-widget must have the panel returned by panel
90 mwxSlider = new wxSlider( panel,
94 wxorientation | wxlabels );
96 // mwxSlider->SetInitialSize(wxSize(sizeX,sizeY));
98 // mwxSlider->SetTickFreq(100,0);
99 mwxSlider->SetRange(min,max);
100 mwxSlider->SetValue(value);
104 // Connecting events to callbacks
105 Connect( mwxSlider->GetId(),
106 wxEVT_SCROLL_THUMBRELEASE,
108 (wxObjectEventFunction)
109 (void (wxPanel::*)(wxScrollEvent&))
110 &SliderWidget::OnSliderRelease );
112 Connect( mwxSlider->GetId(),
113 wxEVT_SCROLL_THUMBTRACK,
115 (wxObjectEventFunction)
116 (void (wxPanel::*)(wxScrollEvent&))
117 &SliderWidget::OnSliderTrack );
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,
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 );
143 //---------------------------------------------------------------------
145 //---------------------------------------------------------------------
146 // 2) Insertion of the components in the window
148 // We use a FlexGridSizer
149 wxFlexGridSizer *sizer;
155 if (mResolutionOfSlider!=NULL)
157 sizer = new wxFlexGridSizer(2);
160 sizer -> Add( new wxStaticText(panel,-1, title ) );
161 sizer -> Add( new wxStaticText(panel,-1, _T("") ) );
166 sizer = new wxFlexGridSizer(1);
169 sizer -> Add( new wxStaticText(panel,-1, title ) );
172 sizer -> Add( mwxSlider,1,wxGROW );
173 sizer -> AddGrowableCol(0);
174 if (mResolutionOfSlider!=NULL)
176 sizer -> Add( mResolutionOfSlider );
182 sizer = new wxFlexGridSizer(1);
183 if (labels==true) // with lable
185 label_vertical = new wxStaticText(panel,-1,_T(""));
186 label_min = new wxStaticText(panel,-1,_T(""));
187 label_max = new wxStaticText(panel,-1,_T(""));
190 sizer -> Add( new wxStaticText(panel,-1, title ) );
191 sizer -> AddGrowableRow(3);
195 sizer -> AddGrowableRow(2);
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)
203 sizer -> Add( mResolutionOfSlider );
210 sizer -> Add( new wxStaticText(panel,-1, title ) );
211 sizer -> AddGrowableRow(1);
215 sizer -> AddGrowableRow(0);
217 sizer -> Add( mwxSlider,1,wxGROW );
218 if (mResolutionOfSlider!=NULL)
220 sizer -> Add( mResolutionOfSlider );
224 // Initialize the labels
226 // Insert the sizer in the main panel and refresh the layout
227 panel->SetSizer(sizer);
228 // panel->SetAutoLayout(true);
231 //-------------------------------------------------------------------------
234 //-------------------------------------------------------------------------
235 SliderWidget::~SliderWidget()
238 //-------------------------------------------------------------------------
241 //-------------------------------------------------------------------------
242 void SliderWidget::OnResolutionOfSlider(wxScrollEvent& event)
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;
257 mwxSlider->SetRange(minTmp,maxTmp);
260 //-------------------------------------------------------------------------
264 //-------------------------------------------------------------------------
265 void SliderWidget::OnSliderTrack(wxScrollEvent& event)
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");
278 //-------------------------------------------------------------------------
281 //-------------------------------------------------------------------------
282 void SliderWidget::OnSliderRelease(wxScrollEvent& event)
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");
291 //-------------------------------------------------------------------------
294 //-------------------------------------------------------------------------
295 void SliderWidget::RefreshLabels()
298 if (label_vertical!=NULL)
300 strValue.Printf( _T("%d"), mwxSlider->GetValue() );
301 label_vertical->SetLabel(strValue);
305 strValue.Printf( _T("%d"), mwxSlider->GetMin() );
306 label_min->SetLabel(strValue);
310 strValue.Printf( _T("%d"), mwxSlider->GetMax() );
311 label_max->SetLabel(strValue);
314 //-------------------------------------------------------------------------
317 //-------------------------------------------------------------------------
318 void SliderWidget::SetRange(int min, int max)
322 mwxSlider->SetRange(min,max);
325 //-------------------------------------------------------------------------
330 //--------------------------------------------------------------------------
331 //-------------------------------------------------------------------------
332 // WxBlackBox implementation
333 //--------------------------------------------------------------------------
334 //--------------------------------------------------------------------------
336 //--------------------------------------------------------------------------
337 BBTK_USER_BLACK_BOX_IMPLEMENTATION(Slider,bbtk::WxBlackBox);
338 BBTK_ADD_BLACK_BOX_TO_PACKAGE(wx,Slider);
340 //--------------------------------------------------------------------------
341 void Slider::bbUserConstructor()
347 bbSetInputOrientation("HORIZONTAL");
348 bbSetInputChangeResolution(false);
349 bbSetInputLabel(true);
350 bbSetInputReactiveOnTrack(0);
353 //--------------------------------------------------------------------------
354 void Slider::Process()
356 bbSetOutputOut( bbGetInputIn() );
359 void Slider::CreateWidget()
363 if (bbtk::Utilities::loosematch(bbGetInputOrientation(),"0|H|HORIZONTAL")==true) { orientation=0; }
364 if (bbtk::Utilities::loosematch(bbGetInputOrientation(),"1|V|VERTICAL")==true) { orientation=1; }
366 SliderWidget *w = new SliderWidget(this,
369 bbGetInputChangeResolution(),
371 bbtk::std2wx( bbGetInputTitle() ),
375 bbGetInputReactiveOnTrack()
377 // w->SetName( bbtk::std2wx( bbGetInputWinTitle() ) );
379 bbSetOutputWidget( w );
385 #endif // _USE_WXWIDGETS_