diff options
| author | [email protected] <[email protected]> | 2012-07-21 12:18:51 +0000 |
|---|---|---|
| committer | [email protected] <[email protected]> | 2012-07-21 12:18:51 +0000 |
| commit | f2503a770fdacdc01a68bfa638e9b40a7121644d (patch) | |
| tree | 528c7b0e4f26e586ea5aba2f5f7c0dae7bd30d63 /components/rtgui/widgets | |
| parent | 8c0310450783ed9028221168e60551554fbee8d2 (diff) | |
sync with github 5892d5b7
Add update_toplevel event. As always, full log is in GitHub.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@2224 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'components/rtgui/widgets')
| -rw-r--r-- | components/rtgui/widgets/container.c | 56 | ||||
| -rw-r--r-- | components/rtgui/widgets/notebook.c | 30 | ||||
| -rw-r--r-- | components/rtgui/widgets/widget.c | 25 |
3 files changed, 77 insertions, 34 deletions
diff --git a/components/rtgui/widgets/container.c b/components/rtgui/widgets/container.c index f5c954ddcf..7cfe455f54 100644 --- a/components/rtgui/widgets/container.c +++ b/components/rtgui/widgets/container.c @@ -38,26 +38,6 @@ static void _rtgui_container_destructor(rtgui_container_t *container) rtgui_object_destroy(RTGUI_OBJECT(container->layout_box)); } -static void _rtgui_container_update_toplevel(rtgui_container_t* container) -{ - struct rtgui_win *window; - struct rtgui_list_node* node; - - window = rtgui_widget_get_toplevel(RTGUI_WIDGET(container)); - - rtgui_list_foreach(node, &(container->children)) - { - rtgui_widget_t* child = rtgui_list_entry(node, rtgui_widget_t, sibling); - /* set child toplevel */ - child->toplevel = window; - - if (RTGUI_IS_CONTAINER(child)) - { - _rtgui_container_update_toplevel(RTGUI_CONTAINER(child)); - } - } -} - DEFINE_CLASS_TYPE(container, "container", RTGUI_WIDGET_TYPE, _rtgui_container_constructor, @@ -82,6 +62,24 @@ rt_bool_t rtgui_container_dispatch_event(rtgui_container_t *container, rtgui_eve return RT_FALSE; } +/* broadcast means that the return value of event handlers will be ignored. The + * events will always reach every child.*/ +rt_bool_t rtgui_container_broadcast_event(struct rtgui_container *container, struct rtgui_event *event) +{ + struct rtgui_list_node* node; + + rtgui_list_foreach(node, &(container->children)) + { + struct rtgui_widget* w; + w = rtgui_list_entry(node, struct rtgui_widget, sibling); + + if (RTGUI_OBJECT(w)->event_handler) + RTGUI_OBJECT(w)->event_handler(RTGUI_OBJECT(w), event) == RT_TRUE; + } + + return RT_FALSE; +} + rt_bool_t rtgui_container_dispatch_mouse_event(rtgui_container_t *container, struct rtgui_event_mouse* event) { /* handle in child widget */ @@ -164,6 +162,13 @@ rt_bool_t rtgui_container_event_handler(struct rtgui_object* object, struct rtgu rtgui_container_dispatch_event(container, event); break; + case RTGUI_EVENT_UPDATE_TOPLVL: + /* call parent handler */ + rtgui_widget_onupdate_toplvl(object, event); + /* update the children */ + rtgui_container_broadcast_event(container, event); + break; + default: /* call parent widget event handler */ return rtgui_widget_event_handler(RTGUI_OBJECT(widget), event); @@ -205,13 +210,10 @@ void rtgui_container_add_child(rtgui_container_t *container, rtgui_widget_t* chi if (RTGUI_WIDGET(container)->toplevel != RT_NULL && RTGUI_IS_TOPLEVEL(RTGUI_WIDGET(container)->toplevel)) { - child->toplevel = rtgui_widget_get_toplevel(RTGUI_WIDGET(container)); - - /* update all child toplevel */ - if (RTGUI_IS_CONTAINER(child)) - { - _rtgui_container_update_toplevel(RTGUI_CONTAINER(child)); - } + struct rtgui_event_update_toplvl eup; + RTGUI_EVENT_UPDATE_TOPLVL_INIT(&eup); + eup.toplvl = RTGUI_WIDGET(container)->toplevel; + rtgui_container_broadcast_event(container, (struct rtgui_event*)&eup); } } diff --git a/components/rtgui/widgets/notebook.c b/components/rtgui/widgets/notebook.c index 6b6f9ec49f..1192fd6e70 100644 --- a/components/rtgui/widgets/notebook.c +++ b/components/rtgui/widgets/notebook.c @@ -2,6 +2,7 @@ #include <rtgui/rtgui.h> #include <rtgui/rtgui_system.h> #include <rtgui/widgets/notebook.h> +#include <rtgui/widgets/window.h> #define RTGUI_NOTEBOOK_TAB_WIDTH 80 @@ -215,6 +216,16 @@ void rtgui_notebook_add(struct rtgui_notebook* notebook, const char* label, stru if (notebook->count - 1 != notebook->current) rtgui_widget_hide(child); + + if (RTGUI_WIDGET(notebook)->toplevel != RT_NULL && + RTGUI_IS_TOPLEVEL(RTGUI_WIDGET(notebook)->toplevel)) + { + struct rtgui_event_update_toplvl eup; + RTGUI_EVENT_UPDATE_TOPLVL_INIT(&eup); + eup.toplvl = RTGUI_WIDGET(notebook)->toplevel; + if (RTGUI_OBJECT(child)->event_handler) + RTGUI_OBJECT(child)->event_handler(RTGUI_OBJECT(child), (struct rtgui_event*)&eup); + } } void rtgui_notebook_remove(struct rtgui_notebook* notebook, rt_uint16_t index) @@ -333,6 +344,19 @@ static rt_bool_t _rtgui_notebook_current_widget_handle(struct rtgui_notebook *no return RT_FALSE; } +static void _rtgui_notebook_all_widget_handle(struct rtgui_notebook *notebook, + struct rtgui_event *event) +{ + struct rtgui_object *object; + int i; + for (i = 0; i < notebook->count; i++) + { + object = RTGUI_OBJECT(notebook->childs[i].widget); + if (object->event_handler) + object->event_handler(object, event); + } +} + rt_bool_t rtgui_notebook_event_handler(struct rtgui_object* object, struct rtgui_event* event) { struct rtgui_notebook* notebook; @@ -362,6 +386,12 @@ rt_bool_t rtgui_notebook_event_handler(struct rtgui_object* object, struct rtgui return _rtgui_notebook_current_widget_handle(notebook, event); case RTGUI_EVENT_KBD: return _rtgui_notebook_current_widget_handle(notebook, event); + case RTGUI_EVENT_UPDATE_TOPLVL: + /* update myself */ + rtgui_widget_onupdate_toplvl(object, event); + /* update all the widgets in myself */ + _rtgui_notebook_all_widget_handle(notebook, event); + return RT_FALSE; default: /* use parent event handler */ return rtgui_widget_event_handler(object, event); diff --git a/components/rtgui/widgets/widget.c b/components/rtgui/widgets/widget.c index dbdd644ce2..97ff00fea9 100644 --- a/components/rtgui/widgets/widget.c +++ b/components/rtgui/widgets/widget.c @@ -145,13 +145,6 @@ void rtgui_widget_set_parent(rtgui_widget_t* widget, rtgui_widget_t* parent) { /* set parent and toplevel widget */ widget->parent = parent; - - /* update children toplevel */ - if (parent->toplevel != RT_NULL && - RTGUI_IS_TOPLEVEL(parent->toplevel)) - { - widget->toplevel = rtgui_widget_get_toplevel(parent); - } } void rtgui_widget_get_extent(rtgui_widget_t* widget, rtgui_rect_t *rect) @@ -402,6 +395,22 @@ struct rtgui_win* rtgui_widget_get_toplevel(rtgui_widget_t* widget) return RTGUI_WIN(r); } +rt_bool_t rtgui_widget_onupdate_toplvl(struct rtgui_object *object, struct rtgui_event *event) +{ + struct rtgui_widget *widget; + struct rtgui_event_update_toplvl *eup; + + RT_ASSERT(object); + RT_ASSERT(event); + + widget = RTGUI_WIDGET(object); + eup = (struct rtgui_event_update_toplvl*)event; + + widget->toplevel = eup->toplvl; + + return RT_FALSE; +} + rt_bool_t rtgui_widget_event_handler(struct rtgui_object* object, rtgui_event_t* event) { RT_ASSERT(object != RT_NULL); @@ -413,6 +422,8 @@ rt_bool_t rtgui_widget_event_handler(struct rtgui_object* object, rtgui_event_t* return rtgui_widget_onshow(object, event); case RTGUI_EVENT_HIDE: return rtgui_widget_onhide(object, event); + case RTGUI_EVENT_UPDATE_TOPLVL: + return rtgui_widget_onupdate_toplvl(object, event); #ifndef RTGUI_USING_SMALL_SIZE case RTGUI_EVENT_PAINT: if (widget->on_draw != RT_NULL) |
