123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- #include <rtgui/dc.h>
- #include "block_panel.h"
- static void dc_render_block(struct rtgui_dc* dc, struct rtgui_rect *rect, int angle_y)
- {
- #define BLOCK_BORDER_SZ 5
- #define BLOCK_ANGLE_SZ 10
- int rect_y[12];
- int rect_x[12];
- int ri = 0;
- rtgui_color_t line_color = RTGUI_RGB(215, 215, 215);
- // rtgui_color_t external_color = RTGUI_RGB(241, 241, 241);
- // rtgui_color_t angle_color = RTGUI_RGB(229, 229, 229);
- rtgui_color_t fg, bg;
- struct rtgui_gc *gc;
- rect_x[ri] = rect->x1 + BLOCK_ANGLE_SZ + 3; rect_y[ri] = rect->y1 + BLOCK_BORDER_SZ; ri ++;
- rect_x[ri] = rect->x2 - BLOCK_BORDER_SZ - 3; rect_y[ri] = rect->y1 + BLOCK_BORDER_SZ; ri ++;
- rect_x[ri] = rect->x2 - BLOCK_BORDER_SZ; rect_y[ri] = rect->y1 + BLOCK_BORDER_SZ + 3; ri ++;
- rect_x[ri] = rect->x2 - BLOCK_BORDER_SZ; rect_y[ri] = rect->y2 - BLOCK_BORDER_SZ - 3; ri ++;
- rect_x[ri] = rect->x2 - BLOCK_BORDER_SZ - 3; rect_y[ri] = rect->y2 - BLOCK_BORDER_SZ; ri ++;
- rect_x[ri] = rect->x1 + BLOCK_ANGLE_SZ + 3; rect_y[ri] = rect->y2 - BLOCK_BORDER_SZ; ri ++;
- rect_x[ri] = rect->x1 + BLOCK_ANGLE_SZ ; rect_y[ri] = rect->y2 - BLOCK_BORDER_SZ - 3; ri ++;
- /* angle */
- rect_x[ri] = rect->x1 + BLOCK_ANGLE_SZ ; rect_y[ri] = angle_y + BLOCK_ANGLE_SZ; ri ++;
- rect_x[ri] = rect->x1; rect_y[ri] = angle_y; ri ++;
- rect_x[ri] = rect->x1 + BLOCK_ANGLE_SZ ; rect_y[ri] = angle_y - BLOCK_ANGLE_SZ; ri ++;
- rect_x[ri] = rect->x1 + BLOCK_ANGLE_SZ ; rect_y[ri] = rect->y1 + BLOCK_BORDER_SZ + 3; ri ++;
- rect_x[ri] = rect->x1 + BLOCK_ANGLE_SZ + 3; rect_y[ri] = rect->y1 + BLOCK_BORDER_SZ; ri ++;
- gc = rtgui_dc_get_gc(dc);
- fg = gc->foreground;
- bg = gc->background;
- gc->foreground = white;
- rtgui_dc_fill_polygon(dc, rect_x, rect_y, 12);
- gc->foreground = line_color;
- rtgui_dc_draw_polygon(dc, rect_x, rect_y, 12);
- gc->foreground = fg;
- gc->background = bg;
- }
- static void _block_panel_constructor(block_panel_t *panel)
- {
- /* init widget and set event handler */
- rtgui_object_set_event_handler(RTGUI_OBJECT(panel), block_panel_event_handler);
- /* set field */
- panel->angle_y = 10;
- }
- DEFINE_CLASS_TYPE(block_panel, "block_panel",
- RTGUI_PANEL_TYPE,
- _block_panel_constructor,
- RT_NULL,
- sizeof(struct block_panel));
- struct block_panel *block_panel_create(int angle_y, struct rtgui_rect *rect)
- {
- struct block_panel* panel;
- panel = (struct block_panel*) rtgui_widget_create(BLOCK_PANEL_TYPE);
- if (panel != RT_NULL)
- {
- panel->angle_y = angle_y;
- rtgui_widget_set_rect(RTGUI_WIDGET(panel), rect);
- rtgui_object_set_event_handler(RTGUI_OBJECT(panel), block_panel_event_handler);
- }
- return panel;
- }
- void block_panel_destroy(block_panel_t* panel)
- {
- rtgui_object_destroy(RTGUI_OBJECT(panel));
- }
- rt_bool_t block_panel_event_handler(struct rtgui_object* object, struct rtgui_event* event)
- {
- struct block_panel *panel;
- panel = BLOCK_PANEL(object);
- if (event->type == RTGUI_EVENT_PAINT)
- {
- struct rtgui_dc* dc;
- struct rtgui_rect rect;
- rtgui_widget_get_rect(RTGUI_WIDGET(object), &rect);
- dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(object));
- rtgui_dc_fill_rect(dc, &rect);
- rtgui_rect_inflate(&rect, - 3);
- dc_render_block(dc, &rect, panel->angle_y);
- /* paint on each child */
- rtgui_container_dispatch_event(RTGUI_CONTAINER(panel), event);
- rtgui_dc_end_drawing(dc);
- }
- else
- {
- return rtgui_panel_event_handler(object, event);
- }
- return RT_FALSE;
- }
- void block_panel_get_client_extent(struct block_panel *panel, struct rtgui_rect *rect)
- {
- RT_ASSERT(panel != RT_NULL);
- RT_ASSERT(rect != RT_NULL);
- rtgui_widget_get_extent(RTGUI_WIDGET(panel), rect);
- rect->x1 += 20; rect->y1 += 10;
- rect->x2 -= 10; rect->y2 -= 10;
- }
|