/*========================================================================= Program: bbtk Module: $RCSfile: bbkwSlider.cxx,v $ Language: C++ Date: $Date: 2008/11/29 21:41:58 $ Version: $Revision: 1.1 $ =========================================================================*/ /* --------------------------------------------------------------------- * Copyright (c) CREATIS-LRMN (Centre de Recherche en Imagerie Medicale) * Authors : Eduardo Davila, Laurent Guigues, Jean-Pierre Roux * * This software is governed by the CeCILL-B license under French law and * abiding by the rules of distribution of free software. You can use, * modify and/ or redistribute the software under the terms of the CeCILL-B * license as circulated by CEA, CNRS and INRIA at the following URL * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html * or in the file LICENSE.txt. * * As a counterpart to the access to the source code and rights to copy, * modify and redistribute granted by the license, users are provided only * with a limited warranty and the software's author, the holder of the * economic rights, and the successive licensors have only limited * liability. * * The fact that you are presently reading this means that you have had * knowledge of the CeCILL-B license and that you accept its terms. * ------------------------------------------------------------------------ */ /** * \file * \brief Short description in one line * * Long * description * */ #ifdef USE_KWWIDGETS #include "bbkwSlider.h" #include "bbkwPackage.h" #include "bbtkUtilities.h" #include "vtkKWScale.h" namespace bbkw { /* //------------------------------------------------------------------------- SliderWidget::SliderWidget(Slider* box, kwWindow *parent, int orientation, bool changeresolution, bool labels, kwString title, int vmin, int vmax, int value, int reactiveontrack) : kwPanel( parent, -1, kwDefaultPosition, kwDefaultSize, kwTAB_TRAVERSAL), mBox(box), min(vmin), max(vmax), reactiveOnTrack(reactiveontrack) { kwPanel * panel = this; label_min = NULL; label_max = NULL; label_vertical = NULL; mResolutionOfSlider = NULL; int sizeX,sizeY; long kwlabels=0; long kworientation=0; if (orientation==0) { sizeX = 2; sizeY = 40; kworientation = kwSL_HORIZONTAL; if (labels==true) { kwlabels = kwSL_LABELS; } } else { sizeX = 20; sizeY = 2; kworientation = kwSL_VERTICAL; } //--------------------------------------------------------------------- // 1) Creation of the components of the widget // Any top level sub-widget must have the panel returned by panel // for parent mkwSlider = new kwSlider( panel, -1, 0 , 0, 500 , kwDefaultPosition, kwSize(sizeX,sizeY), kworientation | kwlabels ); // mkwSlider->SetInitialSize(kwSize(sizeX,sizeY)); // mkwSlider->SetTickFreq(100,0); mkwSlider->SetRange(min,max); mkwSlider->SetValue(value); // RefreshLabels(); // Connecting events to callbacks Connect( mkwSlider->GetId(), kwEVT_SCROLL_THUMBRELEASE, (kwObjectEventFunction) (void (kwPanel::*)(kwScrollEvent&)) &SliderWidget::OnSliderRelease ); Connect( mkwSlider->GetId(), kwEVT_SCROLL_THUMBTRACK, (kwObjectEventFunction) (void (kwPanel::*)(kwScrollEvent&)) &SliderWidget::OnSliderTrack ); Connect( mkwSlider->GetId(), kwEVT_SCROLL_CHANGED, (kwObjectEventFunction) (void (kwPanel::*)(kwScrollEvent&)) &SliderWidget::OnSliderTrack ); // If asked : creation of the other little slider which allows to change // the resolution of the main slider if (changeresolution==true){ // has panel for parent too mResolutionOfSlider = new kwSlider(panel, -1,5,1,10, kwDefaultPosition, kwSize(25,45), kwSL_VERTICAL | kwSL_AUTOTICKS | kwSL_LEFT ); mResolutionOfSlider->SetRange(1,8); mResolutionOfSlider->SetValue(5); // Is kwEVT_COMMAND_SLIDER_UPDATED event // is connected to the method OnResolutionOfSlider Connect(mResolutionOfSlider->GetId(), kwEVT_COMMAND_SLIDER_UPDATED, (kwObjectEventFunction) (void (kwPanel::*)(kwScrollEvent&)) &SliderWidget::OnResolutionOfSlider ); } //--------------------------------------------------------------------- //--------------------------------------------------------------------- // 2) Insertion of the components in the window // We use a FlexGridSizer kwFlexGridSizer *sizer; if (orientation==0) { // HORIZONTAL if (mResolutionOfSlider!=NULL) { sizer = new kwFlexGridSizer(2); if (title!=_T("")) { sizer -> Add( new kwStaticText(panel,-1, title ) ); sizer -> Add( new kwStaticText(panel,-1, _T("") ) ); } } else { sizer = new kwFlexGridSizer(1); if (title!=_T("")) { sizer -> Add( new kwStaticText(panel,-1, title ) ); } } sizer -> Add( mkwSlider,1,kwGROW ); sizer -> AddGrowableCol(0); if (mResolutionOfSlider!=NULL) { sizer -> Add( mResolutionOfSlider ); } } else { // VERTICAL sizer = new kwFlexGridSizer(1); if (labels==true) // with lable { label_vertical = new kwStaticText(panel,-1,_T("")); label_min = new kwStaticText(panel,-1,_T("")); label_max = new kwStaticText(panel,-1,_T("")); if (title!=_T("")) { sizer -> Add( new kwStaticText(panel,-1, title ) ); sizer -> AddGrowableRow(3); } else { sizer -> AddGrowableRow(2); } sizer -> Add( label_vertical ); sizer -> Add( label_min ); sizer -> Add( mkwSlider,1,kwGROW ); sizer -> Add( label_max ); if (mResolutionOfSlider!=NULL) { sizer -> Add( mResolutionOfSlider ); } } else { if (title!=_T("")) { sizer -> Add( new kwStaticText(panel,-1, title ) ); sizer -> AddGrowableRow(1); } else { sizer -> AddGrowableRow(0); } sizer -> Add( mkwSlider,1,kwGROW ); if (mResolutionOfSlider!=NULL) { sizer -> Add( mResolutionOfSlider ); } } } // Initialize the labels RefreshLabels(); // Insert the sizer in the main panel and refresh the layout panel->SetSizer(sizer); } //------------------------------------------------------------------------- //------------------------------------------------------------------------- SliderWidget::~SliderWidget() { } //------------------------------------------------------------------------- //------------------------------------------------------------------------- void SliderWidget::OnResolutionOfSlider(kwScrollEvent& event) { int value = mkwSlider->GetValue(); int delta = (int) (pow( 4 , mResolutionOfSlider->GetValue() )); int minTmp = value - delta/2; int maxTmp = value + delta/2; if (minTmpmax) { maxTmp = max; } mkwSlider->SetRange(minTmp,maxTmp); RefreshLabels(); } //------------------------------------------------------------------------- //------------------------------------------------------------------------- void SliderWidget::OnSliderTrack(kwScrollEvent& event) { if(reactiveOnTrack) { // When user releases the slider // we update the output of the box mBox->bbSetOutputOut( mkwSlider->GetValue() ); mBox->bbSetInputIn( mkwSlider->GetValue() ); // and signal that the output has changed mBox->bbSignalOutputModification("Out"); } RefreshLabels(); } //------------------------------------------------------------------------- //------------------------------------------------------------------------- void SliderWidget::OnSliderRelease(kwScrollEvent& event) { // When user releases the slider // we update the output of the box mBox->bbSetOutputOut( mkwSlider->GetValue() ); mBox->bbSetInputIn( mkwSlider->GetValue() ); // and signal that the output has changed mBox->bbSignalOutputModification("Out"); } //------------------------------------------------------------------------- //------------------------------------------------------------------------- void SliderWidget::RefreshLabels() { kwString strValue; if (label_vertical!=NULL) { strValue.Printf( _T("%d"), mkwSlider->GetValue() ); label_vertical->SetLabel(strValue); } if (label_min!=NULL) { strValue.Printf( _T("%d"), mkwSlider->GetMin() ); label_min->SetLabel(strValue); } if (label_max!=NULL) { strValue.Printf( _T("%d"), mkwSlider->GetMax() ); label_max->SetLabel(strValue); } } //------------------------------------------------------------------------- //------------------------------------------------------------------------- void SliderWidget::SetRange(int min, int max) { this->min = min; this->max = max; mkwSlider->SetRange(min,max); RefreshLabels(); } //------------------------------------------------------------------------- */ //-------------------------------------------------------------------------- //------------------------------------------------------------------------- // KwBlackBox implementation //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- BBTK_BLACK_BOX_IMPLEMENTATION(Slider,bbtk::KWBlackBox); BBTK_ADD_BLACK_BOX_TO_PACKAGE(kw,Slider); //-------------------------------------------------------------------------- void Slider::bbUserConstructor() { bbSetInputIn(0); bbSetInputMin(0); bbSetInputMax(500); bbSetOutputOut(0); bbSetOutputWidget(0); bbSetInputOrientation("HORIZONTAL"); bbSetInputChangeResolution(false); bbSetInputLabel(true); bbSetInputReactiveOnTrack(0); } //-------------------------------------------------------------------------- void Slider::Process() { } //-------------------------------------------------------------------------- void Slider::CreateWidget(vtkKWWidget* parent) { vtkKWScale* s = vtkKWScale::New(); bbSetOutputWidget(s); s->SetParent(parent); s->Create(); s->SetRange(bbGetInputMin(),bbGetInputMax()); // s->SetResolution(1.0); // s->SetLength(150); s->SetLabelText("A simple scale:"); if (bbtk::Utilities::loosematch(bbGetInputOrientation(),"0|H|HORIZONTAL")==true) { s->SetOrientationToHorizontal(); } else if (bbtk::Utilities::loosematch(bbGetInputOrientation(),"1|V|VERTICAL")==true) { s->SetOrientationToVertical(); } else { bbtkWarning("Unrecognized value for input 'Orientation' of "<GetApplication()->Script("pack %s -side left -anchor c -expand y", s->GetWidgetName()); bbSetOutputOut( bbGetInputIn() ); } } //namespace bbkw #endif // USE_KWWIDGETS