Slider.cpp 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. namespace EE{
  4. /******************************************************************************/
  5. void Slider::zero()
  6. {
  7. _vertical =false;
  8. _focusable =false;
  9. _value =0;
  10. _lit =0;
  11. _func_immediate=false;
  12. _func_user =null;
  13. _func =null;
  14. }
  15. Slider::Slider() {zero();}
  16. Slider& Slider::del()
  17. {
  18. skin.clear();
  19. super::del(); zero(); return T;
  20. }
  21. Slider& Slider::create()
  22. {
  23. del();
  24. _type =GO_SLIDER;
  25. _visible =true;
  26. _rect.max.x= 0.30f;
  27. _rect.min.y=-0.05f;
  28. return T;
  29. }
  30. Slider& Slider::create(C Slider &src)
  31. {
  32. if(this!=&src)
  33. {
  34. if(!src.is())del();else
  35. {
  36. copyParams(src);
  37. _type =GO_SLIDER;
  38. skin =src. skin;
  39. _vertical =src._vertical;
  40. _focusable =src._focusable;
  41. _value =src._value;
  42. _lit =src._lit;
  43. _func_immediate=src._func_immediate;
  44. _func_user =src._func_user;
  45. _func =src._func;
  46. }
  47. }
  48. return T;
  49. }
  50. /******************************************************************************/
  51. Slider& Slider::func(void (*func)(Ptr), Ptr user, Bool immediate)
  52. {
  53. T._func =func;
  54. T._func_user =user;
  55. T._func_immediate=immediate;
  56. return T;
  57. }
  58. void Slider::call()
  59. {
  60. if(_func)if(_func_immediate)_func(_func_user);else Gui.addFuncCall(_func, _func_user);
  61. }
  62. /******************************************************************************/
  63. Slider& Slider::focusable(Bool on) {if(_focusable!=on){_focusable=on; if(!on)kbClear();} return T;}
  64. /******************************************************************************/
  65. Slider& Slider::set(Flt value, SET_MODE mode)
  66. {
  67. SAT(value);
  68. if(T._value!=value)
  69. {
  70. T._value=value;
  71. if(mode!=QUIET)call();
  72. }
  73. return T;
  74. }
  75. /******************************************************************************/
  76. Slider& Slider::rect(C Rect &rect)
  77. {
  78. //if(T.rect()!=rect) below looks fast so don't need this
  79. {
  80. super::rect(rect);
  81. T._vertical=T.rect().vertical();
  82. }
  83. return T;
  84. }
  85. /******************************************************************************/
  86. GuiObj* Slider::test(C GuiPC &gpc, C Vec2 &pos, GuiObj* &mouse_wheel)
  87. {
  88. if(visible() && gpc.visible)
  89. {
  90. Rect r=rect();
  91. if(GuiSkin *skin=getSkin())
  92. if(PanelImage *slider=skin->slider.slider())
  93. {
  94. if(_vertical)
  95. {
  96. Flt h=rect().w()*slider->image.aspect()*0.5f,
  97. y=rect().h()*_value+rect().min.y;
  98. r.includeY(y-h, y+h);
  99. }else
  100. {
  101. Flt w=rect().h()*slider->image.aspect()*0.5f,
  102. x=rect().w()*_value+rect().min.x;
  103. r.includeX(x-w, x+w);
  104. }
  105. }
  106. if(Cuts(pos, (r+gpc.offset)&gpc.clip))
  107. {
  108. if(!mouse_wheel || mouse_wheel->type()!=GO_SLIDEBAR)mouse_wheel=this; // don't grab wheel focus if it already belongs to a SlideBar (for example Slider located in a Region with SlideBars)
  109. return this;
  110. }
  111. }
  112. return null;
  113. }
  114. void Slider::update(C GuiPC &gpc)
  115. {
  116. Bool enabled=(T.enabled() && gpc.enabled);
  117. if( enabled)
  118. {
  119. if(Gui.wheel()==this && (Ms.wheel() || Ms.wheelX()))set(_value+(Ms.wheel()+Ms.wheelX())*0.1f);
  120. if(Gui.kb ()==this)
  121. {
  122. if(_vertical)
  123. {
  124. if(Kb.b(KB_DOWN))set(_value-Time.d()*0.2f);
  125. if(Kb.b(KB_UP ))set(_value+Time.d()*0.2f);
  126. }else
  127. {
  128. if(Kb.b(KB_LEFT ))set(_value-Time.d()*0.2f);
  129. if(Kb.b(KB_RIGHT))set(_value+Time.d()*0.2f);
  130. }
  131. }
  132. C Vec2 *pos=null; if(Gui.ms()==this && Ms.b(0))pos=&Ms.pos(); if(!pos)REPA(Touches)if(Touches[i].guiObj()==this && Touches[i].on())pos=&Touches[i].pos();
  133. if( pos)set(_vertical ? (pos->y-(rect().min.y+gpc.offset.y))/rect().h() : (pos->x-(rect().min.x+gpc.offset.x))/rect().w());
  134. //AdjustValBool(_lit, Gui.ms()==this && enabled, Gui._time_d_fade_in, Gui._time_d_fade_out);
  135. if(Gui.ms()==this)_lit=1;else MAX(_lit-=Gui._time_d_fade_out, 0);
  136. }
  137. }
  138. void Slider::draw(C GuiPC &gpc)
  139. {
  140. if(visible() && gpc.visible)
  141. if(GuiSkin *skin=getSkin())
  142. {
  143. Rect rect=T.rect()+gpc.offset, ext_rect;
  144. if(skin->slider.background) skin->slider.background->extendedRect(rect, ext_rect);else ext_rect =rect;
  145. if(skin->slider.progress ){Rect r; if(skin->slider.progress ->extendedRect(rect, r )) ext_rect|=r;}
  146. // for simplicity 'skin->slider.slider' is not included in 'ext_rect'
  147. if(Cuts(ext_rect, gpc.clip))
  148. {
  149. D.clip(gpc.clip);
  150. D.alignScreenToPixel(rect);
  151. Rect background_rect=rect;
  152. if(_vertical)
  153. {
  154. Flt shrink=skin->slider.background_shrink*rect.w();
  155. background_rect.min.x+=shrink;
  156. background_rect.max.x-=shrink;
  157. }else
  158. {
  159. Flt shrink=skin->slider.background_shrink*rect.h();
  160. background_rect.min.y+=shrink;
  161. background_rect.max.y-=shrink;
  162. }
  163. // background
  164. if(skin->slider.background)
  165. {
  166. if(_vertical)skin->slider.background->drawVertical(skin->slider.background_color, TRANSPARENT, background_rect);
  167. else skin->slider.background->draw (skin->slider.background_color, TRANSPARENT, background_rect);
  168. }else
  169. if(skin->slider.background_color.a)background_rect.draw(skin->slider.background_color);
  170. // progress
  171. if(skin->slider.progress)
  172. {
  173. if(skin->slider.draw_progress_partial)
  174. {
  175. if(_vertical)skin->slider.progress->drawVerticalFrac(skin->slider.progress_color, TRANSPARENT, background_rect, T(), false);
  176. else skin->slider.progress->drawFrac (skin->slider.progress_color, TRANSPARENT, background_rect, T(), false);
  177. }else
  178. {
  179. Rect prog_rect=background_rect; if(_vertical)prog_rect.max.y=background_rect.lerpY(T());else prog_rect.max.x=background_rect.lerpX(T());
  180. if(_vertical)skin->slider.progress->drawVertical(skin->slider.progress_color, TRANSPARENT, prog_rect);
  181. else skin->slider.progress->draw (skin->slider.progress_color, TRANSPARENT, prog_rect);
  182. }
  183. }else
  184. if(skin->slider.progress_color.a)
  185. {
  186. Rect prog_rect=background_rect; if(_vertical)prog_rect.max.y=background_rect.lerpY(T());else prog_rect.max.x=background_rect.lerpX(T());
  187. prog_rect.draw(skin->slider.progress_color);
  188. }
  189. // slider
  190. if(skin->slider.slider)
  191. {
  192. Color highlight=ColorMulZeroAlpha(skin->mouse_highlight_color, _lit);
  193. if(_vertical)
  194. {
  195. Rect_C r(rect.centerX(), rect.lerpY(T()), rect.w(), rect.w()*skin->slider.slider->image.aspect()); D.alignScreenToPixel(r);
  196. skin->slider.slider->drawVertical(skin->slider.slider_color, highlight, r);
  197. }else
  198. {
  199. Rect_C r(rect.lerpX(T()), rect.centerY(), rect.h()*skin->slider.slider->image.aspect(), rect.h()); D.alignScreenToPixel(r);
  200. skin->slider.slider->draw(skin->slider.slider_color, highlight, r);
  201. }
  202. }
  203. if(Gui.kb()==this)Gui.kbLit(this, rect, skin);
  204. }
  205. }
  206. }
  207. /******************************************************************************/
  208. Bool Slider::save(File &f, CChar *path)C
  209. {
  210. if(super::save(f, path))
  211. {
  212. f.cmpUIntV(2); // version
  213. f<<_focusable<<_value<<_lit;
  214. f._putAsset(skin.name(path));
  215. return f.ok();
  216. }
  217. return false;
  218. }
  219. Bool Slider::load(File &f, CChar *path)
  220. {
  221. del(); if(super::load(f, path))switch(f.decUIntV()) // version
  222. {
  223. case 2:
  224. {
  225. _type=GO_SLIDER;
  226. f>>_focusable>>_value>>_lit; _vertical=rect().vertical();
  227. skin.require(f._getAsset(), path);
  228. if(f.ok())return true;
  229. }break;
  230. case 1:
  231. {
  232. _type=GO_SLIDER;
  233. f>>_focusable>>_value>>_lit; _vertical=rect().vertical();
  234. f._getStr(); f._getStr();
  235. if(f.ok())return true;
  236. }break;
  237. case 0:
  238. {
  239. _type=GO_SLIDER;
  240. f>>_focusable; f.skip(4); f>>_value>>_lit; _vertical=rect().vertical();
  241. f._getStr8();
  242. if(f.ok())return true;
  243. }break;
  244. }
  245. del(); return false;
  246. }
  247. /******************************************************************************/
  248. }
  249. /******************************************************************************/