DoubleClickArrowWidget.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2021, Mathias Jakobsen <mathias@jbcoding.com>
  4. * Copyright (c) 2022, the SerenityOS developers.
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause
  7. */
  8. #include "DoubleClickArrowWidget.h"
  9. #include <LibGUI/Painter.h>
  10. #include <LibGfx/Font/Font.h>
  11. REGISTER_WIDGET(MouseSettings, DoubleClickArrowWidget);
  12. namespace MouseSettings {
  13. void DoubleClickArrowWidget::set_double_click_speed(int speed)
  14. {
  15. if (m_double_click_speed == speed)
  16. return;
  17. m_double_click_speed = speed;
  18. update();
  19. }
  20. DoubleClickArrowWidget::DoubleClickArrowWidget()
  21. {
  22. m_arrow_bitmap = Gfx::Bitmap::load_from_file("/res/graphics/double-click-down-arrow.png"sv).release_value_but_fixme_should_propagate_errors();
  23. }
  24. void DoubleClickArrowWidget::paint_event(GUI::PaintEvent& event)
  25. {
  26. GUI::Painter painter(*this);
  27. painter.add_clip_rect(event.rect());
  28. auto bottom_arrow_rect = m_arrow_bitmap->rect().centered_within(rect()).translated(0, m_arrow_bitmap->height() / 2);
  29. painter.blit_filtered(bottom_arrow_rect.location(), *m_arrow_bitmap, m_arrow_bitmap->rect(), [&](Color color) {
  30. return m_inverted ? color.inverted() : color;
  31. });
  32. auto top_arrow_rect = bottom_arrow_rect;
  33. top_arrow_rect.translate_by(0, -(m_double_click_speed / 50));
  34. painter.blit_filtered(top_arrow_rect.location(), *m_arrow_bitmap, m_arrow_bitmap->rect(), [&](Color color) {
  35. return m_inverted ? color.inverted() : color;
  36. });
  37. auto text_rect = rect();
  38. text_rect.set_y(bottom_arrow_rect.bottom() - 1);
  39. text_rect.set_height(font().pixel_size_rounded_up());
  40. }
  41. void DoubleClickArrowWidget::mousedown_event(GUI::MouseEvent&)
  42. {
  43. auto double_click_in_progress = m_double_click_timer.is_valid();
  44. auto elapsed_ms = double_click_in_progress ? m_double_click_timer.elapsed() : 0;
  45. if (!double_click_in_progress || elapsed_ms > m_double_click_speed) {
  46. m_double_click_timer.start();
  47. return;
  48. }
  49. dbgln("Double-click in {}ms", elapsed_ms);
  50. m_inverted = !m_inverted;
  51. update();
  52. m_double_click_timer.reset();
  53. }
  54. }