summaryrefslogtreecommitdiff
path: root/Libraries/LibCore
diff options
context:
space:
mode:
Diffstat (limited to 'Libraries/LibCore')
-rw-r--r--Libraries/LibCore/CEvent.cpp3
-rw-r--r--Libraries/LibCore/CEvent.h6
-rw-r--r--Libraries/LibCore/CObject.cpp9
-rw-r--r--Libraries/LibCore/CObject.h1
4 files changed, 17 insertions, 2 deletions
diff --git a/Libraries/LibCore/CEvent.cpp b/Libraries/LibCore/CEvent.cpp
index eacce964c2..ebc9eeff3d 100644
--- a/Libraries/LibCore/CEvent.cpp
+++ b/Libraries/LibCore/CEvent.cpp
@@ -1,9 +1,10 @@
#include <LibCore/CEvent.h>
#include <LibCore/CObject.h>
-CChildEvent::CChildEvent(Type type, CObject& child)
+CChildEvent::CChildEvent(Type type, CObject& child, CObject* insertion_before_child)
: CEvent(type)
, m_child(child.make_weak_ptr())
+ , m_insertion_before_child(insertion_before_child ? insertion_before_child->make_weak_ptr() : nullptr)
{
}
diff --git a/Libraries/LibCore/CEvent.h b/Libraries/LibCore/CEvent.h
index 8e49c07fd4..28c593be45 100644
--- a/Libraries/LibCore/CEvent.h
+++ b/Libraries/LibCore/CEvent.h
@@ -100,14 +100,18 @@ private:
class CChildEvent final : public CEvent {
public:
- CChildEvent(Type, CObject& child);
+ CChildEvent(Type, CObject& child, CObject* insertion_before_child = nullptr);
~CChildEvent();
CObject* child() { return m_child.ptr(); }
const CObject* child() const { return m_child.ptr(); }
+ CObject* insertion_before_child() { return m_insertion_before_child.ptr(); }
+ const CObject* insertion_before_child() const { return m_insertion_before_child.ptr(); }
+
private:
WeakPtr<CObject> m_child;
+ WeakPtr<CObject> m_insertion_before_child;
};
class CCustomEvent : public CEvent {
diff --git a/Libraries/LibCore/CObject.cpp b/Libraries/LibCore/CObject.cpp
index 0058de5b39..7de5a5a044 100644
--- a/Libraries/LibCore/CObject.cpp
+++ b/Libraries/LibCore/CObject.cpp
@@ -64,6 +64,15 @@ void CObject::add_child(CObject& object)
event(*make<CChildEvent>(CEvent::ChildAdded, object));
}
+void CObject::insert_child_before(CObject& new_child, CObject& before_child)
+{
+ // FIXME: Should we support reparenting objects?
+ ASSERT(!new_child.parent() || new_child.parent() == this);
+ new_child.m_parent = this;
+ m_children.insert_before_matching(new_child, [&](auto& existing_child) { return existing_child.ptr() == &before_child; });
+ event(*make<CChildEvent>(CEvent::ChildAdded, new_child, &before_child));
+}
+
void CObject::remove_child(CObject& object)
{
for (int i = 0; i < m_children.size(); ++i) {
diff --git a/Libraries/LibCore/CObject.h b/Libraries/LibCore/CObject.h
index 7a5ce63785..709d2e607e 100644
--- a/Libraries/LibCore/CObject.h
+++ b/Libraries/LibCore/CObject.h
@@ -70,6 +70,7 @@ public:
bool has_timer() const { return m_timer_id; }
void add_child(CObject&);
+ void insert_child_before(CObject& new_child, CObject& before_child);
void remove_child(CObject&);
void dump_tree(int indent = 0);