summaryrefslogtreecommitdiff
path: root/rtgui/common
diff options
context:
space:
mode:
authorbernard.xiong <[email protected]>2010-01-13 23:41:15 +0000
committerbernard.xiong <[email protected]>2010-01-13 23:41:15 +0000
commit0ce439673d649eae01fb972be053651296dffc96 (patch)
tree7a82ca03ed489426fda7a497ecb22f9e9a477ec1 /rtgui/common
parenta27f7c67bd51c93dfed233adc371d6f178ff7b73 (diff)
add draw_round_rect, update radiobox widget implementation.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@298 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'rtgui/common')
-rw-r--r--rtgui/common/dc.c15
-rw-r--r--rtgui/common/rtgui_system.c165
-rw-r--r--rtgui/common/rtgui_theme.c110
3 files changed, 289 insertions, 1 deletions
diff --git a/rtgui/common/dc.c b/rtgui/common/dc.c
index b8e06bf176..f31884cd06 100644
--- a/rtgui/common/dc.c
+++ b/rtgui/common/dc.c
@@ -138,6 +138,21 @@ void rtgui_dc_draw_rect (struct rtgui_dc* dc, struct rtgui_rect* rect)
rtgui_dc_draw_vline(dc, rect->x2 - 1, rect->y1, rect->y2);
}
+void rtgui_dc_draw_round_rect(struct rtgui_dc* dc, struct rtgui_rect* rect)
+{
+ int r = 3;
+
+ rtgui_dc_draw_arc(dc, rect->x1 + r, rect->y1 + r, r, 180, 270);
+ rtgui_dc_draw_arc(dc, rect->x2 - r, rect->y1 + r, r, 270, 360);
+ rtgui_dc_draw_arc(dc, rect->x1 + r, rect->y2 - r, r, 90, 180);
+ rtgui_dc_draw_arc(dc, rect->x2 - r, rect->y2 - r, r, 0, 90);
+
+ rtgui_dc_draw_hline(dc, rect->x1 + r, rect->x2 - r, rect->y1);
+ rtgui_dc_draw_hline(dc, rect->x1 + r, rect->x2 - r, rect->y2);
+ rtgui_dc_draw_vline(dc, rect->x1, rect->y1 + r, rect->y2 - r);
+ rtgui_dc_draw_vline(dc, rect->x2, rect->y1 + r, rect->y2 - r);
+}
+
void rtgui_dc_fill_rect (struct rtgui_dc* dc, struct rtgui_rect* rect)
{
if (dc == RT_NULL) return;
diff --git a/rtgui/common/rtgui_system.c b/rtgui/common/rtgui_system.c
index 824d298abc..e07ba74e9c 100644
--- a/rtgui/common/rtgui_system.c
+++ b/rtgui/common/rtgui_system.c
@@ -658,3 +658,168 @@ void rtgui_free(void* ptr)
rt_free(ptr);
}
+
+#if 0
+/*
+ * read/write lock implementation
+ */
+struct rtgui_rwlock* rtgui_rwlock_create()
+{
+ struct rtgui_rwlock* rwlock;
+
+ rwlock = rtgui_malloc(sizeof(struct rtgui_rwlock));
+ if (rwlock != RT_NULL)
+ {
+ rwlock->stat = RTGUI_RWLOCK_UNLOCK;
+ rwlock->reader_count = 0;
+
+ rt_sem_init(&(rwlock->rd_lock), "rwr", 0, RT_IPC_FLAG_FIFO);
+ rt_sem_init(&(rwlock->wr_lock), "rww", 0, RT_IPC_FLAG_FIFO);
+ }
+
+ return rwlock;
+}
+
+rt_err_t rtgui_rwlock_delete(struct rtgui_rwlock* rwlock)
+{
+ RT_ASSERT(rwlock != RT_NULL);
+
+ rt_sem_detach(&(rwlock->rd_lock));
+ rt_sem_detach(&(rwlock->wr_lock));
+
+ rtgui_free(rwlock);
+
+ return RT_EOK;
+}
+
+rt_err_t rtgui_rwlock_read_take(struct rtgui_rwlock* rwlock, rt_int32_t timeout)
+{
+ rt_err_t result;
+ rt_ubase_t level;
+
+ RT_ASSERT(rwlock != RT_NULL);
+ level = rt_hw_interrupt_disable();
+ switch (rwlock->stat)
+ {
+ case RTGUI_RWLOCK_UNLOCK:
+ break;
+
+ case RTGUI_RWLOCK_READING:
+ if (rwlock->wr_lock.parent.suspend_thread_count > 0)
+ {
+ /* suspend read thread */
+ result = rt_sem_take(&rwlock->rd_lock, timeout);
+ if (result != RT_EOK)
+ {
+ rt_hw_interrupt_enable(level);
+ return result;
+ }
+ }
+ break;
+
+ case RTGUI_RWLOCK_WRITTING:
+ /* suspend read thread */
+ result = rt_sem_take(&(rwlock->rd_lock), timeout);
+ if (result != RT_EOK)
+ {
+ rt_hw_interrupt_enable(level);
+ return result;
+ }
+ break;
+ }
+
+ /* get rwlock */
+ rwlock->reader_count ++;
+ rwlock->stat = RTGUI_RWLOCK_READING;
+
+ rt_hw_interrupt_enable(level);
+}
+
+rt_err_t rtgui_rwlock_write_take(struct rtgui_rwlock* rwlock, rt_int32_t timeout)
+{
+ rt_err_t result;
+ rt_ubase_t level;
+
+ RT_ASSERT(rwlock != RT_NULL);
+
+ level = rt_hw_interrupt_disable();
+ rwlock->stat = RTGUI_RWLOCK_WRITTING;
+ result = rt_sem_take(&(rwlock->wr_lock), timeout);
+
+ if (result != RT_EOK)
+ {
+ if (rwlock->wr_lock.parent.suspend_thread_count == 0)
+ {
+ if (rwlock->reader_count > 0)
+ rwlock->stat = RTGUI_RWLOCK_READING;
+ }
+ }
+ rt_hw_interrupt_enable(level);
+
+ return result;
+}
+
+rt_err_t rtgui_rwlock_read_release(struct rtgui_rwlock* rwlock)
+{
+ rt_ubase_t level;
+
+ RT_ASSERT(rwlock != RT_NULL);
+
+ level = rt_hw_interrupt_disable();
+ switch (rwlock->stat)
+ {
+ case RTGUI_RWLOCK_UNLOCK:
+ ASSERT(0);
+ break;
+
+ case RTGUI_RWLOCK_READING:
+ rwlock->reader_count --;
+ if (rwlock->reader_count == 0)
+ rwlock->stat = RTGUI_RWLOCK_UNLOCK;
+ break;
+
+ case RTGUI_RWLOCK_WRITTING:
+ rwlock->reader_count --;
+
+ if (rwlock->reader_count == 0)
+ {
+ /* resume write */
+ rt_sem_release(&(rwlock->wr_lock));
+ }
+ break;
+ }
+ rt_hw_interrupt_enable(level);
+}
+
+rt_err_t rtgui_rwlock_write_release(struct rtgui_rwlock* rwlock)
+{
+ rt_err_t result;
+ rt_ubase_t level;
+
+ RT_ASSERT(rwlock != RT_NULL);
+
+ level = rt_hw_interrupt_disable();
+ result = rt_sem_release(&(rwlock->wr_lock));
+
+ if ((result == RT_EOK) && (rwlock->wr_lock.parent.suspend_thread_count == 0))
+ {
+ rt_uint32_t index, reader_thread_count;
+
+ reader_thread_count = rwlock->rd_lock.parent.suspend_thread_count;
+ if (reader_thread_count > 0)
+ {
+ rwlock->stat = RTGUI_RWLOCK_READING;
+
+ /* resume all reader thread */
+ for (index = 0; index < reader_thread_count; index ++)
+ {
+ rt_sem_release(&(rwlock->rd_lock));
+ }
+ }
+ else rwlock->stat = RTGUI_RWLOCK_UNLOCK;
+ }
+ rt_hw_interrupt_enable(level);
+
+ return result;
+}
+#endif
diff --git a/rtgui/common/rtgui_theme.c b/rtgui/common/rtgui_theme.c
index 13588f2a1f..07575f0bb7 100644
--- a/rtgui/common/rtgui_theme.c
+++ b/rtgui/common/rtgui_theme.c
@@ -470,7 +470,7 @@ void rtgui_theme_draw_iconbox(rtgui_iconbox_t* iconbox)
rtgui_dc_end_drawing(dc);
}
-void rtgui_theme_draw_checkbox(rtgui_checkbox_t* checkbox)
+void rtgui_theme_draw_checkbox(struct rtgui_checkbox* checkbox)
{
struct rtgui_dc* dc;
struct rtgui_rect rect, box_rect;
@@ -528,6 +528,114 @@ void rtgui_theme_draw_checkbox(rtgui_checkbox_t* checkbox)
return;
}
+void rtgui_theme_draw_radiobox(struct rtgui_radiobox* radiobox)
+{
+ struct rtgui_dc* dc;
+ struct rtgui_rect rect, item_rect;
+ rt_size_t item_size, bord_size, index;
+
+ /* begin drawing */
+ dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(radiobox));
+ if (dc == RT_NULL) return;
+
+ /* get widget rect */
+ rtgui_widget_get_rect(RTGUI_WIDGET(radiobox), &rect);
+ rtgui_dc_fill_rect(dc, &rect);
+
+ item_size = radiobox->item_size;
+ /* get board size */
+ if (radiobox->orient == RTGUI_VERTICAL)
+ bord_size = item_size;
+ else
+ {
+ rtgui_font_get_metrics(rtgui_dc_get_font(dc), "H", &item_rect);
+ bord_size = rtgui_rect_height(item_rect);
+ }
+
+ /* draw box */
+ rtgui_rect_inflate(&rect, -bord_size/2);
+ rtgui_dc_draw_round_rect(dc, &rect);
+ rtgui_rect_inflate(&rect, bord_size/2);
+ if (radiobox->text != RT_NULL)
+ {
+ struct rtgui_rect text_rect;
+
+ /* draw group text */
+ rtgui_font_get_metrics(rtgui_dc_get_font(dc), radiobox->text, &text_rect);
+ rtgui_rect_moveto(&text_rect, rect.x1 + 5, rect.y1);
+ rtgui_dc_fill_rect(dc, &text_rect);
+ rtgui_dc_draw_text(dc, radiobox->text, &text_rect);
+ }
+
+ /* set init item rect */
+ item_rect = rect;
+ rtgui_rect_inflate(&item_rect, - bord_size);
+
+ if (radiobox->orient == RTGUI_VERTICAL)
+ {
+ /* set the first text rect */
+ item_rect.y2 = item_rect.y1 + item_size;
+
+ /* draw each radio button */
+ for (index = 0; index < radiobox->item_count; index ++)
+ {
+ if (item_rect.y2 > rect.y2 - item_size) break;
+
+ /* draw radio */
+ if (radiobox->item_selection == index)
+ {
+ rtgui_dc_draw_focus_rect(dc, &item_rect);
+ rtgui_dc_fill_circle(dc, item_rect.x1 + item_size/2 + 2, item_rect.y1 + item_size/2 + 2, item_size/2 - 2);
+ }
+ else
+ {
+ rtgui_dc_draw_circle(dc, item_rect.x1 + item_size/2 + 2, item_rect.y1 + item_size/2 + 2, item_size/2 - 2);
+ }
+
+ /* draw text */
+ item_rect.x1 += item_size + 3;
+ rtgui_dc_draw_text(dc, radiobox->items[index], item_rect);
+ item_rect.x1 -= item_size + 3;
+
+ item_rect.y1 += item_size;
+ item_rect.y2 += item_size;
+ }
+ }
+ else
+ {
+ /* set the first text rect */
+ item_rect.x2 = item_rect.x1 + item_size;
+
+ /* draw each radio button */
+ for (index = 0; index < radiobox->item_count; index ++)
+ {
+ if (item_rect.x2 > rect.x2 - item_size) break;
+
+ /* draw radio */
+ if (radiobox->item_selection == index)
+ {
+ rtgui_dc_draw_focus_rect(dc, &item_rect);
+ rtgui_dc_fill_circle(dc, item_rect.x1 + item_size/2 + 2, item_rect.y1 + item_size/2 + 2, item_size/2 - 2);
+ }
+ else
+ {
+ rtgui_dc_draw_circle(dc, item_rect.x1 + item_size/2 + 2, item_rect.y1 + item_size/2 + 2, item_size/2 - 2);
+ }
+
+ /* draw text */
+ item_rect.x1 += item_size + 3;
+ rtgui_dc_draw_text(dc, radiobox->items[index], item_rect);
+ item_rect.x1 -= item_size + 3;
+
+ item_rect.x1 += item_size;
+ item_rect.x2 += item_size;
+ }
+ }
+
+ /* end drawing */
+ rtgui_dc_end_drawing(dc);
+}
+
void rtgui_theme_draw_slider(struct rtgui_slider* slider)
{
/* draw button */