]> git.saurik.com Git - wxWidgets.git/commitdiff
Correct cell alignment computation for too small column sizes.
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 15 Oct 2009 16:53:52 +0000 (16:53 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 15 Oct 2009 16:53:52 +0000 (16:53 +0000)
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

src/generic/datavgen.cpp

index 7eccd2768250e4ee1f2644f3365271e42c0625d3..bdeadffd368cf888284931def78b3056723feea9 100644 (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
-
-        // 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);