]> git.saurik.com Git - wxWidgets.git/commitdiff
Fix hit testing in generic wxDataViewToggleRenderer.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sun, 21 Apr 2013 17:39:43 +0000 (17:39 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sun, 21 Apr 2013 17:39:43 +0000 (17:39 +0000)
Handle clicks on the checkboxes in generic wxDataViewCtrl correctly by taking
into account that the checkbox rectangle is centred inside the total cell
rectangle.

Closes #15144.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@73835 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

src/generic/datavgen.cpp

index 2334084bcd7d32e17f351db61f70bdbfbf3b74a1..ba18a3bdea505d5ff7508226a918fa1b3eaddb7d 100644 (file)
@@ -1090,7 +1090,7 @@ bool wxDataViewToggleRenderer::Render( wxRect cell, wxDC *dc, int WXUNUSED(state
     return true;
 }
 
-bool wxDataViewToggleRenderer::WXActivateCell(const wxRect& WXUNUSED(cell),
+bool wxDataViewToggleRenderer::WXActivateCell(const wxRect& cellRect,
                                               wxDataViewModel *model,
                                               const wxDataViewItem& item,
                                               unsigned int col,
@@ -1098,8 +1098,16 @@ bool wxDataViewToggleRenderer::WXActivateCell(const wxRect& WXUNUSED(cell),
 {
     if ( mouseEvent )
     {
-        // only react to clicks directly on the checkbox, not elsewhere in the same cell:
-        if ( !wxRect(GetSize()).Contains(mouseEvent->GetPosition()) )
+        // Only react to clicks directly on the checkbox, not elsewhere in the
+        // same cell.
+        //
+        // We suppose that the checkbox is centred in the total cell rectangle
+        // as this is how it's rendered, at least under MSW. If this turns out
+        // to be a wrong assumption, we probably would need to do the hit test
+        // checking in wxRendererNative but for now this simple solution works.
+        const wxRect checkRect = wxRect(GetSize()).CentreIn(cellRect);
+
+        if ( !checkRect.Contains(mouseEvent->GetPosition()) )
             return false;
     }