00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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
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
00055 faceNode = ce.primitive.AddFace("Slider",id,-1,FALSE);
00056
00057 ce.Push(this);
00058
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;
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;
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();
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