提交 c260b4d7 编写于 作者: B bernard.xiong@gmail.com

update notebook control.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1223 bbd45198-f89e-11dd-88c7-29a3b14d5316
上级 ecb7e7d9
...@@ -736,6 +736,24 @@ void* rtgui_malloc(rt_size_t size) ...@@ -736,6 +736,24 @@ void* rtgui_malloc(rt_size_t size)
return ptr; return ptr;
} }
void* rtgui_realloc(void* ptr, rt_size_t size)
{
void* new_ptr;
#ifdef RTGUI_MEM_TRACE
new_ptr = rtgui_malloc(size);
if ((new_ptr != RT_NULL) && (ptr != RT_NULL))
{
rt_memcpy(new_ptr, ptr, size);
rtgui_free(ptr);
}
#else
new_ptr = rt_realloc(ptr, size);
#endif
return new_ptr;
}
void rtgui_free(void* ptr) void rtgui_free(void* ptr)
{ {
#ifdef RTGUI_MEM_TRACE #ifdef RTGUI_MEM_TRACE
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#define RT_INT16_MAX 32767 #define RT_INT16_MAX 32767
#define RT_INT16_MIN (-RT_INT16_MAX-1) #define RT_INT16_MIN (-RT_INT16_MAX-1)
#define RTGUI_NOT_FOUND (-1)
struct rtgui_panel; struct rtgui_panel;
struct rtgui_event; struct rtgui_event;
......
...@@ -82,7 +82,7 @@ rt_err_t rtgui_thread_send(rt_thread_t tid, struct rtgui_event* event, rt_size_t ...@@ -82,7 +82,7 @@ rt_err_t rtgui_thread_send(rt_thread_t tid, struct rtgui_event* event, rt_size_t
rt_err_t rtgui_thread_send_urgent(rt_thread_t tid, struct rtgui_event* event, rt_size_t event_size); rt_err_t rtgui_thread_send_urgent(rt_thread_t tid, struct rtgui_event* event, rt_size_t event_size);
rt_err_t rtgui_thread_send_sync(rt_thread_t tid, struct rtgui_event* event, rt_size_t event_size); rt_err_t rtgui_thread_send_sync(rt_thread_t tid, struct rtgui_event* event, rt_size_t event_size);
rt_err_t rtgui_thread_recv(struct rtgui_event* event, rt_size_t event_size); rt_err_t rtgui_thread_recv(struct rtgui_event* event, rt_size_t event_size);
rt_err_t rtgui_thread_recv_nosuspend(struct rtgui_event* event, rt_size_t event_size); rt_err_t rtgui_thread_recv_nosuspend(struct rtgui_event* event, rt_size_t event_size);
rt_err_t rtgui_thread_recv_filter(rt_uint32_t type, struct rtgui_event* event, rt_size_t event_size); rt_err_t rtgui_thread_recv_filter(rt_uint32_t type, struct rtgui_event* event, rt_size_t event_size);
rt_err_t rtgui_thread_ack(struct rtgui_event* event, rt_int32_t status); rt_err_t rtgui_thread_ack(struct rtgui_event* event, rt_int32_t status);
...@@ -91,6 +91,7 @@ void rtgui_system_server_init(void); ...@@ -91,6 +91,7 @@ void rtgui_system_server_init(void);
void* rtgui_malloc(rt_size_t size); void* rtgui_malloc(rt_size_t size);
void rtgui_free(void* ptr); void rtgui_free(void* ptr);
void* rtgui_realloc(void* ptr, rt_size_t size);
#endif #endif
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
#define __RTGUI_NOTEBOOK_H__ #define __RTGUI_NOTEBOOK_H__
#include <rtgui/rtgui.h> #include <rtgui/rtgui.h>
#include <rtgui/widgets/container.h> #include <rtgui/widgets/widget.h>
/** Gets the type of a notebook */ /** Gets the type of a notebook */
#define RTGUI_NOTEBOOK_TYPE (rtgui_notebook_type_get()) #define RTGUI_NOTEBOOK_TYPE (rtgui_notebook_type_get())
...@@ -11,12 +11,19 @@ ...@@ -11,12 +11,19 @@
/** Checks if the object is a notebook control */ /** Checks if the object is a notebook control */
#define RTGUI_IS_NOTEBOOK(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_NOTEBOOK_TYPE)) #define RTGUI_IS_NOTEBOOK(obj) (RTGUI_OBJECT_CHECK_TYPE((obj), RTGUI_NOTEBOOK_TYPE))
struct rtgui_notebook_tab
{
char* title;
struct rtgui_widget* widget;
};
typedef struct rtgui_notebook_tab rtgui_notebook_tab_t;
struct rtgui_notebook struct rtgui_notebook
{ {
struct rtgui_container parent; struct rtgui_widget parent;
/* widget private data */ /* widget private data */
struct rtgui_widget* childs; rtgui_notebook_tab_t* childs;
rt_uint16_t count; rt_uint16_t count;
rt_int16_t current; rt_int16_t current;
}; };
...@@ -28,7 +35,7 @@ rtgui_notebook_t* rtgui_notebook_create(const rtgui_rect_t* rect); ...@@ -28,7 +35,7 @@ rtgui_notebook_t* rtgui_notebook_create(const rtgui_rect_t* rect);
void rtgui_notebook_destroy(rtgui_notebook_t* notebook); void rtgui_notebook_destroy(rtgui_notebook_t* notebook);
void rtgui_notebook_add(rtgui_notebook_t* notebook, const char* label, rtgui_widget_t* child); void rtgui_notebook_add(rtgui_notebook_t* notebook, const char* label, rtgui_widget_t* child);
int rtgui_notebook_get_count(rtgui_notebootk_t* notebook); int rtgui_notebook_get_count(rtgui_notebook_t* notebook);
rtgui_widget_t* rtgui_notebook_get_current(rtgui_notebook_t* notebook); rtgui_widget_t* rtgui_notebook_get_current(rtgui_notebook_t* notebook);
void rtgui_notebook_set_current(rtgui_notebook_t* notebook, rtgui_widget_t* widget); void rtgui_notebook_set_current(rtgui_notebook_t* notebook, rtgui_widget_t* widget);
void rtgui_notebook_set_current_by_index(rtgui_notebook_t* notebook, rt_uint16_t index); void rtgui_notebook_set_current_by_index(rtgui_notebook_t* notebook, rt_uint16_t index);
......
...@@ -149,7 +149,7 @@ void rtgui_widget_set_oncommand(rtgui_widget_t* widget, rtgui_event_handler_ptr ...@@ -149,7 +149,7 @@ void rtgui_widget_set_oncommand(rtgui_widget_t* widget, rtgui_event_handler_ptr
/* get and set rect of widget */ /* get and set rect of widget */
void rtgui_widget_get_rect(rtgui_widget_t* widget, rtgui_rect_t *rect); 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); void rtgui_widget_set_rect(rtgui_widget_t* widget, const rtgui_rect_t* rect);
void rtgui_widget_get_extent(rtgui_widget_t* widget, rtgui_rect_t *rect); void rtgui_widget_get_extent(rtgui_widget_t* widget, rtgui_rect_t *rect);
#ifndef RTGUI_USING_SMALL_SIZE #ifndef RTGUI_USING_SMALL_SIZE
......
#include <rtgui/dc.h>
#include <rtgui/rtgui.h> #include <rtgui/rtgui.h>
#include <rtgui/rtgui_system.h>
#include <rtgui/widgets/notebook.h> #include <rtgui/widgets/notebook.h>
static void _rtgui_notebook_constructor(rtgui_notebook_t *notebook)
{
notebook->childs = RT_NULL;
notebook->count = 0;
notebook->current = RTGUI_NOT_FOUND;
}
static void _rtgui_notebook_destructor(rtgui_notebook_t *notebook)
{
int index;
if (notebook->childs != RT_NULL)
{
for (index = 0; index < notebook->count; index ++)
{
rtgui_widget_destroy(notebook->childs[index].widget);
rt_free(notebook->childs[index].title);
}
rtgui_free(notebook->childs);
}
}
static void _rtgui_notebook_ondraw(rtgui_notebook_t *notebook)
{
struct rtgui_dc* dc;
rtgui_rect_t rect;
int index;
dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(notebook));
if (dc == RT_NULL) return;
rtgui_widget_get_rect(RTGUI_WIDGET(notebook), &rect);
if (notebook->count == 0)
{
rtgui_dc_fill_rect(dc, &rect);
}
else
{
/* draw tab bar */
for (index = 0; index < notebook->count; index ++)
{
}
/* draw current tab */
rtgui_widget_update(notebook->childs[notebook->current].widget);
}
rtgui_dc_end_drawing(dc);
}
rtgui_type_t *rtgui_notebook_type_get(void) rtgui_type_t *rtgui_notebook_type_get(void)
{ {
static rtgui_type_t *noteboot_type = RT_NULL;
if (!noteboot_type)
{
noteboot_type = rtgui_type_create("notebook", RTGUI_WIDGET_TYPE,
sizeof(rtgui_notebook_t),
RTGUI_CONSTRUCTOR(_rtgui_notebook_constructor),
RTGUI_DESTRUCTOR(_rtgui_notebook_destructor));
}
return noteboot_type;
} }
rtgui_notebook_t* rtgui_notebook_create(const rtgui_rect_t* rect) rtgui_notebook_t* rtgui_notebook_create(const rtgui_rect_t* rect)
{ {
struct rtgui_notebook* notebook;
notebook = (struct rtgui_notebook*) rtgui_widget_create (RTGUI_NOTEBOOK_TYPE);
if (notebook != RT_NULL)
{
rtgui_widget_set_rect(RTGUI_WIDGET(notebook), rect);
}
return notebook;
} }
void rtgui_notebook_destroy(rtgui_notebook_t* notebook) void rtgui_notebook_destroy(rtgui_notebook_t* notebook)
{ {
rtgui_widget_destroy(RTGUI_WIDGET(notebook));
} }
void rtgui_notebook_add(rtgui_notebook_t* notebook, const char* label, rtgui_widget_t* child) void rtgui_notebook_add(rtgui_notebook_t* notebook, const char* label, rtgui_widget_t* child)
{ {
RT_ASSERT(notebook != RT_NULL);
notebook->count += 1;
notebook->childs = (struct rtgui_notebook_tab*) rtgui_realloc(notebook->childs,
sizeof(struct rtgui_notebook_tab) * notebook->count);
notebook->childs[notebook->count - 1].title = rt_strdup(label);
notebook->childs[notebook->count - 1].widget = child;
}
void rtgui_notebook_remove(rtgui_notebook_t* notebook, rt_uint16_t index)
{
struct rtgui_notebook_tab tab;
RT_ASSERT(notebook != RT_NULL);
if (index < notebook->count)
{
if (notebook->count == 1)
{
tab = notebook->childs[0];
rtgui_free(notebook->childs);
notebook->childs = RT_NULL;
notebook->count = 0;
}
else
{
tab = notebook->childs[index];
for (;index < notebook->count - 1; index ++)
{
notebook->childs[index] = notebook->childs[index + 1];
}
notebook->count -= 1;
notebook->childs = (struct rtgui_notebook_tab*) rtgui_realloc(notebook->childs,
sizeof(struct rtgui_notebook_tab) * notebook->count);
}
rtgui_widget_destroy(tab.widget);
rtgui_free(tab.title);
if (notebook->current == index)
{
/* update tab */
if (notebook->current > notebook->count - 1)
notebook->current = notebook->count - 1;
rtgui_widget_update(RTGUI_WIDGET(notebook));
}
}
} }
int rtgui_notebook_get_count(rtgui_notebootk_t* notebook) int rtgui_notebook_get_count(rtgui_notebook_t* notebook)
{ {
return notebook->count; return notebook->count;
} }
...@@ -26,7 +148,7 @@ rtgui_widget_t* rtgui_notebook_get_current(rtgui_notebook_t* notebook) ...@@ -26,7 +148,7 @@ rtgui_widget_t* rtgui_notebook_get_current(rtgui_notebook_t* notebook)
{ {
RT_ASSERT(notebook != RT_NULL); RT_ASSERT(notebook != RT_NULL);
if (notebook->current != RTGUI_NOT_FOUND) if (notebook->current != RTGUI_NOT_FOUND)
return &notebook->childs[notebook->current]; return notebook->childs[notebook->current].widget;
return RT_NULL; return RT_NULL;
} }
...@@ -38,7 +160,7 @@ void rtgui_notebook_set_current(rtgui_notebook_t* notebook, rtgui_widget_t* widg ...@@ -38,7 +160,7 @@ void rtgui_notebook_set_current(rtgui_notebook_t* notebook, rtgui_widget_t* widg
for (index = 0; index < notebook->count; index ++) for (index = 0; index < notebook->count; index ++)
{ {
if (widget == &notebook->childs[index]) if (widget == notebook->childs[index].widget)
{ {
rtgui_notebook_set_current_by_index(notebook, index); rtgui_notebook_set_current_by_index(notebook, index);
return; return;
...@@ -53,11 +175,11 @@ void rtgui_notebook_set_current_by_index(rtgui_notebook_t* notebook, rt_uint16_t ...@@ -53,11 +175,11 @@ void rtgui_notebook_set_current_by_index(rtgui_notebook_t* notebook, rt_uint16_t
if ((index < notebook->count) && (notebook->current != index)) if ((index < notebook->count) && (notebook->current != index))
{ {
if (notebook->current != RTGUI_NOT_FOUND) if (notebook->current != RTGUI_NOT_FOUND)
rtgui_widget_hide(&notebook->childs[notebook->current]); rtgui_widget_hide(notebook->childs[notebook->current].widget);
notebook->current = index; notebook->current = index;
rtgui_widget_show(&notebook->childs[notebook->current]); rtgui_widget_show(notebook->childs[notebook->current].widget);
rtgui_widget_update(&notebook->childs[notebook->current]); rtgui_widget_update(notebook->childs[notebook->current].widget);
} }
} }
...@@ -65,12 +187,22 @@ rtgui_widget_t* rtgui_notebook_get_index(rtgui_notebook_t* notebook, rt_uint16_t ...@@ -65,12 +187,22 @@ rtgui_widget_t* rtgui_notebook_get_index(rtgui_notebook_t* notebook, rt_uint16_t
{ {
RT_ASSERT(notebook != RT_NULL); RT_ASSERT(notebook != RT_NULL);
if (index < notebook->count) if (index < notebook->count)
return &notebook->childs[index]; return notebook->childs[index].widget;
return RT_NULL; return RT_NULL;
} }
rt_bool_t rtgui_notebook_event_handler(struct rtgui_widget* widget, struct rtgui_event* event) rt_bool_t rtgui_notebook_event_handler(struct rtgui_widget* widget, struct rtgui_event* event)
{ {
if (event->type == RTGUI_EVENT_PAINT)
{
_rtgui_notebook_ondraw(RTGUI_NOTEBOOK(widget));
}
else
{
/* use parent event handler */
return rtgui_widget_event_handler(widget, event);
}
return RT_FALSE; return RT_FALSE;
} }
...@@ -111,7 +111,7 @@ void rtgui_widget_destroy(rtgui_widget_t* widget) ...@@ -111,7 +111,7 @@ void rtgui_widget_destroy(rtgui_widget_t* widget)
rtgui_object_destroy(RTGUI_OBJECT(widget)); rtgui_object_destroy(RTGUI_OBJECT(widget));
} }
void rtgui_widget_set_rect(rtgui_widget_t* widget, rtgui_rect_t* rect) void rtgui_widget_set_rect(rtgui_widget_t* widget, const rtgui_rect_t* rect)
{ {
if (widget == RT_NULL || rect == RT_NULL) return; if (widget == RT_NULL || rect == RT_NULL) return;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册