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
This commit is contained in:
Vadim Zeitlin
2009-10-15 16:53:52 +00:00
parent 84fc95da58
commit 7bade612f0

View File

@@ -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
// 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
// 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
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.SetSize(size);
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);