rtgui_theme.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904
  1. /*
  2. * File : rtgui_theme.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 <rtgui/rtgui.h>
  15. #include <rtgui/dc.h>
  16. #include <rtgui/widgets/widget.h>
  17. #include <rtgui/widgets/button.h>
  18. #include <rtgui/widgets/label.h>
  19. #include <rtgui/widgets/textbox.h>
  20. #include <rtgui/widgets/iconbox.h>
  21. #include <rtgui/widgets/title.h>
  22. #include <rtgui/rtgui_theme.h>
  23. #include <rtgui/rtgui_server.h>
  24. #include <rtgui/rtgui_system.h>
  25. #define SELECTED_HEIGHT 25
  26. const rtgui_color_t default_foreground = RTGUI_RGB(0x00, 0x00, 0x00);
  27. const rtgui_color_t default_background = RTGUI_RGB(212, 208, 200);
  28. const rtgui_color_t selected_color = RTGUI_RGB(0xc0, 0xc0, 0xc0);
  29. const rtgui_color_t disable_foreground = RTGUI_RGB(0x80, 0x80, 0x80);
  30. extern struct rtgui_font rtgui_font_asc16;
  31. extern struct rtgui_font rtgui_font_arial16;
  32. extern struct rtgui_font rtgui_font_asc12;
  33. extern struct rtgui_font rtgui_font_arial12;
  34. /* init theme */
  35. void rtgui_system_theme_init()
  36. {
  37. #if RTGUI_DEFAULT_FONT_SIZE == 16
  38. rtgui_font_set_defaut(&rtgui_font_asc16);
  39. #elif RTGUI_DEFAULT_FONT_SIZE == 12
  40. rtgui_font_set_defaut(&rtgui_font_asc12);
  41. #else
  42. rtgui_font_set_defaut(&rtgui_font_asc12);
  43. #endif
  44. }
  45. static const rt_uint8_t close_byte[14] = {0x06, 0x18, 0x03, 0x30, 0x01, 0xE0, 0x00,
  46. 0xC0, 0x01, 0xE0, 0x03, 0x30, 0x06, 0x18
  47. };
  48. /* window drawing */
  49. void rtgui_theme_draw_win(struct rtgui_topwin *win)
  50. {
  51. struct rtgui_dc *dc;
  52. rtgui_rect_t rect;
  53. if (win->title == RT_NULL) return; /* no title and no board */
  54. /* begin drawing */
  55. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(win->title));
  56. if (dc == RT_NULL) return;
  57. /* get rect */
  58. rtgui_widget_get_rect(RTGUI_WIDGET(win->title), &rect);
  59. /* draw border */
  60. if (win->flag & WINTITLE_BORDER)
  61. {
  62. rect.x2 -= 1;
  63. rect.y2 -= 1;
  64. RTGUI_WIDGET_FOREGROUND(win->title) = RTGUI_RGB(212, 208, 200);
  65. rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y1);
  66. rtgui_dc_draw_vline(dc, rect.x1, rect.y1, rect.y2);
  67. RTGUI_WIDGET_FOREGROUND(win->title) = white;
  68. rtgui_dc_draw_hline(dc, rect.x1 + 1, rect.x2 - 1, rect.y1 + 1);
  69. rtgui_dc_draw_vline(dc, rect.x1 + 1, rect.y1 + 1, rect.y2 - 1);
  70. RTGUI_WIDGET_FOREGROUND(win->title) = RTGUI_RGB(128, 128, 128);
  71. rtgui_dc_draw_hline(dc, rect.x1 + 1, rect.x2 - 1, rect.y2 - 1);
  72. rtgui_dc_draw_vline(dc, rect.x2 - 1, rect.y1 + 1, rect.y2);
  73. RTGUI_WIDGET_FOREGROUND(win->title) = RTGUI_RGB(64, 64, 64);
  74. rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y2);
  75. rtgui_dc_draw_vline(dc, rect.x2, rect.y1, rect.y2 + 1);
  76. /* shrink border */
  77. rtgui_rect_inflate(&rect, -WINTITLE_BORDER_SIZE);
  78. }
  79. /* draw title */
  80. if (!(win->flag & WINTITLE_NO))
  81. {
  82. rt_uint32_t index;
  83. float r, g, b, delta;
  84. if (win->flag & WINTITLE_ACTIVATE)
  85. {
  86. r = 10;
  87. g = 36;
  88. b = 106;
  89. delta = 150 / (float)(rect.x2 - rect.x1);
  90. }
  91. else
  92. {
  93. r = 128;
  94. g = 128;
  95. b = 128;
  96. delta = 64 / (float)(rect.x2 - rect.x1);
  97. }
  98. RTGUI_WIDGET_FOREGROUND(win->title) = RTGUI_RGB(r, g, b);
  99. for (index = rect.x1; index < rect.x2 + 1; index ++)
  100. {
  101. rtgui_dc_draw_vline(dc, index, rect.y1, rect.y2);
  102. r += delta;
  103. g += delta;
  104. b += delta;
  105. }
  106. if (win->flag & WINTITLE_ACTIVATE)
  107. {
  108. RTGUI_WIDGET_FOREGROUND(win->title) = white;
  109. }
  110. else
  111. {
  112. RTGUI_WIDGET_FOREGROUND(win->title) = RTGUI_RGB(212, 208, 200);
  113. }
  114. rect.x1 += 4;
  115. rect.y1 += 2;
  116. rect.y2 = rect.y1 + WINTITLE_CB_HEIGHT;
  117. rtgui_dc_draw_text(dc, rtgui_wintitle_get_title(win->title), &rect);
  118. if (win->flag & WINTITLE_CLOSEBOX)
  119. {
  120. /* get close button rect */
  121. rtgui_rect_t box_rect = {0, 0, WINTITLE_CB_WIDTH, WINTITLE_CB_HEIGHT};
  122. rtgui_rect_moveto_align(&rect, &box_rect, RTGUI_ALIGN_CENTER_VERTICAL | RTGUI_ALIGN_RIGHT);
  123. box_rect.x1 -= 3;
  124. box_rect.x2 -= 3;
  125. rtgui_dc_fill_rect(dc, &box_rect);
  126. /* draw close box */
  127. if (win->flag & WINTITLE_CB_PRESSED)
  128. {
  129. rtgui_dc_draw_border(dc, &box_rect, RTGUI_BORDER_SUNKEN);
  130. RTGUI_WIDGET_FOREGROUND(win->title) = red;
  131. rtgui_dc_draw_word(dc, box_rect.x1, box_rect.y1 + 6, 7, close_byte);
  132. }
  133. else
  134. {
  135. rtgui_dc_draw_border(dc, &box_rect, RTGUI_BORDER_RAISE);
  136. RTGUI_WIDGET_FOREGROUND(win->title) = black;
  137. rtgui_dc_draw_word(dc, box_rect.x1 - 1, box_rect.y1 + 5, 7, close_byte);
  138. }
  139. }
  140. }
  141. rtgui_dc_end_drawing(dc);
  142. }
  143. /* widget drawing */
  144. void rtgui_theme_draw_button(rtgui_button_t *btn)
  145. {
  146. /* draw button */
  147. struct rtgui_dc *dc;
  148. struct rtgui_rect rect;
  149. rtgui_color_t bc, fc;
  150. /* begin drawing */
  151. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(btn));
  152. if (dc == RT_NULL) return;
  153. /* get widget rect */
  154. rtgui_widget_get_rect(RTGUI_WIDGET(btn), &rect);
  155. /* get foreground color */
  156. bc = RTGUI_WIDGET_BACKGROUND(btn);
  157. fc = RTGUI_WIDGET_FOREGROUND(btn);
  158. if (btn->flag & RTGUI_BUTTON_FLAG_PRESS)
  159. {
  160. /* fill button rect with background color */
  161. rtgui_dc_fill_rect(dc, &rect);
  162. if (btn->pressed_image != RT_NULL)
  163. {
  164. rtgui_rect_t image_rect;
  165. image_rect.x1 = 0;
  166. image_rect.y1 = 0;
  167. image_rect.x2 = btn->unpressed_image->w;
  168. image_rect.y2 = btn->unpressed_image->h;
  169. rtgui_rect_moveto_align(&rect, &image_rect, RTGUI_ALIGN_CENTER);
  170. rtgui_image_blit(btn->pressed_image, dc, &image_rect);
  171. }
  172. else
  173. {
  174. rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_SUNKEN);
  175. }
  176. }
  177. else
  178. {
  179. /* fill button rect with background color */
  180. rtgui_dc_fill_rect(dc, &rect);
  181. if (btn->unpressed_image != RT_NULL)
  182. {
  183. rtgui_rect_t image_rect;
  184. image_rect.x1 = 0;
  185. image_rect.y1 = 0;
  186. image_rect.x2 = btn->unpressed_image->w;
  187. image_rect.y2 = btn->unpressed_image->h;
  188. rtgui_rect_moveto_align(&rect, &image_rect, RTGUI_ALIGN_CENTER);
  189. rtgui_image_blit(btn->unpressed_image, dc, &image_rect);
  190. }
  191. else
  192. {
  193. rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_RAISE);
  194. }
  195. }
  196. if (RTGUI_WIDGET_IS_FOCUSED(btn))
  197. {
  198. /* re-set foreground and get default rect */
  199. rtgui_widget_get_rect(RTGUI_WIDGET(btn), &rect);
  200. rtgui_rect_inflate(&rect, -2);
  201. RTGUI_WIDGET_FOREGROUND(btn) = black;
  202. rtgui_dc_draw_focus_rect(dc, &rect);
  203. }
  204. /* set forecolor */
  205. RTGUI_WIDGET_BACKGROUND(btn) = bc;
  206. RTGUI_WIDGET_FOREGROUND(btn) = fc;
  207. if (btn->pressed_image == RT_NULL)
  208. {
  209. /* re-set foreground and get default rect */
  210. rtgui_widget_get_rect(RTGUI_WIDGET(btn), &rect);
  211. /* remove border */
  212. rtgui_rect_inflate(&rect, -2);
  213. /* draw text */
  214. rtgui_dc_draw_text(dc, rtgui_label_get_text(RTGUI_LABEL(btn)), &rect);
  215. }
  216. /* end drawing */
  217. rtgui_dc_end_drawing(dc);
  218. }
  219. void rtgui_theme_draw_label(rtgui_label_t *label)
  220. {
  221. /* draw label */
  222. struct rtgui_dc *dc;
  223. struct rtgui_rect rect;
  224. /* begin drawing */
  225. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(label));
  226. if (dc == RT_NULL) return;
  227. rtgui_widget_get_rect(RTGUI_WIDGET(label), &rect);
  228. rtgui_dc_fill_rect(dc, &rect);
  229. /* default left and center draw */
  230. rtgui_dc_draw_text(dc, rtgui_label_get_text(label), &rect);
  231. /* end drawing */
  232. rtgui_dc_end_drawing(dc);
  233. }
  234. #define RTGUI_TEXTBOX_MARGIN 3
  235. void rtgui_theme_draw_textbox(rtgui_textbox_t *box)
  236. {
  237. /* draw button */
  238. struct rtgui_dc *dc;
  239. struct rtgui_rect rect;
  240. rtgui_color_t fc;
  241. /* begin drawing */
  242. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(box));
  243. if (dc == RT_NULL) return;
  244. /* get widget rect */
  245. rtgui_widget_get_rect(RTGUI_WIDGET(box), &rect);
  246. fc = RTGUI_WIDGET_FOREGROUND(box);
  247. /* fill widget rect with white color */
  248. RTGUI_WIDGET_BACKGROUND(box) = white;
  249. rtgui_dc_fill_rect(dc, &rect);
  250. /* draw border */
  251. RTGUI_WIDGET_FOREGROUND(box) = RTGUI_RGB(123, 158, 189);
  252. rtgui_dc_draw_rect(dc, &rect);
  253. /* draw text */
  254. RTGUI_WIDGET_FOREGROUND(box) = fc;
  255. if (box->text != RT_NULL)
  256. {
  257. rect.x1 += RTGUI_TEXTBOX_MARGIN;
  258. if (box->flag & RTGUI_TEXTBOX_MASK)
  259. {
  260. /* draw '*' */
  261. rt_size_t len = rt_strlen(box->text);
  262. if (len > 0)
  263. {
  264. char *text_mask = rtgui_malloc(len + 1);
  265. rt_memset(text_mask, '*', len + 1);
  266. text_mask[len] = 0;
  267. rtgui_dc_draw_text(dc, text_mask, &rect);
  268. rtgui_free(text_mask);
  269. }
  270. }
  271. else
  272. {
  273. rtgui_dc_draw_text(dc, box->text, &rect);
  274. }
  275. /* draw caret */
  276. if (box->flag & RTGUI_TEXTBOX_CARET_SHOW)
  277. {
  278. rect.x1 += box->position * box->font_width;
  279. rect.x2 = rect.x1 + box->font_width;
  280. rect.y2 -= 2;
  281. rect.y1 = rect.y2 - 3;
  282. RTGUI_WIDGET_BACKGROUND(box) = black;
  283. rtgui_dc_fill_rect(dc, &rect);
  284. }
  285. }
  286. /* end drawing */
  287. rtgui_dc_end_drawing(dc);
  288. }
  289. void rtgui_theme_draw_iconbox(rtgui_iconbox_t *iconbox)
  290. {
  291. struct rtgui_dc *dc;
  292. struct rtgui_rect rect;
  293. struct rtgui_rect text_rect;
  294. /* begin drawing */
  295. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(iconbox));
  296. if (dc == RT_NULL) return;
  297. /* get widget rect */
  298. rtgui_widget_get_rect(RTGUI_WIDGET(iconbox), &rect);
  299. /* draw icon */
  300. rtgui_image_blit(iconbox->image, dc, &rect);
  301. /* draw text */
  302. if (iconbox->text_position == RTGUI_ICONBOX_TEXT_BELOW && iconbox->text != RT_NULL)
  303. {
  304. rect.y1 = iconbox->image->h + RTGUI_WIDGET_DEFAULT_MARGIN;
  305. rtgui_font_get_metrics(rtgui_dc_get_gc(dc)->font, iconbox->text, &text_rect);
  306. rtgui_rect_moveto_align(&rect, &text_rect, RTGUI_ALIGN_CENTER);
  307. rtgui_dc_draw_text(dc, iconbox->text, &text_rect);
  308. }
  309. else if (iconbox->text_position == RTGUI_ICONBOX_TEXT_RIGHT && iconbox->text != RT_NULL)
  310. {
  311. rect.x1 = iconbox->image->w + RTGUI_WIDGET_DEFAULT_MARGIN;
  312. rtgui_font_get_metrics(rtgui_dc_get_gc(dc)->font, iconbox->text, &text_rect);
  313. rtgui_rect_moveto_align(&rect, &text_rect, RTGUI_ALIGN_CENTER);
  314. rtgui_dc_draw_text(dc, iconbox->text, &text_rect);
  315. }
  316. /* end drawing */
  317. rtgui_dc_end_drawing(dc);
  318. }
  319. static const rt_uint8_t checked_byte[7] = {0x02, 0x06, 0x8E, 0xDC, 0xF8, 0x70, 0x20};
  320. void rtgui_theme_draw_checkbox(struct rtgui_checkbox *checkbox)
  321. {
  322. struct rtgui_dc *dc;
  323. struct rtgui_rect rect, box_rect;
  324. rtgui_color_t bc, fc;
  325. fc = RTGUI_WIDGET_FOREGROUND(checkbox);
  326. bc = RTGUI_WIDGET_BACKGROUND(checkbox);
  327. /* begin drawing */
  328. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(checkbox));
  329. if (dc == RT_NULL) return;
  330. /* get rect */
  331. rtgui_widget_get_rect(RTGUI_WIDGET(checkbox), &rect);
  332. /* fill rect */
  333. rtgui_dc_fill_rect(dc, &rect);
  334. if (RTGUI_WIDGET_IS_FOCUSED(checkbox))
  335. {
  336. RTGUI_WIDGET_FOREGROUND(checkbox) = black;
  337. /* draw focused border */
  338. rtgui_rect_inflate(&rect, -1);
  339. rtgui_dc_draw_focus_rect(dc, &rect);
  340. rtgui_rect_inflate(&rect, 1);
  341. }
  342. /* draw check box */
  343. box_rect.x1 = 0;
  344. box_rect.y1 = 0;
  345. box_rect.x2 = CHECK_BOX_W;
  346. box_rect.y2 = CHECK_BOX_H;
  347. rtgui_rect_moveto_align(&rect, &box_rect, RTGUI_ALIGN_CENTER_VERTICAL);
  348. box_rect.x1 += 2;
  349. box_rect.x2 += 2;
  350. rtgui_dc_draw_border(dc, &box_rect, RTGUI_BORDER_BOX);
  351. rtgui_rect_inflate(&box_rect, -1);
  352. RTGUI_WIDGET_BACKGROUND(checkbox) = RTGUI_RGB(247, 247, 246);
  353. rtgui_dc_fill_rect(dc, &box_rect);
  354. if (checkbox->status_down == RTGUI_CHECKBOX_STATUS_CHECKED)
  355. {
  356. RTGUI_WIDGET_FOREGROUND(checkbox) = RTGUI_RGB(33, 161, 33);
  357. rtgui_dc_draw_byte(dc, box_rect.x1 + 2, box_rect.y1 + 2, 7, checked_byte);
  358. }
  359. /* restore saved color */
  360. RTGUI_WIDGET_BACKGROUND(checkbox) = bc;
  361. RTGUI_WIDGET_FOREGROUND(checkbox) = fc;
  362. /* draw text */
  363. rect.x1 += rtgui_rect_height(rect) - 4 + 5;
  364. rtgui_dc_draw_text(dc, rtgui_label_get_text(RTGUI_LABEL(checkbox)), &rect);
  365. /* end drawing */
  366. rtgui_dc_end_drawing(dc);
  367. return;
  368. }
  369. static const rt_uint8_t radio_unchecked_byte[] =
  370. {
  371. 0x0f, 0x00, 0x30, 0xc0, 0x40, 0x20,
  372. 0x40, 0x20, 0x80, 0x10, 0x80, 0x10,
  373. 0x80, 0x10, 0x80, 0x10, 0x40, 0x20,
  374. 0x40, 0x20, 0x30, 0xc0, 0x0f, 0x00,
  375. };
  376. static const rt_uint8_t radio_checked_byte[] =
  377. {
  378. 0x0f, 0x00, 0x30, 0xc0, 0x40, 0x20,
  379. 0x40, 0x20, 0x86, 0x10, 0x8f, 0x10,
  380. 0x8f, 0x10, 0x86, 0x10, 0x40, 0x20,
  381. 0x40, 0x20, 0x30, 0xc0, 0x0f, 0x00,
  382. };
  383. void rtgui_theme_draw_radiobutton(struct rtgui_radiobox *radiobox, rt_uint16_t item)
  384. {
  385. struct rtgui_dc *dc;
  386. struct rtgui_rect rect, item_rect;
  387. int item_size, bord_size;
  388. /* begin drawing */
  389. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(radiobox));
  390. if (dc == RT_NULL) return;
  391. /* get widget rect */
  392. rtgui_widget_get_rect(RTGUI_WIDGET(radiobox), &rect);
  393. item_size = radiobox->item_size;
  394. /* get board size */
  395. if (radiobox->orient == RTGUI_VERTICAL)
  396. bord_size = item_size;
  397. else
  398. {
  399. rtgui_font_get_metrics(RTGUI_DC_FONT(dc), "H", &item_rect);
  400. bord_size = rtgui_rect_height(item_rect);
  401. }
  402. item_rect = rect;
  403. rtgui_rect_inflate(&item_rect, - bord_size);
  404. if (radiobox->orient == RTGUI_VERTICAL)
  405. {
  406. /* set the first text rect */
  407. item_rect.y1 += item * item_size;
  408. item_rect.y2 = item_rect.y1 + item_size;
  409. /* draw radio */
  410. if (radiobox->item_selection == item)
  411. {
  412. if (RTGUI_WIDGET_IS_FOCUSED(radiobox))
  413. rtgui_dc_draw_focus_rect(dc, &item_rect);
  414. rtgui_dc_draw_word(dc, item_rect.x1, item_rect.y1 + (item_size - RADIO_BOX_H) / 2,
  415. RADIO_BOX_H, radio_checked_byte);
  416. }
  417. else
  418. {
  419. item_rect.x2 += 1;
  420. item_rect.y2 += 1;
  421. rtgui_dc_fill_rect(dc, &item_rect);
  422. item_rect.x2 -= 1;
  423. item_rect.y2 -= 1;
  424. rtgui_dc_draw_word(dc, item_rect.x1, item_rect.y1 + (item_size - RADIO_BOX_H) / 2,
  425. RADIO_BOX_H, radio_unchecked_byte);
  426. }
  427. /* draw text */
  428. item_rect.x1 += item_size + 3;
  429. rtgui_dc_draw_text(dc, radiobox->items[item], &item_rect);
  430. }
  431. else
  432. {
  433. item_rect.x1 += item * item_size;
  434. /* set the first text rect */
  435. item_rect.x2 = item_rect.x1 + item_size - 1;
  436. item_rect.y2 = item_rect.y1 + bord_size;
  437. /* draw radio */
  438. if (radiobox->item_selection == item)
  439. {
  440. if (RTGUI_WIDGET_IS_FOCUSED(radiobox))
  441. rtgui_dc_draw_focus_rect(dc, &item_rect);
  442. rtgui_dc_draw_word(dc, item_rect.x1, item_rect.y1, RADIO_BOX_H, radio_checked_byte);
  443. }
  444. else
  445. {
  446. item_rect.x2 += 1;
  447. item_rect.y2 += 1;
  448. rtgui_dc_fill_rect(dc, &item_rect);
  449. item_rect.x2 -= 1;
  450. item_rect.y2 -= 1;
  451. rtgui_dc_draw_word(dc, item_rect.x1, item_rect.y1, RADIO_BOX_H, radio_unchecked_byte);
  452. }
  453. /* draw text */
  454. item_rect.x1 += bord_size + 3;
  455. rtgui_dc_draw_text(dc, radiobox->items[item], &item_rect);
  456. }
  457. /* end drawing */
  458. rtgui_dc_end_drawing(dc);
  459. }
  460. void rtgui_theme_draw_radiobox(struct rtgui_radiobox *radiobox)
  461. {
  462. struct rtgui_dc *dc;
  463. struct rtgui_rect rect, item_rect;
  464. int item_size, bord_size, index;
  465. rtgui_color_t fc;
  466. /* begin drawing */
  467. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(radiobox));
  468. if (dc == RT_NULL) return;
  469. /* get widget rect */
  470. rtgui_widget_get_rect(RTGUI_WIDGET(radiobox), &rect);
  471. rtgui_dc_fill_rect(dc, &rect);
  472. item_size = radiobox->item_size;
  473. /* get board size */
  474. if (radiobox->orient == RTGUI_VERTICAL)
  475. bord_size = item_size;
  476. else
  477. {
  478. rtgui_font_get_metrics(RTGUI_DC_FONT(dc), "H", &item_rect);
  479. bord_size = rtgui_rect_height(item_rect);
  480. }
  481. /* draw box */
  482. rtgui_rect_inflate(&rect, -bord_size / 2);
  483. fc = RTGUI_WIDGET_FOREGROUND(radiobox);
  484. RTGUI_WIDGET_FOREGROUND(radiobox) = white;
  485. rect.x1 ++;
  486. rect.y1 ++;
  487. rect.x2 ++;
  488. rect.y2 ++;
  489. rtgui_dc_draw_rect(dc, &rect);
  490. RTGUI_WIDGET_FOREGROUND(radiobox) = RTGUI_RGB(128, 128, 128);
  491. rect.x1 --;
  492. rect.y1 --;
  493. rect.x2 --;
  494. rect.y2 --;
  495. rtgui_dc_draw_rect(dc, &rect);
  496. RTGUI_WIDGET_FOREGROUND(radiobox) = fc;
  497. rtgui_rect_inflate(&rect, bord_size / 2);
  498. if (radiobox->text != RT_NULL)
  499. {
  500. struct rtgui_rect text_rect;
  501. /* draw group text */
  502. rtgui_font_get_metrics(RTGUI_DC_FONT(dc), radiobox->text, &text_rect);
  503. rtgui_rect_moveto(&text_rect, rect.x1 + bord_size + 5, rect.y1);
  504. rect.x1 -= 5;
  505. rect.x2 += 5;
  506. rtgui_dc_fill_rect(dc, &text_rect);
  507. rect.x1 += 5;
  508. rect.x2 -= 5;
  509. rtgui_dc_draw_text(dc, radiobox->text, &text_rect);
  510. }
  511. /* set init item rect */
  512. item_rect = rect;
  513. rtgui_rect_inflate(&item_rect, - bord_size);
  514. if (radiobox->orient == RTGUI_VERTICAL)
  515. {
  516. rt_uint16_t offset;
  517. /* set the first text rect */
  518. item_rect.y2 = item_rect.y1 + item_size;
  519. offset = (item_size - RADIO_BOX_H) / 2;
  520. /* draw each radio button */
  521. for (index = 0; index < radiobox->item_count; index ++)
  522. {
  523. if (item_rect.y2 > rect.y2 - item_size) break;
  524. /* draw radio */
  525. if (radiobox->item_selection == index)
  526. {
  527. if (RTGUI_WIDGET_IS_FOCUSED(radiobox))
  528. rtgui_dc_draw_focus_rect(dc, &item_rect);
  529. rtgui_dc_draw_word(dc, item_rect.x1, item_rect.y1 + offset, RADIO_BOX_H, radio_checked_byte);
  530. }
  531. else
  532. {
  533. rtgui_dc_draw_word(dc, item_rect.x1, item_rect.y1 + offset, RADIO_BOX_H, radio_unchecked_byte);
  534. }
  535. /* draw text */
  536. item_rect.x1 += item_size + 3;
  537. rtgui_dc_draw_text(dc, radiobox->items[index], &item_rect);
  538. item_rect.x1 -= item_size + 3;
  539. item_rect.y1 += item_size;
  540. item_rect.y2 += item_size;
  541. }
  542. }
  543. else
  544. {
  545. /* set the first text rect */
  546. item_rect.x2 = item_rect.x1 + item_size;
  547. item_rect.y2 = item_rect.y1 + bord_size;
  548. /* draw each radio button */
  549. for (index = 0; index < radiobox->item_count; index ++)
  550. {
  551. if (item_rect.x2 > rect.x2 - item_size) break;
  552. /* draw radio */
  553. if (radiobox->item_selection == index)
  554. {
  555. if (RTGUI_WIDGET_IS_FOCUSED(radiobox))
  556. rtgui_dc_draw_focus_rect(dc, &item_rect);
  557. rtgui_dc_draw_word(dc, item_rect.x1, item_rect.y1, RADIO_BOX_H, radio_checked_byte);
  558. }
  559. else
  560. {
  561. rtgui_dc_draw_word(dc, item_rect.x1, item_rect.y1, RADIO_BOX_H, radio_unchecked_byte);
  562. }
  563. /* draw text */
  564. item_rect.x1 += bord_size + 3;
  565. rtgui_dc_draw_text(dc, radiobox->items[index], &item_rect);
  566. item_rect.x1 -= bord_size + 3;
  567. item_rect.x1 += item_size;
  568. item_rect.x2 += (item_size - 1);
  569. }
  570. }
  571. /* end drawing */
  572. rtgui_dc_end_drawing(dc);
  573. }
  574. void rtgui_theme_draw_slider(struct rtgui_slider *slider)
  575. {
  576. /* draw button */
  577. struct rtgui_dc *dc;
  578. int i, xsize, x0;
  579. rtgui_rect_t r, focus_rect, slider_rect, slot_rect;
  580. /* begin drawing */
  581. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(slider));
  582. if (dc == RT_NULL) return;
  583. /* get widget rect */
  584. rtgui_widget_get_rect(RTGUI_WIDGET(slider), &focus_rect);
  585. /* fill widget rect with background color */
  586. rtgui_dc_fill_rect(dc, &focus_rect);
  587. r = focus_rect;
  588. if (slider->orient == RTGUI_VERTICAL)
  589. {
  590. rtgui_rect_inflate(&r, -1);
  591. xsize = r.y2 - r.y1 + 1 - slider->thumb_width;
  592. x0 = r.y1 + slider->thumb_width / 2;
  593. /* calculate thumb position */
  594. slider_rect = r;
  595. slider_rect.x1 = 5;
  596. slider_rect.y1 = x0 + xsize * (slider->value - slider->min) / (slider->max - slider->min) - slider->thumb_width / 2;
  597. slider_rect.y2 = slider_rect.y1 + slider->thumb_width;
  598. /* calculate slot position */
  599. slot_rect.y1 = x0;
  600. slot_rect.y2 = x0 + xsize;
  601. slot_rect.x1 = (slider_rect.x1 + slider_rect.x2) / 2 - 1;
  602. slot_rect.x2 = slot_rect.x1 + 3;
  603. /* draw slot */
  604. rtgui_dc_draw_border(dc, &slot_rect, RTGUI_BORDER_RAISE);
  605. /* draw the ticks */
  606. for (i = 0; i <= slider->ticks; i++)
  607. {
  608. int x = x0 + xsize * i / slider->ticks;
  609. rtgui_dc_draw_hline(dc, 1, 3, x);
  610. }
  611. /* draw the thumb */
  612. rtgui_dc_fill_rect(dc, &slider_rect);
  613. rtgui_dc_draw_border(dc, &slider_rect, RTGUI_BORDER_RAISE);
  614. }
  615. else
  616. {
  617. rtgui_rect_inflate(&r, -1);
  618. xsize = r.x2 - r.x1 + 1 - slider->thumb_width;
  619. x0 = r.x1 + slider->thumb_width / 2;
  620. /* calculate thumb position */
  621. slider_rect = r;
  622. slider_rect.y1 = 5;
  623. slider_rect.x1 = x0 + xsize * (slider->value - slider->min) / (slider->max - slider->min) - slider->thumb_width / 2;
  624. slider_rect.x2 = slider_rect.x1 + slider->thumb_width;
  625. /* calculate slot position */
  626. slot_rect.x1 = x0;
  627. slot_rect.x2 = x0 + xsize;
  628. slot_rect.y1 = (slider_rect.y1 + slider_rect.y2) / 2 - 1;
  629. slot_rect.y2 = slot_rect.y1 + 3;
  630. /* draw slot */
  631. rtgui_dc_draw_border(dc, &slot_rect, RTGUI_BORDER_RAISE);
  632. /* draw the ticks */
  633. for (i = 0; i <= slider->ticks; i++)
  634. {
  635. int x = x0 + xsize * i / slider->ticks;
  636. rtgui_dc_draw_vline(dc, x, 1, 3);
  637. }
  638. /* draw the thumb */
  639. rtgui_dc_fill_rect(dc, &slider_rect);
  640. rtgui_dc_draw_border(dc, &slider_rect, RTGUI_BORDER_RAISE);
  641. }
  642. /* draw focus */
  643. if (RTGUI_WIDGET_IS_FOCUSED(slider))
  644. {
  645. rtgui_dc_draw_focus_rect(dc, &focus_rect);
  646. }
  647. /* end drawing */
  648. rtgui_dc_end_drawing(dc);
  649. return;
  650. }
  651. void rtgui_theme_draw_progressbar(struct rtgui_progressbar *bar)
  652. {
  653. /* draw progress bar */
  654. struct rtgui_dc *dc;
  655. struct rtgui_rect rect;
  656. int max = bar->range;
  657. int pos = bar->position;
  658. int left;
  659. rtgui_color_t bc;
  660. /* begin drawing */
  661. dc = rtgui_dc_begin_drawing(&(bar->parent));
  662. if (dc == RT_NULL) return;
  663. bc = RTGUI_DC_BC(dc);
  664. rtgui_widget_get_rect(&(bar->parent), &rect);
  665. /* fill button rect with background color */
  666. RTGUI_WIDGET_BACKGROUND(bar) = RTGUI_RGB(212, 208, 200);
  667. /* draw border */
  668. rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_SUNKEN);
  669. /* Nothing to draw */
  670. if (max == 0)
  671. {
  672. rtgui_dc_end_drawing(dc);
  673. return;
  674. }
  675. rect.x2 ++;
  676. rect.y2 ++;
  677. left = max - pos;
  678. rtgui_rect_inflate(&rect, -2);
  679. RTGUI_WIDGET_BACKGROUND(bar) = RTGUI_RGB(0, 0, 255);
  680. rect.y2 --;
  681. rect.x2 --;
  682. if (bar->orient == RTGUI_VERTICAL)
  683. {
  684. /* Vertical bar grows from bottom to top */
  685. int dy = (rtgui_rect_height(rect) * left) / max;
  686. rect.y1 += dy;
  687. rtgui_dc_fill_rect(dc, &rect);
  688. RTGUI_DC_BC(dc) = bc;
  689. rect.y1 -= dy;
  690. rect.y2 = dy;
  691. rtgui_dc_fill_rect(dc, &rect);
  692. }
  693. else
  694. {
  695. /* Horizontal bar grows from left to right */
  696. int dx = (rtgui_rect_width(rect) * left) / max;
  697. rect.x2 -= dx;
  698. rtgui_dc_fill_rect(dc, &rect);
  699. RTGUI_DC_BC(dc) = bc;
  700. rect.x1 = rect.x2;
  701. rect.x2 += dx;
  702. rtgui_dc_fill_rect(dc, &rect);
  703. }
  704. /* end drawing */
  705. rtgui_dc_end_drawing(dc);
  706. return;
  707. }
  708. void rtgui_theme_draw_staticline(struct rtgui_staticline *staticline)
  709. {
  710. struct rtgui_dc *dc;
  711. struct rtgui_rect rect;
  712. /* begin drawing */
  713. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(staticline));
  714. if (dc == RT_NULL) return ;
  715. rtgui_widget_get_rect(RTGUI_WIDGET(staticline), &rect);
  716. rtgui_dc_fill_rect(dc, &rect);
  717. if (staticline->orient == RTGUI_HORIZONTAL)
  718. {
  719. rtgui_dc_draw_horizontal_line(dc, rect.x1, rect.x2, rect.y1);
  720. }
  721. else
  722. {
  723. rtgui_dc_draw_vertical_line(dc, rect.x1, rect.y1, rect.y2);
  724. }
  725. rtgui_dc_end_drawing(dc);
  726. }
  727. rt_uint16_t rtgui_theme_get_selected_height()
  728. {
  729. return SELECTED_HEIGHT;
  730. }
  731. void rtgui_theme_draw_selected(struct rtgui_dc *dc, rtgui_rect_t *rect)
  732. {
  733. rtgui_color_t bc;
  734. rt_uint16_t index;
  735. bc = RTGUI_DC_FC(dc);
  736. RTGUI_DC_FC(dc) = selected_color;
  737. rtgui_dc_draw_hline(dc, rect->x1 + 3, rect->x2 - 2, rect->y1 + 1);
  738. rtgui_dc_draw_hline(dc, rect->x1 + 3, rect->x2 - 2, rect->y2 - 2);
  739. rtgui_dc_draw_vline(dc, rect->x1 + 2, rect->y1 + 2, rect->y2 - 2);
  740. rtgui_dc_draw_vline(dc, rect->x2 - 2, rect->y1 + 2, rect->y2 - 2);
  741. for (index = rect->y1 + 1; index < rect->y2 - 2; index ++)
  742. rtgui_dc_draw_hline(dc, rect->x1 + 3, rect->x2 - 2, index);
  743. RTGUI_DC_FC(dc) = bc;
  744. }
  745. /* get default background color */
  746. rtgui_color_t rtgui_theme_default_bc()
  747. {
  748. return default_background;
  749. }
  750. /* get default foreground color */
  751. rtgui_color_t rtgui_theme_default_fc()
  752. {
  753. return default_foreground;
  754. }