Support or disable "insert" for drag/drop wxDataViewCtrl on OSX

see #18167
This commit is contained in:
Stefan Csomor
2018-07-16 19:42:35 +02:00
parent b554cf0018
commit d3e8d3f271
3 changed files with 28 additions and 7 deletions

View File

@@ -846,7 +846,8 @@ public:
m_dataBuffer(event.m_dataBuffer), m_dataBuffer(event.m_dataBuffer),
m_dataSize(event.m_dataSize), m_dataSize(event.m_dataSize),
m_dragFlags(event.m_dragFlags), m_dragFlags(event.m_dragFlags),
m_dropEffect(event.m_dropEffect) m_dropEffect(event.m_dropEffect),
m_proposedDropIndex(event.m_proposedDropIndex)
#endif #endif
{ } { }
@@ -889,6 +890,10 @@ public:
int GetDragFlags() const { return m_dragFlags; } int GetDragFlags() const { return m_dragFlags; }
void SetDropEffect( wxDragResult effect ) { m_dropEffect = effect; } void SetDropEffect( wxDragResult effect ) { m_dropEffect = effect; }
wxDragResult GetDropEffect() const { return m_dropEffect; } wxDragResult GetDropEffect() const { return m_dropEffect; }
// for plaforms (currently only OSX) that support Drag/Drop insertion of items,
// this is the proposed child index for the insertion
void SetProposedDropIndex(int index) { m_proposedDropIndex = index; }
int GetProposedDropIndex() const { return m_proposedDropIndex;}
#endif // wxUSE_DRAG_AND_DROP #endif // wxUSE_DRAG_AND_DROP
virtual wxEvent *Clone() const wxOVERRIDE { return new wxDataViewEvent(*this); } virtual wxEvent *Clone() const wxOVERRIDE { return new wxDataViewEvent(*this); }
@@ -928,6 +933,7 @@ protected:
int m_dragFlags; int m_dragFlags;
wxDragResult m_dropEffect; wxDragResult m_dropEffect;
int m_proposedDropIndex;
#endif // wxUSE_DRAG_AND_DROP #endif // wxUSE_DRAG_AND_DROP
private: private:

View File

@@ -1683,6 +1683,7 @@ void wxDataViewEvent::Init(wxDataViewCtrlBase* dvc,
m_dataSize = 0; m_dataSize = 0;
m_dragFlags = 0; m_dragFlags = 0;
m_dropEffect = wxDragNone; m_dropEffect = wxDragNone;
m_proposedDropIndex = -1;
#endif // wxUSE_DRAG_AND_DROP #endif // wxUSE_DRAG_AND_DROP
SetEventObject(dvc); SetEventObject(dvc);

View File

@@ -539,9 +539,8 @@ outlineView:(NSOutlineView*)outlineView
item:(id)item childIndex:(NSInteger)index item:(id)item childIndex:(NSInteger)index
{ {
wxUnusedVar(outlineView); wxUnusedVar(outlineView);
wxUnusedVar(index);
return [self setupAndCallDataViewEvents:wxEVT_DATAVIEW_ITEM_DROP dropInfo:info item:item] != NSDragOperationNone; return [self setupAndCallDataViewEvents:wxEVT_DATAVIEW_ITEM_DROP dropInfo:info item:item proposedChildIndex:index] != NSDragOperationNone;
} }
-(id) outlineView:(NSOutlineView*)outlineView -(id) outlineView:(NSOutlineView*)outlineView
@@ -680,10 +679,11 @@ outlineView:(NSOutlineView*)outlineView
wxUnusedVar(outlineView); wxUnusedVar(outlineView);
wxUnusedVar(index); wxUnusedVar(index);
return [self setupAndCallDataViewEvents:wxEVT_DATAVIEW_ITEM_DROP_POSSIBLE dropInfo:info item:item]; return [self setupAndCallDataViewEvents:wxEVT_DATAVIEW_ITEM_DROP_POSSIBLE dropInfo:info item:item proposedChildIndex:index];
} }
-(NSDragOperation) callDataViewEvents:(wxEventType)eventType dataObjects:(wxDataObjectComposite*)dataObjects item:(id)item -(NSDragOperation) callDataViewEvents:(wxEventType)eventType dataObjects:(wxDataObjectComposite*)dataObjects item:(id)item
proposedChildIndex:(NSInteger)index
{ {
NSDragOperation dragOperation = NSDragOperationNone; NSDragOperation dragOperation = NSDragOperationNone;
wxDataViewCtrl* const dvc(implementation->GetDataViewCtrl()); wxDataViewCtrl* const dvc(implementation->GetDataViewCtrl());
@@ -693,7 +693,20 @@ outlineView:(NSOutlineView*)outlineView
// copy data into data object: // copy data into data object:
event.SetDataObject(dataObjects); event.SetDataObject(dataObjects);
event.SetDataFormat(implementation->GetDnDDataFormat(dataObjects)); event.SetDataFormat(implementation->GetDnDDataFormat(dataObjects));
event.SetDropEffect(wxDragCopy); event.SetProposedDropIndex(index);
if (index == -1)
{
event.SetDropEffect(wxDragCopy);
}
else
{
//if index is not -1, we're going to set the default
//for the drop effect to None to be compatible with
//the other wxPlatforms that don't support it. In the
//user code for for the event, they can set this to
//copy/move or similar to support it.
event.SetDropEffect(wxDragNone);
}
wxDataFormatId formatId = event.GetDataFormat().GetType(); wxDataFormatId formatId = event.GetDataFormat().GetType();
wxMemoryBuffer buffer; wxMemoryBuffer buffer;
@@ -745,6 +758,7 @@ outlineView:(NSOutlineView*)outlineView
} }
-(NSDragOperation) setupAndCallDataViewEvents:(wxEventType)eventType dropInfo:(id<NSDraggingInfo>)info item:(id)item -(NSDragOperation) setupAndCallDataViewEvents:(wxEventType)eventType dropInfo:(id<NSDraggingInfo>)info item:(id)item
proposedChildIndex:(NSInteger)index
{ {
NSArray* supportedTypes( NSArray* supportedTypes(
[NSArray arrayWithObjects:DataViewPboardType,NSStringPboardType,nil] [NSArray arrayWithObjects:DataViewPboardType,NSStringPboardType,nil]
@@ -774,7 +788,7 @@ outlineView:(NSOutlineView*)outlineView
{ {
wxDataObjectComposite* dataObjects(implementation->GetDnDDataObjects((NSData*)[dataArray objectAtIndex:indexDraggedItem])); wxDataObjectComposite* dataObjects(implementation->GetDnDDataObjects((NSData*)[dataArray objectAtIndex:indexDraggedItem]));
dragOperation = [self callDataViewEvents:eventType dataObjects:dataObjects item:item]; dragOperation = [self callDataViewEvents:eventType dataObjects:dataObjects item:item proposedChildIndex:index];
if ( dragOperation != NSDragOperationNone ) if ( dragOperation != NSDragOperationNone )
++indexDraggedItem; ++indexDraggedItem;
@@ -806,7 +820,7 @@ outlineView:(NSOutlineView*)outlineView
delete textDataObject; delete textDataObject;
// send event if data could be copied: // send event if data could be copied:
dragOperation = [self callDataViewEvents:eventType dataObjects:dataObjects item:item]; dragOperation = [self callDataViewEvents:eventType dataObjects:dataObjects item:item proposedChildIndex:index];
// clean up: // clean up:
::CFRelease(osxData); ::CFRelease(osxData);