From 97d4abe29425c4beb5f13b9b64947e22927b5396 Mon Sep 17 00:00:00 2001 From: "bernard.xiong" Date: Mon, 1 Feb 2010 09:45:33 +0000 Subject: [PATCH] change window close button outlook and add select bar drawing. git-svn-id: https://rt-thread.googlecode.com/svn/trunk@355 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- examples/gui/demo_fnview.c | 4 + examples/gui/demo_view_dc.c | 115 +++++++++++- rtgui/common/dc.c | 38 ++-- rtgui/common/rtgui_system.c | 6 +- rtgui/common/rtgui_theme.c | 275 +++++++---------------------- rtgui/include/rtgui/dc.h | 3 +- rtgui/include/rtgui/rtgui.h | 4 +- rtgui/include/rtgui/rtgui_server.h | 2 + rtgui/server/topwin.c | 13 +- 9 files changed, 219 insertions(+), 241 deletions(-) diff --git a/examples/gui/demo_fnview.c b/examples/gui/demo_fnview.c index f7d4010597..68c4269137 100644 --- a/examples/gui/demo_fnview.c +++ b/examples/gui/demo_fnview.c @@ -14,7 +14,11 @@ static void open_btn_onbutton(rtgui_widget_t* widget, struct rtgui_event* event) workbench = RTGUI_WORKBENCH(rtgui_widget_get_toplevel(widget)); rtgui_widget_get_rect(RTGUI_WIDGET(workbench), &rect); +#ifdef _WIN32 + view = rtgui_filelist_view_create(workbench, "d:\\", "*.*", &rect); +#else view = rtgui_filelist_view_create(workbench, "/", "*.*", &rect); +#endif if (rtgui_view_show(RTGUI_VIEW(view), RT_TRUE) == RTGUI_MODAL_OK) { char path[32]; diff --git a/examples/gui/demo_view_dc.c b/examples/gui/demo_view_dc.c index be0abdd1da..8a5f54b5b1 100644 --- a/examples/gui/demo_view_dc.c +++ b/examples/gui/demo_view_dc.c @@ -3,6 +3,28 @@ #include #include +static const rt_uint8_t boxChecked[7] = {0x02, 0x06, 0x8E, 0xDC, 0xF8, 0x70, 0x20}; + +static const rt_uint8_t sysMin[2] = {0x7E, 0x7E}; +static const rt_uint8_t sysMax[18] = {0x0F, 0xF8, 0x0F, 0xF8, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, + 0x08, 0x08, 0x08, 0x08, 0x0F, 0xF8 +}; +static const rt_uint8_t sysNormal[18] = {0x03, 0xF0, 0x03, 0xF0, 0x02, 0x10, + 0x0F, 0xD0, 0x0F, 0xD0, 0x08, 0x70, + 0x08, 0x40, 0x08, 0x40, 0x0F, 0xC0 +}; + +static const rt_uint8_t sysClose[14] = {0x06, 0x18, 0x03, 0x30, 0x01, 0xE0, 0x00, + 0xC0, 0x01, 0xE0, 0x03, 0x30, 0x06, 0x18 +}; + +static const rt_uint8_t viewSYS[28] = {0xFF, 0x1F, 0x3C, 0x06, 0x1C, 0x04, 0x1C, + 0x0C, 0x0E, 0x08, 0x0E, 0x18, 0x07, 0x10, + 0x07, 0x30, 0x03, 0xA0, 0x03, 0xE0, 0x01, + 0xC0, 0x01, 0xC0, 0x00, 0x80, 0x00, 0x80 +}; + rt_bool_t dc_event_handler(rtgui_widget_t* widget, rtgui_event_t *event) { if (event->type == RTGUI_EVENT_PAINT) @@ -35,7 +57,7 @@ rt_bool_t dc_event_handler(rtgui_widget_t* widget, rtgui_event_t *event) rtgui_dc_set_color(dc, green); rtgui_dc_fill_circle(dc, rect.x1 + 30, rect.y1 + 10, 10); - /* 画一个圆弧 */ + /* 画一个圆弧 */ rtgui_dc_set_color(dc, RTGUI_RGB(250, 120, 120)); rtgui_dc_draw_arc(dc, rect.x1 + 120, rect.y1 + 60, 30, 0, 120); @@ -43,6 +65,97 @@ rt_bool_t dc_event_handler(rtgui_widget_t* widget, rtgui_event_t *event) rtgui_dc_set_color(dc, blue); rtgui_dc_draw_polygon(dc, vx, vy, 6); + { + rtgui_rect_t item_rect = {0, 0, 14, 14}; + rt_uint16_t item_size = 14; + + rtgui_rect_moveto(&item_rect, 100, 100); + + rtgui_dc_set_color(dc, RTGUI_RGB(0x66, 0x66, 0x66)); + rtgui_dc_draw_circle(dc, item_rect.x1 + item_size/2, item_rect.y1 + item_size/2, item_size/2); + rtgui_dc_set_color(dc, RTGUI_RGB(0xff, 0xFF, 0xFF)); + rtgui_dc_draw_circle(dc, item_rect.x1 + item_size/2, item_rect.y1 + item_size/2, item_size/2 - 1); + + rtgui_dc_set_color(dc, RTGUI_RGB(0x00, 0x00, 0x00)); + rtgui_dc_fill_circle(dc, item_rect.x1 + item_size/2, item_rect.y1 + item_size/2, item_size/2 - 3); + } + + { + rtgui_rect_t item_rect = {0, 0, 14, 14}; + rt_uint16_t item_size = 14; + rtgui_rect_moveto(&item_rect, 120, 120); + + rtgui_dc_set_color(dc, RTGUI_RGB(0x66, 0x66, 0x66)); + rtgui_dc_draw_circle(dc, item_rect.x1 + item_size/2, item_rect.y1 + item_size/2, item_size/2); + rtgui_dc_set_color(dc, RTGUI_RGB(0xff, 0xFF, 0xFF)); + rtgui_dc_draw_circle(dc, item_rect.x1 + item_size/2, item_rect.y1 + item_size/2, item_size/2 - 1); + rtgui_dc_set_color(dc, RTGUI_RGB(0x00, 0x00, 0x00)); + } + { + int x, y; + + x = 150; y = 150; + rtgui_dc_set_color(dc, black); + + rtgui_dc_draw_byte(dc, x, y, 7, boxChecked); + y += 7 + 2; + + rtgui_dc_draw_byte(dc, x, y, 2, sysMin); + y += 2 + 2; + + rtgui_dc_draw_word(dc, x, y, 9, sysMax); + y += 9 + 2; + + rtgui_dc_draw_word(dc, x, y, 9, sysNormal); + y += 9 + 2; + + rtgui_dc_draw_word(dc, x, y, 7, sysClose); + y += 7 + 2; + + rtgui_dc_draw_word(dc, x, y, 14, viewSYS); + y += 14 + 2; + } + + { + rtgui_rect_t rect = {0, 0, 16, 16}; + rtgui_rect_moveto(&rect, 30, 120); + + rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_RAISE); + rect.x1 += 20; rect.x2 += 20 + 50; + rtgui_dc_draw_text(dc, "raise", &rect); + rect.x1 -= 20; rect.x2 -= 20 + 50; + rect.y1 += 20; rect.y2 += 20; + + rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_SIMPLE); + rect.x1 += 20; rect.x2 += 20 + 50; + rtgui_dc_draw_text(dc, "simple", &rect); + rect.x1 -= 20; rect.x2 -= 20 + 50; + rect.y1 += 20; rect.y2 += 20; + + rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_SUNKEN); + rect.x1 += 20; rect.x2 += 20 + 50; + rtgui_dc_draw_text(dc, "sunken", &rect); + rect.x1 -= 20; rect.x2 -= 20 + 50; + rect.y1 += 20; rect.y2 += 20; + + rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_BOX); + rect.x1 += 20; rect.x2 += 20 + 50; + rtgui_dc_draw_text(dc, "box", &rect); + rect.x1 -= 20; rect.x2 -= 20 + 50; + rect.y1 += 20; rect.y2 += 20; + + rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_STATIC); + rect.x1 += 20; rect.x2 += 20 + 50; + rtgui_dc_draw_text(dc, "static", &rect); + rect.x1 -= 20; rect.x2 -= 20 + 50; + rect.y1 += 20; rect.y2 += 20; + + rtgui_dc_draw_border(dc, &rect, RTGUI_BORDER_EXTRA); + rect.x1 += 20; rect.x2 += 20 + 50; + rtgui_dc_draw_text(dc, "extra", &rect); + rect.x1 -= 20; rect.x2 -= 20 + 50; + rect.y1 += 20; rect.y2 += 20; + } /* 绘图完成 */ rtgui_dc_end_drawing(dc); } diff --git a/rtgui/common/dc.c b/rtgui/common/dc.c index 0c225ae161..6a0075f8e6 100644 --- a/rtgui/common/dc.c +++ b/rtgui/common/dc.c @@ -226,11 +226,11 @@ void rtgui_dc_draw_text (struct rtgui_dc* dc, const rt_uint8_t* text, struct rtg #endif } -void rtgui_dc_draw_byte(struct rtgui_dc*dc, int x, int y, int h, rt_uint8_t* data) +void rtgui_dc_draw_byte(struct rtgui_dc*dc, int x, int y, int h, const rt_uint8_t* data) { int i, k; - /* draw word */ + /* draw byte */ for (i=0; i < h; i ++) { for (k=0; k < 8; k++) @@ -243,6 +243,24 @@ void rtgui_dc_draw_byte(struct rtgui_dc*dc, int x, int y, int h, rt_uint8_t* dat } } +void rtgui_dc_draw_word(struct rtgui_dc*dc, int x, int y, int h, const rt_uint8_t* data) +{ + int i, j, k; + + /* draw word */ + for (i=0; i < h; i ++) + { + for (j=0; j < 2; j++) + for (k=0; k < 8; k++) + { + if (((data[i * 2 + j] >> (7-k)) & 0x01) != 0) + { + rtgui_dc_draw_point(dc, x + 8*j + k, y + i); + } + } + } +} + void rtgui_dc_set_color(struct rtgui_dc* dc, rtgui_color_t color) { if (dc != RT_NULL) @@ -791,7 +809,7 @@ void rtgui_dc_draw_arc(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16 /* Sanity check radius */ if (r < 0) return ; /* Special case for r=0 - draw a point */ - if (r == 0) + if (r == 0) { rtgui_dc_draw_point(dc, x, y); return; @@ -802,11 +820,11 @@ void rtgui_dc_draw_arc(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16 end = end % 360; /* - * Draw arc + * Draw arc */ // Octant labelling - // + // // \ 5 | 6 / // \ | / // 4 \ | / 7 @@ -840,7 +858,7 @@ void rtgui_dc_draw_arc(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16 if (oct == startoct) { // need to compute stopval_start for this octant. Look at picture above if this is unclear - switch (oct) + switch (oct) { case 0: case 3: @@ -902,15 +920,15 @@ void rtgui_dc_draw_arc(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16 // otherwise: we only draw in this octant, so initialize it to false, it will get set back to true if (start > end) { - // unfortunately, if we're in the same octant and need to draw over the whole circle, + // unfortunately, if we're in the same octant and need to draw over the whole circle, // we need to set the rest to true, because the while loop will end at the bottom. drawoct = 255; - } + } else { drawoct &= 255 - (1 << oct); } - } + } else if (oct % 2) drawoct &= 255 - (1 << oct); else drawoct |= (1 << oct); } else if (oct != startoct) { // already verified that it's != endoct @@ -962,7 +980,7 @@ void rtgui_dc_draw_arc(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16 if (stopval_start == cx) { // works like an on-off switch because start & end may be in the same octant. - if (drawoct & (1 << startoct)) drawoct &= 255 - (1 << startoct); + if (drawoct & (1 << startoct)) drawoct &= 255 - (1 << startoct); else drawoct |= (1 << startoct); } if (stopval_end == cx) diff --git a/rtgui/common/rtgui_system.c b/rtgui/common/rtgui_system.c index ffbf50c109..cb6dc130f0 100644 --- a/rtgui/common/rtgui_system.c +++ b/rtgui/common/rtgui_system.c @@ -32,9 +32,6 @@ void rtgui_system_server_init() /* init rtgui_thread */ rtgui_thread_system_init(); - /* init theme */ - rtgui_system_theme_init(); - /* init image */ rtgui_system_image_init(); /* init font */ @@ -44,6 +41,9 @@ void rtgui_system_server_init() rtgui_panel_init(); rtgui_topwin_init(); rtgui_server_init(); + + /* init theme */ + rtgui_system_theme_init(); } /************************************************************************/ diff --git a/rtgui/common/rtgui_theme.c b/rtgui/common/rtgui_theme.c index 36c21cbd56..8ac4fce891 100644 --- a/rtgui/common/rtgui_theme.c +++ b/rtgui/common/rtgui_theme.c @@ -24,170 +24,11 @@ #include #include -#define WINTITLE_CB_WIDTH 14 -#define WINTITLE_CB_HEIGHT 14 #define SELECTED_HEIGHT 25 -static const rt_uint8_t *close_unpressed_xpm[] = { - "14 14 55 1", - " c None", - ". c #DCDFEA", - "+ c #A4ADD3", - "@ c #8F9ACA", - "# c #98A2CD", - "$ c #D2D6E6", - "% c #F7F7F7", - "& c #F6F6F6", - "* c #B9C1D0", - "= c #7A8AAA", - "- c #D6DAE2", - "; c #D8DCE3", - "> c #7485A5", - ", c #455C89", - "' c #516690", - ") c #D3D8E0", - "! c #536891", - "~ c #6D7FA1", - "{ c #F5F5F5", - "] c #D1D6DF", - "^ c #D2D7DF", - "/ c #D5D9E1", - "( c #4E648E", - "_ c #CFD4DE", - ": c #F4F4F4", - "< c #D0D5DE", - "[ c #CED3DD", - "} c #F3F3F3", - "| c #CFD4DD", - "1 c #CDD2DC", - "2 c #F2F2F2", - "3 c #D3D7DF", - "4 c #526790", - "5 c #D0D5DD", - "6 c #F1F1F1", - "7 c #D2D6DE", - "8 c #CFD4DC", - "9 c #F0F0F0", - "0 c #D1D5DD", - "a c #C9CED8", - "b c #CDD2DB", - "c c #50658F", - "d c #CED3DB", - "e c #7283A3", - "f c #6E80A2", - "g c #EFEFEF", - "h c #B2BACA", - "i c #7081A2", - "j c #C8CDD7", - "k c #CCD1DA", - "l c #ACB5C7", - "m c #D0D4E2", - "n c #EEEEEE", - "o c #D2D5E3", - "p c #97A1CC", - ".+@@@@@@@@@@+.", - "#$%%%%%%%%%%$#", - "@&*=-&&&&;=*&@", - "@&>,')&&-!,~&@", - "@{]','^/!,(_{@", - "@::<','!,([::@", - "@}}}|',,(1}}}@", - "@22234,,'5222@", - "@6674,(','866@", - "@904,(abc,cd9@", - "@9e,(a99bc,f9@", - "@ghijggggkelg@", - "#mnnnnnnnnnnm#", - "op@@@@@@@@@@po"}; - -static const rt_uint8_t *close_pressed_xpm[] = { - "14 14 66 1", - " c None", - ". c #CED4EE", - "+ c #7E90DD", - "@ c #6076D7", - "# c #6C80D9", - "$ c #BFC8EA", - "% c #F2F3F5", - "& c #F0F2F3", - "* c #A5B6D7", - "= c #587ABB", - "- c #C9D3E4", - "; c #CBD5E4", - "> c #EEF0F2", - ", c #5073B7", - "' c #1746A3", - ") c #2551A8", - "! c #C5CFE2", - "~ c #C8D1E3", - "{ c #2853A8", - "] c #496DB4", - "^ c #ECEEF1", - "/ c #C0CCE0", - "( c #C3CEE1", - "_ c #C6D0E2", - ": c #224FA7", - "< c #BEC9DF", - "[ c #EAECF0", - "} c #BFCAE0", - "| c #2551A7", - "1 c #224EA7", - "2 c #BCC8DF", - "3 c #E8EBEE", - "4 c #BDCADE", - "5 c #BAC7DD", - "6 c #E6E9ED", - "7 c #C1CBDF", - "8 c #2753A8", - "9 c #BECADE", - "0 c #E4E7EB", - "a c #BFCADD", - "b c #224EA6", - "c c #BDC8DC", - "d c #E1E5EA", - "e c #2752A8", - "f c #B3C0D9", - "g c #B8C5DB", - "h c #2451A7", - "i c #BAC6DB", - "j c #DFE2E8", - "k c #4C70B4", - "l c #B2BED8", - "m c #B6C2D9", - "n c #2450A7", - "o c #486BB3", - "p c #DCE0E7", - "q c #96A8CE", - "r c #496CB3", - "s c #AFBCD7", - "t c #B4C1D8", - "u c #4B6FB4", - "v c #8EA4CC", - "w c #6C80D8", - "x c #B4BEDF", - "y c #DADEE5", - "z c #B5BEDE", - "A c #6A7ED7", - ".+@@@@@@@@@@+.", - "#$%%%%%%%%%%$#", - "@&*=-&&&&;=*&@", - "@>,')!>>~{']>@", - "@^/)')(_{':<^@", - "@[[}|'|{'12[[@", - "@3334|''15333@", - "@66678''|9666@", - "@00a8'b|'|c00@", - "@dce'bfgh'hid@", - "@jk'bljjmn'oj@", - "@pqrspppptuvp@", - "wxyyyyyyyyyyxw", - "zA@@@@@@@@@@Az"}; - -static rtgui_image_t* close_pressed = RT_NULL; -static rtgui_image_t* close_unpressed = RT_NULL; - const rtgui_color_t default_foreground = RTGUI_RGB(0x00, 0x00, 0x00); const rtgui_color_t default_background = RTGUI_RGB(212, 208, 200); +const rtgui_color_t selected_color = RTGUI_RGB(0xc0, 0xc0, 0xc0); extern struct rtgui_font rtgui_font_asc16; extern struct rtgui_font rtgui_font_arial16; @@ -197,28 +38,19 @@ extern struct rtgui_font rtgui_font_arial12; /* init theme */ void rtgui_system_theme_init() { - close_pressed = rtgui_image_create_from_mem("xpm", - (const rt_uint8_t*)close_pressed_xpm, sizeof(close_pressed_xpm), RT_TRUE); - close_unpressed = rtgui_image_create_from_mem("xpm", - (const rt_uint8_t*)close_unpressed_xpm, sizeof(close_unpressed_xpm), RT_TRUE); - - rtgui_font_set_defaut(&rtgui_font_arial16); + rtgui_font_set_defaut(&rtgui_font_asc12); } +static const rt_uint8_t close_byte[14] = {0x06, 0x18, 0x03, 0x30, 0x01, 0xE0, 0x00, + 0xC0, 0x01, 0xE0, 0x03, 0x30, 0x06, 0x18 +}; + /* window drawing */ void rtgui_theme_draw_win(struct rtgui_topwin* win) { struct rtgui_dc* dc; rtgui_rect_t rect; - /* init close box image */ - if (close_pressed == RT_NULL) - close_pressed = rtgui_image_create_from_mem("xpm", - (const rt_uint8_t*)close_pressed_xpm, sizeof(close_pressed_xpm), RT_TRUE); - if (close_unpressed == RT_NULL) - close_unpressed = rtgui_image_create_from_mem("xpm", - (const rt_uint8_t*)close_unpressed_xpm, sizeof(close_unpressed_xpm), RT_TRUE); - /* begin drawing */ dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(win->title)); @@ -228,6 +60,7 @@ void rtgui_theme_draw_win(struct rtgui_topwin* win) /* draw border */ if (win->flag & WINTITLE_BORDER) { + rect.x2 -= 1; rect.y2 -= 1; RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(win->title)) = RTGUI_RGB(212, 208, 200); rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y1); rtgui_dc_draw_vline(dc, rect.x1, rect.y1, rect.y2); @@ -241,14 +74,11 @@ void rtgui_theme_draw_win(struct rtgui_topwin* win) rtgui_dc_draw_vline(dc, rect.x2 - 1, rect.y1 + 1, rect.y2 - 1); RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(win->title)) = RTGUI_RGB(64, 64, 64); - rtgui_dc_draw_hline(dc, rect.x1, rect.x2 + 1, rect.y2); + rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y2); rtgui_dc_draw_vline(dc, rect.x2, rect.y1, rect.y2); /* shrink border */ - rect.x1 += WINTITLE_BORDER_SIZE; - rect.y1 += WINTITLE_BORDER_SIZE; - rect.x2 -= WINTITLE_BORDER_SIZE; - rect.y2 -= WINTITLE_BORDER_SIZE; + rtgui_rect_inflate(&rect, -WINTITLE_BORDER_SIZE); } /* draw title */ @@ -291,15 +121,24 @@ void rtgui_theme_draw_win(struct rtgui_topwin* win) if (win->flag & WINTITLE_CLOSEBOX) { /* get close button rect */ - rect.x1 = rtgui_rect_width(RTGUI_WIDGET(win->title)->extent) - - WINTITLE_BORDER_SIZE - WINTITLE_CB_WIDTH - 3; - rect.y1 = 3; - rect.x2 = rect.x1 + WINTITLE_CB_WIDTH; - rect.y2 = rect.y1 + WINTITLE_CB_HEIGHT; + rtgui_rect_t box_rect = {0, 0, WINTITLE_CB_WIDTH, WINTITLE_CB_HEIGHT}; + rtgui_rect_moveto_align(&rect, &box_rect, RTGUI_ALIGN_CENTER_VERTICAL | RTGUI_ALIGN_RIGHT); + box_rect.x1 -= 3; box_rect.x2 -= 3; + rtgui_dc_fill_rect(dc, &box_rect); /* draw close box */ - if(win->flag & WINTITLE_CB_PRESSED) rtgui_image_blit(close_pressed, dc, &rect); - else rtgui_image_blit(close_unpressed, dc, &rect); + if (win->flag & WINTITLE_CB_PRESSED) + { + rtgui_dc_draw_border(dc, &box_rect, RTGUI_BORDER_SUNKEN); + RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(win->title)) = red; + rtgui_dc_draw_word(dc, box_rect.x1, box_rect.y1 + 6, 7, close_byte); + } + else + { + rtgui_dc_draw_border(dc, &box_rect, RTGUI_BORDER_RAISE); + RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(win->title)) = black; + rtgui_dc_draw_word(dc, box_rect.x1 - 1, box_rect.y1 + 5, 7, close_byte); + } } } @@ -550,10 +389,18 @@ void rtgui_theme_draw_iconbox(rtgui_iconbox_t* iconbox) rtgui_dc_end_drawing(dc); } +#define CHECK_BOX_W 13 +#define CHECK_BOX_H 13 +static const rt_uint8_t checked_byte[7] = {0x02, 0x06, 0x8E, 0xDC, 0xF8, 0x70, 0x20}; + void rtgui_theme_draw_checkbox(struct rtgui_checkbox* checkbox) { struct rtgui_dc* dc; struct rtgui_rect rect, box_rect; + rtgui_color_t bc, fc; + + fc = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(checkbox)); + bc = RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(checkbox)); /* begin drawing */ dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(checkbox)); @@ -575,29 +422,26 @@ void rtgui_theme_draw_checkbox(struct rtgui_checkbox* checkbox) } /* draw check box */ - box_rect = rect; - box_rect.x1 += 2; - box_rect.y1 += 2; - box_rect.x2 = rtgui_rect_height(rect) - 4; - box_rect.y2 = rtgui_rect_height(rect) - 4; + box_rect.x1 = 0; + box_rect.y1 = 0; + box_rect.x2 = CHECK_BOX_W; + box_rect.y2 = CHECK_BOX_H; + rtgui_rect_moveto_align(&rect, &box_rect, RTGUI_ALIGN_CENTER_VERTICAL); - rtgui_dc_draw_rect(dc, &box_rect); + rtgui_dc_draw_border(dc, &box_rect, RTGUI_BORDER_BOX); + rtgui_rect_inflate(&box_rect, -1); + RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(checkbox)) = RTGUI_RGB(247, 247, 246); + rtgui_dc_fill_rect(dc, &box_rect); if (checkbox->status_down == RTGUI_CHECKBOX_STATUS_CHECKED) { - rtgui_color_t save; - - save = RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(checkbox)); - - /* swap fore/back color */ - RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(checkbox)) = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(checkbox)); - - rtgui_rect_inflate(&box_rect, -4); - rtgui_dc_fill_rect(dc, &box_rect); - - /* restore saved color */ - RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(checkbox)) = save; + RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(checkbox)) = RTGUI_RGB(33, 161, 33); + rtgui_dc_draw_byte(dc, box_rect.x1 + 2, box_rect.y1 + 2, 7, checked_byte); } + /* restore saved color */ + RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(checkbox)) = bc; + RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(checkbox)) = fc; + /* draw text */ rect.x1 += rtgui_rect_height(rect) - 4 + 5; rtgui_dc_draw_text(dc, rtgui_label_get_text(RTGUI_LABEL(checkbox)), &rect); @@ -922,19 +766,22 @@ rt_uint16_t rtgui_theme_get_selected_height() void rtgui_theme_draw_selected(struct rtgui_dc* dc, rtgui_rect_t *rect) { - rtgui_color_t saved; - rtgui_rect_t focus_rect; + rtgui_color_t bc; + rt_uint16_t index; - focus_rect = *rect; - saved = rtgui_dc_get_color(dc); - rtgui_dc_set_color(dc, blue); + bc = rtgui_dc_get_color(dc); + rtgui_dc_set_color(dc, selected_color); - rtgui_rect_inflate(&focus_rect, -1); - rtgui_dc_draw_focus_rect(dc, &focus_rect); - rtgui_rect_inflate(&focus_rect, -1); - rtgui_dc_draw_focus_rect(dc, &focus_rect); + rtgui_dc_draw_hline(dc, rect->x1 + 3, rect->x2 - 2, rect->y1 + 1); + rtgui_dc_draw_hline(dc, rect->x1 + 3, rect->x2 - 2, rect->y2 - 2); - rtgui_dc_set_color(dc, saved); + rtgui_dc_draw_vline(dc, rect->x1 + 2, rect->y1 + 2, rect->y2 - 2); + rtgui_dc_draw_vline(dc, rect->x2 - 2, rect->y1 + 2, rect->y2 - 2); + + for (index = rect->y1 + 1; index < rect->y2 - 2; index ++) + rtgui_dc_draw_hline(dc, rect->x1 + 3, rect->x2 - 2, index); + + rtgui_dc_set_color(dc, bc); } /* get default background color */ diff --git a/rtgui/include/rtgui/dc.h b/rtgui/include/rtgui/dc.h index 5e05def8e5..43704d1785 100644 --- a/rtgui/include/rtgui/dc.h +++ b/rtgui/include/rtgui/dc.h @@ -107,7 +107,8 @@ void rtgui_dc_draw_rect (struct rtgui_dc* dc, struct rtgui_rect* rect); void rtgui_dc_draw_round_rect(struct rtgui_dc* dc, struct rtgui_rect* rect); void rtgui_dc_draw_text (struct rtgui_dc* dc, const rt_uint8_t* text, struct rtgui_rect* rect); -void rtgui_dc_draw_byte(struct rtgui_dc*dc, int x, int y, int h, rt_uint8_t* data); +void rtgui_dc_draw_byte(struct rtgui_dc*dc, int x, int y, int h, const rt_uint8_t* data); +void rtgui_dc_draw_word(struct rtgui_dc*dc, int x, int y, int h, const rt_uint8_t* data); void rtgui_dc_draw_border(struct rtgui_dc* dc, rtgui_rect_t* rect, int flag); void rtgui_dc_draw_horizontal_line(struct rtgui_dc* dc, int x1, int x2, int y); diff --git a/rtgui/include/rtgui/rtgui.h b/rtgui/include/rtgui/rtgui.h index 62b229c4e6..66e2d00369 100644 --- a/rtgui/include/rtgui/rtgui.h +++ b/rtgui/include/rtgui/rtgui.h @@ -61,7 +61,9 @@ enum RTGUI_BORDER_STYLE RTGUI_BORDER_SUNKEN, RTGUI_BORDER_BOX, RTGUI_BORDER_STATIC, - RTGUI_BORDER_EXTRA + RTGUI_BORDER_EXTRA, + RTGUI_BORDER_UP, + RTGUI_BORDER_DOWN }; #define RTGUI_BORDER_DEFAULT_WIDTH 2 #define RTGUI_WIDGET_DEFAULT_MARGIN 3 diff --git a/rtgui/include/rtgui/rtgui_server.h b/rtgui/include/rtgui/rtgui_server.h index 6cd692c297..46e1837e35 100644 --- a/rtgui/include/rtgui/rtgui_server.h +++ b/rtgui/include/rtgui/rtgui_server.h @@ -31,6 +31,8 @@ enum }; #define WINTITLE_HEIGHT 20 +#define WINTITLE_CB_WIDTH 16 +#define WINTITLE_CB_HEIGHT 16 #define WINTITLE_BORDER_SIZE 2 struct rtgui_topwin diff --git a/rtgui/server/topwin.c b/rtgui/server/topwin.c index dc0fd1480b..5a234a7b8c 100644 --- a/rtgui/server/topwin.c +++ b/rtgui/server/topwin.c @@ -30,9 +30,6 @@ static struct rt_semaphore _rtgui_topwin_lock; static void rtgui_topwin_update_clip(void); static void rtgui_topwin_redraw(struct rtgui_rect* rect); -#define WINTITLE_CB_WIDTH 14 -#define WINTITLE_CB_HEIGHT 14 - void rtgui_topwin_init() { /* init window list */ @@ -90,10 +87,7 @@ rt_err_t rtgui_topwin_add(struct rtgui_event_win_create* event) /* add border rect */ if (topwin->flag & WINTITLE_BORDER) { - rect.x1 -= WINTITLE_BORDER_SIZE; - rect.y1 -= WINTITLE_BORDER_SIZE; - rect.x2 += WINTITLE_BORDER_SIZE; - rect.y2 += WINTITLE_BORDER_SIZE; + rtgui_rect_inflate(&rect, WINTITLE_BORDER_SIZE); } /* add title rect */ @@ -688,10 +682,7 @@ void rtgui_topwin_resize(struct rtgui_win* wid, rtgui_rect_t* r) /* add border rect */ if (topwin->flag & WINTITLE_BORDER) { - rect.x1 -= WINTITLE_BORDER_SIZE; - rect.y1 -= WINTITLE_BORDER_SIZE; - rect.x2 += WINTITLE_BORDER_SIZE; - rect.y2 += WINTITLE_BORDER_SIZE; + rtgui_rect_inflate(&rect, WINTITLE_BORDER_SIZE); } /* add title rect */