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

slider.cpp

Go to the documentation of this file.
00001 /* *************************************************************************************
00002         Writer:         Sebastien Bloc
00003         Copyright:      2003-2004
00004         eMail:          sebastien.bloc@free.fr
00005         URL:            http://mignonsoft.free.fr
00006 
00007         This program is free software; you can redistribute it and/or
00008         modify it under the terms of the GNU General Public License
00009         as published by the Free Software Foundation; either version 2
00010         of the License, or (at your option) any later version.
00011 
00012         This program is distributed in the hope that it will be useful,
00013         but WITHOUT ANY WARRANTY; without even the implied warranty of
00014         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015         GNU General Public License for more details.
00016         http://www.gnu.org/copyleft/gpl.html
00017 ************************************************************************************* */
00018 
00019 #include "3d.h"
00020 #include "input.h"
00021 #include "controlEngine.h"
00022 #include "slider.h"
00023 
00024 extern ControlEngine ce;
00025 
00026 Slider::Slider()        
00027 {
00028         // init variable
00029         name="Slider";
00030         Init(0,100,30,70);
00031         Step(5);
00032         useButtons = TRUE;
00033 
00034         body.onControl.mouse.move.connect(this,OnMouseMove);
00035         body.onControl.mouse.left.down.connect(this,OnLMouseDown);
00036         btnMinus.onControl.mouse.left.down.connect(this,OnMinusLMouseDown);
00037         btnPlus.onControl.mouse.left.down.connect(this,OnPlusLMouseDown);
00038         btnMinus.onControl.over.out.connect(this,OnButtonsOverOut);
00039         btnPlus.onControl.over.out.connect(this,OnButtonsOverOut);
00040         btnMinus.onControl.mouse.left.up.connect(this,OnButtonsLMouseUp);
00041         btnPlus.onControl.mouse.left.up.connect(this,OnButtonsLMouseUp);
00042 }
00043 
00044 Slider::~Slider()
00045 {
00046 }
00047 
00048 // ********************************************************************************
00049 
00050 void Slider::Create(double depth)
00051 {
00052         SetParent();
00053 
00054         // init general
00055         faceNode = ce.primitive.AddFace("Slider",id,-1,FALSE);
00056 
00057         ce.Push(this);
00058                 // dessin du corps
00059                 body.faceNode = ce.primitive.AddBox("Body",body.id,depth,FALSE);
00060                 body.SetBlending(TRUE);
00061                 body.faceNode->elem->material.SetDS(0,0,1,0.25f);
00062 
00063                 if (useButtons)
00064                 {
00065                         btnMinus.Create(depth);
00066                         btnMinus.XDockLeft(0,SIZE_BUTTON);
00067                         btnMinus.YDockCenter(0,0);
00068                         btnMinus.depth_min=btnMinus.depth_max; // ne peut pas etre appyé
00069                         ConfigFaces(&btnMinus,&ce.texture.arrow);
00070                         btnPlus.Create(depth);
00071                         btnPlus.XDockRight(0,SIZE_BUTTON,TRUE);
00072                         btnPlus.YDockCenter(0,0);
00073                         btnPlus.depth_min=btnPlus.depth_max; // ne peut pas etre appyé
00074                         btnPlus.Rotate(0,180,0);
00075                         btnPlus.Move(-SIZE_BUTTON/2.0,0,depth);
00076                         btnPlus.faceNode->Elems(FACE_BACK)->view=TRUE;
00077                         ConfigFaces(&btnPlus,&ce.texture.arrow);
00078                         body.XDockCenter(SIZE_BUTTON,SIZE_BUTTON);
00079                         body.YDockCenter(0,0);
00080                 }
00081                 else
00082                 {
00083                         body.XDockCenter(0,0);
00084                         body.YDockCenter(0,0);
00085                 }
00086 
00087                 ce.Push(this);
00088                         cursor.faceNode = ce.primitive.AddBox("Cursor",cursor.id,depth-4,FALSE);
00089                         cursor.YDockCenter(2,2);
00090                         cursor.Move(0,0,2);
00091                         cursor.faceNode->elem->material.SetDS(1,1,1);
00092                         ConfigFaces(&cursor,&ce.texture.grip);
00093                         cursor.faceNode->MoveToFirstChild(); // pour que la transparence puisse s'applique au body qui est contien
00094                         Refresh();
00095                 ce.Pop();
00096         ce.Pop();
00097 }
00098 
00099 int Slider::OnAutoMinus(Timer *)
00100 {
00101         Current(-stepButton);
00102         SendMoving();
00103         return 0;
00104 }
00105 
00106 void Slider::SendMoving()
00107 {
00108         double deltaRang = maximum-minimum;
00109         double percentMin = (curMin-minimum)/deltaRang; 
00110         double percentMax = (maximum-curMax)/deltaRang;
00111         double percent = percentMin/(percentMin+percentMax);
00112         onSlidder.moving(curMin,curMax,percent);
00113 }
00114 
00115 int Slider::OnButtonsOverOut(Control *,int)
00116 {
00117         timerAutoButton.StopAndUnBind();
00118         return 0;
00119 }
00120 
00121 int Slider::OnButtonsLMouseUp(StateMouse *,int)
00122 {
00123         timerAutoButton.StopAndUnBind();
00124         return 0;
00125 }
00126 
00127 int Slider::OnMinusLMouseDown(StateMouse *,int)
00128 {
00129         BindTimer(timerAutoButton,OnAutoMinus,100);
00130         OnAutoMinus(NULL);
00131         return 0;
00132 }
00133 
00134 int Slider::OnAutoPlus(Timer *)
00135 {
00136         Current(stepButton);
00137         SendMoving();
00138         return 0;
00139 }
00140 
00141 int Slider::OnPlusLMouseDown(StateMouse *,int)
00142 {
00143         BindTimer(timerAutoButton,OnAutoPlus,100);
00144         OnAutoPlus(NULL);
00145         return 0;
00146 }
00147 
00148 int Slider::OnLMouseDown(StateMouse *mouse,int face)
00149 {
00150         return OnMouseMove(mouse,0,0,face);
00151 }
00152 
00153 void Slider::ConfigFaces(Control *control,Texture *texture)
00154 {
00155         for (control->faceNode->childs.i=0;control->faceNode->childs.i.More();control->faceNode->childs.i++)
00156         {
00157                 control->faceNode->childs.i.GetElem()->elem->texture = texture;
00158         }
00159 }
00160 
00161 // ********************************************************************************
00162 
00163 int Slider::OnMouseMove(StateMouse *mouse,int deltaX,int deltaY,int face)
00164 {
00165         if (mouse->leftBtn)
00166         {
00167                 Point2D<double> pos(mouse->pos.x,mouse->pos.y);
00168                 Point2D<double> result;  
00169                 result = body.GetLocalPos(face,pos);
00170                 SetCurrentByPosition(result.x);
00171                 Refresh();
00172                 SendMoving();
00173         }
00174         return 0;
00175 }
00176 
00177 BOOL Slider::Step(double step)
00178 {
00179         if (step<0) return FALSE;
00180         stepButton = step;
00181         return TRUE;
00182 }
00183 
00184 void Slider::Setup(double min,double max,double curMin,double curMax)
00185 {
00186         Init(min,max,curMin,curMax);
00187         Refresh();
00188 }
00189 
00190 void Slider::Init(double min,double max,double curMin,double curMax)
00191 {
00192         minimum=min;
00193         maximum=max;
00194         SetCurrent(curMin,curMax);
00195 }
00196 
00197 BOOL Slider::Min(double value)
00198 {
00199         if (!SetMin(value)) return FALSE;
00200         Refresh();
00201         return TRUE;
00202 }
00203 
00204 BOOL Slider::SetMin(double value)
00205 {
00206         if (value<=maximum) return FALSE;
00207         minimum=value;
00208         return TRUE;
00209 }
00210 
00211 BOOL Slider::Max(double value)
00212 {
00213         if (!SetMax(value))return FALSE;
00214         Refresh();
00215         return TRUE;
00216 }
00217 
00218 BOOL Slider::SetMax(double value)
00219 {
00220         if (value>=minimum) return FALSE;
00221         maximum=value;
00222         return TRUE;
00223 }
00224 
00225 BOOL Slider::Current(double min,double max)
00226 {
00227         if (!SetCurrent(min,max))return FALSE;
00228         Refresh();
00229         return TRUE;
00230 }
00231 
00232 BOOL Slider::Current(double delta)
00233 {
00234         SetCurrent(delta);
00235         Refresh();
00236         return TRUE;
00237 }
00238 
00239 BOOL Slider::SetCurrent(double min,double max)
00240 {
00241         double tMin,tMax;
00242         tMin=min>maximum?maximum:min;
00243         tMin=min<minimum?minimum:min;
00244 
00245         tMax=max>maximum?maximum:max;
00246         tMax=max<minimum?minimum:max;
00247 
00248         if (tMin>=tMax) return FALSE; 
00249         curMin=tMin;
00250         curMax=tMax;
00251         return TRUE;
00252 }
00253 
00254 BOOL Slider::SetCurrent(double delta)
00255 {
00256         if ((curMin+delta)<minimum) delta=minimum-curMin;
00257         if ((curMax+delta)>maximum) delta=maximum-curMax;
00258         curMin+=delta;
00259         curMax+=delta;
00260         return TRUE;
00261 }
00262 
00263 void Slider::SetCurrentByPosition(double x)
00264 {
00265         double percent;
00266         percent = x/body.faceNode->elem->computeSize.x;
00267         double curValue = percent*(maximum-minimum)+minimum;
00268         double delta = (curValue-(curMax-curMin)/2.0)-curMin;
00269         SetCurrent(delta);
00270 }
00271 
00272 void Slider::Refresh()
00273 {
00274         double percent;
00275         double deltaCur = curMax-curMin;
00276         double deltaSlider= maximum-minimum;
00277         double deltaBody = body.faceNode->elem->computeSize.x;
00278         if (!deltaBody) 
00279         {
00280                 ce.primitive.ComputeLayout(body.faceNode);
00281                 deltaBody = body.faceNode->elem->computeSize.x;
00282         }
00283         double deltaX = deltaCur/deltaSlider;
00284         if (deltaX>1) deltaX=1;
00285         if(deltaX*deltaBody<MIN_SIZE_CURSOR) 
00286         {
00287                 deltaX=MIN_SIZE_CURSOR/deltaBody;
00288         }
00289         percent=((curMin-minimum)+deltaCur/2.0)/deltaSlider;
00290         cursor.XDockLeft(percent*deltaBody+SIZE_BUTTON,deltaX*deltaBody,TRUE);
00291 }
00292 
00293 // ********************************************************************************
00294 
00295 void Slider::ToString(MyString &str)
00296 {
00297         str.AddFormat("name: %s",name);
00298 }
00299 
00300 // ********************************************************************************
00301 // ********************************************************************************
00302 // ********************************************************************************
00303 // ********************************************************************************
00304 // ********************************************************************************
00305 // ********************************************************************************

Generated on Fri Aug 20 19:19:49 2004 for 3d Controls by doxygen 1.3.6