Merge branch 'dvc-multi-format-dnd'

Accept multiple data formats via drag-and-drop in wxDataViewCtrl.

See #2478, #2616.
This commit is contained in:
Vadim Zeitlin
2022-01-15 23:39:03 +01:00
16 changed files with 290 additions and 373 deletions

View File

@@ -922,7 +922,6 @@ public:
};
bool EnableDragSource( const wxDataFormat &format );
bool EnableDropTarget( const wxDataFormat &format );
void RefreshDropHint();
void RemoveDropHint();
@@ -1032,8 +1031,6 @@ private:
bool m_dragEnabled;
wxDataFormat m_dragFormat;
bool m_dropEnabled;
wxDataFormat m_dropFormat;
DropItemInfo m_dropItemInfo;
#endif // wxUSE_DRAG_AND_DROP
@@ -1704,12 +1701,15 @@ public:
class wxDataViewDropTarget: public wxDropTarget
{
public:
wxDataViewDropTarget( wxDataObject *obj, wxDataViewMainWindow *win ) :
wxDropTarget( obj )
wxDataViewDropTarget( wxDataObjectComposite *obj, wxDataViewMainWindow *win ) :
wxDropTarget( obj ),
m_obj(obj)
{
m_win = win;
}
wxDataObjectComposite* GetCompositeDataObject() const { return m_obj; }
virtual wxDragResult OnDragOver( wxCoord x, wxCoord y, wxDragResult def ) wxOVERRIDE
{
wxDataFormat format = GetMatchingPair();
@@ -1739,6 +1739,9 @@ public:
virtual void OnLeave() wxOVERRIDE
{ m_win->OnLeave(); }
private:
wxDataObjectComposite* const m_obj;
wxDataViewMainWindow *m_win;
};
@@ -2076,7 +2079,6 @@ wxDataViewMainWindow::wxDataViewMainWindow( wxDataViewCtrl *parent, wxWindowID i
m_dragStart = wxPoint(0,0);
m_dragEnabled = false;
m_dropEnabled = false;
m_dropItemInfo = DropItemInfo();
#endif // wxUSE_DRAG_AND_DROP
@@ -2132,17 +2134,6 @@ bool wxDataViewMainWindow::EnableDragSource( const wxDataFormat &format )
return true;
}
bool wxDataViewMainWindow::EnableDropTarget( const wxDataFormat &format )
{
m_dropFormat = format;
m_dropEnabled = format != wxDF_INVALID;
if (m_dropEnabled)
SetDropTarget( new wxDataViewDropTarget( new wxCustomDataObject( format ), this ) );
return true;
}
void wxDataViewMainWindow::RefreshDropHint()
{
const unsigned row = m_dropItemInfo.m_row;
@@ -2389,18 +2380,18 @@ bool wxDataViewMainWindow::OnDrop( wxDataFormat format, wxCoord x, wxCoord y )
return true;
}
wxDragResult wxDataViewMainWindow::OnData( wxDataFormat format, wxCoord x, wxCoord y,
wxDragResult def )
wxDragResult wxDataViewMainWindow::OnData(wxDataFormat format, wxCoord x, wxCoord y,
wxDragResult def)
{
DropItemInfo dropItemInfo = GetDropItemInfo(x, y);
wxCustomDataObject *obj = (wxCustomDataObject *) GetDropTarget()->GetDataObject();
wxDataViewDropTarget* const
target = static_cast<wxDataViewDropTarget*>(GetDropTarget());
wxDataObjectComposite* const obj = target->GetCompositeDataObject();
wxDataViewEvent event(wxEVT_DATAVIEW_ITEM_DROP, m_owner, dropItemInfo.m_item);
event.SetProposedDropIndex(dropItemInfo.m_proposedDropIndex);
event.SetDataFormat( format );
event.SetDataSize( obj->GetSize() );
event.SetDataBuffer( obj->GetData() );
event.InitData(obj, format);
event.SetDropEffect( def );
if ( !m_owner->HandleWindowEvent( event ) || !event.IsAllowed() )
return wxDragNone;
@@ -5823,9 +5814,17 @@ bool wxDataViewCtrl::EnableDragSource( const wxDataFormat &format )
return m_clientArea->EnableDragSource( format );
}
bool wxDataViewCtrl::EnableDropTarget( const wxDataFormat &format )
bool wxDataViewCtrl::DoEnableDropTarget( const wxVector<wxDataFormat> &formats )
{
return m_clientArea->EnableDropTarget( format );
wxDataViewDropTarget* dt = NULL;
if (wxDataObjectComposite* dataObject = CreateDataObject(formats))
{
dt = new wxDataViewDropTarget(dataObject, m_clientArea);
}
m_clientArea->SetDropTarget(dt);
return true;
}
#endif // wxUSE_DRAG_AND_DROP