From: Vadim Zeitlin Date: Tue, 20 Dec 2011 21:21:38 +0000 (+0000) Subject: Fix horizontal alignment in icon view in generic wxListCtrl. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/4d0c23087a957d9535030e7b327049c717cd8bf1 Fix horizontal alignment in icon view in generic wxListCtrl. Ensure that all the items in the same column have the same width, so that their labels are centred. Closes #9227. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70066 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/docs/changes.txt b/docs/changes.txt index c4d5ab5849..36f74dd1f6 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -453,6 +453,7 @@ All (GUI): - Added wxFilePickerCtrl::SetInitialDirectory(). - Added wxDataViewItemAttr::SetBackgroundColour() and implemented it in generic wxDataViewCtrl (Andrew Xu). +- Fix item alignment in icon view in the generic wxListCtrl. MSW: diff --git a/samples/listctrl/listtest.cpp b/samples/listctrl/listtest.cpp index 0536b20076..97d3a4fef3 100644 --- a/samples/listctrl/listtest.cpp +++ b/samples/listctrl/listtest.cpp @@ -571,8 +571,14 @@ void MyFrame::InitWithIconItems(bool withText, bool sameIcon) if ( withText ) { - m_listCtrl->InsertItem(i, wxString::Format(wxT("Label %d"), i), - image); + // Make labels of different widths to test the layout. + wxString label; + if ( !(i % 5) ) + label.Printf("Longer label %d", i); + else + label.Printf("Label %d", i); + + m_listCtrl->InsertItem(i, label, image); } else { diff --git a/src/generic/listctrl.cpp b/src/generic/listctrl.cpp index 50052c8773..8ad024386e 100644 --- a/src/generic/listctrl.cpp +++ b/src/generic/listctrl.cpp @@ -3629,6 +3629,9 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh) int x = EXTRA_BORDER_X; int y = EXTRA_BORDER_Y; + + // Note that "row" here is vertical, i.e. what is called + // "column" in many other places in wxWidgets. int maxWidthInThisRow = 0; m_linesPerPage = 0; @@ -3650,8 +3653,20 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh) if (currentlyVisibleLines > m_linesPerPage) m_linesPerPage = currentlyVisibleLines; - if ( y + sizeLine.y >= clientHeight ) + // Have we reached the end of the row either because no + // more items would fit or because there are simply no more + // items? + if ( y + sizeLine.y >= clientHeight + || i == count - 1) { + // Adjust all items in this row to have the same + // width to ensure that they all align horizontally. + size_t firstRowLine = i - currentlyVisibleLines + 1; + for (size_t j = firstRowLine; j <= i; j++) + { + GetLine(j)->m_gi->ExtendWidth(maxWidthInThisRow); + } + currentlyVisibleLines = 0; y = EXTRA_BORDER_Y; maxWidthInThisRow += MARGIN_BETWEEN_ROWS; @@ -3660,10 +3675,6 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh) maxWidthInThisRow = 0; } - // We have reached the last item. - if ( i == count - 1 ) - entireWidth += maxWidthInThisRow; - if ( (tries == 0) && (entireWidth + SCROLL_UNIT_X > clientWidth) ) {