panel.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. /*
  2. * File : panel.c
  3. * This file is part of RTGUI in RT-Thread RTOS
  4. * COPYRIGHT (C) 2006 - 2009, 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-04 Bernard first version
  13. */
  14. #include <panel.h>
  15. #include <mouse.h>
  16. #include <rtgui/rtgui_system.h>
  17. #include <rtgui/widgets/widget.h>
  18. #include <rtgui/rtgui_theme.h>
  19. /* the global parameter */
  20. rtgui_panel_t *rtgui_panel = RT_NULL;
  21. //在SVN版中,下面两个变量是在topwin层定义的,
  22. //由于取消了topwin层,所有提出来作为全局变量
  23. rtgui_rect_t *external_clip_rect=RT_NULL;
  24. rt_uint32_t external_clip_size=0;
  25. static void _rtgui_panel_constructor(rtgui_panel_t *panel)
  26. {
  27. panel->status = 0;
  28. RTGUI_WIDGET_FLAG(panel) |= RTGUI_WIDGET_FLAG_FOCUSABLE;
  29. panel->image = RT_NULL;
  30. rtgui_widget_set_event_handler(panel, rtgui_panel_event_handler);
  31. panel->modal_widget = RT_NULL;
  32. }
  33. static void _rtgui_panel_destructor(rtgui_panel_t *panel)
  34. {
  35. if(external_clip_size > 0)
  36. {
  37. rt_free(external_clip_rect);
  38. external_clip_rect = RT_NULL;
  39. external_clip_size = 0;
  40. }
  41. }
  42. rtgui_type_t *rtgui_panel_type_get(void)
  43. {
  44. static rtgui_type_t *panel_type = RT_NULL;
  45. if(!panel_type)
  46. {
  47. panel_type = rtgui_type_create("panel", RTGUI_CONTAINER_TYPE,sizeof(rtgui_panel_t),
  48. RTGUI_CONSTRUCTOR(_rtgui_panel_constructor),
  49. RTGUI_DESTRUCTOR(_rtgui_panel_destructor));
  50. }
  51. return panel_type;
  52. }
  53. rtgui_panel_t* rtgui_panel_create(int left, int top, int w, int h)
  54. {
  55. rtgui_rect_t rect;
  56. rtgui_panel_t *panel;
  57. rtgui_thread_t *thread;
  58. panel = rtgui_widget_create(RTGUI_PANEL_TYPE);
  59. if(panel == RT_NULL) return RT_NULL;
  60. rtgui_panel_set(panel);
  61. thread = rtgui_thread_self();
  62. panel->tid = thread->tid;
  63. RTGUI_WIDGET(panel)->toplevel = RTGUI_WIDGET(panel);
  64. rect.x1 = left;
  65. rect.y1 = top;
  66. rect.x2 = rect.x1+w;
  67. rect.y2 = rect.y1+h;
  68. rtgui_widget_set_rect(panel,&rect);
  69. rtgui_widget_update_clip(panel);
  70. rtgui_thread_set_widget(panel);
  71. return panel;
  72. }
  73. void rtgui_panel_destroy(char* name)
  74. {
  75. //Panel需要永远驻留内存中
  76. //......
  77. }
  78. void rtgui_panel_set(rtgui_panel_t *panel)
  79. {
  80. rtgui_panel = panel;
  81. }
  82. rtgui_panel_t* rtgui_panel_get(void)
  83. {
  84. return rtgui_panel;
  85. }
  86. void rtgui_panel_show(rtgui_panel_t *panel)
  87. {
  88. rtgui_widget_update_clip(panel);
  89. rtgui_widget_update(panel);
  90. }
  91. rt_bool_t rtgui_panel_ondraw(rtgui_panel_t* panel)
  92. {
  93. rtgui_theme_draw_panel(panel);
  94. return RT_TRUE;
  95. }
  96. rt_bool_t rtgui_panel_event_handler(PVOID wdt,rtgui_event_t *event)
  97. {
  98. rtgui_widget_t *widget = (rtgui_widget_t*)wdt;
  99. rtgui_panel_t *panel = (rtgui_panel_t*)wdt;
  100. RT_ASSERT((wdt != RT_NULL) && (event != RT_NULL));
  101. switch (event->type)
  102. {
  103. case RTGUI_EVENT_WIN_CLOSE:
  104. case RTGUI_EVENT_WIN_ACTIVATE:
  105. case RTGUI_EVENT_WIN_DEACTIVATE:
  106. {
  107. rtgui_event_win_t* wevent = (rtgui_event_win_t*)event;
  108. rtgui_win_t* win = wevent->wid;
  109. if (win != RT_NULL && RTGUI_WIDGET_EVENT_HANDLE(win) != RT_NULL)
  110. {
  111. RTGUI_WIDGET_EVENT_CALL(win, event);
  112. }
  113. break;
  114. }
  115. case RTGUI_EVENT_WIN_MOVE:
  116. {
  117. rtgui_event_win_move_t* wevent = (rtgui_event_win_move_t*)event;
  118. rtgui_win_t* win = wevent->wid;
  119. if (win != RT_NULL && RTGUI_WIDGET_EVENT_HANDLE(win) != RT_NULL)
  120. {
  121. RTGUI_WIDGET_EVENT_CALL(win, event);
  122. }
  123. break;
  124. }
  125. case RTGUI_EVENT_PAINT:
  126. if(widget->on_draw != RT_NULL)
  127. widget->on_draw(widget, event);
  128. else
  129. rtgui_panel_ondraw(panel);
  130. break;
  131. case RTGUI_EVENT_MOUSE_BUTTON:
  132. {
  133. rtgui_event_mouse_t* emouse = (rtgui_event_mouse_t*)event;
  134. rtgui_win_t* win = emouse->wid;
  135. /* check the destination window */
  136. if(win != RT_NULL && RTGUI_WIDGET_EVENT_HANDLE(win) != RT_NULL)
  137. {
  138. RTGUI_WIDGET_EVENT_CALL(win, event);
  139. }
  140. else
  141. {
  142. if(RTGUI_PANEL_IS_MODAL_MODE(panel))
  143. {
  144. /* let modal widget to handle it */
  145. if(panel->modal_widget != RT_NULL && RTGUI_WIDGET_EVENT_HANDLE(panel->modal_widget) != RT_NULL)
  146. {
  147. RTGUI_WIDGET_EVENT_CALL(panel->modal_widget, event);
  148. }
  149. }
  150. else
  151. {
  152. return rtgui_container_dispatch_mouse_event(RTGUI_CONTAINER(panel),(rtgui_event_mouse_t*)event);
  153. }
  154. }
  155. break;
  156. }
  157. case RTGUI_EVENT_MOUSE_MOTION:
  158. return rtgui_container_dispatch_mouse_event(RTGUI_CONTAINER(panel),(rtgui_event_mouse_t*)event);
  159. case RTGUI_EVENT_KBD:
  160. {
  161. rtgui_event_kbd_t* kbd = (rtgui_event_kbd_t*)event;
  162. rtgui_win_t* win = kbd->wid;
  163. /* check the destination window */
  164. if(win != RT_NULL && RTGUI_WIDGET_EVENT_HANDLE(win) != RT_NULL)
  165. {
  166. RTGUI_WIDGET_EVENT_CALL(win, event);
  167. }
  168. else
  169. {
  170. if(RTGUI_PANEL_IS_MODAL_MODE(panel))
  171. {
  172. /* let modal widget to handle it */
  173. if(panel->modal_widget != RT_NULL && RTGUI_WIDGET_EVENT_HANDLE(panel->modal_widget) != RT_NULL)
  174. {
  175. RTGUI_WIDGET_EVENT_CALL(panel->modal_widget, event);
  176. }
  177. }
  178. else if(RTGUI_CONTAINER(panel)->focused != RT_NULL)
  179. {
  180. if(RTGUI_CONTAINER(panel)->focused != widget)
  181. {
  182. RTGUI_WIDGET_EVENT_CALL(RTGUI_CONTAINER(panel)->focused, event);
  183. }
  184. }
  185. }
  186. break;
  187. }
  188. default:
  189. return rtgui_container_event_handler(widget, event);
  190. }
  191. return RT_FALSE;
  192. }
  193. void rtgui_panel_event_loop(rtgui_panel_t *panel)
  194. {
  195. rt_err_t result;
  196. rtgui_thread_t* tid;
  197. rtgui_event_t* event;
  198. tid = rtgui_thread_self();
  199. RT_ASSERT(tid != RT_NULL);
  200. /* point to event buffer */
  201. event = (rtgui_event_t*)tid->event_buffer;
  202. if(RTGUI_PANEL_IS_MODAL_MODE(panel))
  203. {
  204. /* event loop for modal mode shown view */
  205. while(RTGUI_PANEL_IS_MODAL_MODE(panel))
  206. {
  207. if (tid->on_idle != RT_NULL)
  208. {
  209. result = rtgui_thread_recv_nosuspend(event, RTGUI_EVENT_BUFFER_SIZE);
  210. if (result == RT_EOK)
  211. RTGUI_WIDGET_EVENT_CALL(panel, event);
  212. else if (result == -RT_ETIMEOUT)
  213. tid->on_idle(panel, RT_NULL);
  214. }
  215. else
  216. {
  217. result = rtgui_thread_recv(event, RTGUI_EVENT_BUFFER_SIZE);
  218. if (result == RT_EOK)
  219. RTGUI_WIDGET_EVENT_CALL(panel, event);
  220. }
  221. }
  222. }
  223. else
  224. {
  225. while(1)
  226. {
  227. if(tid->on_idle != RT_NULL)
  228. {
  229. result = rtgui_thread_recv_nosuspend(event, RTGUI_EVENT_BUFFER_SIZE);
  230. if (result == RT_EOK)
  231. RTGUI_WIDGET_EVENT_CALL(panel, event);
  232. else if (result == -RT_ETIMEOUT)
  233. tid->on_idle(panel, RT_NULL);
  234. }
  235. else
  236. {
  237. result = rtgui_thread_recv(event, RTGUI_EVENT_BUFFER_SIZE);
  238. if (result == RT_EOK)
  239. {
  240. /* perform event handler */
  241. RTGUI_WIDGET_EVENT_CALL(panel, event);
  242. }
  243. }
  244. }
  245. }
  246. }