ui/winui/table.cpp

branch
newapi
changeset 223
8d7ca1b320e2
parent 221
a82d9beaa94a
child 224
88bc21b19213
--- 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);
+	}
 }

mercurial