diff -r 1121b61f8828 -r 8d7ca1b320e2 ui/winui/table.cpp --- a/ui/winui/table.cpp Thu Oct 19 20:38:16 2023 +0200 +++ b/ui/winui/table.cpp Thu Oct 19 21:19:19 2023 +0200 @@ -269,14 +269,72 @@ } // dnd - if (enabledrag) { - cellBorder.CanDrag(enabledrag); - cellBorder.DragStarting([](IInspectable const& sender, DragStartingEventArgs args) { - //args.Data().SetText(L"test"); + if (ondragstart) { + cellBorder.CanDrag(true); + cellBorder.DragStarting([this](IInspectable const& sender, DragStartingEventArgs args) { + UiWinuiTableDnd dndevt; + dndevt.evtobj.selection = uiselection(); + dndevt.evtobj.dnd = &dndevt; + dndevt.evttype = 0; + dndevt.dndstartargs = args; + + UiEvent evt; + evt.obj = this->obj; + evt.window = evt.obj->window; + evt.document = obj->ctx->document; + evt.eventdata = &dndevt; + evt.intval = 0; + + this->ondragstart(&evt, this->ondragstartdata); + + if (dndevt.evtobj.selection.rows) { + free(dndevt.evtobj.selection.rows); + } + }); + cellBorder.DropCompleted([this](IInspectable const& sender, DropCompletedEventArgs args) { + UiWinuiTableDnd dndevt; + dndevt.evtobj.selection = uiselection(); + dndevt.evtobj.dnd = &dndevt; + dndevt.evttype = 1; + dndevt.dndcompletedargs = args; + + UiEvent evt; + evt.obj = this->obj; + evt.window = evt.obj->window; + evt.document = obj->ctx->document; + evt.eventdata = &dndevt; + evt.intval = 0; + + if (this->ondragcomplete) { + this->ondragcomplete(&evt, this->ondragcompletedata); + } + if (dndevt.evtobj.selection.rows) { + free(dndevt.evtobj.selection.rows); + } }); } - if (enabledrop) { + if (ondrop) { cellBorder.AllowDrop(enabledrop); + cellBorder.Drop(DragEventHandler([this](winrt::Windows::Foundation::IInspectable const& sender, DragEventArgs const& args){ + UiWinuiTableDnd dndevt; + dndevt.evtobj.selection = uiselection(); + dndevt.evtobj.dnd = &dndevt; + dndevt.evttype = 2; + dndevt.drageventargs = args; + + UiEvent evt; + evt.obj = this->obj; + evt.window = evt.obj->window; + evt.document = obj->ctx->document; + evt.eventdata = &dndevt; + evt.intval = 0; + + this->ondrop(&evt, this->ondropdata); + + if (dndevt.evtobj.selection.rows) { + free(dndevt.evtobj.selection.rows); + } + })); } // set the cell value @@ -489,11 +547,7 @@ selection.shrink_to_fit(); } -void UiTable::call_handler(ui_callback cb, void* cbdata) { - if (!cb) { - return; - } - +UiListSelection UiTable::uiselection() { std::sort(selection.begin(), selection.end()); UiListSelection selobj; @@ -506,6 +560,15 @@ selobj.rows[i]--; } } + return selobj; +} + +void UiTable::call_handler(ui_callback cb, void* cbdata) { + if (!cb) { + return; + } + + UiListSelection selobj = uiselection(); UiEvent evt; evt.obj = obj; @@ -514,4 +577,8 @@ evt.eventdata = &selobj; evt.intval = 0; cb(&evt, cbdata); + + if (selobj.rows) { + free(selobj.rows); + } }