ResizeCorner.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibGUI/Painter.h>
  7. #include <LibGUI/ResizeCorner.h>
  8. #include <LibGUI/Window.h>
  9. #include <LibGfx/CharacterBitmap.h>
  10. #include <LibGfx/Palette.h>
  11. namespace GUI {
  12. static const char* s_resize_corner_shadows_data = {
  13. " "
  14. " ## "
  15. " # "
  16. " "
  17. " ## ## "
  18. " # # "
  19. " "
  20. " ## ## ## "
  21. " # # # "
  22. " "
  23. " ## ## ## ## "
  24. " # # # # "
  25. " "
  26. " ## ## ## ## ## "
  27. " # # # # # "
  28. " "
  29. };
  30. static const char* s_resize_corner_highlights_data = {
  31. " "
  32. " "
  33. " # "
  34. " "
  35. " "
  36. " # # "
  37. " "
  38. " "
  39. " # # # "
  40. " "
  41. " "
  42. " # # # # "
  43. " "
  44. " "
  45. " # # # # # "
  46. " "
  47. };
  48. static Gfx::CharacterBitmap* s_resize_corner_shadows_bitmap;
  49. static Gfx::CharacterBitmap* s_resize_corner_highlights_bitmap;
  50. static const int s_resize_corner_bitmap_width = 16;
  51. static const int s_resize_corner_bitmap_height = 16;
  52. ResizeCorner::ResizeCorner()
  53. {
  54. set_override_cursor(Gfx::StandardCursor::ResizeDiagonalTLBR);
  55. set_background_role(ColorRole::Button);
  56. set_fixed_size(16, 18);
  57. }
  58. ResizeCorner::~ResizeCorner()
  59. {
  60. }
  61. void ResizeCorner::paint_event(PaintEvent& event)
  62. {
  63. Painter painter(*this);
  64. painter.add_clip_rect(event.rect());
  65. painter.fill_rect(rect(), palette().color(background_role()));
  66. if (!s_resize_corner_shadows_bitmap)
  67. s_resize_corner_shadows_bitmap = &Gfx::CharacterBitmap::create_from_ascii(s_resize_corner_shadows_data, s_resize_corner_bitmap_width, s_resize_corner_bitmap_height).leak_ref();
  68. painter.draw_bitmap({ 0, 2 }, *s_resize_corner_shadows_bitmap, palette().threed_shadow1());
  69. if (!s_resize_corner_highlights_bitmap)
  70. s_resize_corner_highlights_bitmap = &Gfx::CharacterBitmap::create_from_ascii(s_resize_corner_highlights_data, s_resize_corner_bitmap_width, s_resize_corner_bitmap_height).leak_ref();
  71. painter.draw_bitmap({ 0, 2 }, *s_resize_corner_highlights_bitmap, palette().threed_highlight());
  72. Widget::paint_event(event);
  73. }
  74. void ResizeCorner::mousedown_event(MouseEvent& event)
  75. {
  76. if (event.button() == MouseButton::Primary)
  77. window()->start_interactive_resize();
  78. Widget::mousedown_event(event);
  79. }
  80. }