fix view focus bug.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@840 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
parent
50eb24dfe7
commit
aa35bccfee
@ -188,6 +188,9 @@ rtgui_widget_t* rtgui_widget_get_next_sibling(rtgui_widget_t* widget);
|
|||||||
/* get the prev sibling of widget */
|
/* get the prev sibling of widget */
|
||||||
rtgui_widget_t* rtgui_widget_get_prev_sibling(rtgui_widget_t* widget);
|
rtgui_widget_t* rtgui_widget_get_prev_sibling(rtgui_widget_t* widget);
|
||||||
|
|
||||||
|
/* dump widget information */
|
||||||
|
void rtgui_widget_dump(rtgui_widget_t* widget);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -148,8 +148,13 @@ rtgui_modal_code_t rtgui_view_show(rtgui_view_t* view, rt_bool_t is_modal)
|
|||||||
|
|
||||||
workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(view)->parent);
|
workbench = RTGUI_WORKBENCH(RTGUI_WIDGET(view)->parent);
|
||||||
rtgui_workbench_show_view(workbench, view);
|
rtgui_workbench_show_view(workbench, view);
|
||||||
if (RTGUI_WIDGET_IS_FOCUSABLE(RTGUI_WIDGET(view)))
|
if (RTGUI_CONTAINER(view)->focused != RT_NULL)
|
||||||
rtgui_widget_focus(RTGUI_WIDGET(view));
|
rtgui_widget_focus(RTGUI_CONTAINER(view)->focused);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (RTGUI_WIDGET_IS_FOCUSABLE(RTGUI_WIDGET(view)))
|
||||||
|
rtgui_widget_focus(RTGUI_WIDGET(view));
|
||||||
|
}
|
||||||
|
|
||||||
view->modal_show = is_modal;
|
view->modal_show = is_modal;
|
||||||
if (is_modal == RT_TRUE)
|
if (is_modal == RT_TRUE)
|
||||||
|
@ -250,37 +250,31 @@ void rtgui_widget_set_oncommand(rtgui_widget_t* widget, rtgui_event_handler_ptr
|
|||||||
*/
|
*/
|
||||||
void rtgui_widget_focus(rtgui_widget_t *widget)
|
void rtgui_widget_focus(rtgui_widget_t *widget)
|
||||||
{
|
{
|
||||||
rtgui_widget_t *focused;
|
|
||||||
rtgui_container_t *parent;
|
rtgui_container_t *parent;
|
||||||
|
|
||||||
RT_ASSERT(widget != RT_NULL);
|
RT_ASSERT(widget != RT_NULL);
|
||||||
|
|
||||||
if (!widget->parent || !RTGUI_WIDGET_IS_FOCUSABLE(widget) || !RTGUI_WIDGET_IS_ENABLE(widget))
|
if (!widget->parent || !widget->toplevel) return;
|
||||||
|
if (!RTGUI_WIDGET_IS_FOCUSABLE(widget) || !RTGUI_WIDGET_IS_ENABLE(widget))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* set widget as focused */
|
/* set widget as focused */
|
||||||
widget->flag |= RTGUI_WIDGET_FLAG_FOCUS;
|
widget->flag |= RTGUI_WIDGET_FLAG_FOCUS;
|
||||||
|
|
||||||
/* get parent container */
|
/* get root parent container and old focused widget */
|
||||||
parent = RTGUI_CONTAINER(widget->parent);
|
parent = RTGUI_CONTAINER(widget->toplevel);
|
||||||
|
if (parent->focused == widget) return ; /* it's the same focused widget */
|
||||||
|
|
||||||
/* get old focused widget */
|
/* unfocused the old widget */
|
||||||
focused = parent->focused;
|
if (parent->focused != RT_NULL) rtgui_widget_unfocus(parent->focused);
|
||||||
if (focused == widget) return ; /* it's the same focused widget */
|
|
||||||
|
|
||||||
if (focused != RT_NULL)
|
|
||||||
rtgui_widget_unfocus(focused);
|
|
||||||
|
|
||||||
/* set widget as focused widget in parent link */
|
/* set widget as focused widget in parent link */
|
||||||
parent->focused = widget;
|
parent = RTGUI_CONTAINER(widget->parent);
|
||||||
while (RTGUI_WIDGET(parent)->parent != RT_NULL)
|
do
|
||||||
{
|
{
|
||||||
parent = RTGUI_CONTAINER(RTGUI_WIDGET(parent)->parent);
|
|
||||||
parent->focused = widget;
|
parent->focused = widget;
|
||||||
|
parent = RTGUI_CONTAINER(RTGUI_WIDGET(parent)->parent);
|
||||||
/* if the parent is hide, break it */
|
} while ((parent != RT_NULL) && !RTGUI_WIDGET_IS_HIDE(RTGUI_WIDGET(parent)));
|
||||||
if (RTGUI_WIDGET_IS_HIDE(RTGUI_WIDGET(parent))) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* invoke on focus in call back */
|
/* invoke on focus in call back */
|
||||||
if (widget->on_focus_in != RT_NULL)
|
if (widget->on_focus_in != RT_NULL)
|
||||||
@ -559,3 +553,26 @@ rtgui_widget_t* rtgui_widget_get_prev_sibling(rtgui_widget_t* widget)
|
|||||||
|
|
||||||
return sibling;
|
return sibling;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef RTGUI_WIDGET_DEBUG
|
||||||
|
#include <rtgui/widgets/label.h>
|
||||||
|
#include <rtgui/widgets/button.h>
|
||||||
|
void rtgui_widget_dump(rtgui_widget_t* widget)
|
||||||
|
{
|
||||||
|
struct rtgui_object *obj;
|
||||||
|
|
||||||
|
obj = RTGUI_OBJECT(widget);
|
||||||
|
rt_kprintf("widget type: %s ", obj->type->name);
|
||||||
|
|
||||||
|
if (RTGUI_IS_VIEW(widget) == RT_TRUE)
|
||||||
|
rt_kprintf(":%s ", RTGUI_VIEW(widget)->title);
|
||||||
|
if (RTGUI_IS_WIN(widget) == RT_TRUE)
|
||||||
|
rt_kprintf(":%s ", RTGUI_WIN(widget)->title);
|
||||||
|
if ((RTGUI_IS_LABEL(widget) == RT_TRUE) || (RTGUI_IS_BUTTON(widget) == RT_TRUE))
|
||||||
|
rt_kprintf(":%s ", RTGUI_LABEL(widget)->text);
|
||||||
|
|
||||||
|
rt_kprintf("extent(%d, %d) - (%d, %d)\n", widget->extent.x1,
|
||||||
|
widget->extent.y1, widget->extent.x2, widget->extent.y2);
|
||||||
|
// rtgui_region_dump(&(widget->clip));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user