1 /*=========================================================================
4 Module: $RCSfile: bbwxSlider.cxx,v $
6 Date: $Date: 2008/10/06 09:05:07 $
7 Version: $Revision: 1.13 $
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
27 #ifdef _USE_WXWIDGETS_
29 #include "bbwxSlider.h"
30 #include "bbwxPackage.h"
31 #include "bbtkUtilities.h"
36 //-------------------------------------------------------------------------
37 SliderWidget::SliderWidget(Slider* box, wxWindow *parent,
39 bool changeresolution,
47 wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL),
51 reactiveOnTrack(reactiveontrack)
53 wxPanel * panel = this;
57 label_vertical = NULL;
58 mResolutionOfSlider = NULL;
67 wxorientation = wxSL_HORIZONTAL;
70 wxlabels = wxSL_LABELS;
77 wxorientation = wxSL_VERTICAL;
80 //---------------------------------------------------------------------
81 // 1) Creation of the components of the widget
82 // Any top level sub-widget must have the panel returned by panel
84 mwxSlider = new wxSlider( panel,
88 wxorientation | wxlabels );
90 // mwxSlider->SetInitialSize(wxSize(sizeX,sizeY));
92 // mwxSlider->SetTickFreq(100,0);
93 mwxSlider->SetRange(min,max);
94 mwxSlider->SetValue(value);
98 // Connecting events to callbacks
99 Connect( mwxSlider->GetId(),
100 wxEVT_SCROLL_THUMBRELEASE,
102 (wxObjectEventFunction)
103 (void (wxPanel::*)(wxScrollEvent&))
104 &SliderWidget::OnSliderRelease );
106 Connect( mwxSlider->GetId(),
107 wxEVT_SCROLL_THUMBTRACK,
109 (wxObjectEventFunction)
110 (void (wxPanel::*)(wxScrollEvent&))
111 &SliderWidget::OnSliderTrack );
113 Connect( mwxSlider->GetId(),
114 wxEVT_SCROLL_CHANGED,
116 (wxObjectEventFunction)
117 (void (wxPanel::*)(wxScrollEvent&))
118 &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);
229 //-------------------------------------------------------------------------
232 //-------------------------------------------------------------------------
233 SliderWidget::~SliderWidget()
236 //-------------------------------------------------------------------------
239 //-------------------------------------------------------------------------
240 void SliderWidget::OnResolutionOfSlider(wxScrollEvent& event)
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;
255 mwxSlider->SetRange(minTmp,maxTmp);
258 //-------------------------------------------------------------------------
262 //-------------------------------------------------------------------------
263 void SliderWidget::OnSliderTrack(wxScrollEvent& event)
267 // When user releases the slider
268 // 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");
277 //-------------------------------------------------------------------------
280 //-------------------------------------------------------------------------
281 void SliderWidget::OnSliderRelease(wxScrollEvent& event)
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");
290 //-------------------------------------------------------------------------
293 //-------------------------------------------------------------------------
294 void SliderWidget::RefreshLabels()
297 if (label_vertical!=NULL)
299 strValue.Printf( _T("%d"), mwxSlider->GetValue() );
300 label_vertical->SetLabel(strValue);
304 strValue.Printf( _T("%d"), mwxSlider->GetMin() );
305 label_min->SetLabel(strValue);
309 strValue.Printf( _T("%d"), mwxSlider->GetMax() );
310 label_max->SetLabel(strValue);
313 //-------------------------------------------------------------------------
316 //-------------------------------------------------------------------------
317 void SliderWidget::SetRange(int min, int max)
321 mwxSlider->SetRange(min,max);
324 //-------------------------------------------------------------------------
329 //--------------------------------------------------------------------------
330 //-------------------------------------------------------------------------
331 // WxBlackBox implementation
332 //--------------------------------------------------------------------------
333 //--------------------------------------------------------------------------
335 //--------------------------------------------------------------------------
336 BBTK_BLACK_BOX_IMPLEMENTATION(Slider,bbtk::WxBlackBox);
337 BBTK_ADD_BLACK_BOX_TO_PACKAGE(wx,Slider);
339 //--------------------------------------------------------------------------
340 void Slider::bbUserConstructor()
346 bbSetInputOrientation("HORIZONTAL");
347 bbSetInputChangeResolution(false);
348 bbSetInputLabel(true);
349 bbSetInputReactiveOnTrack(0);
352 //--------------------------------------------------------------------------
353 void Slider::Process()
355 bbSetOutputOut( bbGetInputIn() );
358 void Slider::CreateWidget()
362 if (bbtk::Utilities::loosematch(bbGetInputOrientation(),"0|H|HORIZONTAL")==true) { orientation=0; }
363 if (bbtk::Utilities::loosematch(bbGetInputOrientation(),"1|V|VERTICAL")==true) { orientation=1; }
366 // std::cout << "bbGetWxParent = "<<bbGetWxParent()<<std::endl;
367 SliderWidget *w = new SliderWidget(this,
370 bbGetInputChangeResolution(),
372 bbtk::std2wx( bbGetInputTitle() ),
376 bbGetInputReactiveOnTrack()
378 // std::cout << "w = "<<w<<std::endl;
379 // w->SetName( bbtk::std2wx( bbGetInputWinTitle() ) );
381 bbSetOutputWidget( w );
387 #endif // _USE_WXWIDGETS_