add more optimization options, remove caret implementation.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@278 bbd45198-f89e-11dd-88c7-29a3b14d5316
This commit is contained in:
bernard.xiong 2010-01-04 00:05:01 +00:00
parent 238b6b89ea
commit 5950b02b04
16 changed files with 133 additions and 308 deletions

View File

@ -9,7 +9,6 @@ common/rtgui_theme.c
common/asc12font.c
common/asc16font.c
common/color.c
common/caret.c
common/dc.c
common/dc_buffer.c
common/dc_hw.c
@ -47,7 +46,6 @@ widgets/window.c
widgets/workbench.c
""")
# The set of source files associated with this SConscript file.
src_local = common_src + server_src + widgets_src

View File

@ -1,214 +0,0 @@
/*
* File : caret.c
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2009-10-16 Bernard first version
*/
#include <rtgui/dc.h>
#include <rtgui/caret.h>
#include <rtgui/rtgui_system.h>
#define RTGUI_CARET_WIDTH 2
#ifdef __WIN32__
#define RTGUI_CARET_BLINK 300
#else
#define RTGUI_CARET_BLINK 30
#endif
static void rtgui_caret_blink(struct rtgui_timer* timer, void* parameter)
{
struct rtgui_caret* caret;
rtgui_widget_t* widget;
caret = (struct rtgui_caret*)parameter;
RT_ASSERT(caret != RT_NULL);
if (caret->owner == RT_NULL) return;
/* caret's owner is visible? */
widget = caret->owner;
do
{
if (RTGUI_WIDGET_IS_HIDE(widget) == RT_TRUE) return;
widget = widget->parent;
} while (widget != RT_NULL);
if (caret->is_show == RT_TRUE)
{
/* set to false */
caret->is_show = RT_FALSE;
/* update owner widget */
if (caret->owner != RT_NULL)
{
rtgui_widget_update(caret->owner);
}
}
else
{
/* set to true */
caret->is_show = RT_TRUE;
/* draw caret */
rtgui_caret_draw(caret);
}
}
struct rtgui_caret* rtgui_caret_create(struct rtgui_widget* owner)
{
struct rtgui_caret* caret;
RT_ASSERT(owner != RT_NULL);
caret = (struct rtgui_caret*)rtgui_malloc(sizeof(struct rtgui_caret));
if (caret != RT_NULL)
{
caret->is_show = RT_FALSE;
caret->extent.x1 = 0;
caret->extent.y1 = 0;
caret->extent.x2 = RTGUI_CARET_WIDTH;
caret->extent.y2 = owner->gc.font->height;
caret->owner = owner;
caret->dc = (struct rtgui_dc*)rtgui_dc_buffer_create(RTGUI_CARET_WIDTH, caret->extent.y2);
if (caret->dc == RT_NULL) goto __exit;
rtgui_dc_set_color(caret->dc, black);
rtgui_dc_fill_rect(caret->dc, &(caret->extent));
caret->timer_period = RTGUI_CARET_BLINK;
caret->timer = rtgui_timer_create(caret->timer_period,
RT_TIMER_FLAG_PERIODIC,
rtgui_caret_blink, caret);
if (caret->timer == RT_NULL) goto __exit_dc;
caret->show_point.x = 0;
caret->show_point.y = 0;
}
return caret;
__exit_dc:
rtgui_dc_destory(caret->dc);
__exit:
rtgui_free(caret);
return RT_NULL;
}
void rtgui_caret_destroy(struct rtgui_caret* caret)
{
RT_ASSERT(caret != RT_NULL);
if (caret->is_show == RT_TRUE)
{
/* stop timer */
rtgui_timer_stop(caret->timer);
}
caret->owner = RT_NULL;
rtgui_dc_destory(caret->dc);
rtgui_timer_destory(caret->timer);
rtgui_free(caret);
}
/* show caret on owner widget logic position */
void rtgui_caret_show(struct rtgui_caret* caret, rt_base_t x, rt_base_t y)
{
if (caret->is_show == RT_TRUE)
{
/* set show flag and stop blink timer */
caret->is_show = RT_FALSE;
rtgui_timer_stop(caret->timer);
}
/* set show x and y */
caret->show_point.x = x;
caret->show_point.y = y;
/* set show flag and start blink timer */
caret->is_show = RT_TRUE;
/* draw caret */
rtgui_caret_draw(caret);
/* start blink timer */
rtgui_timer_start(caret->timer);
}
void rtgui_caret_hide(struct rtgui_caret* caret)
{
RT_ASSERT(caret != RT_NULL);
/* set show flag and stop blink timer */
caret->is_show = RT_FALSE;
rtgui_timer_stop(caret->timer);
/* update owner widget */
if (caret->owner != RT_NULL)
{
rtgui_widget_update(caret->owner);
}
}
void rtgui_caret_set_point(struct rtgui_caret* caret, int x, int y)
{
RT_ASSERT(caret != RT_NULL);
if (caret->is_show == RT_TRUE)
{
/* stop the old caret */
rtgui_timer_stop(caret->timer);
/* update owner widget */
if (caret->owner != RT_NULL && caret->is_show)
{
rtgui_widget_update(caret->owner);
}
}
caret->show_point.x = x;
caret->show_point.y = y;
/* draw caret */
rtgui_caret_draw(caret);
/* start blink timer */
rtgui_timer_start(caret->timer);
}
void rtgui_caret_set_box(struct rtgui_caret* caret, int w, int h)
{
RT_ASSERT(caret != RT_NULL);
caret->extent.x2 = caret->extent.x1 + w;
caret->extent.y2 = caret->extent.y1 + h;
}
void rtgui_caret_draw(struct rtgui_caret* caret)
{
RT_ASSERT(caret != RT_NULL);
if (caret->is_show == RT_TRUE && caret->owner->toplevel != RT_NULL)
{
struct rtgui_rect rect = caret->extent;
struct rtgui_point point = {0, 0};
struct rtgui_dc* hw_dc;
rtgui_rect_moveto(&rect, caret->show_point.x, caret->show_point.y);
hw_dc = rtgui_dc_begin_drawing(caret->owner);
rtgui_dc_blit(caret->dc, &point, hw_dc, &rect);
rtgui_dc_end_drawing(hw_dc);
}
}

View File

@ -16,6 +16,7 @@
#include <rtgui/color.h>
#include <rtgui/rtgui_system.h>
#ifndef RTGUI_USING_SMALL_SIZE
struct rtgui_dc_buffer
{
struct rtgui_dc parent;
@ -390,3 +391,5 @@ static void rtgui_dc_buffer_get_rect(struct rtgui_dc* self, rtgui_rect_t* rect)
rect->x2 = dc->width;
rect->y2 = dc->height;
}
#endif

View File

@ -1,53 +0,0 @@
/*
* File : caret.h
* This file is part of RT-Thread RTOS
* COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rt-thread.org/license/LICENSE
*
* Change Logs:
* Date Author Notes
* 2009-10-16 Bernard first version
*/
#ifndef __RTGUI_CARET_H__
#define __RTGUI_CARET_H__
#include <rtgui/dc.h>
#include <rtgui/rtgui_system.h>
#include <rtgui/widgets/widget.h>
struct rtgui_caret
{
/* show flag */
rt_bool_t is_show;
/* the show point of caret */
struct rtgui_point show_point;
/* widget owner */
struct rtgui_widget* owner;
/* caret buffer dc */
struct rtgui_dc *dc;
/* caret extent */
struct rtgui_rect extent;
/* the blink timer */
struct rtgui_timer* timer;
rt_int32_t timer_period;
};
typedef struct rtgui_caret rtgui_caret_t;
struct rtgui_caret* rtgui_caret_create(struct rtgui_widget* owner);
void rtgui_caret_destroy(struct rtgui_caret* caret);
void rtgui_caret_show(struct rtgui_caret* caret, rt_base_t x, rt_base_t y);
void rtgui_caret_hide(struct rtgui_caret* caret);
void rtgui_caret_draw(struct rtgui_caret* caret);
void rtgui_caret_set_point(struct rtgui_caret* caret, int x, int y);
void rtgui_caret_set_box(struct rtgui_caret* caret, int w, int h);
#endif

View File

@ -36,6 +36,8 @@
#define RTGUI_USING_HZ_FILE
#endif
#define RTGUI_USING_SMALL_SIZE
#define RTGUI_SVR_THREAD_PRIORITY 15
#define RTGUI_SVR_THREAD_TIMESLICE 5
#define RTGUI_SVR_THREAD_STACK_SIZE 2048

View File

@ -52,8 +52,7 @@ struct rtgui_textbox
rt_uint8_t* text;
rt_size_t font_width;
int caret_x, caret_y;
struct rtgui_caret* caret;
struct rtgui_timer* caret_timer;
/* widget private data */
rt_bool_t (*on_enter) (struct rtgui_widget* widget, struct rtgui_event* event);

View File

@ -96,24 +96,30 @@ struct rtgui_widget
/* the widget extent */
rtgui_rect_t extent;
#ifndef RTGUI_USING_SMALL_SIZE
rt_int16_t mini_width, mini_height;
rt_int16_t margin, margin_style;
#endif
/* the rect clip */
rtgui_region_t clip;
#ifndef RTGUI_USING_SMALL_SIZE
rt_uint32_t clip_sync;
#endif
/* the event handler */
rt_bool_t (*event_handler) (struct rtgui_widget* widget, struct rtgui_event* event);
/* call back */
rt_bool_t (*on_draw) (struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t (*on_focus_in) (struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t (*on_focus_out) (struct rtgui_widget* widget, struct rtgui_event* event);
#ifndef RTGUI_USING_SMALL_SIZE
rt_bool_t (*on_draw) (struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t (*on_mouseclick) (struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t (*on_key) (struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t (*on_size) (struct rtgui_widget* widget, struct rtgui_event* event);
rt_bool_t (*on_command) (struct rtgui_widget* widget, struct rtgui_event* event);
#endif
};
typedef struct rtgui_widget rtgui_widget_t;
@ -147,20 +153,24 @@ void rtgui_widget_focus(rtgui_widget_t * widget);
void rtgui_widget_unfocus(rtgui_widget_t *widget);
/* event handler for each command */
void rtgui_widget_set_ondraw(rtgui_widget_t* widget, rtgui_event_handler_ptr handler);
void rtgui_widget_set_onfocus(rtgui_widget_t* widget, rtgui_event_handler_ptr handler);
void rtgui_widget_set_onunfocus(rtgui_widget_t* widget, rtgui_event_handler_ptr handler);
#ifndef RTGUI_USING_SMALL_SIZE
void rtgui_widget_set_ondraw(rtgui_widget_t* widget, rtgui_event_handler_ptr handler);
void rtgui_widget_set_onmouseclick(rtgui_widget_t* widget, rtgui_event_handler_ptr handler);
void rtgui_widget_set_onkey(rtgui_widget_t* widget, rtgui_event_handler_ptr handler);
void rtgui_widget_set_onsize(rtgui_widget_t* widget, rtgui_event_handler_ptr handler);
void rtgui_widget_set_oncommand(rtgui_widget_t* widget, rtgui_event_handler_ptr handler);
#endif
/* get and set rect of widget */
void rtgui_widget_get_rect(rtgui_widget_t* widget, rtgui_rect_t *rect);
void rtgui_widget_set_rect(rtgui_widget_t* widget, rtgui_rect_t* rect);
#ifndef RTGUI_USING_SMALL_SIZE
void rtgui_widget_set_miniwidth(rtgui_widget_t* widget, int width);
void rtgui_widget_set_miniheight(rtgui_widget_t* widget, int height);
#endif
/* get the physical position of a logic point on widget */
void rtgui_widget_point_to_device(rtgui_widget_t * widget, rtgui_point_t * point);

View File

@ -14,6 +14,7 @@
#include <rtgui/dc.h>
#include <rtgui/widgets/box.h>
#ifndef RTGUI_USING_SMALL_SIZE
static void _rtgui_box_constructor(rtgui_box_t *box)
{
/* init widget and set event handler */
@ -338,3 +339,5 @@ rt_uint32_t rtgui_box_get_height(rtgui_box_t* box)
return height;
}
#endif

View File

@ -75,8 +75,11 @@ rt_bool_t rtgui_button_event_handler(struct rtgui_widget* widget, struct rtgui_e
switch (event->type)
{
case RTGUI_EVENT_PAINT:
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_draw != RT_NULL ) widget->on_draw(widget, event);
else rtgui_theme_draw_button(btn);
else
#endif
rtgui_theme_draw_button(btn);
break;
case RTGUI_EVENT_MOUSE_BUTTON:
@ -94,13 +97,18 @@ rt_bool_t rtgui_button_event_handler(struct rtgui_widget* widget, struct rtgui_e
btn->flag |= RTGUI_BUTTON_FLAG_PRESS;
/* draw button */
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_draw != RT_NULL ) widget->on_draw(widget, event);
else rtgui_theme_draw_button(btn);
else
#endif
rtgui_theme_draw_button(btn);
#ifndef RTGUI_USING_SMALL_SIZE
/* invokes call back */
if (widget->on_mouseclick != RT_NULL &&
emouse->button & RTGUI_MOUSE_BUTTON_UP)
return widget->on_mouseclick(widget, event);
#endif
}
}
else
@ -118,13 +126,18 @@ 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 rtgui_theme_draw_button(btn);
else
#endif
rtgui_theme_draw_button(btn);
#ifndef RTGUI_USING_SMALL_SIZE
/* invokes call back */
if (widget->on_mouseclick != RT_NULL &&
emouse->button & RTGUI_MOUSE_BUTTON_UP)
return widget->on_mouseclick(widget, event);
#endif
}
}

View File

@ -105,20 +105,24 @@ rt_bool_t rtgui_container_event_handler(rtgui_widget_t* widget, rtgui_event_t* e
switch (event->type)
{
case RTGUI_EVENT_PAINT:
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_draw != RT_NULL)
{
return widget->on_draw(widget, event);
}
#endif
rtgui_container_dispatch_event(container, event);
break;
case RTGUI_EVENT_KBD:
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_key != RT_NULL)
{
return widget->on_key(widget, event);
}
else
#endif
{
/* let parent to handle keyboard event */
if (widget->parent != RT_NULL && widget->parent != widget->toplevel)
@ -133,11 +137,13 @@ rt_bool_t rtgui_container_event_handler(rtgui_widget_t* widget, rtgui_event_t* e
if (rtgui_container_dispatch_mouse_event(container,
(struct rtgui_event_mouse*)event) == RT_FALSE)
{
#ifndef RTGUI_USING_SMALL_SIZE
/* handle event in current widget */
if (widget->on_mouseclick != RT_NULL)
{
return widget->on_mouseclick(widget, event);
}
#endif
}
else return RT_TRUE;
break;
@ -146,7 +152,7 @@ rt_bool_t rtgui_container_event_handler(rtgui_widget_t* widget, rtgui_event_t* e
if (rtgui_container_dispatch_mouse_event(container,
(struct rtgui_event_mouse*)event) == RT_FALSE)
{
#if 0
#ifndef RTGUI_USING_SMALL_SIZE
/* handle event in current widget */
if (widget->on_mousemotion != RT_NULL)
{
@ -160,10 +166,12 @@ rt_bool_t rtgui_container_event_handler(rtgui_widget_t* widget, rtgui_event_t* e
case RTGUI_EVENT_COMMAND:
if (rtgui_container_dispatch_event(container, event) == RT_FALSE)
{
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_command != RT_NULL)
{
return widget->on_command(widget, event);
}
#endif
}
else return RT_TRUE;
break;
@ -171,8 +179,10 @@ rt_bool_t rtgui_container_event_handler(rtgui_widget_t* widget, rtgui_event_t* e
case RTGUI_EVENT_RESIZE:
if (rtgui_container_dispatch_event(container, event) == RT_FALSE)
{
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_size != RT_NULL)
return widget->on_size(widget, event);
#endif
}
else return RT_TRUE;
break;

View File

@ -61,8 +61,10 @@ rt_bool_t rtgui_iconbox_event_handler(struct rtgui_widget* widget, struct rtgui_
switch (event->type)
{
case RTGUI_EVENT_PAINT:
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_draw != RT_NULL) widget->on_draw(widget, event);
else
#endif
{
rtgui_theme_draw_iconbox(iconbox);
}
@ -162,6 +164,8 @@ void rtgui_iconbox_set_text_position(struct rtgui_iconbox* iconbox, int position
}
}
#ifndef RTGUI_USING_SMALL_SIZE
rtgui_widget_set_miniwidth(RTGUI_WIDGET(iconbox), rect.x2);
rtgui_widget_set_miniheight(RTGUI_WIDGET(iconbox), rect.y2);
#endif
}

View File

@ -26,6 +26,15 @@ static void rtgui_textbox_onkey(struct rtgui_textbox* box, struct rtgui_event_kb
static rt_bool_t rtgui_textbox_onfocus(struct rtgui_widget* widget, struct rtgui_event* event);
static rt_bool_t rtgui_textbox_onunfocus(struct rtgui_widget* widget, struct rtgui_event* event);
static void _rtgui_textbox_caret_timeout(void *parameter)
{
rtgui_textbox_t* box;
box = (rtgui_textbox_t*)parameter;
return ;
}
static void _rtgui_textbox_constructor(rtgui_textbox_t *box)
{
rtgui_rect_t rect = {0, 0, RTGUI_TEXTBOX_DEFAULT_WIDTH, RTGUI_TEXTBOX_DEFAULT_HEIGHT};
@ -40,8 +49,8 @@ static void _rtgui_textbox_constructor(rtgui_textbox_t *box)
RTGUI_WIDGET_TEXTALIGN(RTGUI_WIDGET(box)) = RTGUI_ALIGN_CENTER_VERTICAL;
/* set proper of control */
box->caret_x = box->caret_y = 0;
box->caret = rtgui_caret_create(RTGUI_WIDGET(box));
box->caret_timer = rtgui_timer_create(RT_TICK_PER_SECOND, RT_TIMER_FLAG_PERIODIC,
_rtgui_textbox_caret_timeout, box);
box->line = box->line_begin = box->position = 0;
box->type = RTGUI_TEXTBOX_SINGLE;
@ -61,11 +70,8 @@ static void _rtgui_textbox_deconstructor(rtgui_textbox_t *box)
box->text = RT_NULL;
}
if (box->caret != RT_NULL)
{
rtgui_caret_destroy(box->caret);
box->caret = RT_NULL;
}
rtgui_timer_destory(box->caret_timer);
box->caret_timer = RT_NULL;
}
rtgui_type_t *rtgui_textbox_type_get(void)
@ -112,9 +118,6 @@ static void rtgui_textbox_onmouse(struct rtgui_textbox* box, struct rtgui_event_
box->position = x / box->font_width;
}
rtgui_caret_set_point(box->caret, RTGUI_TEXTBOX_MARGIN + box->position * box->font_width, 2);
rtgui_caret_set_box(box->caret, 2, rtgui_rect_height(RTGUI_WIDGET(box)->extent) - 4);
/* set widget focus */
rtgui_widget_focus(RTGUI_WIDGET(box));
}
@ -215,17 +218,14 @@ static void rtgui_textbox_onkey(struct rtgui_textbox* box, struct rtgui_event_kb
/* re-draw text box */
rtgui_theme_draw_textbox(box);
rtgui_caret_set_point(box->caret,
RTGUI_TEXTBOX_MARGIN + box->position * box->font_width , 2);
rtgui_caret_set_box(box->caret, 2, rtgui_rect_height(RTGUI_WIDGET(box)->extent) - 4);
}
static rt_bool_t rtgui_textbox_onfocus(struct rtgui_widget* widget, struct rtgui_event* event)
{
struct rtgui_textbox* box = (struct rtgui_textbox*)widget;
/* show caret */
rtgui_caret_show(box->caret, box->caret_x, box->caret_y);
/* start caret timer */
rtgui_timer_start(box->caret_timer);
return RT_TRUE;
}
@ -234,8 +234,9 @@ static rt_bool_t rtgui_textbox_onunfocus(struct rtgui_widget* widget, struct rtg
{
struct rtgui_textbox* box = (struct rtgui_textbox*)widget;
/* stop caret timer */
rtgui_timer_stop(box->caret_timer);
/* hide caret */
rtgui_caret_hide(box->caret);
return RT_TRUE;
}
@ -247,18 +248,27 @@ rt_bool_t rtgui_textbox_event_handler(struct rtgui_widget* widget, struct rtgui_
switch (event->type)
{
case RTGUI_EVENT_PAINT:
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_draw != RT_NULL) widget->on_draw(widget, event);
else rtgui_theme_draw_textbox(box);
else
#endif
rtgui_theme_draw_textbox(box);
break;
case RTGUI_EVENT_MOUSE_BUTTON:
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_mouseclick != RT_NULL) widget->on_mouseclick(widget, event);
else rtgui_textbox_onmouse(box, (struct rtgui_event_mouse*)event);
else
#endif
rtgui_textbox_onmouse(box, (struct rtgui_event_mouse*)event);
return RT_TRUE;
case RTGUI_EVENT_KBD:
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_key != RT_NULL) widget->on_key(widget, event);
else rtgui_textbox_onkey(box, (struct rtgui_event_kbd*)event);
else
#endif
rtgui_textbox_onkey(box, (struct rtgui_event_kbd*)event);
return RT_TRUE;
}
@ -348,3 +358,4 @@ void rtgui_widget_set_line_length(struct rtgui_textbox* box, rt_size_t length)
/* set line length */
box->line_length = length;
}

View File

@ -98,10 +98,12 @@ rt_bool_t rtgui_toplevel_event_handler(rtgui_widget_t* widget, rtgui_event_t* ev
case RTGUI_EVENT_COMMAND:
if (rtgui_container_dispatch_event(RTGUI_CONTAINER(widget), event) != RT_TRUE)
{
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_command != RT_NULL)
{
widget->on_command(widget, event);
}
#endif
}
else return RT_TRUE;
break;
@ -151,7 +153,9 @@ void rtgui_toplevel_update_clip(rtgui_toplevel_t* top)
/* reset toplevel widget clip to extent */
rtgui_region_reset(&(RTGUI_WIDGET(top)->clip), &(RTGUI_WIDGET(top)->extent));
#ifndef RTGUI_USING_SMALL_SIZE
RTGUI_WIDGET(top)->clip_sync ++;
#endif
/* subtract the screen rect */
screen_rect.x1 = screen_rect.y1 = 0;

View File

@ -70,8 +70,10 @@ rt_bool_t rtgui_view_event_handler(struct rtgui_widget* widget, struct rtgui_eve
switch (event->type)
{
case RTGUI_EVENT_PAINT:
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_draw != RT_NULL) widget->on_draw(widget, event);
else
#endif
{
struct rtgui_dc* dc;
struct rtgui_rect rect;

View File

@ -37,6 +37,7 @@ static void _rtgui_widget_constructor(rtgui_widget_t *widget)
widget->toplevel = RT_NULL;
/* some common event handler */
#ifndef RTGUI_USING_SMALL_SIZE
widget->on_draw = RT_NULL;
widget->on_focus_in = RT_NULL;
widget->on_focus_out = RT_NULL;
@ -44,13 +45,16 @@ static void _rtgui_widget_constructor(rtgui_widget_t *widget)
widget->on_key = RT_NULL;
widget->on_size = RT_NULL;
widget->on_command = RT_NULL;
#endif
/* set default event handler */
widget->event_handler = rtgui_widget_event_handler;
/* does not set widget extent and only set clip_sync to zero */
rtgui_region_init(&(widget->clip));
#ifndef RTGUI_USING_SMALL_SIZE
widget->clip_sync = 0;
#endif
}
/* Destroys the widget */
@ -68,7 +72,9 @@ static void _rtgui_widget_destructor(rtgui_widget_t *widget)
/* fini clip region */
rtgui_region_fini(&(widget->clip));
#ifndef RTGUI_USING_SMALL_SIZE
widget->clip_sync = 0;
#endif
}
rtgui_type_t *rtgui_widget_type_get(void)
@ -105,9 +111,11 @@ void rtgui_widget_set_rect(rtgui_widget_t* widget, rtgui_rect_t* rect)
widget->extent = *rect;
#ifndef RTGUI_USING_SMALL_SIZE
/* reset mini width and height */
widget->mini_width = rtgui_rect_width(widget->extent);
widget->mini_height = rtgui_rect_height(widget->extent);
#endif
/* it's not empty, fini it */
if (rtgui_region_not_empty(&(widget->clip)))
@ -119,6 +127,7 @@ void rtgui_widget_set_rect(rtgui_widget_t* widget, rtgui_rect_t* rect)
rtgui_region_init_with_extents(&(widget->clip), rect);
}
#ifndef RTGUI_USING_SMALL_SIZE
void rtgui_widget_set_miniwidth(rtgui_widget_t* widget, int width)
{
RT_ASSERT(widget != RT_NULL);
@ -132,6 +141,7 @@ void rtgui_widget_set_miniheight(rtgui_widget_t* widget, int height)
widget->mini_height = height;
}
#endif
/*
* This function moves widget and its children to a logic point
@ -176,13 +186,6 @@ void rtgui_widget_get_rect(rtgui_widget_t* widget, rtgui_rect_t *rect)
}
}
void rtgui_widget_set_ondraw(rtgui_widget_t* widget, rtgui_event_handler_ptr handler)
{
RT_ASSERT(widget != RT_NULL);
widget->on_draw = handler;
}
void rtgui_widget_set_onfocus(rtgui_widget_t* widget, rtgui_event_handler_ptr handler)
{
RT_ASSERT(widget != RT_NULL);
@ -197,6 +200,14 @@ void rtgui_widget_set_onunfocus(rtgui_widget_t* widget, rtgui_event_handler_ptr
widget->on_focus_out = handler;
}
#ifndef RTGUI_USING_SMALL_SIZE
void rtgui_widget_set_ondraw(rtgui_widget_t* widget, rtgui_event_handler_ptr handler)
{
RT_ASSERT(widget != RT_NULL);
widget->on_draw = handler;
}
void rtgui_widget_set_onmouseclick(rtgui_widget_t* widget, rtgui_event_handler_ptr handler)
{
RT_ASSERT(widget != RT_NULL);
@ -224,6 +235,7 @@ void rtgui_widget_set_oncommand(rtgui_widget_t* widget, rtgui_event_handler_ptr
widget->on_command = handler;
}
#endif
/**
* @brief Focuses the widget. The focused widget is the widget which can receive the keyboard events
@ -264,9 +276,11 @@ void rtgui_widget_focus(rtgui_widget_t *widget)
if (RTGUI_WIDGET_IS_HIDE(RTGUI_WIDGET(parent))) break;
}
#ifndef RTGUI_USING_SMALL_SIZE
/* invoke on focus in call back */
if (widget->on_focus_in)
if (widget->on_focus_in != RT_NULL)
widget->on_focus_in(widget, RT_NULL);
#endif
}
/**
@ -282,8 +296,10 @@ void rtgui_widget_unfocus(rtgui_widget_t *widget)
if (!widget->toplevel || !RTGUI_WIDGET_IS_FOCUS(widget))
return;
if (widget->on_focus_out)
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_focus_out != RT_NULL)
widget->on_focus_out(widget, RT_NULL);
#endif
}
void rtgui_widget_point_to_device(rtgui_widget_t* widget, rtgui_point_t* point)
@ -356,6 +372,7 @@ rtgui_widget_t* rtgui_widget_get_toplevel(rtgui_widget_t* widget)
rt_bool_t rtgui_widget_event_handler(rtgui_widget_t* widget, rtgui_event_t* event)
{
#ifndef RTGUI_USING_SMALL_SIZE
switch (event->type)
{
case RTGUI_EVENT_PAINT:
@ -378,6 +395,7 @@ rt_bool_t rtgui_widget_event_handler(rtgui_widget_t* widget, rtgui_event_t* even
if (widget->on_size != RT_NULL) return widget->on_size(widget, event);
break;
}
#endif
return RT_FALSE;
}
@ -397,8 +415,10 @@ void rtgui_widget_update_clip(rtgui_widget_t* widget)
/* if there is no parent, do not update clip (please use toplevel widget API) */
if (parent == RT_NULL) return;
#ifndef RTGUI_USING_SMALL_SIZE
/* increase clip sync */
widget->clip_sync ++;
#endif
/* reset clip to extent */
rtgui_region_reset(&(widget->clip), &(widget->extent));

View File

@ -380,8 +380,11 @@ rt_bool_t rtgui_win_event_handler(struct rtgui_widget* widget, struct rtgui_even
}
win->style |= RTGUI_WIN_STYLE_ACTIVATE;
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_draw != RT_NULL) widget->on_draw(widget, event);
else rtgui_win_ondraw(win);
else
#endif
rtgui_win_ondraw(win);
if (win->on_activate != RT_NULL)
{
@ -391,8 +394,11 @@ rt_bool_t rtgui_win_event_handler(struct rtgui_widget* widget, struct rtgui_even
case RTGUI_EVENT_WIN_DEACTIVATE:
win->style &= ~RTGUI_WIN_STYLE_ACTIVATE;
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_draw != RT_NULL) widget->on_draw(widget, event);
else rtgui_win_ondraw(win);
else
#endif
rtgui_win_ondraw(win);
if (win->on_deactivate != RT_NULL)
{
@ -401,17 +407,22 @@ rt_bool_t rtgui_win_event_handler(struct rtgui_widget* widget, struct rtgui_even
break;
case RTGUI_EVENT_PAINT:
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_draw != RT_NULL) widget->on_draw(widget, event);
else rtgui_win_ondraw(win);
else
#endif
rtgui_win_ondraw(win);
break;
case RTGUI_EVENT_MOUSE_BUTTON:
if (rtgui_container_dispatch_mouse_event(RTGUI_CONTAINER(win), (struct rtgui_event_mouse*)event) == RT_FALSE)
{
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_mouseclick != RT_NULL)
{
return widget->on_mouseclick(widget, event);
}
#endif
}
break;
@ -420,11 +431,13 @@ rt_bool_t rtgui_win_event_handler(struct rtgui_widget* widget, struct rtgui_even
if (rtgui_widget_dispatch_mouse_event(widget,
(struct rtgui_event_mouse*)event) == RT_FALSE)
{
#ifndef RTGUI_USING_SMALL_SIZE
/* handle event in current widget */
if (widget->on_mousemotion != RT_NULL)
{
return widget->on_mousemotion(widget, event);
}
#endif
}
else return RT_TRUE;
#endif