StackWidget.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2022, the SerenityOS developers.
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #include <LibGUI/BoxLayout.h>
  8. #include <LibGUI/StackWidget.h>
  9. #include <LibGUI/Window.h>
  10. REGISTER_WIDGET(GUI, StackWidget);
  11. namespace GUI {
  12. void StackWidget::set_active_widget(Widget* widget)
  13. {
  14. if (widget == m_active_widget)
  15. return;
  16. bool active_widget_had_focus = m_active_widget && m_active_widget->has_focus_within();
  17. if (m_active_widget)
  18. m_active_widget->set_visible(false);
  19. m_active_widget = widget;
  20. if (m_active_widget) {
  21. m_active_widget->set_relative_rect(rect());
  22. if (active_widget_had_focus)
  23. m_active_widget->set_focus(true);
  24. m_active_widget->set_visible(true);
  25. }
  26. set_focus_proxy(m_active_widget);
  27. if (on_active_widget_change)
  28. on_active_widget_change(m_active_widget);
  29. }
  30. void StackWidget::resize_event(ResizeEvent& event)
  31. {
  32. if (!m_active_widget)
  33. return;
  34. m_active_widget->set_relative_rect({ {}, event.size() });
  35. }
  36. void StackWidget::child_event(Core::ChildEvent& event)
  37. {
  38. if (!event.child() || !is<Widget>(*event.child()))
  39. return Widget::child_event(event);
  40. auto& child = verify_cast<Widget>(*event.child());
  41. if (event.type() == Event::ChildAdded) {
  42. if (!m_active_widget)
  43. set_active_widget(&child);
  44. else if (m_active_widget != &child)
  45. child.set_visible(false);
  46. } else if (event.type() == Event::ChildRemoved) {
  47. if (m_active_widget == &child) {
  48. Widget* new_active_widget = nullptr;
  49. for_each_child_widget([&](auto& new_child) {
  50. new_active_widget = &new_child;
  51. return IterationDecision::Break;
  52. });
  53. set_active_widget(new_active_widget);
  54. }
  55. }
  56. Widget::child_event(event);
  57. }
  58. }