slider.c 5.6 KB

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