diff options
author | Andreas Kling <awesomekling@gmail.com> | 2019-09-22 00:17:53 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-09-22 00:25:25 +0200 |
commit | bc319d9e8873734bb8e8cea3d762d7fab2ded887 (patch) | |
tree | c8648b92fe32e6c48454a99356f7b3ca59b5e423 /Libraries/LibGUI/GWidget.cpp | |
parent | 0c72e0c09f085a371b0abdba172325e56b1e6a06 (diff) | |
download | serenity-bc319d9e8873734bb8e8cea3d762d7fab2ded887.zip |
LibCore: Make CObject reference-counted
Okay, I've spent a whole day on this now, and it finally kinda works!
With this patch, CObject and all of its derived classes are reference
counted instead of tree-owned.
The previous, Qt-like model was nice and familiar, but ultimately also
outdated and difficult to reason about.
CObject-derived types should now be stored in RefPtr/NonnullRefPtr and
each class can be constructed using the forwarding construct() helper:
auto widget = GWidget::construct(parent_widget);
Note that construct() simply forwards all arguments to an existing
constructor. It is inserted into each class by the C_OBJECT macro,
see CObject.h to understand how that works.
CObject::delete_later() disappears in this patch, as there is no longer
a single logical owner of a CObject.
Diffstat (limited to 'Libraries/LibGUI/GWidget.cpp')
-rw-r--r-- | Libraries/LibGUI/GWidget.cpp | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/Libraries/LibGUI/GWidget.cpp b/Libraries/LibGUI/GWidget.cpp index 66ff1eed53..1aa678c846 100644 --- a/Libraries/LibGUI/GWidget.cpp +++ b/Libraries/LibGUI/GWidget.cpp @@ -325,13 +325,13 @@ Rect GWidget::screen_relative_rect() const GWidget* GWidget::child_at(const Point& point) const { for (int i = children().size() - 1; i >= 0; --i) { - if (!is<GWidget>(*children()[i])) + if (!is<GWidget>(children()[i])) continue; - auto& child = to<GWidget>(*children()[i]); + auto& child = to<GWidget>(children()[i]); if (!child.is_visible()) continue; if (child.relative_rect().contains(point)) - return &child; + return const_cast<GWidget*>(&child); } return nullptr; } @@ -492,7 +492,7 @@ void GWidget::move_to_front() parent->children().remove_first_matching([this](auto& entry) { return entry == this; }); - parent->children().append(this); + parent->children().append(*this); parent->update(); } @@ -506,7 +506,7 @@ void GWidget::move_to_back() parent->children().remove_first_matching([this](auto& entry) { return entry == this; }); - parent->children().prepend(this); + parent->children().prepend(*this); parent->update(); } @@ -515,7 +515,7 @@ bool GWidget::is_frontmost() const auto* parent = parent_widget(); if (!parent) return true; - return parent->children().last() == this; + return &parent->children().last() == this; } bool GWidget::is_backmost() const @@ -523,7 +523,7 @@ bool GWidget::is_backmost() const auto* parent = parent_widget(); if (!parent) return true; - return parent->children().first() == this; + return &parent->children().first() == this; } GAction* GWidget::action_for_key_event(const GKeyEvent& event) |