block_panel.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #include <rtgui/dc.h>
  2. #include "block_panel.h"
  3. static void dc_render_block(struct rtgui_dc* dc, struct rtgui_rect *rect, int angle_y)
  4. {
  5. #define BLOCK_BORDER_SZ 5
  6. #define BLOCK_ANGLE_SZ 10
  7. int rect_y[12];
  8. int rect_x[12];
  9. int ri = 0;
  10. rtgui_color_t line_color = RTGUI_RGB(215, 215, 215);
  11. // rtgui_color_t external_color = RTGUI_RGB(241, 241, 241);
  12. // rtgui_color_t angle_color = RTGUI_RGB(229, 229, 229);
  13. rtgui_color_t fg, bg;
  14. struct rtgui_gc *gc;
  15. rect_x[ri] = rect->x1 + BLOCK_ANGLE_SZ + 3; rect_y[ri] = rect->y1 + BLOCK_BORDER_SZ; ri ++;
  16. rect_x[ri] = rect->x2 - BLOCK_BORDER_SZ - 3; rect_y[ri] = rect->y1 + BLOCK_BORDER_SZ; ri ++;
  17. rect_x[ri] = rect->x2 - BLOCK_BORDER_SZ; rect_y[ri] = rect->y1 + BLOCK_BORDER_SZ + 3; ri ++;
  18. rect_x[ri] = rect->x2 - BLOCK_BORDER_SZ; rect_y[ri] = rect->y2 - BLOCK_BORDER_SZ - 3; ri ++;
  19. rect_x[ri] = rect->x2 - BLOCK_BORDER_SZ - 3; rect_y[ri] = rect->y2 - BLOCK_BORDER_SZ; ri ++;
  20. rect_x[ri] = rect->x1 + BLOCK_ANGLE_SZ + 3; rect_y[ri] = rect->y2 - BLOCK_BORDER_SZ; ri ++;
  21. rect_x[ri] = rect->x1 + BLOCK_ANGLE_SZ ; rect_y[ri] = rect->y2 - BLOCK_BORDER_SZ - 3; ri ++;
  22. /* angle */
  23. rect_x[ri] = rect->x1 + BLOCK_ANGLE_SZ ; rect_y[ri] = angle_y + BLOCK_ANGLE_SZ; ri ++;
  24. rect_x[ri] = rect->x1; rect_y[ri] = angle_y; ri ++;
  25. rect_x[ri] = rect->x1 + BLOCK_ANGLE_SZ ; rect_y[ri] = angle_y - BLOCK_ANGLE_SZ; ri ++;
  26. rect_x[ri] = rect->x1 + BLOCK_ANGLE_SZ ; rect_y[ri] = rect->y1 + BLOCK_BORDER_SZ + 3; ri ++;
  27. rect_x[ri] = rect->x1 + BLOCK_ANGLE_SZ + 3; rect_y[ri] = rect->y1 + BLOCK_BORDER_SZ; ri ++;
  28. gc = rtgui_dc_get_gc(dc);
  29. fg = gc->foreground;
  30. bg = gc->background;
  31. gc->foreground = white;
  32. rtgui_dc_fill_polygon(dc, rect_x, rect_y, 12);
  33. gc->foreground = line_color;
  34. rtgui_dc_draw_polygon(dc, rect_x, rect_y, 12);
  35. gc->foreground = fg;
  36. gc->background = bg;
  37. }
  38. static void _block_panel_constructor(block_panel_t *panel)
  39. {
  40. /* init widget and set event handler */
  41. rtgui_object_set_event_handler(RTGUI_OBJECT(panel), block_panel_event_handler);
  42. /* set field */
  43. panel->angle_y = 10;
  44. }
  45. DEFINE_CLASS_TYPE(block_panel, "block_panel",
  46. RTGUI_PANEL_TYPE,
  47. _block_panel_constructor,
  48. RT_NULL,
  49. sizeof(struct block_panel));
  50. struct block_panel *block_panel_create(int angle_y, struct rtgui_rect *rect)
  51. {
  52. struct block_panel* panel;
  53. panel = (struct block_panel*) rtgui_widget_create(BLOCK_PANEL_TYPE);
  54. if (panel != RT_NULL)
  55. {
  56. panel->angle_y = angle_y;
  57. rtgui_widget_set_rect(RTGUI_WIDGET(panel), rect);
  58. rtgui_object_set_event_handler(RTGUI_OBJECT(panel), block_panel_event_handler);
  59. }
  60. return panel;
  61. }
  62. void block_panel_destroy(block_panel_t* panel)
  63. {
  64. rtgui_object_destroy(RTGUI_OBJECT(panel));
  65. }
  66. rt_bool_t block_panel_event_handler(struct rtgui_object* object, struct rtgui_event* event)
  67. {
  68. struct block_panel *panel;
  69. panel = BLOCK_PANEL(object);
  70. if (event->type == RTGUI_EVENT_PAINT)
  71. {
  72. struct rtgui_dc* dc;
  73. struct rtgui_rect rect;
  74. rtgui_widget_get_rect(RTGUI_WIDGET(object), &rect);
  75. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(object));
  76. rtgui_dc_fill_rect(dc, &rect);
  77. rtgui_rect_inflate(&rect, - 3);
  78. dc_render_block(dc, &rect, panel->angle_y);
  79. /* paint on each child */
  80. rtgui_container_dispatch_event(RTGUI_CONTAINER(panel), event);
  81. rtgui_dc_end_drawing(dc);
  82. }
  83. else
  84. {
  85. return rtgui_panel_event_handler(object, event);
  86. }
  87. return RT_FALSE;
  88. }
  89. void block_panel_get_client_extent(struct block_panel *panel, struct rtgui_rect *rect)
  90. {
  91. RT_ASSERT(panel != RT_NULL);
  92. RT_ASSERT(rect != RT_NULL);
  93. rtgui_widget_get_extent(RTGUI_WIDGET(panel), rect);
  94. rect->x1 += 20; rect->y1 += 10;
  95. rect->x2 -= 10; rect->y2 -= 10;
  96. }