提交 601eb6fe 编写于 作者: D dzzxzz@gmail.com

sync RTGUI with github(https://github.com/RT-Thread/RTGUI) c4b8c0ac2a3de482357b88d584931831aed7c8ae

As always, full log is in GitHub.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@2481 bbd45198-f89e-11dd-88c7-29a3b14d5316
上级 5927bf0a
...@@ -70,11 +70,13 @@ void rtgui_font_system_add_font(struct rtgui_font *font) ...@@ -70,11 +70,13 @@ void rtgui_font_system_add_font(struct rtgui_font *font)
if (font->engine->font_load != RT_NULL) if (font->engine->font_load != RT_NULL)
font->engine->font_load(font); font->engine->font_load(font);
} }
RTM_EXPORT(rtgui_font_system_add_font);
void rtgui_font_system_remove_font(struct rtgui_font *font) void rtgui_font_system_remove_font(struct rtgui_font *font)
{ {
rtgui_list_remove(&_rtgui_font_list, &(font->list)); rtgui_list_remove(&_rtgui_font_list, &(font->list));
} }
RTM_EXPORT(rtgui_font_system_remove_font);
struct rtgui_font *rtgui_font_default() struct rtgui_font *rtgui_font_default()
{ {
...@@ -105,6 +107,7 @@ struct rtgui_font *rtgui_font_refer(const char *family, rt_uint16_t height) ...@@ -105,6 +107,7 @@ struct rtgui_font *rtgui_font_refer(const char *family, rt_uint16_t height)
return RT_NULL; return RT_NULL;
} }
RTM_EXPORT(rtgui_font_refer);
void rtgui_font_derefer(struct rtgui_font *font) void rtgui_font_derefer(struct rtgui_font *font)
{ {
......
...@@ -68,6 +68,17 @@ extern "C" { ...@@ -68,6 +68,17 @@ extern "C" {
void rtgui_button_set_pressed_image(rtgui_button_t *btn, rtgui_image_t *image); 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_set_unpressed_image(rtgui_button_t *btn, rtgui_image_t *image);
/** Set the callback function on button btn
*
* If the btn is a push button, the callback will be invoked every
* time the btn got "pushed", i.e., both pressed down @em and pressed
* up. If the button is a normal button, the callback will be invoked when
* the btn got "clicked", i.e., when pressed up @em after pressed
* down.
*
* @param btn the btn that the callback will be setted on.
* @param func the callback function.
*/
void rtgui_button_set_onbutton(rtgui_button_t *btn, rtgui_onbutton_func_t func); void rtgui_button_set_onbutton(rtgui_button_t *btn, rtgui_onbutton_func_t func);
rt_bool_t rtgui_button_event_handler(struct rtgui_object *object, struct rtgui_event *event); rt_bool_t rtgui_button_event_handler(struct rtgui_object *object, struct rtgui_event *event);
......
...@@ -76,7 +76,7 @@ rt_bool_t rtgui_textbox_event_handler(struct rtgui_object *object, struct rtgui_ ...@@ -76,7 +76,7 @@ rt_bool_t rtgui_textbox_event_handler(struct rtgui_object *object, struct rtgui_
void rtgui_textbox_set_value(struct rtgui_textbox *box, const char *text); void rtgui_textbox_set_value(struct rtgui_textbox *box, const char *text);
const char *rtgui_textbox_get_value(struct rtgui_textbox *box); const char *rtgui_textbox_get_value(struct rtgui_textbox *box);
void rtgui_textbox_set_mask_char(rtgui_textbox_t *box, const char ch); void rtgui_textbox_set_mask_char(rtgui_textbox_t *box, const char ch);
const char rtgui_textbox_get_mask_char(rtgui_textbox_t *box); char rtgui_textbox_get_mask_char(rtgui_textbox_t *box);
void rtgui_textbox_set_line_length(struct rtgui_textbox *box, rt_size_t length); void rtgui_textbox_set_line_length(struct rtgui_textbox *box, rt_size_t length);
void rtgui_textbox_get_edit_rect(struct rtgui_textbox *box, rtgui_rect_t *rect); void rtgui_textbox_get_edit_rect(struct rtgui_textbox *box, rtgui_rect_t *rect);
......
...@@ -156,10 +156,24 @@ rt_bool_t rtgui_button_event_handler(struct rtgui_object *object, struct rtgui_e ...@@ -156,10 +156,24 @@ rt_bool_t rtgui_button_event_handler(struct rtgui_object *object, struct rtgui_e
{ {
/* set the last mouse event handled widget */ /* set the last mouse event handled widget */
struct rtgui_win *win; struct rtgui_win *win;
/* need callback */
rt_bool_t need_cb = RT_FALSE;
win = RTGUI_WIN(RTGUI_WIDGET(btn)->toplevel); win = RTGUI_WIN(RTGUI_WIDGET(btn)->toplevel);
win->last_mevent_widget = RTGUI_WIDGET(btn); win->last_mevent_widget = RTGUI_WIDGET(btn);
/* we need to decide whether the callback will be invoked
* before the flag has changed. Moreover, we cannot invoke
* it directly here, because the button might be destroyed
* in the callback. If that happens, program will crash on
* the following code. We need to make sure that the
* callbacks are invoke at the very last step. */
if ((btn->flag & RTGUI_BUTTON_FLAG_PRESS)
&& (emouse->button & RTGUI_MOUSE_BUTTON_UP))
{
need_cb = RT_TRUE;
}
/* it's a normal button */ /* it's a normal button */
if (emouse->button & RTGUI_MOUSE_BUTTON_DOWN) if (emouse->button & RTGUI_MOUSE_BUTTON_DOWN)
{ {
...@@ -173,20 +187,16 @@ rt_bool_t rtgui_button_event_handler(struct rtgui_object *object, struct rtgui_e ...@@ -173,20 +187,16 @@ rt_bool_t rtgui_button_event_handler(struct rtgui_object *object, struct rtgui_e
/* draw button */ /* draw button */
rtgui_theme_draw_button(btn); rtgui_theme_draw_button(btn);
if (need_cb)
{
if (btn->on_button)
btn->on_button(RTGUI_OBJECT(widget), event);
#ifndef RTGUI_USING_SMALL_SIZE #ifndef RTGUI_USING_SMALL_SIZE
/* invokes call back */ if (widget->on_mouseclick)
if (widget->on_mouseclick != RT_NULL && return widget->on_mouseclick(RTGUI_OBJECT(widget), event);
emouse->button & RTGUI_MOUSE_BUTTON_UP)
return widget->on_mouseclick(RTGUI_OBJECT(widget), event);
#endif #endif
if (!(btn->flag & RTGUI_BUTTON_FLAG_PRESS) && (btn->on_button != RT_NULL))
{
/* call on button handler */
btn->on_button(RTGUI_OBJECT(widget), event);
} }
} }
} }
return RT_TRUE; return RT_TRUE;
......
...@@ -105,16 +105,18 @@ static void _rtgui_listctrl_scrollbar_onmouse(struct rtgui_listctrl *ctrl, struc ...@@ -105,16 +105,18 @@ static void _rtgui_listctrl_scrollbar_onmouse(struct rtgui_listctrl *ctrl, struc
if (mouse->y < rect.y1) if (mouse->y < rect.y1)
{ {
if (ctrl->current_item - ctrl->page_items >= 0) if (ctrl->current_item - ctrl->page_items >= 0)
ctrl->current_item -= ctrl->page_items; rtgui_listctrl_set_current_item(ctrl, ctrl->current_item - ctrl->page_items);
rtgui_listctrl_update_current(ctrl, old_item); else
rtgui_listctrl_update_current(ctrl, old_item);
} }
else if (mouse->y > rect.y2) else if (mouse->y > rect.y2)
{ {
rt_uint16_t new_item;
if (ctrl->current_item + ctrl->page_items < ctrl->items_count - 1) if (ctrl->current_item + ctrl->page_items < ctrl->items_count - 1)
ctrl->current_item += ctrl->page_items; new_item = ctrl->current_item + ctrl->page_items;
else else
ctrl->current_item = ((ctrl->current_item / ctrl->page_items) + 1) * ctrl->page_items; new_item = ((ctrl->current_item / ctrl->page_items) + 1) * ctrl->page_items;
rtgui_listctrl_update_current(ctrl, old_item); rtgui_listctrl_set_current_item(ctrl, new_item);
} }
} }
...@@ -166,7 +168,7 @@ static void _rtgui_listctrl_ondraw(struct rtgui_listctrl *ctrl) ...@@ -166,7 +168,7 @@ static void _rtgui_listctrl_ondraw(struct rtgui_listctrl *ctrl)
rtgui_dc_end_drawing(dc); rtgui_dc_end_drawing(dc);
} }
void rtgui_listctrl_update_current(struct rtgui_listctrl *ctrl, rt_uint16_t old_item) static void rtgui_listctrl_update_current(struct rtgui_listctrl *ctrl, rt_uint16_t old_item)
{ {
struct rtgui_dc *dc; struct rtgui_dc *dc;
rtgui_rect_t rect, item_rect; rtgui_rect_t rect, item_rect;
...@@ -214,7 +216,6 @@ void rtgui_listctrl_update_current(struct rtgui_listctrl *ctrl, rt_uint16_t old_ ...@@ -214,7 +216,6 @@ void rtgui_listctrl_update_current(struct rtgui_listctrl *ctrl, rt_uint16_t old_
rtgui_dc_end_drawing(dc); rtgui_dc_end_drawing(dc);
} }
RTM_EXPORT(rtgui_listctrl_update_current);
rt_bool_t rtgui_listctrl_event_handler(struct rtgui_object *object, struct rtgui_event *event) rt_bool_t rtgui_listctrl_event_handler(struct rtgui_object *object, struct rtgui_event *event)
{ {
...@@ -288,24 +289,10 @@ rt_bool_t rtgui_listctrl_event_handler(struct rtgui_object *object, struct rtgui ...@@ -288,24 +289,10 @@ rt_bool_t rtgui_listctrl_event_handler(struct rtgui_object *object, struct rtgui
if ((index < ctrl->page_items) && if ((index < ctrl->page_items) &&
(ctrl->current_item / ctrl->page_items)* ctrl->page_items + index < ctrl->items_count) (ctrl->current_item / ctrl->page_items)* ctrl->page_items + index < ctrl->items_count)
{ {
rt_uint16_t old_item;
old_item = ctrl->current_item;
/* set selected item */
ctrl->current_item = (ctrl->current_item / ctrl->page_items) * ctrl->page_items + index;
if (emouse->button & RTGUI_MOUSE_BUTTON_DOWN) if (emouse->button & RTGUI_MOUSE_BUTTON_DOWN)
{ {
/* down event */ rtgui_listctrl_set_current_item(ctrl,
rtgui_listctrl_update_current(ctrl, old_item); (ctrl->current_item / ctrl->page_items) * ctrl->page_items + index);
}
else
{
/* up event */
if (ctrl->on_item != RT_NULL)
{
ctrl->on_item(RTGUI_OBJECT(ctrl), RT_NULL);
}
} }
} }
} }
...@@ -318,38 +305,36 @@ rt_bool_t rtgui_listctrl_event_handler(struct rtgui_object *object, struct rtgui ...@@ -318,38 +305,36 @@ rt_bool_t rtgui_listctrl_event_handler(struct rtgui_object *object, struct rtgui
struct rtgui_event_kbd *ekbd = (struct rtgui_event_kbd *)event; struct rtgui_event_kbd *ekbd = (struct rtgui_event_kbd *)event;
if ((ekbd->type == RTGUI_KEYDOWN) && (ctrl->items_count > 0)) if ((ekbd->type == RTGUI_KEYDOWN) && (ctrl->items_count > 0))
{ {
rt_uint16_t old_item;
old_item = ctrl->current_item;
switch (ekbd->key) switch (ekbd->key)
{ {
case RTGUIK_LEFT: case RTGUIK_LEFT:
if (ctrl->current_item - ctrl->page_items >= 0) if (ctrl->current_item - ctrl->page_items >= 0)
ctrl->current_item -= ctrl->page_items; rtgui_listctrl_set_current_item(ctrl, ctrl->current_item - ctrl->page_items);
rtgui_listctrl_update_current(ctrl, old_item);
return RT_TRUE; return RT_TRUE;
case RTGUIK_UP: case RTGUIK_UP:
if (ctrl->current_item > 0) if (ctrl->current_item > 0)
ctrl->current_item --; rtgui_listctrl_set_current_item(ctrl, ctrl->current_item-1);
rtgui_listctrl_update_current(ctrl, old_item);
return RT_TRUE; return RT_TRUE;
case RTGUIK_RIGHT: case RTGUIK_RIGHT:
if (ctrl->current_item + ctrl->page_items < ctrl->items_count - 1)
ctrl->current_item += ctrl->page_items;
else
{ {
if ((((ctrl->current_item / ctrl->page_items) + 1) * ctrl->page_items) < ctrl->items_count - 1) rt_uint16_t new_item = ctrl->items_count;
ctrl->current_item = ((ctrl->current_item / ctrl->page_items) + 1) * ctrl->page_items; if (ctrl->current_item + ctrl->page_items < ctrl->items_count - 1)
new_item = ctrl->current_item + ctrl->page_items;
else
{
if ((((ctrl->current_item / ctrl->page_items) + 1) * ctrl->page_items)
< ctrl->items_count - 1)
new_item = ((ctrl->current_item / ctrl->page_items) + 1) * ctrl->page_items;
}
rtgui_listctrl_set_current_item(ctrl, new_item);
} }
rtgui_listctrl_update_current(ctrl, old_item);
return RT_TRUE; return RT_TRUE;
case RTGUIK_DOWN: case RTGUIK_DOWN:
if (ctrl->current_item < ctrl->items_count - 1) if (ctrl->current_item < ctrl->items_count - 1)
ctrl->current_item ++; rtgui_listctrl_set_current_item(ctrl, ctrl->current_item+1);
rtgui_listctrl_update_current(ctrl, old_item);
return RT_TRUE; return RT_TRUE;
case RTGUIK_RETURN: case RTGUIK_RETURN:
......
...@@ -605,7 +605,7 @@ void rtgui_textbox_set_mask_char(rtgui_textbox_t *box, const char ch) ...@@ -605,7 +605,7 @@ void rtgui_textbox_set_mask_char(rtgui_textbox_t *box, const char ch)
box->mask_char = ch; box->mask_char = ch;
} }
const char rtgui_textbox_get_mask_char(rtgui_textbox_t *box) char rtgui_textbox_get_mask_char(rtgui_textbox_t *box)
{ {
return box->mask_char; return box->mask_char;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册