chaos.proton@gmail.com db06460208 merge new RTGUI in to trunk
The full log is at https://github.com/RTGUI/RTGUI/commits/merge_1 and it's difficult to merge the new tree commit by commit. I also converted all the file into unix eol so there are many fake diff. Big changes are noted in rtgui/doc/road_map.txt and rtgui/doc/attention.txt. Keep an eye on them if you want to migrate your old code.

Note that the work is still in progress and the bsp is not prepared in trunk so far.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@2092 bbd45198-f89e-11dd-88c7-29a3b14d5316
2012-04-18 15:06:12 +00:00

154 lines
3.6 KiB
C

#include <rtgui/dc.h>
#include <rtgui/rtgui_theme.h>
#include <rtgui/widgets/checkbox.h>
static void _rtgui_checkbox_constructor(rtgui_checkbox_t *box)
{
/* init widget and set event handler */
RTGUI_WIDGET(box)->flag |= RTGUI_WIDGET_FLAG_FOCUSABLE;
rtgui_object_set_event_handler(RTGUI_OBJECT(box), rtgui_checkbox_event_handler);
/* set status */
box->status_down = RTGUI_CHECKBOX_STATUS_UNCHECKED;
box->on_button = RT_NULL;
/* set default gc */
RTGUI_WIDGET_TEXTALIGN(RTGUI_WIDGET(box)) = RTGUI_ALIGN_LEFT | RTGUI_ALIGN_CENTER_VERTICAL;
}
DEFINE_CLASS_TYPE(checkbox, "checkbox",
RTGUI_LABEL_TYPE,
_rtgui_checkbox_constructor,
RT_NULL,
sizeof(struct rtgui_checkbox));
void rtgui_checkbox_set_onbutton(rtgui_checkbox_t* checkbox, rtgui_onbutton_func_t func)
{
RT_ASSERT(checkbox != RT_NULL);
checkbox->on_button = func;
}
rt_bool_t rtgui_checkbox_event_handler(struct rtgui_object* object, struct rtgui_event* event)
{
struct rtgui_widget *widget;
struct rtgui_checkbox *box = (struct rtgui_checkbox*)widget;
RT_ASSERT(widget != RT_NULL);
RT_ASSERT(event != RT_NULL);
widget = RTGUI_WIDGET(object);
box = RTGUI_CHECKBOX(object);
switch (event->type)
{
case RTGUI_EVENT_PAINT:
#ifndef RTGUI_USING_SMALL_SIZE
if (widget->on_draw != RT_NULL)
{
return widget->on_draw(widget, event);
}
else
#endif
rtgui_theme_draw_checkbox(box);
break;
case RTGUI_EVENT_MOUSE_BUTTON:
{
if (RTGUI_WIDGET_IS_ENABLE(widget) && !RTGUI_WIDGET_IS_HIDE(widget))
{
struct rtgui_event_mouse* emouse = (struct rtgui_event_mouse*)event;
if (emouse->button & RTGUI_MOUSE_BUTTON_LEFT &&
emouse->button & RTGUI_MOUSE_BUTTON_UP)
{
/* set focus */
rtgui_widget_focus(widget);
if (box->status_down & RTGUI_CHECKBOX_STATUS_UNCHECKED)
{
/* check it */
box->status_down = RTGUI_CHECKBOX_STATUS_CHECKED;
}
else
{
/* un-check it */
box->status_down = RTGUI_CHECKBOX_STATUS_UNCHECKED;
}
}
/* draw checkbox */
rtgui_theme_draw_checkbox(box);
#ifndef RTGUI_USING_SMALL_SIZE
/* call user callback */
if (widget->on_mouseclick != RT_NULL)
{
return widget->on_mouseclick(widget, event);
}
#endif
if (box->on_button != RT_NULL)
{
box->on_button(widget, event);
return RT_TRUE;
}
}
return RT_TRUE;
}
}
return RT_FALSE;
}
struct rtgui_checkbox* rtgui_checkbox_create(const char* text, rt_bool_t checked)
{
struct rtgui_checkbox* box;
box = (struct rtgui_checkbox*) rtgui_widget_create (RTGUI_CHECKBOX_TYPE);
if (box != RT_NULL)
{
rtgui_rect_t rect;
/* set default rect */
rtgui_font_get_metrics(rtgui_font_default(), text, &rect);
rect.x2 += RTGUI_BORDER_DEFAULT_WIDTH + 5 + (RTGUI_BORDER_DEFAULT_WIDTH << 1);
rect.y2 += (RTGUI_BORDER_DEFAULT_WIDTH << 1);
rtgui_widget_set_rect(RTGUI_WIDGET(box), &rect);
rtgui_label_set_text(RTGUI_LABEL(box), text);
if (checked == RT_TRUE)
box->status_down = RTGUI_CHECKBOX_STATUS_CHECKED;
else
box->status_down = RTGUI_CHECKBOX_STATUS_UNCHECKED;
}
return box;
}
void rtgui_checkbox_destroy(rtgui_checkbox_t* box)
{
rtgui_widget_destroy(RTGUI_WIDGET(box));
}
void rtgui_checkbox_set_checked(rtgui_checkbox_t* checkbox, rt_bool_t checked)
{
RT_ASSERT(checkbox != RT_NULL);
if (checked == RT_TRUE)
checkbox->status_down = RTGUI_CHECKBOX_STATUS_CHECKED;
else
checkbox->status_down = RTGUI_CHECKBOX_STATUS_UNCHECKED;
}
rt_bool_t rtgui_checkbox_get_checked(rtgui_checkbox_t* checkbox)
{
RT_ASSERT(checkbox != RT_NULL);
if (checkbox->status_down == RTGUI_CHECKBOX_STATUS_CHECKED)
return RT_TRUE;
return RT_FALSE;
}