Nochmal Table-View und Drag&Drop

  • Nochmal Table-View und Drag&Drop

    Wie erfahre ich denn bei einem Table-View (nicht bei dem normalen Dragging-Source-Protokoll!), wohin ein Item denn geworfen wurde und welche Aktion ausgeführt wurde? Ich finde keine Delega^WData-Source-Methode!?
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: Nochmal Table-View und Drag&Drop

    Na, das normale Protokoll ist <NSDraggingSource>
    Specifying dragging options
    – draggingSourceOperationMaskForLocal:
    – ignoreModifierKeysWhileDragging
    Responding to dragging sessions
    – draggedImage:beganAt:
    – draggedImage:endedAt:deposited:
    – draggedImage:endedAt:operation:
    – draggedImage:movedTo:
    – namesOfPromisedFilesDroppedAtDestination:

    -tableView:acceptDrop:row:dropOperation
    Invoked by aTableView when the mouse button is released over a table view that previously decided to allow a drop.

    tableView:validateDrop:proposedRow:proposedDropOperation:
    Used by aTableView to determine a valid drop target.

    Hiermit kann ich entscheiden, ob jemand auf mich droppen (Target) kann. Ich will aber als Source wissen, wohin gedroppt wurde.

    Aber gut, dann implementiere ich die Funktionalität targetseitig.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: Nochmal Table-View und Drag&Drop

    Original von Tom9811
    -tableView:acceptDrop:row:dropOperation
    Invoked by aTableView when the mouse button is released over a table view that previously decided to allow a drop.
    Hiermit kann ich entscheiden, ob jemand auf mich droppen (Target) kann. Ich will aber als Source wissen, wohin gedroppt wurde.


    Aber genau das kann man doch mit -tableView:acceptDrop:row:dropOperation? Das ist doch auch der Punkt, wo man als Data Source das Modell entsprechend der Drop Operation anpasst, also z.B. Objekte in Core Data verschiebt/hinzufügt.
  • RE: Nochmal Table-View und Drag&Drop

    Ah, jetzt verstehe ich das Problem!
    Die Source (also der NSTableView) wird wahrscheinlich per draggingEnded: (wie Du schon geschrieben hast) benachrichtigt. Scheint leider keine Methode im normalen (NSTableView) Data Source Protokoll dafür zu geben. Bleibt wohl nichts anderes über, als NSTableView abzuleiten.
  • RE: Nochmal Table-View und Drag&Drop

    Endlich versteht mich jemand. ;)

    Mein konkretes Problem ist, dass ich nicht sehe, wie ich erfahren kann, ob mein Item einen Move oder ein Copy mitgemacht hat. Davon abhängig müsste ich es aber in der Source entfernen. Im NSDraggingSource-Protokoll habe ich dafür
    - draggedImage:endedAt:operation
    [...] For example, if you are moving data from one location to another, you could use this method to make the source data disappear from its previous location, if the dragging session is successful, or reset itself to its previous state, in the event of a failure.

    Aber ein Table-View schient das nicht anzubieten. :(

    Die "Hilfe", die ein Table-View beim D&D anbietet gehört mehr in die Kategorie: "Si tacuisse …"
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: Nochmal Table-View und Drag&Drop

    Was eventuell noch ginge, wäre die Daten dem Pasteboard in tableView:writeRowsWithIndexes:toPasteboard: nicht vollständig zur Verfügung zu stellen, sondern nur mit declareTypes:owner: zu deklarieren. Wenn dann die Destination per pasteboard:provideDataForType: nachfragt, kann Deine Source entscheiden, ob sie eher einen Move oder ein Copy durchführen möchte.
    Könnte klappen, habe ich aber noch nicht ausprobiert...
  • RE: Nochmal Table-View und Drag&Drop

    Hmm, es gibt ja noch die Modifier.

    Ich habe es jetzt so gemacht:

    Quellcode

    1. @implementation ExtendedTableView
    2. - (void)draggedImage:(NSImage *)image
    3. endedAt:(NSPoint)point
    4. operation:(NSDragOperation)operation {
    5. NSLog( @"received drop receipt for view %@", [self autosaveName] );
    6. if( [[self dataSource] respondsToSelector:@selector( tableView:draggedImage:endedAt:operation:)])
    7. {
    8. [[self dataSource] tableView:self draggedImage:image endedAt:point operation:operation];
    9. }
    10. [super draggedImage:image endedAt:point operation:operation];
    11. }
    12. @end
    Alles anzeigen
    Ich muss ohnehin für die Delete-Taste ableiten …
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?