1 /*=========================================================================
4 Module: $RCSfile: bbwxSlider.cxx,v $
6 Date: $Date: 2008/04/18 12:59:53 $
7 Version: $Revision: 1.11 $
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 );
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,
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 );
137 //---------------------------------------------------------------------
139 //---------------------------------------------------------------------
140 // 2) Insertion of the components in the window
142 // We use a FlexGridSizer
143 wxFlexGridSizer *sizer;
149 if (mResolutionOfSlider!=NULL)
151 sizer = new wxFlexGridSizer(2);
154 sizer -> Add( new wxStaticText(panel,-1, title ) );
155 sizer -> Add( new wxStaticText(panel,-1, _T("") ) );
160 sizer = new wxFlexGridSizer(1);
163 sizer -> Add( new wxStaticText(panel,-1, title ) );
166 sizer -> Add( mwxSlider,1,wxGROW );
167 sizer -> AddGrowableCol(0);
168 if (mResolutionOfSlider!=NULL)
170 sizer -> Add( mResolutionOfSlider );
176 sizer = new wxFlexGridSizer(1);
177 if (labels==true) // with lable
179 label_vertical = new wxStaticText(panel,-1,_T(""));
180 label_min = new wxStaticText(panel,-1,_T(""));
181 label_max = new wxStaticText(panel,-1,_T(""));
184 sizer -> Add( new wxStaticText(panel,-1, title ) );
185 sizer -> AddGrowableRow(3);
189 sizer -> AddGrowableRow(2);
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)
197 sizer -> Add( mResolutionOfSlider );
204 sizer -> Add( new wxStaticText(panel,-1, title ) );
205 sizer -> AddGrowableRow(1);
209 sizer -> AddGrowableRow(0);
211 sizer -> Add( mwxSlider,1,wxGROW );
212 if (mResolutionOfSlider!=NULL)
214 sizer -> Add( mResolutionOfSlider );
218 // Initialize the labels
220 // Insert the sizer in the main panel and refresh the layout
221 panel->SetSizer(sizer);
223 //-------------------------------------------------------------------------
226 //-------------------------------------------------------------------------
227 SliderWidget::~SliderWidget()
230 //-------------------------------------------------------------------------
233 //-------------------------------------------------------------------------
234 void SliderWidget::OnResolutionOfSlider(wxScrollEvent& event)
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;
249 mwxSlider->SetRange(minTmp,maxTmp);
252 //-------------------------------------------------------------------------
256 //-------------------------------------------------------------------------
257 void SliderWidget::OnSliderTrack(wxScrollEvent& event)
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");
270 //-------------------------------------------------------------------------
273 //-------------------------------------------------------------------------
274 void SliderWidget::OnSliderRelease(wxScrollEvent& event)
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");
283 //-------------------------------------------------------------------------
286 //-------------------------------------------------------------------------
287 void SliderWidget::RefreshLabels()
290 if (label_vertical!=NULL)
292 strValue.Printf( _T("%d"), mwxSlider->GetValue() );
293 label_vertical->SetLabel(strValue);
297 strValue.Printf( _T("%d"), mwxSlider->GetMin() );
298 label_min->SetLabel(strValue);
302 strValue.Printf( _T("%d"), mwxSlider->GetMax() );
303 label_max->SetLabel(strValue);
306 //-------------------------------------------------------------------------
309 //-------------------------------------------------------------------------
310 void SliderWidget::SetRange(int min, int max)
314 mwxSlider->SetRange(min,max);
317 //-------------------------------------------------------------------------
322 //--------------------------------------------------------------------------
323 //-------------------------------------------------------------------------
324 // WxBlackBox implementation
325 //--------------------------------------------------------------------------
326 //--------------------------------------------------------------------------
328 //--------------------------------------------------------------------------
329 BBTK_BLACK_BOX_IMPLEMENTATION(Slider,bbtk::WxBlackBox);
330 BBTK_ADD_BLACK_BOX_TO_PACKAGE(wx,Slider);
332 //--------------------------------------------------------------------------
333 void Slider::bbUserConstructor()
339 bbSetInputOrientation("HORIZONTAL");
340 bbSetInputChangeResolution(false);
341 bbSetInputLabel(true);
342 bbSetInputReactiveOnTrack(0);
345 //--------------------------------------------------------------------------
346 void Slider::Process()
348 bbSetOutputOut( bbGetInputIn() );
351 void Slider::CreateWidget()
355 if (bbtk::Utilities::loosematch(bbGetInputOrientation(),"0|H|HORIZONTAL")==true) { orientation=0; }
356 if (bbtk::Utilities::loosematch(bbGetInputOrientation(),"1|V|VERTICAL")==true) { orientation=1; }
359 // std::cout << "bbGetWxParent = "<<bbGetWxParent()<<std::endl;
360 SliderWidget *w = new SliderWidget(this,
363 bbGetInputChangeResolution(),
365 bbtk::std2wx( bbGetInputTitle() ),
369 bbGetInputReactiveOnTrack()
371 // std::cout << "w = "<<w<<std::endl;
372 // w->SetName( bbtk::std2wx( bbGetInputWinTitle() ) );
374 bbSetOutputWidget( w );
380 #endif // _USE_WXWIDGETS_