From a1d1aea77209b57f9231baf0fd3537195c79b058 Mon Sep 17 00:00:00 2001 From: "bernard.xiong" Date: Sun, 17 Jan 2010 23:43:20 +0000 Subject: [PATCH] update radiobox handling; add more optimization on small size. git-svn-id: https://rt-thread.googlecode.com/svn/trunk@311 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- rtgui/common/dc.c | 4 ++ rtgui/common/font.c | 3 +- rtgui/common/rtgui_theme.c | 29 +++++++----- rtgui/include/rtgui/event.h | 2 +- rtgui/include/rtgui/rtgui_config.h | 2 +- rtgui/include/rtgui/widgets/button.h | 3 +- rtgui/include/rtgui/widgets/radiobox.h | 2 +- rtgui/server/topwin.c | 4 +- rtgui/widgets/button.c | 46 +++++++++++++++++++ rtgui/widgets/radiobox.c | 62 ++++++++++++++++++-------- rtgui/widgets/toplevel.c | 10 +++-- 11 files changed, 129 insertions(+), 38 deletions(-) diff --git a/rtgui/common/dc.c b/rtgui/common/dc.c index f31884cd06..6d2181c568 100644 --- a/rtgui/common/dc.c +++ b/rtgui/common/dc.c @@ -766,6 +766,10 @@ void rtgui_dc_draw_arc(struct rtgui_dc *dc, rt_int16_t x, rt_int16_t y, rt_int16 rt_uint8_t drawoct; int startoct, endoct, oct, stopval_start, stopval_end; double temp; + + stopval_start = 0; + stopval_end = 0; + temp = 0; /* Sanity check radius */ if (r < 0) return ; diff --git a/rtgui/common/font.c b/rtgui/common/font.c index 4979348c22..2dd68d3c33 100644 --- a/rtgui/common/font.c +++ b/rtgui/common/font.c @@ -47,7 +47,8 @@ void rtgui_font_system_init() #ifdef RTGUI_USING_FONT12 rtgui_font_set_defaut(&rtgui_font_asc12); -#elif defined(RTGUI_USING_FONT16) +#endif +#ifdef RTGUI_USING_FONT16 rtgui_font_set_defaut(&rtgui_font_asc16); #endif } diff --git a/rtgui/common/rtgui_theme.c b/rtgui/common/rtgui_theme.c index 22b57a6c27..fc445a4634 100644 --- a/rtgui/common/rtgui_theme.c +++ b/rtgui/common/rtgui_theme.c @@ -270,15 +270,19 @@ void rtgui_theme_draw_button(rtgui_button_t* btn) /* draw button */ struct rtgui_dc* dc; struct rtgui_rect rect; + rtgui_color_t fc; /* begin drawing */ dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(btn)); if (dc == RT_NULL) return; + /* get widget rect */ rtgui_widget_get_rect(RTGUI_WIDGET(btn), &rect); + /* get forecolor */ + fc = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(btn)); + /* fill button rect with background color */ - // RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(btn)) = RTGUI_RGB(212, 208, 200); rtgui_dc_fill_rect(dc, &rect); if (btn->flag & RTGUI_BUTTON_TYPE_PUSH && btn->flag & RTGUI_BUTTON_FLAG_PRESS) @@ -359,10 +363,12 @@ void rtgui_theme_draw_button(rtgui_button_t* btn) } } + /* set forecolor */ + RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(btn)) = fc; + if (btn->pressed_image == RT_NULL) { /* re-set foreground and get default rect */ - RTGUI_WIDGET(btn)->gc.foreground = RTGUI_RGB(0, 0, 0); rtgui_widget_get_rect(RTGUI_WIDGET(btn), &rect); /* remove border */ @@ -511,7 +517,7 @@ void rtgui_theme_draw_checkbox(struct rtgui_checkbox* checkbox) /* swap fore/back color */ RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(checkbox)) = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(checkbox)); - rtgui_rect_inflate(&box_rect, -2); + rtgui_rect_inflate(&box_rect, -4); rtgui_dc_fill_rect(dc, &box_rect); /* restore saved color */ @@ -562,7 +568,7 @@ void rtgui_theme_draw_radiobox(struct rtgui_radiobox* radiobox) /* draw group text */ rtgui_font_get_metrics(rtgui_dc_get_font(dc), radiobox->text, &text_rect); - rtgui_rect_moveto(&text_rect, rect.x1 + 5, rect.y1); + rtgui_rect_moveto(&text_rect, rect.x1 + bord_size + 5, rect.y1); rtgui_dc_fill_rect(dc, &text_rect); rtgui_dc_draw_text(dc, radiobox->text, &text_rect); } @@ -584,8 +590,10 @@ void rtgui_theme_draw_radiobox(struct rtgui_radiobox* radiobox) /* draw radio */ if (radiobox->item_selection == index) { - rtgui_dc_draw_focus_rect(dc, &item_rect); - rtgui_dc_fill_circle(dc, item_rect.x1 + item_size/2 + 2, item_rect.y1 + item_size/2 + 2, item_size/2 - 2); + if (RTGUI_WIDGET_IS_FOCUSED(RTGUI_WIDGET(radiobox))) + rtgui_dc_draw_focus_rect(dc, &item_rect); + rtgui_dc_draw_circle(dc, item_rect.x1 + item_size/2 + 2, item_rect.y1 + item_size/2 + 2, item_size/2 - 2); + rtgui_dc_fill_circle(dc, item_rect.x1 + item_size/2 + 2, item_rect.y1 + item_size/2 + 2, item_size/2 - 4); } else { @@ -615,17 +623,18 @@ void rtgui_theme_draw_radiobox(struct rtgui_radiobox* radiobox) if (radiobox->item_selection == index) { rtgui_dc_draw_focus_rect(dc, &item_rect); - rtgui_dc_fill_circle(dc, item_rect.x1 + item_size/2 + 2, item_rect.y1 + item_size/2 + 2, item_size/2 - 2); + rtgui_dc_draw_circle(dc, item_rect.x1 + bord_size/2 + 2, item_rect.y1 + bord_size/2 + 2, bord_size/2 - 2); + rtgui_dc_fill_circle(dc, item_rect.x1 + bord_size/2 + 2, item_rect.y1 + bord_size/2 + 2, bord_size/2 - 4); } else { - rtgui_dc_draw_circle(dc, item_rect.x1 + item_size/2 + 2, item_rect.y1 + item_size/2 + 2, item_size/2 - 2); + rtgui_dc_draw_circle(dc, item_rect.x1 + bord_size/2 + 2, item_rect.y1 + bord_size/2 + 2, bord_size/2 - 2); } /* draw text */ - item_rect.x1 += item_size + 3; + item_rect.x1 += bord_size + 3; rtgui_dc_draw_text(dc, radiobox->items[index], &item_rect); - item_rect.x1 -= item_size + 3; + item_rect.x1 -= bord_size + 3; item_rect.x1 += item_size; item_rect.x2 += item_size; diff --git a/rtgui/include/rtgui/event.h b/rtgui/include/rtgui/event.h index e1179d8df4..206a7171d5 100644 --- a/rtgui/include/rtgui/event.h +++ b/rtgui/include/rtgui/event.h @@ -344,7 +344,7 @@ struct rtgui_event_kbd #define RTGUI_KBD_IS_SET_ALT(e) ((e)->mod & (RTGUI_KMOD_LALT | RTGUI_KMOD_RALT)) #define RTGUI_KBD_IS_SET_SHIFT(e) ((e)->mod & (RTGUI_KMOD_LSHIFT| RTGUI_KMOD_RSHIFT)) #define RTGUI_KBD_IS_UP(e) ((e)->type == RTGUI_KEYUP) -#define RTGUI_KBD_IS_DOWN(e) ((e)->flag == RTGUI_KEYDOWN) +#define RTGUI_KBD_IS_DOWN(e) ((e)->type == RTGUI_KEYDOWN) #define RTGUI_EVENT_MOUSE_MOTION_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_MOUSE_MOTION) #define RTGUI_EVENT_MOUSE_BUTTON_INIT(e) RTGUI_EVENT_INIT(&((e)->parent), RTGUI_EVENT_MOUSE_BUTTON) diff --git a/rtgui/include/rtgui/rtgui_config.h b/rtgui/include/rtgui/rtgui_config.h index 70cbeabff8..02a3eb7ff3 100644 --- a/rtgui/include/rtgui/rtgui_config.h +++ b/rtgui/include/rtgui/rtgui_config.h @@ -22,7 +22,7 @@ /* #define RTGUI_USING_MOUSE_CURSOR */ -/* #define RTGUI_USING_FONT12 */ +#define RTGUI_USING_FONT12 #define RTGUI_USING_FONT16 #define RTGUI_USING_FONTHZ diff --git a/rtgui/include/rtgui/widgets/button.h b/rtgui/include/rtgui/widgets/button.h index 77e7fc4e03..7ecc574ad0 100644 --- a/rtgui/include/rtgui/widgets/button.h +++ b/rtgui/include/rtgui/widgets/button.h @@ -58,6 +58,7 @@ struct rtgui_button void (*on_button)(struct rtgui_widget* widget, rtgui_event_t *event); }; typedef struct rtgui_button rtgui_button_t; +typedef void (*rtgui_onbutton_func_t)(struct rtgui_widget* widget, rtgui_event_t *event); rtgui_type_t *rtgui_button_type_get(void); @@ -68,7 +69,7 @@ void rtgui_button_destroy(rtgui_button_t* btn); void rtgui_button_set_pressed_image(rtgui_button_t* btn, rtgui_image_t* image); void rtgui_button_set_unpressed_image(rtgui_button_t* btn, rtgui_image_t* image); -void rtgui_button_ondraw(rtgui_button_t* btn); +void rtgui_button_set_onbutton(rtgui_button_t* btn, rtgui_onbutton_func_t func); rt_bool_t rtgui_button_event_handler(struct rtgui_widget* widget, struct rtgui_event* event); diff --git a/rtgui/include/rtgui/widgets/radiobox.h b/rtgui/include/rtgui/widgets/radiobox.h index efab51698c..52bbd84ff3 100644 --- a/rtgui/include/rtgui/widgets/radiobox.h +++ b/rtgui/include/rtgui/widgets/radiobox.h @@ -31,7 +31,7 @@ typedef struct rtgui_radiobox rtgui_radiobox_t; rtgui_type_t *rtgui_radiobox_type_get(void); -struct rtgui_radiobox* rtgui_radiobox_create(int orient, char** radio_items, int number); +struct rtgui_radiobox* rtgui_radiobox_create(const char* label, int orient, char** radio_items, int number); void rtgui_radiobox_destroy(struct rtgui_radiobox* radiobox); void rtgui_radiobox_set_selection(struct rtgui_radiobox* radiobox, int selection); diff --git a/rtgui/server/topwin.c b/rtgui/server/topwin.c index af6b0971b9..f987880132 100644 --- a/rtgui/server/topwin.c +++ b/rtgui/server/topwin.c @@ -975,7 +975,6 @@ void rtgui_topwin_append_monitor_rect(struct rtgui_win* wid, rtgui_rect_t* rect) rtgui_mouse_monitor_append(&(win->monitor_list), rect); } -#ifdef RTGUI_USING_SMALL_SIZE void rtgui_topwin_remove_monitor_rect(struct rtgui_win* wid, rtgui_rect_t* rect) { struct rtgui_topwin* win; @@ -993,8 +992,8 @@ void rtgui_topwin_remove_monitor_rect(struct rtgui_win* wid, rtgui_rect_t* rect) /* remove rect from top window monitor rect list */ rtgui_mouse_monitor_remove(&(win->monitor_list), rect); } -#endif +#ifdef RTGUI_USING_SMALL_SIZE /** * get clip information for topwin * wid, the self window id. If wid = NULL, get whole topwin clip information. @@ -1025,6 +1024,7 @@ void rtgui_topwin_get_clipinfo(struct rtgui_rect* rect_list, rt_int32_t count) } rt_sem_release(&_rtgui_topwin_lock); } +#endif #ifdef RT_USING_FINSH #include diff --git a/rtgui/widgets/button.c b/rtgui/widgets/button.c index e7c84581cd..a68e0771e1 100644 --- a/rtgui/widgets/button.c +++ b/rtgui/widgets/button.c @@ -82,6 +82,33 @@ rt_bool_t rtgui_button_event_handler(struct rtgui_widget* widget, struct rtgui_e rtgui_theme_draw_button(btn); break; + case RTGUI_EVENT_KBD: + { + struct rtgui_event_kbd* ekbd = (struct rtgui_event_kbd*) event; + + if ((ekbd->key == RTGUIK_RETURN) || (ekbd->key == RTGUIK_SPACE)) + { + if (RTGUI_KBD_IS_DOWN(ekbd)) + { + btn->flag |= RTGUI_BUTTON_FLAG_PRESS; + } + else + { + btn->flag &= ~RTGUI_BUTTON_FLAG_PRESS; + } + + /* draw button */ + rtgui_theme_draw_button(btn); + + if ((btn->flag & RTGUI_BUTTON_FLAG_PRESS) && (btn->on_button != RT_NULL)) + { + /* call on button handler */ + btn->on_button(widget, event); + } + } + } + break; + case RTGUI_EVENT_MOUSE_BUTTON: { struct rtgui_event_mouse* emouse = (struct rtgui_event_mouse*)event; @@ -103,6 +130,12 @@ rt_bool_t rtgui_button_event_handler(struct rtgui_widget* widget, struct rtgui_e #endif rtgui_theme_draw_button(btn); + if (btn->on_button != RT_NULL) + { + /* call on button handler */ + btn->on_button(widget, event); + } + #ifndef RTGUI_USING_SMALL_SIZE /* invokes call back */ if (widget->on_mouseclick != RT_NULL && @@ -132,6 +165,12 @@ rt_bool_t rtgui_button_event_handler(struct rtgui_widget* widget, struct rtgui_e #endif rtgui_theme_draw_button(btn); + if (!(btn->flag & RTGUI_BUTTON_FLAG_PRESS) && (btn->on_button != RT_NULL)) + { + /* call on button handler */ + btn->on_button(widget, event); + } + #ifndef RTGUI_USING_SMALL_SIZE /* invokes call back */ if (widget->on_mouseclick != RT_NULL && @@ -198,3 +237,10 @@ void rtgui_button_set_unpressed_image(rtgui_button_t* btn, rtgui_image_t* image) btn->unpressed_image = image; } +void rtgui_button_set_onbutton(rtgui_button_t* btn, rtgui_onbutton_func_t func) +{ + RT_ASSERT(btn != RT_NULL); + + btn->on_button = func; +} + diff --git a/rtgui/widgets/radiobox.c b/rtgui/widgets/radiobox.c index d7178c4460..9b4e055c05 100644 --- a/rtgui/widgets/radiobox.c +++ b/rtgui/widgets/radiobox.c @@ -45,6 +45,9 @@ static void rtgui_radiobox_onmouse(struct rtgui_radiobox* radiobox, struct rtgui int bord_size; struct rtgui_rect rect; + /* focus widgets */ + rtgui_widget_focus(RTGUI_WIDGET(radiobox)); + /* get widget rect */ rtgui_widget_get_rect(RTGUI_WIDGET(radiobox), &rect); @@ -59,15 +62,18 @@ static void rtgui_radiobox_onmouse(struct rtgui_radiobox* radiobox, struct rtgui bord_size = rtgui_rect_height(bord_rect); } rtgui_rect_inflate(&rect, - bord_size); + if (rtgui_rect_contains_point(&rect, event->x, event->y) != RT_EOK) return; if (radiobox->orient == RTGUI_VERTICAL) { + int delta_y = event->y - rect.y1; + rtgui_radiobox_set_selection(radiobox, delta_y / radiobox->item_size); } else { + int delta_x = event->x - rect.x1; + rtgui_radiobox_set_selection(radiobox, delta_x / radiobox->item_size); } - - rtgui_widget_focus(RTGUI_WIDGET(radiobox)); } } @@ -100,16 +106,32 @@ rt_bool_t rtgui_radiobox_event_handler(struct rtgui_widget* widget, struct rtgui rtgui_widget_focus(RTGUI_WIDGET(radiobox)); if (!(RTGUI_KBD_IS_UP(e))) return RT_FALSE; - if (e->key == RTGUIK_UP) - { - if (radiobox->item_selection > 0) - rtgui_radiobox_set_selection(radiobox, radiobox->item_selection - 1); - } - else if (e->key == RTGUIK_DOWN) - { - if (radiobox->item_selection < radiobox->item_count - 1) - rtgui_radiobox_set_selection(radiobox, radiobox->item_selection + 1); - } + if (radiobox->orient == RTGUI_VERTICAL) + { + if (e->key == RTGUIK_UP) + { + if (radiobox->item_selection > 0) + rtgui_radiobox_set_selection(radiobox, radiobox->item_selection - 1); + } + else if (e->key == RTGUIK_DOWN) + { + if (radiobox->item_selection < radiobox->item_count - 1) + rtgui_radiobox_set_selection(radiobox, radiobox->item_selection + 1); + } + } + else + { + if (e->key == RTGUIK_LEFT) + { + if (radiobox->item_selection > 0) + rtgui_radiobox_set_selection(radiobox, radiobox->item_selection - 1); + } + else if (e->key == RTGUIK_RIGHT) + { + if (radiobox->item_selection < radiobox->item_count - 1) + rtgui_radiobox_set_selection(radiobox, radiobox->item_selection + 1); + } + } } break; @@ -127,25 +149,29 @@ rt_bool_t rtgui_radiobox_event_handler(struct rtgui_widget* widget, struct rtgui return RT_FALSE; } -struct rtgui_radiobox* rtgui_radiobox_create(int orient, char** radio_items, int number) +struct rtgui_radiobox* rtgui_radiobox_create(const char* label, int orient, char** radio_items, int number) { struct rtgui_radiobox* radiobox; radiobox = (struct rtgui_radiobox*) rtgui_widget_create (RTGUI_RADIOBOX_TYPE); if (radiobox != RT_NULL) { + rt_uint8_t board_size; + struct rtgui_rect rect; + radiobox->items = radio_items; radiobox->item_count = number; radiobox->item_selection = -1; + radiobox->text = rt_strdup(label); /* set proper of control */ rtgui_radiobox_set_orientation(radiobox, orient); + rtgui_font_get_metrics(RTGUI_WIDGET_FONT(RTGUI_WIDGET(radiobox)), "H", &rect); + board_size = rtgui_rect_height(rect); + if (orient == RTGUI_VERTICAL) { - struct rtgui_rect rect; - rtgui_font_get_metrics(RTGUI_WIDGET_FONT(RTGUI_WIDGET(radiobox)), "H", &rect); - - radiobox->item_size = rtgui_rect_height(rect); + radiobox->item_size = board_size; } else { @@ -161,7 +187,7 @@ struct rtgui_radiobox* rtgui_radiobox_create(int orient, char** radio_items, int { rtgui_font_get_metrics(font, radio_items[index], &rect); if (rtgui_rect_width(rect) > radiobox->item_size) - radiobox->item_size = rtgui_rect_width(rect); + radiobox->item_size = board_size + 3 + rtgui_rect_width(rect); } } } diff --git a/rtgui/widgets/toplevel.c b/rtgui/widgets/toplevel.c index 96285e6005..cd4144b4c9 100644 --- a/rtgui/widgets/toplevel.c +++ b/rtgui/widgets/toplevel.c @@ -136,9 +136,13 @@ void rtgui_toplevel_handle_clip(struct rtgui_toplevel* top, info->num_rect); top->external_clip_size = info->num_rect; -#ifdef RTGUI_USING_SMALL_SIZE - /* get rect list from topwin list */ - rtgui_topwin_get_clipinfo(top->external_clip_rect, top->external_clip_size); +#ifdef RTGUI_USING_SMALL_SIZE + { + extern void rtgui_topwin_get_clipinfo(struct rtgui_rect* list, rt_int32_t count); + + /* get rect list from topwin list */ + rtgui_topwin_get_clipinfo(top->external_clip_rect, top->external_clip_size); + } #else /* copy rect array */ rt_memcpy(top->external_clip_rect, (void*)(info + 1), sizeof(rtgui_rect_t) * info->num_rect); -- GitLab