From 293b15f78d8873a65837c3d165dd739ec23dad8c Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 13 Jul 2008 17:28:31 +0000 Subject: [PATCH 1/1] added wxVListBox::GetItemRect() (#9711) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@54601 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/vlbox.h | 2 ++ interface/wx/vlbox.h | 7 +++++++ samples/htlbox/htlbox.cpp | 12 ++++++++++++ src/generic/vlbox.cpp | 25 +++++++++++++++++++++++++ 4 files changed, 46 insertions(+) diff --git a/include/wx/vlbox.h b/include/wx/vlbox.h index c6235d98b5..6887686b03 100644 --- a/include/wx/vlbox.h +++ b/include/wx/vlbox.h @@ -127,6 +127,8 @@ public: // get the background colour of selected cells const wxColour& GetSelectionBackground() const { return m_colBgSel; } + // get the item rect, returns empty rect if the item is not visible + wxRect GetItemRect(size_t n) const; // operations // ---------- diff --git a/interface/wx/vlbox.h b/interface/wx/vlbox.h index 2f7ae80506..ee09a476df 100644 --- a/interface/wx/vlbox.h +++ b/interface/wx/vlbox.h @@ -125,6 +125,13 @@ public: */ wxPoint GetMargins() const; + /** + Returns the rectangle occupied by this item in physical coordinates. + + If the item is not currently visible, returns an empty rectangle. + */ + wxRect GetItemRect(size_t item) const; + /** Returns the index of the next selected item or @c wxNOT_FOUND if there are no more. diff --git a/samples/htlbox/htlbox.cpp b/samples/htlbox/htlbox.cpp index 831dd2c839..eb4ccdb014 100644 --- a/samples/htlbox/htlbox.cpp +++ b/samples/htlbox/htlbox.cpp @@ -116,6 +116,7 @@ public: void OnToggleMulti(wxCommandEvent& event); void OnSelectAll(wxCommandEvent& event); void OnUpdateItem(wxCommandEvent& event); + void OnGetItemRect(wxCommandEvent& event); void OnSetBgCol(wxCommandEvent& event); void OnSetSelBgCol(wxCommandEvent& event); @@ -172,6 +173,7 @@ enum HtmlLbox_ToggleMulti, HtmlLbox_SelectAll, HtmlLbox_UpdateItem, + HtmlLbox_GetItemRect, HtmlLbox_SetBgCol, HtmlLbox_SetSelBgCol, @@ -199,6 +201,7 @@ BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(HtmlLbox_ToggleMulti, MyFrame::OnToggleMulti) EVT_MENU(HtmlLbox_SelectAll, MyFrame::OnSelectAll) EVT_MENU(HtmlLbox_UpdateItem, MyFrame::OnUpdateItem) + EVT_MENU(HtmlLbox_GetItemRect, MyFrame::OnGetItemRect) EVT_MENU(HtmlLbox_About, MyFrame::OnAbout) @@ -265,6 +268,7 @@ MyFrame::MyFrame() menuHLbox->AppendSeparator(); menuHLbox->Append(HtmlLbox_SelectAll, _T("Select &all items\tCtrl-A")); menuHLbox->Append(HtmlLbox_UpdateItem, _T("Update &first item\tCtrl-U")); + menuHLbox->Append(HtmlLbox_GetItemRect, _T("Show &rectangle of item #10\tCtrl-R")); menuHLbox->AppendSeparator(); menuHLbox->Append(HtmlLbox_SetBgCol, _T("Set &background...\tCtrl-B")); menuHLbox->Append(HtmlLbox_SetSelBgCol, @@ -434,6 +438,14 @@ void MyFrame::OnUpdateItem(wxCommandEvent& WXUNUSED(event)) GetMyBox()->UpdateFirstItem(); } +void MyFrame::OnGetItemRect(wxCommandEvent& WXUNUSED(event)) +{ + static const int ITEM = 10; + const wxRect r = m_hlbox->GetItemRect(ITEM); + wxLogMessage("Rect of item %d: (%d, %d)-(%d, %d)", + ITEM, r.x, r.y, r.x + r.width, r.y + r.height); +} + void MyFrame::OnSetBgCol(wxCommandEvent& WXUNUSED(event)) { wxColour col = wxGetColourFromUser(this, m_hlbox->GetBackgroundColour()); diff --git a/src/generic/vlbox.cpp b/src/generic/vlbox.cpp index f94031bca5..df4a9bbfb0 100644 --- a/src/generic/vlbox.cpp +++ b/src/generic/vlbox.cpp @@ -325,6 +325,31 @@ void wxVListBox::RefreshSelected() } } +wxRect wxVListBox::GetItemRect(size_t n) const +{ + wxRect itemrect; + + // check that this item is visible + const size_t lineMax = GetVisibleEnd(); + if ( n >= lineMax ) + return itemrect; + size_t line = GetVisibleBegin(); + if ( n < line ) + return itemrect; + + while ( line <= n ) + { + itemrect.y += itemrect.height; + itemrect.height = OnGetRowHeight(line); + + line++; + } + + itemrect.width = GetClientSize().x; + + return itemrect; +} + // ---------------------------------------------------------------------------- // wxVListBox appearance parameters // ---------------------------------------------------------------------------- -- 2.47.2