fork download
  1. template<class T = int> struct slider_point
  2. {
  3. slider_point(){}
  4. slider_point(T x, T y): X(x), Y(y){}
  5. ~slider_point(){}
  6. T X;
  7. T Y;
  8. };
  9.  
  10. template<class T = int> struct slider_values
  11. {
  12. slider_values(){}
  13. slider_values(slider_point<T> min_values, slider_point<T> max_values, slider_point<T> default_values)
  14. :minimum(min_values),maximum(max_values),default(default_values),current(default_values)
  15. {}
  16. ~slider_values(){}
  17. slider_point<T> minimum;
  18. slider_point<T> maximum;
  19. slider_point<T> default;
  20. slider_point<T> current;
  21. };
  22.  
  23. struct slider_box
  24. {
  25. slider_box(){}
  26. ~slider_box(){}
  27. slider_box(slider_point<float> position, slider_point<float> size, DWORD color_inner, DWORD color_outline):
  28. pos(position), size(size), color_inner(color_inner), color_outline(color_outline)
  29. {}
  30. slider_point<float> pos;
  31. slider_point<float> size;
  32. DWORD color_inner;
  33. DWORD color_outline;
  34. void draw()
  35. {
  36. return render->D3DBoxBorder(pos.X,pos.Y,size.X,size.Y,color_outline,color_inner);
  37. }
  38. };
  39.  
  40. struct slider_button
  41. {
  42. slider_button(){}
  43. slider_button(slider_point<float> size, slider_point<float> pos, button_color _appearance = default_appearance, button_color _highlight = default_highlighted, button_color _mousedown = default_mousedown)
  44. : size(size), pos(pos), appearance(_appearance), highlight(_highlight), mousedown(_mousedown)
  45. {}
  46. ~slider_button(){}
  47. button_color appearance;
  48. button_color highlight;
  49. button_color mousedown;
  50. slider_point<float> size;
  51. slider_point<float> pos;
  52. bool IsPointOnThis(slider_point<float> point)
  53. {
  54. return IsPointInArea(point.X,point.Y,pos.X,pos.Y,size.X,size.Y);
  55. }
  56. bool IsMouseOnThis()
  57. {
  58. return IsPointOnThis(slider_point<float>((float)cursorPos.x,(float)cursorPos.y));
  59. }
  60. void SetPos(slider_point<float> point)
  61. {
  62. pos = point;
  63. }
  64. void SetCenter(slider_point<float> point)
  65. {
  66. pos.X = (point.X - (size.X/2.0f));
  67. pos.Y = (point.Y - (size.Y/2.0f));
  68. }
  69. void SetTopLeft(slider_point<float> point)
  70. {
  71. pos = point;
  72. }
  73. void SetTopRight(slider_point<float> point)
  74. {
  75. pos.Y = point.Y;
  76. pos.X = point.X-size.X;
  77. }
  78. void SetBottomLeft(slider_point<float> point)
  79. {
  80. pos.X = point.X;
  81. pos.Y = point.Y-size.Y;
  82. }
  83. void SetBottomRight(slider_point<float> point)
  84. {
  85. pos.X = point.X-size.X;
  86. pos.Y = point.Y-size.Y;
  87. }
  88. float GetLeft()
  89. {
  90. return pos.X;
  91. }
  92. float GetRight()
  93. {
  94. return pos.X+size.X;
  95. }
  96. float GetTop()
  97. {
  98. return pos.Y;
  99. }
  100. float GetBottom()
  101. {
  102. return pos.Y+size.Y;
  103. }
  104. slider_point<float> GetCenter()
  105. {
  106. return slider_point<float>(pos.X+(size.X/2.0f),pos.Y+(size.Y/2.0f));
  107. }
  108. void draw()
  109. {
  110. if(!IsPointInArea(cursorPos.x,cursorPos.y,pos.X,pos.Y,size.X,size.Y))
  111. return render->D3DBoxBorder(pos.X,pos.Y,size.X,size.Y,appearance.border,appearance.button);
  112. if(Keys(VK_LBUTTON).Down)
  113. return render->D3DBoxBorder(pos.X,pos.Y,size.X,size.Y,mousedown.border,mousedown.button);
  114. return render->D3DBoxBorder(pos.X,pos.Y,size.X,size.Y,highlight.border,highlight.button);
  115. }
  116. };
  117.  
  118. //not only left/right or up/down, but also both at once!
  119. template<class T = int> class slider
  120. {
  121. private:
  122. slider_values<T> data;
  123. bool Dragging;
  124. slider_point<float> DragMouseStart;
  125. slider_point<float> DragSliderStart;
  126. public:
  127. bool Show;
  128. bool LockXMovement;
  129. bool LockYMovement;
  130. slider_box box;
  131. slider_button sliding;
  132. slider(){Show = true;Dragging=false;}
  133. slider(slider_point<float> pos, slider_point<float> size, slider_point<T> minimum, slider_point<T> maximum, slider_point<T> default, slider_point<float> slider_size, DWORD _color_inner, DWORD _color_outline, bool LockX = false, bool LockY = false, button_color _appearance = default_appearance, button_color _highlighted = default_highlighted, button_color _mousedown = default_mousedown)
  134. : data(minimum,maximum,default),LockXMovement(LockX),LockYMovement(LockY),box(pos,size,_color_inner,_color_outline), sliding(slider_size,pos,_appearance,_highlighted,_mousedown)
  135. {
  136. Dragging = false;
  137. if(sliding.size.Y > box.size.Y)
  138. {
  139. sliding.size.Y = box.size.Y;
  140. LockYMovement = true;
  141. }
  142. if(sliding.size.X > box.size.X)
  143. {
  144. sliding.size.X = box.size.X;
  145. LockXMovement = true;
  146. }
  147.  
  148.  
  149. sliding.SetCenter( slider_point<float>( pos.X+( (float)(((float)(default.X-minimum.X))/((float)(maximum.X-minimum.X))) *size.X), pos.Y+( (float)(((float)(default.Y-minimum.Y))/((float)(maximum.Y-minimum.Y))) *size.Y)));
  150. if(sliding.pos.X < box.pos.X)
  151. sliding.pos = slider_point<float>( box.pos.X , sliding.pos.Y );
  152. if(sliding.GetRight() > (box.pos.X + box.size.X))
  153. sliding.SetTopRight(slider_point<float>( box.pos.X+box.size.X , sliding.pos.Y ));
  154. if(sliding.pos.Y < box.pos.Y)
  155. sliding.pos = slider_point<float>( sliding.pos.X , box.pos.Y );
  156. if(sliding.GetBottom() > (box.pos.Y+box.size.Y))
  157. sliding.SetBottomLeft(slider_point<float>( sliding.pos.X , box.pos.Y+box.size.Y ));
  158. Show = true;
  159. }
  160. slider_values<T> GetValue()
  161. {
  162. return data.current;
  163. }
  164. void Process()
  165. {
  166. if(Dragging)
  167. {
  168. if(Keys(VK_LBUTTON).Up)
  169. {
  170. Dragging = false;
  171. }
  172. if(!LockXMovement)
  173. {
  174. float mousepos = (float)cursorPos.x;
  175. sliding.pos = slider_point<float>( DragSliderStart.X+(mousepos-DragMouseStart.X) , sliding.pos.Y );
  176. if(sliding.pos.X < box.pos.X)
  177. sliding.pos = slider_point<float>( box.pos.X , sliding.pos.Y );
  178. if(sliding.GetRight() > (box.pos.X+box.size.X))
  179. sliding.SetTopRight(slider_point<float>( box.pos.X+box.size.X , sliding.pos.Y ));
  180. data.current.X = data.minimum.X + (T)((float)(data.maximum.X-data.minimum.X) * ((sliding.pos.X-box.pos.X)/(box.size.X-sliding.size.X)));
  181. }
  182. if(!LockYMovement)
  183. {
  184. float mousepos = (float)cursorPos.y;
  185. sliding.pos = slider_point<float>( sliding.pos.X , DragSliderStart.Y+(mousepos-DragMouseStart.Y) );
  186. if(sliding.pos.Y < box.pos.Y)
  187. sliding.pos = slider_point<float>( sliding.pos.X , box.pos.Y );
  188. if(sliding.GetBottom() > (box.pos.Y+box.size.Y))
  189. sliding.SetBottomLeft(slider_point<float>( sliding.pos.X , box.pos.Y+box.size.Y ));
  190. data.current.Y = data.minimum.Y + (T)((float)(data.maximum.Y-data.minimum.Y) * ((sliding.pos.Y-box.pos.Y)/(box.size.Y-sliding.size.Y)));
  191. }
  192. DirectXFont::Access(4)->Print(0.0f,50.0f,0xFF00FF00,string_format("[%04d,%04d]",(int)data.current.X,(int)data.current.Y).c_str());
  193. }else
  194. if(Keys(VK_LBUTTON).Pressed)
  195. {
  196. if(sliding.IsMouseOnThis())
  197. {
  198. Dragging = true;
  199. DragMouseStart.X = (float)cursorPos.x;
  200. DragMouseStart.Y = (float)cursorPos.y;
  201. DragSliderStart = sliding.pos;
  202. }
  203. }
  204. box.draw();
  205. sliding.draw();
  206. }
  207. ~slider()
  208. {
  209.  
  210. }
  211. };
  212.  
Not running #stdin #stdout 0s 0KB
stdin
Standard input is empty
stdout
Standard output is empty