Progress.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /******************************************************************************/
  2. #include "stdafx.h"
  3. namespace EE{
  4. /******************************************************************************/
  5. void Progress::zero()
  6. {
  7. mode =PROGRESS_NONE;
  8. _progress=0;
  9. }
  10. Progress::Progress() {zero();}
  11. Progress& Progress::del()
  12. {
  13. skin.clear();
  14. super::del(); zero(); return T;
  15. }
  16. Progress& Progress::create(PROGRESS_MODE mode)
  17. {
  18. del();
  19. T._type =GO_PROGRESS;
  20. T._visible =true;
  21. T. mode =mode;
  22. T._rect.max.x= 0.40f;
  23. T._rect.min.y=-0.04f;
  24. return T;
  25. }
  26. Progress& Progress::create(C Progress &src)
  27. {
  28. if(this!=&src)
  29. {
  30. if(!src.is())del();else
  31. {
  32. copyParams(src);
  33. _type =GO_PROGRESS;
  34. mode =src. mode;
  35. skin =src. skin;
  36. _progress=src._progress;
  37. }
  38. }
  39. return T;
  40. }
  41. /******************************************************************************/
  42. Progress& Progress::clear( ) {T._progress=0 ; return T;}
  43. Progress& Progress::set (Int x, Int max) {T._progress=((max>0) ? Sat( Flt(x)/max ) : 0); return T;}
  44. Progress& Progress::set (Long x, Long max) {T._progress=((max>0) ? Sat(Flt(Dbl(x)/max)) : 0); return T;}
  45. Progress& Progress::set (Flt progress ) {T._progress=Sat(progress) ; return T;}
  46. /******************************************************************************/
  47. void Progress::draw(C GuiPC &gpc)
  48. {
  49. if(visible() && gpc.visible)
  50. if(GuiSkin *skin=getSkin())
  51. {
  52. Rect rect=T.rect()+gpc.offset, ext_rect, prog_ext_rect;
  53. if(skin->progress.background) skin->progress.background->extendedRect(rect, ext_rect);else ext_rect =rect;
  54. if(skin->progress.progress && skin->progress.progress ->extendedRect(rect, prog_ext_rect)) ext_rect|=prog_ext_rect;
  55. if(Cuts(ext_rect, gpc.clip))
  56. {
  57. Bool vertical=rect.vertical();
  58. D.clip(gpc.clip);
  59. D.alignScreenToPixel(rect);
  60. // background
  61. if(skin->progress.background)
  62. {
  63. if(vertical)skin->progress.background->drawVertical(skin->progress.background_color, TRANSPARENT, rect);
  64. else skin->progress.background->draw (skin->progress.background_color, TRANSPARENT, rect);
  65. }else
  66. if(skin->progress.background_color.a)rect.draw(skin->progress.background_color);
  67. // progress
  68. if(skin->progress.progress)
  69. {
  70. if(skin->progress.draw_progress_partial)
  71. {
  72. if(vertical)skin->progress.progress->drawVerticalFrac(skin->progress.progress_color, TRANSPARENT, rect, T(), true);
  73. else skin->progress.progress->drawFrac (skin->progress.progress_color, TRANSPARENT, rect, T(), true);
  74. }else
  75. {
  76. Rect prog_rect=rect; if(vertical)prog_rect.max.y=rect.lerpY(T());else prog_rect.max.x=rect.lerpX(T());
  77. // shrink in case of shadow/glow
  78. if(skin->progress.progress->_padd_any)
  79. {
  80. if(vertical)
  81. {
  82. Flt h=prog_rect.h(), size=skin->progress.progress->_side_size.y, scale; if(skin->progress.progress->getSideScale(rect, scale))size*=scale;
  83. if(size>h)
  84. {
  85. scale=h/size; scale=(1-scale)*prog_rect.w()*0.5f;
  86. prog_rect.min.x+=scale;
  87. prog_rect.max.x-=scale;
  88. }
  89. }else
  90. {
  91. Flt w=prog_rect.w(), size=skin->progress.progress->_side_size.x, scale; if(skin->progress.progress->getSideScale(rect, scale))size*=scale;
  92. if(size>w)
  93. {
  94. Flt scale=w/size; scale=(1-scale)*prog_rect.h()*0.5f;
  95. prog_rect.min.y+=scale;
  96. prog_rect.max.y-=scale;
  97. }
  98. }
  99. }
  100. if(vertical)skin->progress.progress->drawVertical(skin->progress.progress_color, TRANSPARENT, prog_rect);
  101. else skin->progress.progress->draw (skin->progress.progress_color, TRANSPARENT, prog_rect);
  102. }
  103. }else
  104. if(skin->progress.progress_color.a)
  105. {
  106. Rect prog_rect=rect; if(vertical)prog_rect.max.y=rect.lerpY(T());else prog_rect.max.x=rect.lerpX(T());
  107. prog_rect.draw(skin->progress.progress_color);
  108. }
  109. // text
  110. if(mode)
  111. if(TextStyle *text_style=skin->progress.text_style())
  112. {
  113. TextStyleParams ts=*text_style; ts.size=(vertical ? rect.w()*0.5f : rect.h())*skin->progress.text_size;
  114. D.text(ts, rect.center(), (mode==PROGRESS_PERCENT) ? S+RoundPos(T()*100)+'%' : S+T());
  115. }
  116. }
  117. }
  118. }
  119. /******************************************************************************/
  120. Bool Progress::save(File &f, CChar *path)C
  121. {
  122. if(super::save(f, path))
  123. {
  124. f.cmpUIntV(4); // version
  125. f<<_progress<<mode;
  126. f._putAsset(skin.name(path));
  127. return f.ok();
  128. }
  129. return false;
  130. }
  131. Bool Progress::load(File &f, CChar *path)
  132. {
  133. del(); if(super::load(f, path))switch(f.decUIntV()) // version
  134. {
  135. case 4:
  136. {
  137. _type=GO_PROGRESS;
  138. f>>_progress>>mode;
  139. skin.require(f._getAsset(), path);
  140. if(f.ok())return true;
  141. }break;
  142. case 3:
  143. {
  144. _type=GO_PROGRESS;
  145. f>>mode; f.skip(13); f>>_progress; f._getStr(); f._getStr();
  146. if(f.ok())return true;
  147. }break;
  148. case 2:
  149. {
  150. _type=GO_PROGRESS;
  151. f>>mode; f.skip(13); f>>_progress; f._getStr(); f._getStr();
  152. if(f.ok())return true;
  153. }break;
  154. case 1:
  155. {
  156. _type=GO_PROGRESS;
  157. f>>mode; f.skip(12); f>>_progress; f._getStr8(); f._getStr8();
  158. if(f.ok())return true;
  159. }break;
  160. case 0:
  161. {
  162. _type=GO_PROGRESS;
  163. f>>mode; f.skip(8); f>>_progress; f._getStr8();
  164. if(f.ok())return true;
  165. }break;
  166. }
  167. del(); return false;
  168. }
  169. /******************************************************************************/
  170. }
  171. /******************************************************************************/