diff --git a/interface/wx/dataview.h b/interface/wx/dataview.h index 84c7479df8..1a8ab039ae 100644 --- a/interface/wx/dataview.h +++ b/interface/wx/dataview.h @@ -1446,8 +1446,13 @@ public: int GetIndent() const; /** - Returns item rectangle. Coordinates of the rectangle are specified in - wxDataViewCtrl client area coordinates. + Returns item rectangle. + + If item is not currently visible because its parent is collapsed, + return an empty rectangle. + + Coordinates of the rectangle are specified in wxDataViewCtrl client + area coordinates. @param item A valid item. diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 42e55ebb2e..d5a2fffd75 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -3809,10 +3809,16 @@ wxRect wxDataViewMainWindow::GetItemRect( const wxDataViewItem & item, xpos = 0; } + const int row = GetRowByItem(item); + if ( row == -1 ) + { + // This means the row is currently not visible at all. + return wxRect(); + } + // we have to take an expander column into account and compute its indentation // to get the correct x position where the actual text is int indent = 0; - int row = GetRowByItem(item); if (!IsList() && (column == 0 || GetExpanderColumnOrFirstOne(GetOwner()) == column) ) { diff --git a/tests/controls/dataviewctrltest.cpp b/tests/controls/dataviewctrltest.cpp index 338d00539c..6d0d728890 100644 --- a/tests/controls/dataviewctrltest.cpp +++ b/tests/controls/dataviewctrltest.cpp @@ -198,4 +198,24 @@ TEST_CASE_METHOD(SingleSelectDataViewCtrlTestCase, CHECK( !m_dvc->IsExpanded(m_child2) ); } +TEST_CASE_METHOD(SingleSelectDataViewCtrlTestCase, + "wxDVC::GetItemRect", + "[wxDataViewCtrl][item]") +{ +#ifdef __WXGTK__ + WARN("Disabled under GTK because GetItemRect() is not implemented"); +#else + const wxRect rect1 = m_dvc->GetItemRect(m_child1); + const wxRect rect2 = m_dvc->GetItemRect(m_child2); + + CHECK( rect1.x == rect2.x ); + CHECK( rect1.width == rect2.width ); + CHECK( rect1.height == rect2.height ); + CHECK( rect1.y < rect2.y ); + + const wxRect rectNotShown = m_dvc->GetItemRect(m_grandchild); + CHECK( rectNotShown == wxRect() ); +#endif +} + #endif //wxUSE_DATAVIEWCTRL