summaryrefslogtreecommitdiff
path: root/rtgui/common
diff options
context:
space:
mode:
authorbernard.xiong <[email protected]>2010-01-08 00:02:24 +0000
committerbernard.xiong <[email protected]>2010-01-08 00:02:24 +0000
commit5939b5f6ac3e2afccece4ec5649598d23ae6d98e (patch)
treebe1470182a389b37f325f786031dd72aeac8efb5 /rtgui/common
parente0f0d6da6a143b263790c527bfdb2c218984b23c (diff)
add more widgets.
git-svn-id: https://rt-thread.googlecode.com/svn/trunk@291 bbd45198-f89e-11dd-88c7-29a3b14d5316
Diffstat (limited to 'rtgui/common')
-rw-r--r--rtgui/common/rtgui_theme.c249
1 files changed, 248 insertions, 1 deletions
diff --git a/rtgui/common/rtgui_theme.c b/rtgui/common/rtgui_theme.c
index ef0046953f..13588f2a1f 100644
--- a/rtgui/common/rtgui_theme.c
+++ b/rtgui/common/rtgui_theme.c
@@ -390,7 +390,6 @@ void rtgui_theme_draw_label(rtgui_label_t* label)
rtgui_dc_fill_rect(dc, &rect);
/* default left and center draw */
- rect.y1 = rect.y1 + (rtgui_rect_height(rect) - 8)/2;
rtgui_dc_draw_text(dc, rtgui_label_get_text(label), &rect);
/* end drawing */
@@ -423,6 +422,17 @@ void rtgui_theme_draw_textbox(rtgui_textbox_t* box)
rect.x1 += RTGUI_TEXTBOX_MARGIN;
rtgui_dc_draw_text(dc, box->text, &rect);
+
+ /* draw caret */
+ if (box->flag & RTGUI_TEXTBOX_CARET_SHOW)
+ {
+ rect.x1 += box->position * box->font_width;
+ rect.x2 = rect.x1 + box->font_width;
+
+ rect.y1 = rect.y2 - 3;
+
+ rtgui_dc_fill_rect(dc, &rect);
+ }
}
/* end drawing */
@@ -460,6 +470,243 @@ void rtgui_theme_draw_iconbox(rtgui_iconbox_t* iconbox)
rtgui_dc_end_drawing(dc);
}
+void rtgui_theme_draw_checkbox(rtgui_checkbox_t* checkbox)
+{
+ struct rtgui_dc* dc;
+ struct rtgui_rect rect, box_rect;
+
+ /* begin drawing */
+ dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(checkbox));
+ if (dc == RT_NULL) return;
+
+ /* get rect */
+ rtgui_widget_get_rect(RTGUI_WIDGET(checkbox), &rect);
+
+ /* fill rect */
+ rtgui_dc_fill_rect(dc, &rect);
+
+ if (RTGUI_WIDGET_IS_FOCUSED(RTGUI_WIDGET(checkbox)) == RT_TRUE)
+ {
+ /* draw focused border */
+ rtgui_rect_inflate(&rect, -1);
+ rtgui_dc_draw_focus_rect(dc, &rect);
+
+ rtgui_rect_inflate(&rect, 1);
+ }
+
+ /* draw check box */
+ box_rect = rect;
+ box_rect.x1 += 2;
+ box_rect.y1 += 2;
+ box_rect.x2 = rtgui_rect_height(rect) - 4;
+ box_rect.y2 = rtgui_rect_height(rect) - 4;
+
+ rtgui_dc_draw_rect(dc, &box_rect);
+ if (checkbox->status_down == RTGUI_CHECKBOX_STATUS_CHECKED)
+ {
+ rtgui_color_t save;
+
+ save = RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(checkbox));
+
+ /* swap fore/back color */
+ RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(checkbox)) = RTGUI_WIDGET_FOREGROUND(RTGUI_WIDGET(checkbox));
+
+ rtgui_rect_inflate(&box_rect, -2);
+ rtgui_dc_fill_rect(dc, &box_rect);
+
+ /* restore saved color */
+ RTGUI_WIDGET_BACKGROUND(RTGUI_WIDGET(checkbox)) = save;
+ }
+
+ /* draw text */
+ rect.x1 += rtgui_rect_height(rect) - 4 + 5;
+ rtgui_dc_draw_text(dc, rtgui_label_get_text(RTGUI_LABEL(checkbox)), &rect);
+
+ /* end drawing */
+ rtgui_dc_end_drawing(dc);
+
+ return;
+}
+
+void rtgui_theme_draw_slider(struct rtgui_slider* slider)
+{
+ /* draw button */
+ struct rtgui_dc* dc;
+ int i, xsize, x0;
+ rtgui_rect_t r, focus_rect, slider_rect, slot_rect;
+
+ /* begin drawing */
+ dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(slider));
+ if (dc == RT_NULL) return;
+
+ /* get widget rect */
+ rtgui_widget_get_rect(RTGUI_WIDGET(slider), &focus_rect);
+ /* fill widget rect with background color */
+ rtgui_dc_fill_rect(dc, &focus_rect);
+ r = focus_rect;
+
+ if (slider->orient == RTGUI_VERTICAL)
+ {
+ rtgui_rect_inflate(&r, -1);
+ xsize = r.y2 - r.y1 + 1 - slider->thumb_width;
+ x0 = r.y1 + slider->thumb_width / 2;
+
+ /* calculate thumb position */
+ slider_rect = r;
+ slider_rect.x1 = 5;
+ slider_rect.y1 = x0 + xsize * (slider->value - slider->min) / (slider->max - slider->min) - slider->thumb_width/2;
+ slider_rect.y2 = slider_rect.y1 + slider->thumb_width;
+
+ /* calculate slot position */
+ slot_rect.y1 = x0;
+ slot_rect.y2 = x0 + xsize;
+ slot_rect.x1 = (slider_rect.x1 + slider_rect.x2) /2 -1;
+ slot_rect.x2 = slot_rect.x1 +3;
+ /* draw slot */
+ rtgui_dc_draw_border(dc, &slot_rect, RTGUI_BORDER_RAISE);
+
+ /* draw the ticks */
+ for (i = 0; i <= slider->ticks; i++)
+ {
+ int x = x0 + xsize * i / slider->ticks;
+ rtgui_dc_draw_hline(dc, 1, 3, x);
+ }
+
+ /* draw the thumb */
+ rtgui_dc_fill_rect(dc, &slider_rect);
+ rtgui_dc_draw_border(dc, &slider_rect, RTGUI_BORDER_RAISE);
+ }
+ else
+ {
+ rtgui_rect_inflate(&r, -1);
+ xsize = r.x2 - r.x1 + 1 - slider->thumb_width;
+ x0 = r.x1 + slider->thumb_width / 2;
+
+ /* calculate thumb position */
+ slider_rect = r;
+ slider_rect.y1 = 5;
+ slider_rect.x1 = x0 + xsize * (slider->value - slider->min) / (slider->max - slider->min) - slider->thumb_width/2;
+ slider_rect.x2 = slider_rect.x1 + slider->thumb_width;
+
+ /* calculate slot position */
+ slot_rect.x1 = x0;
+ slot_rect.x2 = x0 + xsize;
+ slot_rect.y1 = (slider_rect.y1 + slider_rect.y2) /2 -1;
+ slot_rect.y2 = slot_rect.y1 +3;
+ /* draw slot */
+ rtgui_dc_draw_border(dc, &slot_rect, RTGUI_BORDER_RAISE);
+
+ /* draw the ticks */
+ for (i = 0; i <= slider->ticks; i++)
+ {
+ int x = x0 + xsize * i / slider->ticks;
+ rtgui_dc_draw_vline(dc, x, 1, 3);
+ }
+
+ /* draw the thumb */
+ rtgui_dc_fill_rect(dc, &slider_rect);
+ rtgui_dc_draw_border(dc, &slider_rect, RTGUI_BORDER_RAISE);
+ }
+
+ /* draw focus */
+ if (RTGUI_WIDGET_IS_FOCUSED(RTGUI_WIDGET(slider)))
+ {
+ rtgui_dc_draw_focus_rect(dc, &focus_rect);
+ }
+
+ /* end drawing */
+ rtgui_dc_end_drawing(dc);
+ return;
+}
+
+
+void rtgui_theme_draw_progressbar(struct rtgui_progressbar* bar)
+{
+ /* draw progress bar */
+ struct rtgui_dc* dc;
+ struct rtgui_rect rect;
+ int max = bar->range;
+ int pos = bar->position;
+ int left;
+
+ /* begin drawing */
+ dc = rtgui_dc_begin_drawing(&(bar->parent));
+ if (dc == RT_NULL) return;
+
+ rtgui_widget_get_rect(&(bar->parent), &rect);
+
+ /* fill button rect with background color */
+ bar->parent.gc.background = RTGUI_RGB(212, 208, 200);
+ rtgui_dc_fill_rect(dc, &rect);
+
+ /* draw border */
+ bar->parent.gc.foreground = RTGUI_RGB(128, 128, 128);
+ rtgui_dc_draw_hline(dc, rect.x1, rect.x2 - 1, rect.y1);
+ rtgui_dc_draw_vline(dc, rect.x1, rect.y1, rect.y2 - 1);
+ bar->parent.gc.foreground = RTGUI_RGB(64, 64, 64);
+ rtgui_dc_draw_hline(dc, rect.x1, rect.x2, rect.y1 + 1);
+ rtgui_dc_draw_vline(dc, rect.x1 + 1, rect.y1, rect.y2);
+
+ bar->parent.gc.foreground = RTGUI_RGB(212, 208, 200);
+ rtgui_dc_draw_hline(dc, rect.x1, rect.x2 + 1, rect.y2);
+ rtgui_dc_draw_vline(dc, rect.x2, rect.y1, rect.y2);
+
+ bar->parent.gc.foreground = RTGUI_RGB(255, 255, 255);
+ rtgui_dc_draw_hline(dc, rect.x1 + 1, rect.x2, rect.y2 - 1);
+ rtgui_dc_draw_vline(dc, rect.x2 - 1, rect.y1 + 1, rect.y2 - 1);
+
+ /* Nothing to draw */
+ if (max == 0)
+ {
+ rtgui_dc_end_drawing(dc);
+ return;
+ }
+
+ left = max - pos;
+ rtgui_rect_inflate(&rect, -2);
+ bar->parent.gc.background = RTGUI_RGB(0, 0, 255);
+
+ if (bar->orientation == RTGUI_VERTICAL)
+ {
+ /* Vertical bar grows from bottom to top */
+ int dy = (rtgui_rect_height(rect) * left) / max;
+ rect.y1 += dy;
+ rtgui_dc_fill_rect(dc, &rect);
+ }
+ else
+ {
+ /* Horizontal bar grows from left to right */
+ rect.x2 -= (rtgui_rect_width(rect) * left) / max;
+ rtgui_dc_fill_rect(dc, &rect);
+ }
+
+ /* end drawing */
+ rtgui_dc_end_drawing(dc);
+ return;
+}
+
+void rtgui_theme_draw_staticline(struct rtgui_staticline* staticline)
+{
+ struct rtgui_dc* dc;
+ struct rtgui_rect rect;
+
+ /* begin drawing */
+ dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(staticline));
+ if (dc == RT_NULL) return ;
+ rtgui_widget_get_rect(RTGUI_WIDGET(staticline), &rect);
+
+ if (staticline->orientation == RTGUI_HORIZONTAL)
+ {
+ rtgui_dc_draw_horizontal_line(dc, rect.x1, rect.x2, rect.y1);
+ }
+ else
+ {
+ rtgui_dc_draw_vertical_line(dc, rect.x1, rect.y1, rect.y2);
+ }
+
+ rtgui_dc_end_drawing(dc);
+}
+
rt_uint16_t rtgui_theme_get_selected_height()
{
return SELECTED_HEIGHT;