mirror of
https://github.com/fergalmoran/ladybird.git
synced 2025-12-27 03:37:53 +00:00
LibGUI+WindowServer: Start fleshing out drag&drop functionality
This patch enables basic drag&drop between applications. You initiate a drag by creating a GDragOperation object and calling exec() on it. This creates a nested event loop in the calling program that only returns once the drag operation has ended. On the receiving side, you get a call to GWidget::drop_event() with a GDropEvent containing information about the dropped data. The only data passed right now is a piece of text that's also used to visually indicate that a drag is happening (by showing the text in a little box that follows the mouse cursor around.) There are things to fix here, but we're off to a nice start. :^)
This commit is contained in:
@@ -154,6 +154,16 @@ void GWindow::set_override_cursor(GStandardCursor cursor)
|
||||
|
||||
void GWindow::event(CEvent& event)
|
||||
{
|
||||
if (event.type() == GEvent::Drop) {
|
||||
auto& drop_event = static_cast<GDropEvent&>(event);
|
||||
if (!m_main_widget)
|
||||
return;
|
||||
auto result = m_main_widget->hit_test(drop_event.position());
|
||||
auto local_event = make<GDropEvent>(result.local_position, drop_event.text());
|
||||
ASSERT(result.widget);
|
||||
return result.widget->dispatch_event(*local_event, this);
|
||||
}
|
||||
|
||||
if (event.type() == GEvent::MouseUp || event.type() == GEvent::MouseDown || event.type() == GEvent::MouseDoubleClick || event.type() == GEvent::MouseMove || event.type() == GEvent::MouseWheel) {
|
||||
auto& mouse_event = static_cast<GMouseEvent&>(event);
|
||||
if (m_global_cursor_tracking_widget) {
|
||||
|
||||
Reference in New Issue
Block a user