StackWidget.cpp 1.9 KB

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