Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

CEGUISlider.cpp

Go to the documentation of this file.
00001 /************************************************************************
00002         filename:       CEGUISlider.cpp
00003         created:        13/4/2004
00004         author:         Paul D Turner
00005         
00006         purpose:        Implementation of Slider widget base class
00007 *************************************************************************/
00008 /*************************************************************************
00009     Crazy Eddie's GUI System (http://www.cegui.org.uk)
00010     Copyright (C)2004 - 2005 Paul D Turner (paul@cegui.org.uk)
00011 
00012     This library is free software; you can redistribute it and/or
00013     modify it under the terms of the GNU Lesser General Public
00014     License as published by the Free Software Foundation; either
00015     version 2.1 of the License, or (at your option) any later version.
00016 
00017     This library is distributed in the hope that it will be useful,
00018     but WITHOUT ANY WARRANTY; without even the implied warranty of
00019     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00020     Lesser General Public License for more details.
00021 
00022     You should have received a copy of the GNU Lesser General Public
00023     License along with this library; if not, write to the Free Software
00024     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00025 *************************************************************************/
00026 #include "elements/CEGUISlider.h"
00027 #include "elements/CEGUIThumb.h"
00028 
00029 // Start of CEGUI namespace section
00030 namespace CEGUI
00031 {
00032 const String Slider::EventNamespace("Slider");
00033 
00034 /*************************************************************************
00035         Definition of Properties for this class
00036 *************************************************************************/
00037 SliderProperties::CurrentValue  Slider::d_currentValueProperty;
00038 SliderProperties::MaximumValue  Slider::d_maximumValueProperty;
00039 SliderProperties::ClickStepSize Slider::d_clickStepSizeProperty;
00040 
00041 
00042 /*************************************************************************
00043         Event name constants
00044 *************************************************************************/
00045 const String Slider::EventValueChanged( (utf8*)"ValueChanged" );
00046 const String Slider::EventThumbTrackStarted( (utf8*)"ThumbTrackStarted" );
00047 const String Slider::EventThumbTrackEnded( (utf8*)"ThumbTrackEnded" );
00048 
00049 
00050 /*************************************************************************
00051         Slider base class constructor
00052 *************************************************************************/
00053 Slider::Slider(const String& type, const String& name) :
00054         Window(type, name),
00055         d_value(0.0f),
00056         d_maxValue(1.0f),
00057         d_step(0.01f),
00058         d_thumb(NULL)
00059 {
00060         addSliderEvents();
00061         addSliderProperties();
00062 }
00063 
00064 
00065 /*************************************************************************
00066         Slider base class destructor
00067 *************************************************************************/
00068 Slider::~Slider(void)
00069 {
00070 }
00071 
00072 
00073 /*************************************************************************
00074         Initialises the Window based object ready for use.      
00075 *************************************************************************/
00076 void Slider::initialise(void)
00077 {
00078         // create and attach thumb
00079         d_thumb = createThumb(getName() + "__auto_thumb__");
00080         addChildWindow(d_thumb);
00081 
00082         // bind handler to thumb events
00083         d_thumb->subscribeEvent(Thumb::EventThumbPositionChanged, Event::Subscriber(&CEGUI::Slider::handleThumbMoved, this));
00084         d_thumb->subscribeEvent(Thumb::EventThumbTrackStarted, Event::Subscriber(&CEGUI::Slider::handleThumbTrackStarted, this));
00085         d_thumb->subscribeEvent(Thumb::EventThumbTrackEnded, Event::Subscriber(&CEGUI::Slider::handleThumbTrackEnded, this));
00086 
00087         performChildWindowLayout();
00088 }
00089 
00090 
00091 /*************************************************************************
00092         set the maximum value for the slider.
00093         Note that the minimum value is fixed at 0.      
00094 *************************************************************************/
00095 void Slider::setMaxValue(float maxVal)
00096 {
00097         d_maxValue = maxVal;
00098 
00099         float oldval = d_value;
00100 
00101         // limit current value to be within new max
00102         if (d_value > d_maxValue) {
00103                 d_value = d_maxValue;
00104         }
00105 
00106         updateThumb();
00107 
00108         // send notification if slider value changed.
00109         if (d_value != oldval)
00110         {
00111                 WindowEventArgs args(this);
00112                 onValueChanged(args);
00113         }
00114 
00115 }
00116 
00117 
00118 /*************************************************************************
00119         set the current slider value.
00120 *************************************************************************/
00121 void Slider::setCurrentValue(float value)
00122 {
00123         float oldval = d_value;
00124 
00125         // range for value: 0 <= value <= maxValue
00126         d_value = (value >= 0.0f) ? ((value <= d_maxValue) ? value : d_maxValue) : 0.0f;
00127 
00128         updateThumb();
00129 
00130         // send notification if slider value changed.
00131         if (d_value != oldval)
00132         {
00133                 WindowEventArgs args(this);
00134                 onValueChanged(args);
00135         }
00136 
00137 }
00138 
00139 
00140 /*************************************************************************
00141         Add slider specific events      
00142 *************************************************************************/
00143 void Slider::addSliderEvents(void)
00144 {
00145         addEvent(EventValueChanged);
00146         addEvent(EventThumbTrackStarted);
00147         addEvent(EventThumbTrackEnded);
00148 }
00149 
00150 
00151 /*************************************************************************
00152         Handler triggered when the slider value changes
00153 *************************************************************************/
00154 void Slider::onValueChanged(WindowEventArgs& e)
00155 {
00156         fireEvent(EventValueChanged, e, EventNamespace);
00157 }
00158 
00159 
00160 /*************************************************************************
00161         Handler triggered when the user begins to drag the slider thumb.        
00162 *************************************************************************/
00163 void Slider::onThumbTrackStarted(WindowEventArgs& e)
00164 {
00165         fireEvent(EventThumbTrackStarted, e, EventNamespace);
00166 }
00167 
00168 
00169 /*************************************************************************
00170         Handler triggered when the slider thumb is released
00171 *************************************************************************/
00172 void Slider::onThumbTrackEnded(WindowEventArgs& e)
00173 {
00174         fireEvent(EventThumbTrackEnded, e, EventNamespace);
00175 }
00176 
00177 
00178 /*************************************************************************
00179         Handler for when a mouse button is pressed
00180 *************************************************************************/
00181 void Slider::onMouseButtonDown(MouseEventArgs& e)
00182 {
00183         // base class processing
00184         Window::onMouseButtonDown(e);
00185 
00186         if (e.button == LeftButton)
00187         {
00188                 float adj = getAdjustDirectionFromPoint(e.position);
00189 
00190                 // adjust slider position in whichever direction as required.
00191                 if (adj != 0)
00192                 {
00193                         setCurrentValue(d_value + (adj * d_step));
00194                 }
00195 
00196                 e.handled = true;
00197         }
00198 
00199 }
00200 
00201 
00202 /*************************************************************************
00203         Handler for scroll wheel changes
00204 *************************************************************************/
00205 void Slider::onMouseWheel(MouseEventArgs& e)
00206 {
00207         // base class processing
00208         Window::onMouseWheel(e);
00209 
00210         // scroll by e.wheelChange * stepSize
00211         setCurrentValue(d_value + d_step * -e.wheelChange);
00212 
00213         // ensure the message does not go to our parent.
00214         e.handled = true;
00215 }
00216 
00217 
00218 /*************************************************************************
00219         handler function for when thumb moves.  
00220 *************************************************************************/
00221 bool Slider::handleThumbMoved(const EventArgs& e)
00222 {
00223         setCurrentValue(getValueFromThumb());
00224 
00225         return true;
00226 }
00227 
00228 
00229 /*************************************************************************
00230         handler function for when thumb tracking begins
00231 *************************************************************************/
00232 bool Slider::handleThumbTrackStarted(const EventArgs& e)
00233 {
00234         // simply trigger our own version of this event
00235         WindowEventArgs args(this);
00236         onThumbTrackStarted(args);
00237 
00238         return true;
00239 }
00240 
00241 
00242 /*************************************************************************
00243         handler function for when thumb tracking begins
00244 *************************************************************************/
00245 bool Slider::handleThumbTrackEnded(const EventArgs& e)
00246 {
00247         // simply trigger our own version of this event
00248         WindowEventArgs args(this);
00249         onThumbTrackEnded(args);
00250 
00251         return true;
00252 }
00253 
00254 
00255 /*************************************************************************
00256         Add properties for the slider
00257 *************************************************************************/
00258 void Slider::addSliderProperties(void)
00259 {
00260         addProperty(&d_currentValueProperty);
00261         addProperty(&d_clickStepSizeProperty);
00262         addProperty(&d_maximumValueProperty);
00263 }
00264 
00265 
00266 } // End of  CEGUI namespace section

Generated on Wed Sep 7 09:56:33 2005 for Crazy Eddies GUI System by  doxygen 1.4.3