digtube.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /*
  2. * File : digfont.c
  3. * This file is part of RT-Thread RTOS
  4. * COPYRIGHT (C) 2006 - 2012, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2012-12-21 pife first version
  13. */
  14. #include <rtgui/dc.h>
  15. #include <rtgui/widgets/digtube.h>
  16. static void _rtgui_digtube_constructor(struct rtgui_digtube * digtube)
  17. {
  18. RTGUI_WIDGET_TEXTALIGN(digtube) = RTGUI_ALIGN_CENTER;
  19. /* init widget and set event handler */
  20. rtgui_object_set_event_handler(RTGUI_OBJECT(digtube), rtgui_digtube_event_handler);
  21. }
  22. static void _rtgui_digtube_destructor(struct rtgui_digtube *digtube)
  23. {
  24. #ifndef RTGUI_DIGTUBE_USE_CONST_FONT
  25. /* release font memory */
  26. rt_free(digtube->digitfont.data);
  27. digtube->digitfont.data = RT_NULL;
  28. #endif
  29. }
  30. DEFINE_CLASS_TYPE(digtube, "digtube",
  31. RTGUI_WIDGET_TYPE,
  32. _rtgui_digtube_constructor,
  33. _rtgui_digtube_destructor,
  34. sizeof(struct rtgui_digtube));
  35. rt_bool_t rtgui_digtube_event_handler(struct rtgui_object *object, struct rtgui_event *event)
  36. {
  37. struct rtgui_digtube *digtube;
  38. struct rtgui_dc *dc;
  39. rtgui_rect_t rect;
  40. rtgui_rect_t text_rect;
  41. rtgui_color_t color;
  42. char * disbuf;
  43. char tempbuf[8];
  44. int i;
  45. RTGUI_WIDGET_EVENT_HANDLER_PREPARE
  46. digtube = RTGUI_DIGTUBE(object);
  47. switch (event->type)
  48. {
  49. case RTGUI_EVENT_PAINT:
  50. dc = rtgui_dc_begin_drawing(RTGUI_WIDGET(object));
  51. if (dc == RT_NULL)
  52. break;
  53. rtgui_widget_get_rect(RTGUI_WIDGET(object), &rect);
  54. rtgui_dc_fill_rect(dc, &rect);
  55. if (! (digtube->tube_style & RTGUI_DIGTUBE_STYLE_NOBACKFONT))
  56. {
  57. color = RTGUI_DC_BC(dc);
  58. RTGUI_DC_BC(dc) = digtube->digit_bc;
  59. }
  60. if (digtube->tube_style & RTGUI_DIGTUBE_STYLE_DISCODES)
  61. disbuf = (char *) (digtube->value);
  62. else
  63. {
  64. const char * format =
  65. digtube->tube_style & RTGUI_DIGTUBE_STYLE_DISHEXNUM ?
  66. "%7x" : "%7d";
  67. disbuf = &tempbuf[0];
  68. rt_snprintf(disbuf, 8, format, digtube->value);
  69. /* */
  70. for (i=0; i<7; i++)
  71. {
  72. if (disbuf[i] == ' ')
  73. disbuf[i] = 0;
  74. else
  75. {
  76. disbuf[i] = (disbuf[i] >= '0' && disbuf[i] <= '9') ? disbuf[i] - '0':
  77. disbuf[i] - 'a' + 10;
  78. disbuf[i] = digtube_code_table[disbuf[i]];
  79. }
  80. }
  81. disbuf = tempbuf + 7 - digtube->tube_count;
  82. }
  83. text_rect.x1 = 0;
  84. text_rect.y1 = 0;
  85. text_rect.x2 = (digtube->digit_width + digtube->digit_space) * digtube->tube_count
  86. -digtube->digit_space;
  87. text_rect.y2 = digtube->digit_hight;
  88. rtgui_rect_moveto_align(&rect, &text_rect, RTGUI_DC_TEXTALIGN(dc));
  89. for (i=0; i<digtube->tube_count; i++)
  90. {
  91. rtgui_dc_draw_digitfont_code(dc, &digtube->digitfont, &text_rect, disbuf[i]);
  92. text_rect.x1 += digtube->digit_width + digtube->digit_space;
  93. }
  94. if (! (digtube->tube_style & RTGUI_DIGTUBE_STYLE_NOBACKFONT))
  95. RTGUI_DC_BC(dc) = color;
  96. rtgui_dc_end_drawing(dc);
  97. break;
  98. default:
  99. return rtgui_widget_event_handler(object, event);
  100. }
  101. return RT_FALSE;
  102. }
  103. rtgui_digtube_t *rtgui_digtube_create(
  104. struct rtgui_digitfont * digitfont,
  105. int count,
  106. void * value,
  107. int style)
  108. {
  109. struct rtgui_digtube *digtube;
  110. rtgui_rect_t rect;
  111. RT_ASSERT(count <= 7 && count > 0)
  112. digtube = (struct rtgui_digtube *) rtgui_widget_create(RTGUI_DIGTUBE_TYPE);
  113. if (digtube == RT_NULL)
  114. return RT_NULL;
  115. /* set field */
  116. if (digitfont == RT_NULL)
  117. digitfont = &digitfont_40;
  118. rt_memcpy(& digtube->digitfont, digitfont, sizeof(struct rtgui_digitfont));
  119. #ifndef RTGUI_DIGTUBE_USE_CONST_FONT
  120. if (digtube->digitfont.data == RT_NULL)
  121. rtgui_digitfont_create(& digtube->digitfont);
  122. #endif
  123. /* set default rect */
  124. rtgui_get_digfont_metrics(&digtube->digitfont, &rect);
  125. digtube->digit_width = rect.x2;
  126. digtube->digit_hight = rect.y2;
  127. digtube->tube_count = count;
  128. digtube->digit_space = RTGUI_DIGTUBE_DEFAULT_SPACE;
  129. rect.x2 = (rect.x2 + digtube->digit_space) * count - digtube->digit_space;
  130. rect.y2 = rect.y2;
  131. RTGUI_WIDGET_BACKGROUND(digtube) = rtgui_theme_default_bc();
  132. RTGUI_WIDGET_FOREGROUND(digtube) = RTGUI_DIGTUBE_DEFAULT_FC;
  133. rtgui_widget_set_rect(RTGUI_WIDGET(digtube), &rect);
  134. /* set display value */
  135. digtube->digit_bc = RTGUI_DIGTUBE_DEFAULT_DIGIT_BC;
  136. digtube->value = value;
  137. digtube->tube_style = style;
  138. return digtube;
  139. }
  140. void rtgui_digtube_destroy(rtgui_digtube_t *digtube)
  141. {
  142. rtgui_widget_destroy(RTGUI_WIDGET(digtube));
  143. }