mirror of
https://github.com/SerenityOS/serenity.git
synced 2025-01-24 10:22:05 -05:00
LibCore: Add a way to install an event filter on a Core::Object
The event filter is consulted by Object::dispatch_event() and may decide that the event should not be delivered to the target object.
This commit is contained in:
parent
c91bb72964
commit
54c7110d9d
2 changed files with 13 additions and 2 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
* Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -227,6 +227,9 @@ void Object::dispatch_event(Core::Event& e, Object* stay_within)
|
||||||
VERIFY(!stay_within || stay_within == this || stay_within->is_ancestor_of(*this));
|
VERIFY(!stay_within || stay_within == this || stay_within->is_ancestor_of(*this));
|
||||||
auto* target = this;
|
auto* target = this;
|
||||||
do {
|
do {
|
||||||
|
// If there's an event filter on this target, ask if it wants to swallow this event.
|
||||||
|
if (target->m_event_filter && !target->m_event_filter(e))
|
||||||
|
return;
|
||||||
target->event(e);
|
target->event(e);
|
||||||
target = target->parent();
|
target = target->parent();
|
||||||
if (target == stay_within) {
|
if (target == stay_within) {
|
||||||
|
@ -262,4 +265,9 @@ void Object::register_property(const String& name, Function<JsonValue()> getter,
|
||||||
m_properties.set(name, make<Property>(name, move(getter), move(setter)));
|
m_properties.set(name, make<Property>(name, move(getter), move(setter)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Object::set_event_filter(Function<bool(Core::Event&)> filter)
|
||||||
|
{
|
||||||
|
m_event_filter = move(filter);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
|
* Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
@ -113,6 +113,8 @@ public:
|
||||||
void remove_child(Object&);
|
void remove_child(Object&);
|
||||||
void remove_all_children();
|
void remove_all_children();
|
||||||
|
|
||||||
|
void set_event_filter(Function<bool(Core::Event&)>);
|
||||||
|
|
||||||
void dump_tree(int indent = 0);
|
void dump_tree(int indent = 0);
|
||||||
|
|
||||||
void deferred_invoke(Function<void(Object&)>);
|
void deferred_invoke(Function<void(Object&)>);
|
||||||
|
@ -169,6 +171,7 @@ private:
|
||||||
unsigned m_inspector_count { 0 };
|
unsigned m_inspector_count { 0 };
|
||||||
HashMap<String, NonnullOwnPtr<Property>> m_properties;
|
HashMap<String, NonnullOwnPtr<Property>> m_properties;
|
||||||
NonnullRefPtrVector<Object> m_children;
|
NonnullRefPtrVector<Object> m_children;
|
||||||
|
Function<bool(Core::Event&)> m_event_filter;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue