From 25ac053adba98061478f22270a7518e2828e96a8 Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Tue, 4 Oct 2016 23:39:38 +0200 Subject: [PATCH] Adjust rectangle coordinates returned by wxDataViewCtrl::GetItemRect() Because query for item rectangle is executed in the context of wxDataViewCtrl so coordinates of retrieved rectangle should be specified in wxDataViewCtrl client coordinates (not in wxDataViewMainWindow coordinates). To return correct coordinates it is necessary to convert rectangle coordinates retrieved by wxDataViewMainWindow::GetItemRect() from wxDataViewMainWindow client coordinates to wxDataViewCtrl client coordinates (they can different due to the presence of the header in wxDataViewCtrl client area). --- docs/changes.txt | 1 + interface/wx/dataview.h | 11 ++++++----- src/generic/datavgen.cpp | 7 ++++++- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/docs/changes.txt b/docs/changes.txt index 5969f3b391..4efea97d7b 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -108,6 +108,7 @@ All (GUI): - Fix retrieving bounding box for wxDC with transformed coordinates. - Fix wxGraphicsMatrixData::Concat() for Direct2D and Cairo renderers. - Fix calculating point position in wxDataViewCtrl::HitTest(). +- Fix position of the rectangle returned by wxDataViewCtrl::GetItemRect(). wxGTK: diff --git a/interface/wx/dataview.h b/interface/wx/dataview.h index 7517edea55..f9c37a3c0a 100644 --- a/interface/wx/dataview.h +++ b/interface/wx/dataview.h @@ -1395,11 +1395,8 @@ public: int GetIndent() const; /** - Returns item rectangle. - - This method is currently not implemented at all in wxGTK and only - implemented for non-@NULL @a col argument in wxOSX. It is fully - implemented in the generic version of the control. + Returns item rectangle. Coordinates of the rectangle are specified in + wxDataViewCtrl client area coordinates. @param item A valid item. @@ -1407,6 +1404,10 @@ public: If non-@NULL, the rectangle returned corresponds to the intersection of the item with the specified column. If @NULL, the rectangle spans all the columns. + + @note This method is currently not implemented at all in wxGTK and only + implemented for non-@NULL @a col argument in wxOSX. It is fully + implemented in the generic version of the control. */ virtual wxRect GetItemRect(const wxDataViewItem& item, const wxDataViewColumn* col = NULL) const; diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index d35af10b3b..9c9a87fb17 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -5349,7 +5349,12 @@ void wxDataViewCtrl::HitTest( const wxPoint & point, wxDataViewItem & item, wxRect wxDataViewCtrl::GetItemRect( const wxDataViewItem & item, const wxDataViewColumn* column ) const { - return m_clientArea->GetItemRect(item, column); + // Convert position from the main window coordinates to the control coordinates. + // (They can be different due to the presence of the header.). + wxRect r = m_clientArea->GetItemRect(item, column); + const wxPoint ctrlPos = ScreenToClient(m_clientArea->ClientToScreen(r.GetPosition())); + r.SetPosition(ctrlPos); + return r; } wxDataViewItem wxDataViewCtrl::GetItemByRow( unsigned int row ) const