00001 #include "../../Library/SDK_Manila_Sense.h"
00002
00003 DIRECTDRAW_GDI *MySlider::slideSurf=NULL;
00004 DIRECTDRAW_GDI *MySlider::btnSurf=NULL;
00005 MySlider *MySlider::slideRunning=NULL;
00006 int MySlider::widthSlide=0;
00007 int MySlider::heightSlide=0;
00008 int MySlider::widthBtn=0;
00009 int MySlider::heightBtn=0;
00010
00011
00012 void MySlider::loadSurf(){
00013 if(slideSurf==NULL){
00014 slideSurf=loadImage(gi->btn_common_slider);
00015 widthSlide=slideSurf->width/4;
00016 heightSlide=slideSurf->height;
00017 }
00018 if(btnSurf==NULL){
00019 btnSurf=loadImage(gi->btn_slider);
00020 widthBtn=btnSurf->width/2;
00021 heightBtn=btnSurf->height;
00022 }
00023
00024 DWORD dwWidth = GetSystemMetrics(SM_CXSCREEN);
00025 DWORD dwHeight = GetSystemMetrics(SM_CYSCREEN);
00026
00027 double diff=dwWidth- dwHeight;
00028 if(dwWidth > dwHeight){
00029 if(this->getWidth()+diff+getLeft()<dwWidth){
00030 this->setWidth(this->getWidth()+diff);
00031 }
00032 }else{
00033 if(this->getWidth()+getLeft()>dwWidth){
00034 this->setWidth(this->getWidth()+diff);
00035 }
00036 }
00037 isSliding=false;
00038
00039 }
00040
00041 MySlider::MySlider(int idElement, int x,int y,int width,bool visible,
00042 int minVal,int maxVal):Element(idElement, x,y,TYPE_SLIDER)
00043 {
00044 sliderAnim=false;
00045 width=width*gi->percentOfVGA;
00046 if (x+width>gi->rs.right)
00047 {
00048 width=gi->rs.right-x;
00049 }
00050 this->setWidth(width);
00051
00052 loadSurf();
00053
00054 this->minVal=minVal;
00055 this->maxVal=maxVal;
00056
00057 this->setHeight(heightSlide);
00058 positionAbsolute.left=0;
00059 positionAbsolute.top=0;
00060 positionAbsolute.right=0;
00061 positionAbsolute.bottom=0;
00062
00063 if(visible)
00064 state=VIS_SLIDE_NORMAL;
00065 else
00066 state=VIS_SLIDE_DISABLED;
00067 position=minVal;
00068 };
00069
00070 MySlider::MySlider(int idElement, int x,int y,int width,bool visible,
00071 double lengthAnim):Element(idElement, x,y,TYPE_SLIDER)
00072 {
00073 sliderAnim=true;
00074 width=width*gi->percentOfVGA;
00075 if (x+width>gi->rs.right)
00076 {
00077 width=gi->rs.right-x;
00078 }
00079 this->setWidth(width);
00080
00081 loadSurf();
00082
00083 this->minVal=0;
00084 this->maxVal=100;
00085
00086
00087 this->setHeight(heightSlide);
00088 positionAbsolute.left=0;
00089 positionAbsolute.top=0;
00090 positionAbsolute.right=0;
00091 positionAbsolute.bottom=0;
00092
00093 if(visible)
00094 state=VIS_SLIDE_NORMAL;
00095 else
00096 state=VIS_SLIDE_DISABLED;
00097 position=minVal;
00098 }
00099
00100 MySlider::~MySlider(void)
00101 {
00102 }
00103
00104 bool MySlider::run(bool isRightClicked){
00105 Element::run(isRightClicked);
00106 return isActivated;
00107 }
00108
00109 void MySlider::unClick(){
00110 this->isActivated=false;
00111
00112 if(container!=NULL){
00113 this->mouseEvent->changeMouseAnalyse(container);
00114 mouseEvent->setClickSelected(false);
00115 }else
00116 return;
00117
00118 container->unselect();
00119 container=NULL;
00120 if(sliderAnim){
00121 gi->rcUpdateRegion.left=this->positionAbsolute.left;
00122 gi->rcUpdateRegion.right=this->positionAbsolute.left+this->getWidth();
00123 gi->rcUpdateRegion.top=this->positionAbsolute.top;
00124 gi->rcUpdateRegion.bottom=this->positionAbsolute.bottom+this->getHeight();
00125 isSliding=true;
00126 gi->mustRedraw=true;
00127 slideRunning=this;
00128
00129 SetTimer(gi->m_hWnd, 2, MS_PER_FRAME,NULL);
00130 }
00131 };
00132
00133 Element* MySlider::isClicked(int x,int y){
00134 if(state!=0)
00135 return NULL;
00136 if(positionAbsolute.right==positionAbsolute.bottom&&
00137 positionAbsolute.bottom==0)
00138 return NULL;
00139
00140 if(x>positionAbsolute.left&&x<positionAbsolute.right&&
00141 y>positionAbsolute.top-gi->rcVisibleDesktopTOP.top&&y<positionAbsolute.top-gi->rcVisibleDesktopTOP.top+this->getHeight()){
00142 if(sliderAnim){
00143 double posAbs=widthBtn/2+(this->getWidth()-widthBtn)*(position-minVal)/(double)maxVal;
00144 if(x<positionAbsolute.left+posAbs-widthBtn/2||x>positionAbsolute.left+posAbs+widthBtn/2)
00145 return NULL;
00146 }
00147 this->isActivated=true;
00148
00149 KillTimer(gi->m_hWnd, 2);
00150
00151 container=(Section*)this->mouseEvent->changeMouseAnalyse(this);
00152 return this;
00153 }
00154 return NULL;
00155 };
00156
00157 void MySlider::paint(DIRECTDRAW_GDI* lpDDraw,int x,int y){
00158 positionAbsolute.top=this->getTop()+y;
00159 positionAbsolute.bottom=positionAbsolute.top+this->getHeight();
00160 positionAbsolute.left=this->getLeft()+x;
00161 positionAbsolute.right=positionAbsolute.left+getWidth();
00162
00163 RECT posClipping=positionAbsolute;
00164
00165
00166
00167 if(positionAbsolute.top>=gi->rcUpdateRegion.bottom||positionAbsolute.bottom<=gi->rcUpdateRegion.top||
00168 positionAbsolute.left>=gi->rcUpdateRegion.right||positionAbsolute.right<=gi->rcUpdateRegion.left)
00169 return;
00170
00171 if(positionAbsolute.top<gi->rcUpdateRegion.top){
00172 clipping.top=gi->rcUpdateRegion.top-positionAbsolute.top;
00173 positionAbsolute.top=gi->rcUpdateRegion.top;
00174 }else{
00175 clipping.top=0;
00176 }
00177 if(positionAbsolute.bottom>gi->rcUpdateRegion.bottom){
00178 clipping.bottom=this->getHeight()-(positionAbsolute.bottom-gi->rcUpdateRegion.bottom);
00179 positionAbsolute.bottom=gi->rcUpdateRegion.bottom;
00180 }else{
00181 clipping.bottom=this->getHeight();
00182 }
00183 if(positionAbsolute.left<gi->rcUpdateRegion.left){
00184 clipping.left=gi->rcUpdateRegion.left-positionAbsolute.left;
00185 positionAbsolute.left=gi->rcUpdateRegion.left;
00186 posClipping.left=gi->rcUpdateRegion.left;
00187 }else{
00188 clipping.left=0;
00189 }
00190 if(positionAbsolute.right>gi->rcUpdateRegion.right){
00191 clipping.right=this->getWidth()-(positionAbsolute.right-gi->rcUpdateRegion.right);
00192 positionAbsolute.right=gi->rcUpdateRegion.right;
00193 posClipping.right=gi->rcUpdateRegion.right;
00194 }else{
00195 clipping.right=this->getWidth();
00196 }
00197
00198
00199
00200 posClipping.bottom=positionAbsolute.bottom;
00201 posClipping.top=positionAbsolute.top;
00202
00203 double posAbs=widthBtn/2+(this->getWidth()-widthBtn)*(position-minVal)/(double)maxVal;
00204
00205 RECT tmp=positionAbsolute;
00206 RECT tmpSrc=clipping;
00207 HRESULT hres;
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217 gi->window->BltFast(lpDDraw,&posClipping, gi->background,&posClipping, DDBLT_WAITNOTBUSY,NULL);
00218
00219 int decal=getWidth()-10;
00220 if(decal>widthSlide-10)
00221 decal=widthSlide-10;
00222 decal=decal-clipping.left;
00223 if(decal>0){
00224
00225 tmp.right=tmp.left+decal;
00226 tmpSrc.left=(state)*widthSlide+clipping.left;
00227 tmpSrc.right=tmpSrc.left+decal;
00228
00229 if(tmp.right>positionAbsolute.right){
00230 tmpSrc.right-=tmp.right-positionAbsolute.right;
00231 tmp.right=positionAbsolute.right;
00232 }
00233 if(tmpSrc.right>=(state+1)*widthSlide){
00234 tmp.right-=tmpSrc.right-(state+1)*widthSlide-1;
00235 tmpSrc.right=(state+1)*widthSlide-1;
00236 }
00237 hres= gi->window->BltFast(lpDDraw,&tmp, slideSurf,&tmpSrc, DDBLT_WAITNOTBUSY|DDBLT_KEYSRC,NULL);
00238 if (hres != DD_OK)
00239 LocalisedString::explainFailDirectDraw(hres,L"MySlider Blt(input [);");
00240
00241 tmp.left=tmp.right;
00242 tmp.right=positionAbsolute.right;
00243 }
00244 int savLeft=tmp.left;
00245 if(clipping.right>this->getWidth()-10&&widthSlide>10){
00246
00247 tmp.left=this->getLeft()+x+getWidth()-10;
00248 tmp.right=positionAbsolute.right;
00249 tmpSrc.left=(state+1)*widthSlide-10;
00250 tmpSrc.right=(state+1)*widthSlide-(getWidth()-clipping.right);
00251 hres= gi->window->BltFast(lpDDraw,&tmp, slideSurf,&tmpSrc, DDBLT_WAITNOTBUSY|DDBLT_KEYSRC,NULL);
00252 if (hres != DD_OK)
00253 LocalisedString::explainFailDirectDraw(hres,L"MySlider Blt(input ]);");
00254
00255 tmp.right=tmp.left;
00256 }
00257
00258 tmp.left=savLeft;
00259 if(tmp.left<tmp.right&&widthSlide>10){
00260
00261 tmpSrc.left=(state+1)*widthSlide-10;
00262 tmpSrc.right=tmpSrc.left+1;
00263 hres= gi->window->BltFast(lpDDraw,&tmp, slideSurf,&tmpSrc, DDBLT_WAITNOTBUSY|DDBLT_KEYSRC,NULL);
00264 if (hres != DD_OK)
00265 LocalisedString::explainFailDirectDraw(hres,L"MySlider Blt(input mdl);");
00266 }
00267
00268
00269 tmp=positionAbsolute;
00270 tmpSrc=clipping;
00271 decal=posAbs;
00272 if(decal>widthSlide-10)
00273 decal=widthSlide-10;
00274 decal=decal-clipping.left;
00275 if(posAbs>tmpSrc.left&&widthSlide>10){
00276 if(decal>0){
00277
00278 tmp.right=tmp.left+decal;
00279 if(tmp.right>positionAbsolute.right)
00280 tmp.right=positionAbsolute.right;
00281 tmpSrc.left=(state+1)*widthSlide+clipping.left;
00282 tmpSrc.right=tmpSrc.left+decal;
00283 if(tmpSrc.right>=(state+2)*widthSlide)
00284 tmpSrc.right=(state+2)*widthSlide-1;
00285 hres= gi->window->BltFast(lpDDraw,&tmp, slideSurf,&tmpSrc, DDBLT_WAITNOTBUSY|DDBLT_KEYSRC,NULL);
00286 if (hres != DD_OK)
00287 LocalisedString::explainFailDirectDraw(hres,L"MySlider Blt(input [);");
00288
00289 tmp.left=tmp.right;
00290 }
00291
00292 tmp.right=x+this->getLeft()+posAbs;
00293 if(tmp.left<tmp.right){
00294
00295 tmpSrc.left=(state+2)*widthSlide-10;
00296 tmpSrc.right=tmpSrc.left+1;
00297 hres= gi->window->BltFast(lpDDraw,&tmp, slideSurf,&tmpSrc, DDBLT_WAITNOTBUSY|DDBLT_KEYSRC,NULL);
00298 if (hres != DD_OK)
00299 LocalisedString::explainFailDirectDraw(hres,L"MySlider Blt(input mdl);");
00300 }
00301 }
00302
00303 int top=y+this->getTop()+(heightSlide-heightBtn)/2;
00304 int left=x+this->getLeft()+posAbs-widthBtn/2;
00305 RECT posBtn={left,top,
00306 left+widthBtn,top+heightBtn};
00307 RECT srcBtn={0,0,widthBtn,heightBtn};
00308 if(state!=0){
00309 srcBtn.left+=widthBtn;
00310 srcBtn.right+=widthBtn;
00311 }
00312
00313
00314
00315
00316
00317 gi->window->BltFast(lpDDraw,&posBtn, btnSurf,&srcBtn, NULL,NULL);
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328 positionAbsolute.top=this->getTop()+y;
00329 positionAbsolute.left=this->getLeft()+x;
00330 };
00331
00332
00333 int MySlider::mouseGesture(){
00334
00335 if(!mouseEvent->isMouseDown()){
00336 mySpeed=mouseEvent->getMouseDXMean()*MS_PER_FRAME;
00337 if(mySpeed>20)
00338 mySpeed=20;
00339 this->unClick();
00340 return 0;
00341 }
00342
00343 int x,y;
00344 mouseEvent->getMousePosition(x,y);
00345 int newX=maxVal*(x-widthBtn/2-this->getLeft())/(this->getWidth()-widthBtn)+minVal;
00346 if(newX<minVal)
00347 newX=minVal;
00348 if(newX>maxVal)
00349 newX=maxVal;
00350
00351 this->updatePosition(newX);
00352 return 0;
00353 };
00354 void MySlider::updatePosition(int newPos){
00355 if(isSliding&&newPos<0){
00356 if(mySpeed>0){
00357 mySpeed-=mySpeed/2.0+1;
00358 newPos=position+mySpeed;
00359 }else{
00360 newPos=position-(position-minVal)/2-1;
00361 if (newPos<=minVal)
00362 {
00363 newPos=minVal;
00364 isSliding=false;
00365 gi->mustRedraw=false;
00366
00367 KillTimer(gi->m_hWnd, 2);
00368 }
00369 }
00370 }
00371 if(position==newPos)
00372 return;
00373 double posAbs=widthBtn/2+(this->getWidth()-widthBtn)*(position-minVal)/(double)maxVal;
00374 position=newPos;
00375 if(position>maxVal)
00376 position=maxVal;
00377 if(position<minVal)
00378 position=minVal;
00379 double posAbs1=widthBtn/2+(this->getWidth()-widthBtn)*(position-minVal)/(double)maxVal;
00380 if(posAbs==posAbs1)
00381 return;
00382 RECT prev=gi->rcUpdateRegion;
00383 if(positionAbsolute.bottom>positionAbsolute.top){
00384 gi->mustRedraw=true;
00385 if(posAbs1>posAbs){
00386 RECT update={getLeft()+posAbs-widthBtn/2,positionAbsolute.top,
00387 getLeft()+posAbs1+widthBtn/2,positionAbsolute.top+heightSlide};
00388
00389 gi->window->addToRedraw(update,false);
00390 }else{
00391 RECT update={getLeft()+posAbs1-widthBtn/2,positionAbsolute.top,
00392 getLeft()+posAbs+widthBtn/2,positionAbsolute.top+heightSlide};
00393
00394 gi->window->addToRedraw(update,false);
00395 }
00396 gi->rcUpdateRegion=prev;
00397 }
00398 getGestEvent()->messageProc(this,EVENT_VALUE_CHANGED);
00399 static int heightBtn;
00400 };