1
0

slider.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  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. rtgui_type_t *rtgui_slider_type_get(void)
  39. {
  40. static rtgui_type_t *slider_type = RT_NULL;
  41. if (!slider_type)
  42. {
  43. slider_type = rtgui_type_create("slider", RTGUI_WIDGET_TYPE,
  44. sizeof(rtgui_slider_t), RTGUI_CONSTRUCTOR(_rtgui_slider_constructor), RT_NULL);
  45. }
  46. return slider_type;
  47. }
  48. static void rtgui_slider_onmouse(struct rtgui_slider* slider, struct rtgui_event_mouse* event)
  49. {
  50. RT_ASSERT(slider != RT_NULL);
  51. RT_ASSERT(event != RT_NULL);
  52. if (event->button & RTGUI_MOUSE_BUTTON_DOWN &&
  53. event->button & RTGUI_MOUSE_BUTTON_LEFT)
  54. {
  55. int sel;
  56. int range = slider->max - slider->min;
  57. int x0, xsize;
  58. int x;
  59. x0 = 1 + slider->thumb_width/2;
  60. if (slider->orient == RTGUI_VERTICAL)
  61. {
  62. x = event->y - RTGUI_WIDGET(slider)->extent.y1;
  63. x -= x0;
  64. xsize = rtgui_rect_height(RTGUI_WIDGET(slider)->extent) - 2 * x0;
  65. }
  66. else
  67. {
  68. x = event->x - RTGUI_WIDGET(slider)->extent.x1;
  69. x -= x0;
  70. xsize = rtgui_rect_width(RTGUI_WIDGET(slider)->extent) - 2 * x0;
  71. }
  72. if (x <= 0)
  73. {
  74. sel = slider->min;
  75. }
  76. else if (x >= xsize)
  77. {
  78. sel = slider->max;
  79. }
  80. else
  81. {
  82. sel = ((range * x) + xsize/2) / xsize;
  83. sel += slider->min;
  84. }
  85. rtgui_widget_focus(RTGUI_WIDGET(slider));
  86. rtgui_slider_set_value(slider, sel);
  87. if (slider->on_changed != RT_NULL) /* invoke callback function */
  88. slider->on_changed(RTGUI_WIDGET(slider), RT_NULL);
  89. }
  90. }
  91. static void rtgui_slider_onkey(struct rtgui_slider* slider, struct rtgui_event_kbd *event)
  92. {
  93. RT_ASSERT(slider != RT_NULL);
  94. RT_ASSERT(event != RT_NULL);
  95. if (!(RTGUI_KBD_IS_UP(event))) return;
  96. if (event->key == RTGUIK_LEFT)
  97. {
  98. if (slider->value > slider->min)
  99. slider->value ++;
  100. }
  101. if (event->key == RTGUIK_RIGHT)
  102. {
  103. if (slider->value < slider->max)
  104. slider->value --;
  105. }
  106. /* update widget */
  107. rtgui_widget_update(RTGUI_WIDGET(slider));
  108. if (slider->on_changed != RT_NULL) /* invoke callback function */
  109. slider->on_changed(RTGUI_WIDGET(slider), RT_NULL);
  110. }
  111. rt_bool_t rtgui_slider_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
  112. {
  113. struct rtgui_slider* slider = (struct rtgui_slider*)widget;
  114. switch (event->type)
  115. {
  116. case RTGUI_EVENT_PAINT:
  117. #ifndef RTGUI_USING_SMALL_SIZE
  118. if (widget->on_draw != RT_NULL) widget->on_draw(widget, event);
  119. else
  120. #endif
  121. {
  122. rtgui_theme_draw_slider(slider);
  123. }
  124. break;
  125. case RTGUI_EVENT_KBD:
  126. if (!RTGUI_WIDGET_IS_ENABLE(widget) || RTGUI_WIDGET_IS_HIDE(widget)) return RT_FALSE;
  127. #ifndef RTGUI_USING_SMALL_SIZE
  128. if (widget->on_key != RT_NULL) widget->on_key(widget, event);
  129. else
  130. #endif
  131. {
  132. rtgui_slider_onkey(slider, (struct rtgui_event_kbd *)event);
  133. }
  134. break;
  135. case RTGUI_EVENT_MOUSE_BUTTON:
  136. if (!RTGUI_WIDGET_IS_ENABLE(widget) || RTGUI_WIDGET_IS_HIDE(widget)) return RT_FALSE;
  137. #ifndef RTGUI_USING_SMALL_SIZE
  138. if (widget->on_mouseclick != RT_NULL) widget->on_mouseclick(widget, event);
  139. else
  140. #endif
  141. {
  142. rtgui_slider_onmouse(slider, (struct rtgui_event_mouse*)event);
  143. }
  144. break;
  145. }
  146. return RT_FALSE;
  147. }
  148. struct rtgui_slider* rtgui_slider_create(rt_size_t min, rt_size_t max, int orient)
  149. {
  150. struct rtgui_slider* slider;
  151. slider = (struct rtgui_slider*) rtgui_widget_create (RTGUI_SLIDER_TYPE);
  152. if (slider != RT_NULL)
  153. {
  154. /* set proper of control */
  155. slider->min = min;
  156. slider->max = max;
  157. slider->value = min;
  158. slider->ticks = 10;
  159. slider->thumb_width = 8;
  160. rtgui_slider_set_orientation(slider, orient);
  161. }
  162. return slider;
  163. }
  164. void rtgui_slider_set_range(struct rtgui_slider* slider, rt_size_t min, rt_size_t max)
  165. {
  166. RT_ASSERT(slider != RT_NULL);
  167. slider->max = max;
  168. slider->min = min;
  169. }
  170. void rtgui_slider_set_value(struct rtgui_slider* slider, rt_size_t value)
  171. {
  172. RT_ASSERT(slider != RT_NULL);
  173. if (RTGUI_WIDGET_IS_ENABLE(RTGUI_WIDGET(slider)))
  174. {
  175. if (value < slider->min) value = slider->min;
  176. if (value > slider->max) value = slider->max;
  177. if (slider->value != value)
  178. {
  179. slider->value = value;
  180. rtgui_theme_draw_slider(slider);
  181. }
  182. }
  183. }
  184. void rtgui_slider_set_orientation(struct rtgui_slider* slider, int orientation)
  185. {
  186. RT_ASSERT(slider != RT_NULL);
  187. /* set orientation */
  188. slider->orient = orientation;
  189. #ifndef RTGUI_USING_SMALL_SIZE
  190. if (slider->orient == RTGUI_HORIZONTAL)
  191. {
  192. /* HORIZONTAL */
  193. rtgui_widget_set_miniheight(RTGUI_WIDGET(slider), RTGUI_SLIDER_DEFAULT_HEIGHT);
  194. rtgui_widget_set_miniwidth(RTGUI_WIDGET(slider), RTGUI_SLIDER_DEFAULT_WIDTH);
  195. }
  196. else
  197. {
  198. /* VERTICAL */
  199. rtgui_widget_set_miniwidth(RTGUI_WIDGET(slider), RTGUI_SLIDER_DEFAULT_HEIGHT);
  200. rtgui_widget_set_miniheight(RTGUI_WIDGET(slider), RTGUI_SLIDER_DEFAULT_WIDTH);
  201. }
  202. #endif
  203. }
  204. rt_size_t rtgui_slider_get_value(struct rtgui_slider* slider)
  205. {
  206. RT_ASSERT(slider != RT_NULL);
  207. return slider->value;
  208. }