267 else { |
267 else { |
268 cellBorder.BorderThickness(b2); |
268 cellBorder.BorderThickness(b2); |
269 } |
269 } |
270 |
270 |
271 // dnd |
271 // dnd |
272 if (enabledrag) { |
272 if (ondragstart) { |
273 cellBorder.CanDrag(enabledrag); |
273 cellBorder.CanDrag(true); |
274 cellBorder.DragStarting([](IInspectable const& sender, DragStartingEventArgs args) { |
274 cellBorder.DragStarting([this](IInspectable const& sender, DragStartingEventArgs args) { |
275 //args.Data().SetText(L"test"); |
275 UiWinuiTableDnd dndevt; |
|
276 dndevt.evtobj.selection = uiselection(); |
|
277 dndevt.evtobj.dnd = &dndevt; |
|
278 dndevt.evttype = 0; |
|
279 dndevt.dndstartargs = args; |
|
280 |
|
281 UiEvent evt; |
|
282 evt.obj = this->obj; |
|
283 evt.window = evt.obj->window; |
|
284 evt.document = obj->ctx->document; |
|
285 evt.eventdata = &dndevt; |
|
286 evt.intval = 0; |
|
287 |
|
288 this->ondragstart(&evt, this->ondragstartdata); |
|
289 |
|
290 if (dndevt.evtobj.selection.rows) { |
|
291 free(dndevt.evtobj.selection.rows); |
|
292 } |
|
293 }); |
|
294 cellBorder.DropCompleted([this](IInspectable const& sender, DropCompletedEventArgs args) { |
|
295 UiWinuiTableDnd dndevt; |
|
296 dndevt.evtobj.selection = uiselection(); |
|
297 dndevt.evtobj.dnd = &dndevt; |
|
298 dndevt.evttype = 1; |
|
299 dndevt.dndcompletedargs = args; |
|
300 |
|
301 UiEvent evt; |
|
302 evt.obj = this->obj; |
|
303 evt.window = evt.obj->window; |
|
304 evt.document = obj->ctx->document; |
|
305 evt.eventdata = &dndevt; |
|
306 evt.intval = 0; |
|
307 |
|
308 if (this->ondragcomplete) { |
|
309 this->ondragcomplete(&evt, this->ondragcompletedata); |
|
310 } |
|
311 if (dndevt.evtobj.selection.rows) { |
|
312 free(dndevt.evtobj.selection.rows); |
|
313 } |
276 }); |
314 }); |
277 } |
315 } |
278 if (enabledrop) { |
316 if (ondrop) { |
279 cellBorder.AllowDrop(enabledrop); |
317 cellBorder.AllowDrop(enabledrop); |
|
318 cellBorder.Drop(DragEventHandler([this](winrt::Windows::Foundation::IInspectable const& sender, DragEventArgs const& args){ |
|
319 UiWinuiTableDnd dndevt; |
|
320 dndevt.evtobj.selection = uiselection(); |
|
321 dndevt.evtobj.dnd = &dndevt; |
|
322 dndevt.evttype = 2; |
|
323 dndevt.drageventargs = args; |
|
324 |
|
325 UiEvent evt; |
|
326 evt.obj = this->obj; |
|
327 evt.window = evt.obj->window; |
|
328 evt.document = obj->ctx->document; |
|
329 evt.eventdata = &dndevt; |
|
330 evt.intval = 0; |
|
331 |
|
332 this->ondrop(&evt, this->ondropdata); |
|
333 |
|
334 if (dndevt.evtobj.selection.rows) { |
|
335 free(dndevt.evtobj.selection.rows); |
|
336 } |
|
337 })); |
280 } |
338 } |
281 |
339 |
282 // set the cell value |
340 // set the cell value |
283 // depending on the type, we create different cell controls |
341 // depending on the type, we create different cell controls |
284 UiModelType type = model->types[col]; |
342 UiModelType type = model->types[col]; |
487 void UiTable::remove_from_selection(int row) { |
545 void UiTable::remove_from_selection(int row) { |
488 selection.erase(std::remove(selection.begin(), selection.end(), row), selection.end()); |
546 selection.erase(std::remove(selection.begin(), selection.end(), row), selection.end()); |
489 selection.shrink_to_fit(); |
547 selection.shrink_to_fit(); |
490 } |
548 } |
491 |
549 |
492 void UiTable::call_handler(ui_callback cb, void* cbdata) { |
550 UiListSelection UiTable::uiselection() { |
493 if (!cb) { |
|
494 return; |
|
495 } |
|
496 |
|
497 std::sort(selection.begin(), selection.end()); |
551 std::sort(selection.begin(), selection.end()); |
498 |
552 |
499 UiListSelection selobj; |
553 UiListSelection selobj; |
500 selobj.count = selection.size(); |
554 selobj.count = selection.size(); |
501 selobj.rows = nullptr; |
555 selobj.rows = nullptr; |
504 memcpy(selobj.rows, selection.data(), selobj.count * sizeof(int)); |
558 memcpy(selobj.rows, selection.data(), selobj.count * sizeof(int)); |
505 for (int i = 0; i < selobj.count; i++) { |
559 for (int i = 0; i < selobj.count; i++) { |
506 selobj.rows[i]--; |
560 selobj.rows[i]--; |
507 } |
561 } |
508 } |
562 } |
|
563 return selobj; |
|
564 } |
|
565 |
|
566 void UiTable::call_handler(ui_callback cb, void* cbdata) { |
|
567 if (!cb) { |
|
568 return; |
|
569 } |
|
570 |
|
571 UiListSelection selobj = uiselection(); |
509 |
572 |
510 UiEvent evt; |
573 UiEvent evt; |
511 evt.obj = obj; |
574 evt.obj = obj; |
512 evt.window = obj->window; |
575 evt.window = obj->window; |
513 evt.document = obj->ctx->document; |
576 evt.document = obj->ctx->document; |
514 evt.eventdata = &selobj; |
577 evt.eventdata = &selobj; |
515 evt.intval = 0; |
578 evt.intval = 0; |
516 cb(&evt, cbdata); |
579 cb(&evt, cbdata); |
517 } |
580 |
|
581 if (selobj.rows) { |
|
582 free(selobj.rows); |
|
583 } |
|
584 } |