ScrollableContainerWidget.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /*
  2. * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibGUI/Layout.h>
  7. #include <LibGUI/ScrollableContainerWidget.h>
  8. namespace GUI {
  9. ScrollableContainerWidget::ScrollableContainerWidget()
  10. {
  11. }
  12. ScrollableContainerWidget::~ScrollableContainerWidget()
  13. {
  14. }
  15. void ScrollableContainerWidget::did_scroll()
  16. {
  17. AbstractScrollableWidget::did_scroll();
  18. update_widget_position();
  19. }
  20. void ScrollableContainerWidget::update_widget_position()
  21. {
  22. if (!m_widget)
  23. return;
  24. m_widget->move_to(-horizontal_scrollbar().value(), -vertical_scrollbar().value());
  25. }
  26. void ScrollableContainerWidget::update_widget_size()
  27. {
  28. if (!m_widget)
  29. return;
  30. m_widget->do_layout();
  31. if (m_widget->is_shrink_to_fit() && m_widget->layout()) {
  32. auto new_size = frame_inner_rect().size();
  33. auto preferred_size = m_widget->layout()->preferred_size();
  34. if (preferred_size.width() != -1)
  35. new_size.set_width(preferred_size.width());
  36. if (preferred_size.height() != -1)
  37. new_size.set_height(preferred_size.height());
  38. m_widget->resize(new_size);
  39. set_content_size(new_size);
  40. }
  41. }
  42. void ScrollableContainerWidget::resize_event(GUI::ResizeEvent& event)
  43. {
  44. AbstractScrollableWidget::resize_event(event);
  45. update_widget_position();
  46. update_widget_size();
  47. }
  48. void ScrollableContainerWidget::set_widget(GUI::Widget* widget)
  49. {
  50. if (m_widget == widget)
  51. return;
  52. if (m_widget)
  53. remove_child(*m_widget);
  54. m_widget = widget;
  55. if (m_widget) {
  56. add_child(*m_widget);
  57. m_widget->move_to_back();
  58. }
  59. update_widget_size();
  60. update_widget_position();
  61. }
  62. }