From: Vadim Zeitlin Date: Thu, 15 Oct 2009 16:53:52 +0000 (+0000) Subject: Correct cell alignment computation for too small column sizes. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/7bade612f0f138a06f6a53d84220bb9d8ece7662?ds=inline Correct cell alignment computation for too small column sizes. Actually the column size might not even be too small but the size returned by renderers GetSize() could be too large -- as is the case for spin renderer currently. And trusting it results in drawing outside of the cell boundary even when there is enough space inside it, so don't do this and fall back to left alignment if there is not enough space. This fixes display of the year column in the dataview sample broken by the recent changes. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62418 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 7eccd27682..bdeadffd36 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -634,22 +634,35 @@ wxDataViewRenderer::RenderWithAttr(wxDC& dc, { const wxSize size = GetSize(); - // horizontal alignment: - if (align & wxALIGN_CENTER_HORIZONTAL) - item_rect.x = cell_rect.x + (cell_rect.width / 2) - (size.x / 2); - else if (align & wxALIGN_RIGHT) - item_rect.x = cell_rect.x + cell_rect.width - size.x; - // else: wxALIGN_LEFT is the default - - // vertical alignment: - item_rect.y = cell_rect.y; - if (align & wxALIGN_CENTER_VERTICAL) - item_rect.y = cell_rect.y + (cell_rect.height / 2) - (size.y / 2); - else if (align & wxALIGN_BOTTOM) - item_rect.y = cell_rect.y + cell_rect.height - size.y; - // else: wxALIGN_TOP is the default - - item_rect.SetSize(size); + // take alignment into account only if there is enough space, otherwise + // show as much contents as possible + // + // notice that many existing renderers (e.g. wxDataViewSpinRenderer) + // return hard-coded size which can be more than they need and if we + // trusted their GetSize() we'd draw the text out of cell bounds + // entirely + + if ( size.x < cell_rect.width ) + { + if (align & wxALIGN_CENTER_HORIZONTAL) + item_rect.x += (cell_rect.width - size.x)/2; + else if (align & wxALIGN_RIGHT) + item_rect.x += cell_rect.width - size.x; + // else: wxALIGN_LEFT is the default + + item_rect.width = size.x; + } + + if ( size.y < cell_rect.height ) + { + if (align & wxALIGN_CENTER_VERTICAL) + item_rect.y += (cell_rect.height - size.y)/2; + else if (align & wxALIGN_BOTTOM) + item_rect.y += cell_rect.height - size.y; + // else: wxALIGN_TOP is the default + + item_rect.height = size.y; + } } return Render(item_rect, &dc, state);