Remove ComponentVtable::input_event

And the custom handling of the mouse grabber
This commit is contained in:
Olivier Goffart 2020-11-24 16:23:37 +01:00
parent 845627c6b4
commit 8a64f10e84
69 changed files with 213 additions and 469 deletions

View file

@ -178,44 +178,6 @@ using cbindgen_private::KeyEventResult;
using cbindgen_private::MouseEvent;
using cbindgen_private::sixtyfps_visit_item_tree;
namespace private_api {
template<typename GetDynamic>
inline InputEventResult process_input_event(const ComponentRc &component_rc, int64_t &mouse_grabber,
MouseEvent mouse_event, Slice<ItemTreeNode> tree,
GetDynamic get_dynamic, const ComponentWindow *window)
{
if (mouse_grabber != -1) {
auto item_index = mouse_grabber & 0xffffffff;
auto rep_index = mouse_grabber >> 32;
auto offset =
cbindgen_private::sixtyfps_item_offset(component_rc.borrow(), tree, item_index);
mouse_event.pos = { mouse_event.pos.x - offset.x, mouse_event.pos.y - offset.y };
const auto &item_node = tree.ptr[item_index];
InputEventResult result = InputEventResult::EventIgnored;
cbindgen_private::ItemRc item_rc{component_rc, uintptr_t(item_index)};
switch (item_node.tag) {
case ItemTreeNode::Tag::Item:
result = item_node.item.item.vtable->input_event(
{
item_node.item.item.vtable,
reinterpret_cast<char *>(component_rc.borrow().instance)
+ item_node.item.item.offset,
},
mouse_event, window, &item_rc);
break;
case ItemTreeNode::Tag::DynamicTree: {
ComponentRef comp = get_dynamic(item_node.dynamic_tree.index, rep_index);
result = comp.vtable->input_event(comp, mouse_event, window);
} break;
}
if (result != InputEventResult::GrabMouse) {
mouse_grabber = -1;
}
return result;
} else {
return cbindgen_private::sixtyfps_process_ungrabbed_mouse_event(&component_rc, mouse_event,
window, &mouse_grabber);
}
}
void dealloc(const ComponentVTable *, uint8_t *ptr, vtable::Layout layout)
{

View file

@ -17,11 +17,11 @@ inline void mock_elapsed_time(int64_t time_in_ms)
cbindgen_private::sixtyfps_mock_elapsed_time(time_in_ms);
}
template<typename Component>
inline void send_mouse_click(const Component &component, float x, float y)
inline void send_mouse_click(const ComponentHandle<Component> *component, float x, float y)
{
cbindgen_private::sixtyfps_send_mouse_click(
{ &Component::component_type, const_cast<Component *>(&component) }, x, y,
&component.window);
reinterpret_cast<const vtable::VRc<private_api::ComponentVTable>*>(component),
x, y, &(*component)->window);
}
template<typename Component>