1
0

slider.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. /*
  2. * File : slider.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2006 - 2010, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2009-10-16 Bernard first version
  13. * 2010-09-10 Bernard fix hide issue
  14. */
  15. #include <rtgui/dc.h>
  16. #include <rtgui/rtgui_theme.h>
  17. #include <rtgui/widgets/slider.h>
  18. #define RTGUI_SLIDER_DEFAULT_WIDTH 100
  19. #define RTGUI_SLIDER_DEFAULT_HEIGHT 20
  20. #define RTGUI_SLIDER_DEFAULT_MIN 0
  21. #define RTGUI_SLIDER_DEFAULT_MAX 100
  22. static void _rtgui_slider_constructor(rtgui_slider_t *slider)
  23. {
  24. rtgui_rect_t rect = {0, 0, RTGUI_SLIDER_DEFAULT_WIDTH, RTGUI_SLIDER_DEFAULT_HEIGHT};
  25. /* init widget and set event handler */
  26. RTGUI_WIDGET(slider)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
  27. rtgui_widget_set_rect(RTGUI_WIDGET(slider), &rect);
  28. rtgui_widget_set_event_handler(RTGUI_WIDGET(slider), rtgui_slider_event_handler);
  29. /* set proper of control */
  30. slider->min = RTGUI_SLIDER_DEFAULT_MIN;
  31. slider->max = RTGUI_SLIDER_DEFAULT_MAX;
  32. slider->value = RTGUI_SLIDER_DEFAULT_MIN;
  33. slider->orient = RTGUI_HORIZONTAL;
  34. slider->ticks = 10;
  35. slider->thumb_width = 8;
  36. slider->on_changed = RT_NULL;
  37. }
  38. DEFINE_CLASS_TYPE(slider, "slider",
  39. RTGUI_WIDGET_TYPE,
  40. _rtgui_slider_constructor,
  41. RT_NULL,
  42. sizeof(struct rtgui_slider));
  43. static void rtgui_slider_onmouse(struct rtgui_slider* slider, struct rtgui_event_mouse* event)
  44. {
  45. RT_ASSERT(slider != RT_NULL);
  46. RT_ASSERT(event != RT_NULL);
  47. if (event->button & RTGUI_MOUSE_BUTTON_DOWN &&
  48. event->button & RTGUI_MOUSE_BUTTON_LEFT)
  49. {
  50. int sel;
  51. int range = slider->max - slider->min;
  52. int x0, xsize;
  53. int x;
  54. x0 = 1 + slider->thumb_width/2;
  55. if (slider->orient == RTGUI_VERTICAL)
  56. {
  57. x = event->y - RTGUI_WIDGET(slider)->extent.y1;
  58. x -= x0;
  59. xsize = rtgui_rect_height(RTGUI_WIDGET(slider)->extent) - 2 * x0;
  60. }
  61. else
  62. {
  63. x = event->x - RTGUI_WIDGET(slider)->extent.x1;
  64. x -= x0;
  65. xsize = rtgui_rect_width(RTGUI_WIDGET(slider)->extent) - 2 * x0;
  66. }
  67. if (x <= 0)
  68. {
  69. sel = slider->min;
  70. }
  71. else if (x >= xsize)
  72. {
  73. sel = slider->max;
  74. }
  75. else
  76. {
  77. sel = ((range * x) + xsize/2) / xsize;
  78. sel += slider->min;
  79. }
  80. rtgui_widget_focus(RTGUI_WIDGET(slider));
  81. rtgui_slider_set_value(slider, sel);
  82. if (slider->on_changed != RT_NULL) /* invoke callback function */
  83. slider->on_changed(RTGUI_WIDGET(slider), RT_NULL);
  84. }
  85. }
  86. static void rtgui_slider_onkey(struct rtgui_slider* slider, struct rtgui_event_kbd *event)
  87. {
  88. RT_ASSERT(slider != RT_NULL);
  89. RT_ASSERT(event != RT_NULL);
  90. if (!(RTGUI_KBD_IS_UP(event))) return;
  91. if (event->key == RTGUIK_LEFT)
  92. {
  93. if (slider->value > slider->min)
  94. slider->value ++;
  95. }
  96. if (event->key == RTGUIK_RIGHT)
  97. {
  98. if (slider->value < slider->max)
  99. slider->value --;
  100. }
  101. /* update widget */
  102. rtgui_widget_update(RTGUI_WIDGET(slider));
  103. if (slider->on_changed != RT_NULL) /* invoke callback function */
  104. slider->on_changed(RTGUI_WIDGET(slider), RT_NULL);
  105. }
  106. rt_bool_t rtgui_slider_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
  107. {
  108. struct rtgui_slider* slider = (struct rtgui_slider*)widget;
  109. switch (event->type)
  110. {
  111. case RTGUI_EVENT_PAINT:
  112. #ifndef RTGUI_USING_SMALL_SIZE
  113. if (widget->on_draw != RT_NULL) widget->on_draw(widget, event);
  114. else
  115. #endif
  116. {
  117. rtgui_theme_draw_slider(slider);
  118. }
  119. break;
  120. case RTGUI_EVENT_KBD:
  121. if (!RTGUI_WIDGET_IS_ENABLE(widget) || RTGUI_WIDGET_IS_HIDE(widget)) return RT_FALSE;
  122. #ifndef RTGUI_USING_SMALL_SIZE
  123. if (widget->on_key != RT_NULL) widget->on_key(widget, event);
  124. else
  125. #endif
  126. {
  127. rtgui_slider_onkey(slider, (struct rtgui_event_kbd *)event);
  128. }
  129. break;
  130. case RTGUI_EVENT_MOUSE_BUTTON:
  131. if (!RTGUI_WIDGET_IS_ENABLE(widget) || RTGUI_WIDGET_IS_HIDE(widget)) return RT_FALSE;
  132. #ifndef RTGUI_USING_SMALL_SIZE
  133. if (widget->on_mouseclick != RT_NULL) widget->on_mouseclick(widget, event);
  134. else
  135. #endif
  136. {
  137. rtgui_slider_onmouse(slider, (struct rtgui_event_mouse*)event);
  138. }
  139. break;
  140. }
  141. return RT_FALSE;
  142. }
  143. struct rtgui_slider* rtgui_slider_create(rt_size_t min, rt_size_t max, int orient)
  144. {
  145. struct rtgui_slider* slider;
  146. slider = (struct rtgui_slider*) rtgui_widget_create (RTGUI_SLIDER_TYPE);
  147. if (slider != RT_NULL)
  148. {
  149. /* set proper of control */
  150. slider->min = min;
  151. slider->max = max;
  152. slider->value = min;
  153. slider->ticks = 10;
  154. slider->thumb_width = 8;
  155. rtgui_slider_set_orientation(slider, orient);
  156. }
  157. return slider;
  158. }
  159. void rtgui_slider_set_range(struct rtgui_slider* slider, rt_size_t min, rt_size_t max)
  160. {
  161. RT_ASSERT(slider != RT_NULL);
  162. slider->max = max;
  163. slider->min = min;
  164. }
  165. void rtgui_slider_set_value(struct rtgui_slider* slider, rt_size_t value)
  166. {
  167. RT_ASSERT(slider != RT_NULL);
  168. if (RTGUI_WIDGET_IS_ENABLE(RTGUI_WIDGET(slider)))
  169. {
  170. if (value < slider->min) value = slider->min;
  171. if (value > slider->max) value = slider->max;
  172. if (slider->value != value)
  173. {
  174. slider->value = value;
  175. rtgui_theme_draw_slider(slider);
  176. }
  177. }
  178. }
  179. void rtgui_slider_set_orientation(struct rtgui_slider* slider, int orientation)
  180. {
  181. RT_ASSERT(slider != RT_NULL);
  182. /* set orientation */
  183. slider->orient = orientation;
  184. #ifndef RTGUI_USING_SMALL_SIZE
  185. if (slider->orient == RTGUI_HORIZONTAL)
  186. {
  187. /* HORIZONTAL */
  188. rtgui_widget_set_miniheight(RTGUI_WIDGET(slider), RTGUI_SLIDER_DEFAULT_HEIGHT);
  189. rtgui_widget_set_miniwidth(RTGUI_WIDGET(slider), RTGUI_SLIDER_DEFAULT_WIDTH);
  190. }
  191. else
  192. {
  193. /* VERTICAL */
  194. rtgui_widget_set_miniwidth(RTGUI_WIDGET(slider), RTGUI_SLIDER_DEFAULT_HEIGHT);
  195. rtgui_widget_set_miniheight(RTGUI_WIDGET(slider), RTGUI_SLIDER_DEFAULT_WIDTH);
  196. }
  197. #endif
  198. }
  199. rt_size_t rtgui_slider_get_value(struct rtgui_slider* slider)
  200. {
  201. RT_ASSERT(slider != RT_NULL);
  202. return slider->value;
  203. }