fix button status issue, which caused by mouse released outside of button but button handled the mouse press event last time.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1547 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
bernard.xiong 2011-06-29 09:57:28 +00:00
parent 3f5782a322
commit a69172aa4e
5 changed files with 68 additions and 12 deletions

View File

@ -24,6 +24,9 @@ DECLARE_CLASS_TYPE(toplevel);
/** Checks if the object is an rtgui_toplevel */
#define RTGUI_IS_TOPLEVEL(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_TOPLEVEL_TYPE))
/* last mouse event handled widget */
#define RTGUI_TOPLEVEL_LAST_MEVENT_WIDGET(obj) (RTGUI_TOPLEVEL(obj)->last_mevent_widget)
struct rtgui_toplevel
{
/* inherit from container */
@ -38,6 +41,9 @@ struct rtgui_toplevel
/* server thread id */
rt_thread_t server;
/* last mouse event handled widget */
rtgui_widget_t* last_mevent_widget;
};
typedef struct rtgui_toplevel rtgui_toplevel_t;

View File

@ -12,8 +12,9 @@
* 2009-10-16 Bernard first version
*/
#include <rtgui/dc.h>
#include <rtgui/widgets/button.h>
#include <rtgui/rtgui_theme.h>
#include <rtgui/widgets/button.h>
#include <rtgui/widgets/toplevel.h>
static void _rtgui_button_constructor(rtgui_button_t *button)
{
@ -102,6 +103,17 @@ rt_bool_t rtgui_button_event_handler(struct rtgui_widget* widget, struct rtgui_e
{
struct rtgui_event_mouse* emouse = (struct rtgui_event_mouse*)event;
/* it's not this widget event, clean status */
if (rtgui_rect_contains_point(&(RTGUI_WIDGET(btn)->extent),
emouse->x, emouse->y) != RT_EOK)
{
btn->flag &= ~RTGUI_BUTTON_FLAG_PRESS;
/* draw button */
rtgui_theme_draw_button(btn);
break;
}
if (btn->flag & RTGUI_BUTTON_TYPE_PUSH)
{
/* it's a push button */
@ -117,11 +129,7 @@ rt_bool_t rtgui_button_event_handler(struct rtgui_widget* widget, struct rtgui_e
}
/* draw button */
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_draw != RT_NULL ) widget->on_draw(widget, event);
else
#endif
rtgui_theme_draw_button(btn);
rtgui_theme_draw_button(btn);
if (btn->on_button != RT_NULL)
{
@ -141,6 +149,12 @@ rt_bool_t rtgui_button_event_handler(struct rtgui_widget* widget, struct rtgui_e
{
if (emouse->button & RTGUI_MOUSE_BUTTON_LEFT)
{
/* set the last mouse event handled widget */
rtgui_toplevel_t* toplevel;
toplevel = RTGUI_TOPLEVEL(RTGUI_WIDGET(btn)->toplevel);
toplevel->last_mevent_widget = RTGUI_WIDGET(btn);
/* it's a normal button */
if (emouse->button & RTGUI_MOUSE_BUTTON_DOWN)
{
@ -152,11 +166,7 @@ rt_bool_t rtgui_button_event_handler(struct rtgui_widget* widget, struct rtgui_e
}
/* draw button */
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_draw != RT_NULL ) widget->on_draw(widget, event);
else
#endif
rtgui_theme_draw_button(btn);
rtgui_theme_draw_button(btn);
#ifndef RTGUI_USING_SMALL_SIZE
/* invokes call back */

View File

@ -13,7 +13,7 @@
*/
#include <rtgui/rtgui_system.h>
#include <rtgui/widgets/toplevel.h>
extern void rtgui_topwin_do_clip(rtgui_widget_t* widget);
extern void rtgui_topwin_do_clip(rtgui_widget_t* widget);
static void _rtgui_toplevel_constructor(rtgui_toplevel_t *toplevel)
{
@ -31,6 +31,8 @@ static void _rtgui_toplevel_constructor(rtgui_toplevel_t *toplevel)
/* set server as RT_NULL (no connected) */
toplevel->server = RT_NULL;
/* initialize last mouse event handled widget */
toplevel->last_mevent_widget = RT_NULL;
}
static void _rtgui_toplevel_destructor(rtgui_toplevel_t* toplevel)

View File

@ -459,6 +459,25 @@ rt_bool_t rtgui_win_event_handler(struct rtgui_widget* widget, struct rtgui_even
break;
case RTGUI_EVENT_MOUSE_BUTTON:
/* check whether has widget which handled mouse event before */
if (RTGUI_TOPLEVEL_LAST_MEVENT_WIDGET(win) != RT_NULL)
{
struct rtgui_event_mouse* emouse;
emouse = (struct rtgui_event_mouse*)event;
RTGUI_TOPLEVEL_LAST_MEVENT_WIDGET(win)->event_handler(RTGUI_TOPLEVEL_LAST_MEVENT_WIDGET(win), event);
if (rtgui_rect_contains_point(&(RTGUI_TOPLEVEL_LAST_MEVENT_WIDGET(win)->extent),
emouse->x, emouse->y) == RT_EOK)
{
RTGUI_TOPLEVEL_LAST_MEVENT_WIDGET(win) = RT_NULL;
break; /* mouse event is inside of widget, do not handle it anymore */
}
/* clean last mouse event handled widget */
RTGUI_TOPLEVEL_LAST_MEVENT_WIDGET(win) = RT_NULL;
}
if (win->style & RTGUI_WIN_STYLE_UNDER_MODAL)
{
if (win->modal_widget != RT_NULL)

View File

@ -321,6 +321,25 @@ rt_bool_t rtgui_workbench_event_handler(rtgui_widget_t* widget, rtgui_event_t* e
struct rtgui_event_mouse* emouse = (struct rtgui_event_mouse*)event;
struct rtgui_toplevel* top = RTGUI_TOPLEVEL(emouse->wid);
/* check whether has widget which handled mouse event before */
if (RTGUI_TOPLEVEL_LAST_MEVENT_WIDGET(workbench) != RT_NULL)
{
struct rtgui_event_mouse* emouse;
emouse = (struct rtgui_event_mouse*)event;
RTGUI_TOPLEVEL_LAST_MEVENT_WIDGET(workbench)->event_handler(RTGUI_TOPLEVEL_LAST_MEVENT_WIDGET(workbench), event);
if (rtgui_rect_contains_point(&(RTGUI_TOPLEVEL_LAST_MEVENT_WIDGET(workbench)->extent),
emouse->x, emouse->y) == RT_EOK)
{
RTGUI_TOPLEVEL_LAST_MEVENT_WIDGET(workbench) = RT_NULL;
break; /* mouse event is inside of widget, do not handle it anymore */
}
/* clean last mouse event handled widget */
RTGUI_TOPLEVEL_LAST_MEVENT_WIDGET(workbench) = RT_NULL;
}
/* check the destination window */
if (top != RT_NULL && RTGUI_WIDGET(top)->event_handler != RT_NULL)
{