StylePainter.cpp 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #include <SharedGraphics/StylePainter.h>
  2. #include <LibGUI/GPainter.h>
  3. static void paint_button_new(Painter& painter, const Rect& rect, bool pressed, bool checked, bool hovered, bool enabled)
  4. {
  5. Color button_color = Color::from_rgb(0xc0c0c0);
  6. Color highlight_color2 = Color::from_rgb(0xdfdfdf);
  7. Color shadow_color1 = Color::from_rgb(0x808080);
  8. Color shadow_color2 = Color::from_rgb(0x404040);
  9. if (checked && enabled) {
  10. if (hovered)
  11. button_color = Color::from_rgb(0xe3dfdb);
  12. else
  13. button_color = Color::from_rgb(0xd6d2ce);
  14. } else if (hovered && enabled)
  15. button_color = Color::from_rgb(0xd4d4d4);
  16. PainterStateSaver saver(painter);
  17. painter.translate(rect.location());
  18. if (pressed || checked) {
  19. // Base
  20. painter.fill_rect({ 1, 1, rect.width() - 2, rect.height() - 2 }, button_color);
  21. painter.draw_rect({ { }, rect.size() }, shadow_color2);
  22. // Sunken shadow
  23. painter.draw_line({ 1, 1 }, { rect.width() - 2, 1 }, shadow_color1);
  24. painter.draw_line({ 1, 2 }, {1, rect.height() - 2 }, shadow_color1);
  25. } else {
  26. // Base
  27. painter.fill_rect({ 1, 1, rect.width() - 3, rect.height() - 3 }, button_color);
  28. // Outer highlight
  29. painter.draw_line({ 0, 0 }, { rect.width() - 2, 0 }, highlight_color2);
  30. painter.draw_line({ 0, 1 }, { 0, rect.height() - 2 }, highlight_color2);
  31. #if 0
  32. // Inner highlight (this looks "too thick" to me right now..)
  33. Color highlight_color1 = Color::from_rgb(0xffffff);
  34. painter.draw_line({ 1, 1 }, { rect.width() - 3, 1 }, highlight_color1);
  35. painter.draw_line({ 1, 2 }, { 1, rect.height() - 3 }, highlight_color1);
  36. #endif
  37. // Outer shadow
  38. painter.draw_line({ 0, rect.height() - 1 }, { rect.width() - 1, rect.height() - 1 }, shadow_color2);
  39. painter.draw_line({ rect.width() - 1, 0 }, { rect.width() - 1, rect.height() - 2 }, shadow_color2);
  40. // Inner shadow
  41. painter.draw_line({ 1, rect.height() - 2 }, { rect.width() - 2, rect.height() - 2 }, shadow_color1);
  42. painter.draw_line({ rect.width() - 2, 1 }, { rect.width() - 2, rect.height() - 3 }, shadow_color1);
  43. }
  44. }
  45. void StylePainter::paint_button(Painter& painter, const Rect& rect, ButtonStyle button_style, bool pressed, bool hovered, bool checked, bool enabled)
  46. {
  47. if (button_style == ButtonStyle::Normal)
  48. return paint_button_new(painter, rect, pressed, checked, hovered, enabled);
  49. Color button_color = checked ? Color::from_rgb(0xd6d2ce) : Color::LightGray;
  50. Color highlight_color = Color::White;
  51. Color shadow_color = Color(96, 96, 96);
  52. if (button_style == ButtonStyle::OldNormal)
  53. painter.draw_rect(rect, Color::Black);
  54. if (button_style == ButtonStyle::CoolBar && !enabled)
  55. return;
  56. PainterStateSaver saver(painter);
  57. painter.translate(rect.location());
  58. if (pressed || checked) {
  59. // Base
  60. painter.fill_rect({ 1, 1, rect.width() - 2, rect.height() - 2 }, button_color);
  61. // Sunken shadow
  62. painter.draw_line({ 1, 1 }, { rect.width() - 2, 1 }, shadow_color);
  63. painter.draw_line({ 1, 2 }, {1, rect.height() - 2 }, shadow_color);
  64. // Bottom highlight
  65. painter.draw_line({ rect.width() - 2, 1 }, { rect.width() - 2, rect.height() - 3 }, highlight_color);
  66. painter.draw_line({ 1, rect.height() - 2 }, { rect.width() - 2, rect.height() - 2 }, highlight_color);
  67. } else if (button_style == ButtonStyle::OldNormal || (button_style == ButtonStyle::CoolBar && hovered)) {
  68. // Base
  69. painter.fill_rect({ 1, 1, rect.width() - 2, rect.height() - 2 }, button_color);
  70. // White highlight
  71. painter.draw_line({ 1, 1 }, { rect.width() - 2, 1 }, highlight_color);
  72. painter.draw_line({ 1, 2 }, { 1, rect.height() - 2 }, highlight_color);
  73. // Gray shadow
  74. painter.draw_line({ rect.width() - 2, 1 }, { rect.width() - 2, rect.height() - 3 }, shadow_color);
  75. painter.draw_line({ 1, rect.height() - 2 }, { rect.width() - 2, rect.height() - 2 }, shadow_color);
  76. }
  77. }
  78. void StylePainter::paint_surface(Painter& painter, const Rect& rect, bool paint_vertical_lines)
  79. {
  80. painter.fill_rect({ rect.x(), rect.y() + 1, rect.width(), rect.height() - 2 }, Color::LightGray);
  81. painter.draw_line(rect.top_left(), rect.top_right(), Color::White);
  82. painter.draw_line(rect.bottom_left(), rect.bottom_right(), Color::MidGray);
  83. if (paint_vertical_lines) {
  84. painter.draw_line(rect.top_left().translated(0, 1), rect.bottom_left().translated(0, -1), Color::White);
  85. painter.draw_line(rect.top_right(), rect.bottom_right().translated(0, -1), Color::MidGray);
  86. }
  87. }
  88. void StylePainter::paint_frame(Painter& painter, const Rect& rect, FrameShape shape, FrameShadow shadow, int thickness, bool skip_vertical_lines)
  89. {
  90. Color top_left_color;
  91. Color bottom_right_color;
  92. Color dark_shade = Color::from_rgb(0x808080);
  93. Color light_shade = Color::from_rgb(0xffffff);
  94. if (shadow == FrameShadow::Raised) {
  95. top_left_color = light_shade;
  96. bottom_right_color = dark_shade;
  97. } else if (shadow == FrameShadow::Sunken) {
  98. top_left_color = dark_shade;
  99. bottom_right_color = light_shade;
  100. } else if (shadow == FrameShadow::Plain) {
  101. top_left_color = dark_shade;
  102. bottom_right_color = dark_shade;
  103. }
  104. if (thickness >= 1) {
  105. painter.draw_line(rect.top_left(), rect.top_right(), top_left_color);
  106. painter.draw_line(rect.bottom_left(), rect.bottom_right(), bottom_right_color);
  107. if (shape != FrameShape::Panel || !skip_vertical_lines) {
  108. painter.draw_line(rect.top_left().translated(0, 1), rect.bottom_left().translated(0, -1), top_left_color);
  109. painter.draw_line(rect.top_right(), rect.bottom_right().translated(0, -1), bottom_right_color);
  110. }
  111. }
  112. if (shape == FrameShape::Container && thickness >= 2) {
  113. Color top_left_color;
  114. Color bottom_right_color;
  115. Color dark_shade = Color::from_rgb(0x404040);
  116. Color light_shade = Color::from_rgb(0xc0c0c0);
  117. if (shadow == FrameShadow::Raised) {
  118. top_left_color = light_shade;
  119. bottom_right_color = dark_shade;
  120. } else if (shadow == FrameShadow::Sunken) {
  121. top_left_color = dark_shade;
  122. bottom_right_color = light_shade;
  123. } else if (shadow == FrameShadow::Plain) {
  124. top_left_color = dark_shade;
  125. bottom_right_color = dark_shade;
  126. }
  127. Rect inner_container_frame_rect = rect.shrunken(2, 2);
  128. painter.draw_line(inner_container_frame_rect.top_left(), inner_container_frame_rect.top_right(), top_left_color);
  129. painter.draw_line(inner_container_frame_rect.bottom_left(), inner_container_frame_rect.bottom_right(), bottom_right_color);
  130. painter.draw_line(inner_container_frame_rect.top_left().translated(0, 1), inner_container_frame_rect.bottom_left().translated(0, -1), top_left_color);
  131. painter.draw_line(inner_container_frame_rect.top_right(), inner_container_frame_rect.bottom_right().translated(0, -1), bottom_right_color);
  132. }
  133. if (shape == FrameShape::Box && thickness >= 2) {
  134. swap(top_left_color, bottom_right_color);
  135. Rect inner_rect = rect.shrunken(2, 2);
  136. painter.draw_line(inner_rect.top_left(), inner_rect.top_right(), top_left_color);
  137. painter.draw_line(inner_rect.bottom_left(), inner_rect.bottom_right(), bottom_right_color);
  138. painter.draw_line(inner_rect.top_left().translated(0, 1), inner_rect.bottom_left().translated(0, -1), top_left_color);
  139. painter.draw_line(inner_rect.top_right(), inner_rect.bottom_right().translated(0, -1), bottom_right_color);
  140. }
  141. }
  142. void StylePainter::paint_menu_frame(Painter& painter, const Rect& rect)
  143. {
  144. Color top_left_color;
  145. Color bottom_right_color;
  146. Color base_color = Color::from_rgb(0xc0c0c0);
  147. Color dark_shade = Color::from_rgb(0x404040);
  148. Color mid_shade = Color::from_rgb(0x808080);
  149. Color light_shade = Color::from_rgb(0xffffff);
  150. painter.draw_line(rect.top_left(), rect.top_right(), base_color);
  151. painter.draw_line(rect.top_left().translated(0, 1), rect.bottom_left(), base_color);
  152. painter.draw_line(rect.top_left().translated(1, 1), rect.top_right().translated(-1, 1), light_shade);
  153. painter.draw_line(rect.top_left().translated(1, 1), rect.bottom_left().translated(1, -1), light_shade);
  154. painter.draw_line(rect.top_right(), rect.bottom_right(), dark_shade);
  155. painter.draw_line(rect.bottom_left(), rect.bottom_right(), dark_shade);
  156. painter.draw_line(rect.top_right().translated(-1, 1), rect.bottom_right().translated(-1, -1), mid_shade);
  157. painter.draw_line(rect.bottom_left().translated(1, -1), rect.bottom_right().translated(-1, -1), mid_shade);
  158. }