summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
Diffstat (limited to 'components')
-rw-r--r--components/rtgui/common/font.c3
-rw-r--r--components/rtgui/include/rtgui/widgets/button.h11
-rw-r--r--components/rtgui/include/rtgui/widgets/textbox.h2
-rw-r--r--components/rtgui/widgets/button.c30
-rw-r--r--components/rtgui/widgets/listctrl.c61
-rw-r--r--components/rtgui/widgets/textbox.c2
6 files changed, 59 insertions, 50 deletions
diff --git a/components/rtgui/common/font.c b/components/rtgui/common/font.c
index 8739b0b4b0..f2518f8cf7 100644
--- a/components/rtgui/common/font.c
+++ b/components/rtgui/common/font.c
@@ -70,11 +70,13 @@ void rtgui_font_system_add_font(struct rtgui_font *font)
if (font->engine->font_load != RT_NULL)
font->engine->font_load(font);
}
+RTM_EXPORT(rtgui_font_system_add_font);
void rtgui_font_system_remove_font(struct rtgui_font *font)
{
rtgui_list_remove(&_rtgui_font_list, &(font->list));
}
+RTM_EXPORT(rtgui_font_system_remove_font);
struct rtgui_font *rtgui_font_default()
{
@@ -105,6 +107,7 @@ struct rtgui_font *rtgui_font_refer(const char *family, rt_uint16_t height)
return RT_NULL;
}
+RTM_EXPORT(rtgui_font_refer);
void rtgui_font_derefer(struct rtgui_font *font)
{
diff --git a/components/rtgui/include/rtgui/widgets/button.h b/components/rtgui/include/rtgui/widgets/button.h
index c414b17961..b81c88281e 100644
--- a/components/rtgui/include/rtgui/widgets/button.h
+++ b/components/rtgui/include/rtgui/widgets/button.h
@@ -68,6 +68,17 @@ extern "C" {
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);
+ /** 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);
rt_bool_t rtgui_button_event_handler(struct rtgui_object *object, struct rtgui_event *event);
diff --git a/components/rtgui/include/rtgui/widgets/textbox.h b/components/rtgui/include/rtgui/widgets/textbox.h
index 918e98d162..e6c1d008ab 100644
--- a/components/rtgui/include/rtgui/widgets/textbox.h
+++ b/components/rtgui/include/rtgui/widgets/textbox.h
@@ -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);
const char *rtgui_textbox_get_value(struct rtgui_textbox *box);
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_get_edit_rect(struct rtgui_textbox *box, rtgui_rect_t *rect);
diff --git a/components/rtgui/widgets/button.c b/components/rtgui/widgets/button.c
index 6f1f7984f3..ca15acb89a 100644
--- a/components/rtgui/widgets/button.c
+++ b/components/rtgui/widgets/button.c
@@ -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 */
struct rtgui_win *win;
+ /* need callback */
+ rt_bool_t need_cb = RT_FALSE;
win = RTGUI_WIN(RTGUI_WIDGET(btn)->toplevel);
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 */
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
/* draw button */
rtgui_theme_draw_button(btn);
+ if (need_cb)
+ {
+ if (btn->on_button)
+ btn->on_button(RTGUI_OBJECT(widget), event);
#ifndef RTGUI_USING_SMALL_SIZE
- /* invokes call back */
- if (widget->on_mouseclick != RT_NULL &&
- emouse->button & RTGUI_MOUSE_BUTTON_UP)
- return widget->on_mouseclick(RTGUI_OBJECT(widget), event);
+ if (widget->on_mouseclick)
+ return widget->on_mouseclick(RTGUI_OBJECT(widget), event);
#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;
diff --git a/components/rtgui/widgets/listctrl.c b/components/rtgui/widgets/listctrl.c
index 8c6409c084..ee74bb2615 100644
--- a/components/rtgui/widgets/listctrl.c
+++ b/components/rtgui/widgets/listctrl.c
@@ -105,16 +105,18 @@ static void _rtgui_listctrl_scrollbar_onmouse(struct rtgui_listctrl *ctrl, struc
if (mouse->y < rect.y1)
{
if (ctrl->current_item - ctrl->page_items >= 0)
- ctrl->current_item -= ctrl->page_items;
- rtgui_listctrl_update_current(ctrl, old_item);
+ rtgui_listctrl_set_current_item(ctrl, ctrl->current_item - ctrl->page_items);
+ else
+ rtgui_listctrl_update_current(ctrl, old_item);
}
else if (mouse->y > rect.y2)
{
+ rt_uint16_t new_item;
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
- ctrl->current_item = ((ctrl->current_item / ctrl->page_items) + 1) * ctrl->page_items;
- rtgui_listctrl_update_current(ctrl, old_item);
+ new_item = ((ctrl->current_item / ctrl->page_items) + 1) * ctrl->page_items;
+ rtgui_listctrl_set_current_item(ctrl, new_item);
}
}
@@ -166,7 +168,7 @@ static void _rtgui_listctrl_ondraw(struct rtgui_listctrl *ctrl)
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;
rtgui_rect_t rect, item_rect;
@@ -214,7 +216,6 @@ void rtgui_listctrl_update_current(struct rtgui_listctrl *ctrl, rt_uint16_t old_
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)
{
@@ -288,24 +289,10 @@ rt_bool_t rtgui_listctrl_event_handler(struct rtgui_object *object, struct rtgui
if ((index < ctrl->page_items) &&
(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)
{
- /* down event */
- rtgui_listctrl_update_current(ctrl, old_item);
- }
- else
- {
- /* up event */
- if (ctrl->on_item != RT_NULL)
- {
- ctrl->on_item(RTGUI_OBJECT(ctrl), RT_NULL);
- }
+ rtgui_listctrl_set_current_item(ctrl,
+ (ctrl->current_item / ctrl->page_items) * ctrl->page_items + index);
}
}
}
@@ -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;
if ((ekbd->type == RTGUI_KEYDOWN) && (ctrl->items_count > 0))
{
- rt_uint16_t old_item;
-
- old_item = ctrl->current_item;
switch (ekbd->key)
{
case RTGUIK_LEFT:
if (ctrl->current_item - ctrl->page_items >= 0)
- ctrl->current_item -= ctrl->page_items;
- rtgui_listctrl_update_current(ctrl, old_item);
+ rtgui_listctrl_set_current_item(ctrl, ctrl->current_item - ctrl->page_items);
return RT_TRUE;
case RTGUIK_UP:
if (ctrl->current_item > 0)
- ctrl->current_item --;
- rtgui_listctrl_update_current(ctrl, old_item);
+ rtgui_listctrl_set_current_item(ctrl, ctrl->current_item-1);
return RT_TRUE;
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)
- ctrl->current_item = ((ctrl->current_item / ctrl->page_items) + 1) * ctrl->page_items;
+ rt_uint16_t new_item = ctrl->items_count;
+ 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;
case RTGUIK_DOWN:
if (ctrl->current_item < ctrl->items_count - 1)
- ctrl->current_item ++;
- rtgui_listctrl_update_current(ctrl, old_item);
+ rtgui_listctrl_set_current_item(ctrl, ctrl->current_item+1);
return RT_TRUE;
case RTGUIK_RETURN:
diff --git a/components/rtgui/widgets/textbox.c b/components/rtgui/widgets/textbox.c
index 9dd2cafca2..53642aeed3 100644
--- a/components/rtgui/widgets/textbox.c
+++ b/components/rtgui/widgets/textbox.c
@@ -605,7 +605,7 @@ void rtgui_textbox_set_mask_char(rtgui_textbox_t *box, const 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;
}