]> git.saurik.com Git - wxWidgets.git/commitdiff
Account for text attrs in generic wxDataViewCtrl's renderers.
authorVáclav Slavík <vslavik@fastmail.fm>
Sat, 30 Oct 2010 15:57:49 +0000 (15:57 +0000)
committerVáclav Slavík <vslavik@fastmail.fm>
Sat, 30 Oct 2010 15:57:49 +0000 (15:57 +0000)
When determining cell content's size, GetSize() measured the text using
wxDataViewCtrl's font, even though it could be renderer in bold or
italics.

Corrected by setting the attributes - and not only the value - prior to
GetSize() calls, and by using the right font in GetTextExtent() calls.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65949 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/dataview.h
include/wx/dvrenderers.h
src/common/datavcmn.cpp
src/generic/datavgen.cpp

index cf597a881befd89994a6e7716b1e01179bed8f35..8950f405671fd50910c5bf52f4949431c2f278f8 100644 (file)
@@ -172,6 +172,9 @@ public:
 
     bool IsDefault() const { return !(HasColour() || HasFont()); }
 
+    // Return the font based on the given one with this attribute applied to it.
+    wxFont GetEffectiveFont(const wxFont& font) const;
+
 private:
     wxColour m_colour;
     bool     m_bold;
index 248e4af121cc21367a93bbdaa6deaa56029ea2ca..d22157a16ba4f382653bfeaa28ed4dd19f5bc08c 100644 (file)
@@ -267,6 +267,10 @@ public:
     // Prepare DC to use attributes and call Render().
     void WXCallRender(wxRect rect, wxDC *dc, int state);
 
+protected:
+    // helper for GetSize() implementations, respects attributes
+    wxSize GetTextExtent(const wxString& str) const;
+
 private:
     wxDataViewItemAttr m_attr;
 
index d14aa097060e9c98b65563145054d1a05fe0487d..dd45d2b42e4f1327d99f26c36f51685f93676a77 100644 (file)
@@ -69,6 +69,24 @@ private:
 
 } // anonymous namespace
 
+// ---------------------------------------------------------
+// wxDataViewItemAttr
+// ---------------------------------------------------------
+
+wxFont wxDataViewItemAttr::GetEffectiveFont(const wxFont& font) const
+{
+    if ( !HasFont() )
+        return font;
+
+    wxFont f(font);
+    if ( GetBold() )
+        f.MakeBold();
+    if ( GetItalic() )
+        f.MakeItalic();
+    return f;
+}
+
+
 // ---------------------------------------------------------
 // wxDataViewModelNotifier
 // ---------------------------------------------------------
@@ -826,19 +844,28 @@ wxDataViewCustomRendererBase::WXCallRender(wxRect rectCell, wxDC *dc, int state)
 
     wxDCFontChanger changeFont(*dc);
     if ( m_attr.HasFont() )
-    {
-        wxFont font(dc->GetFont());
-        if ( m_attr.GetBold() )
-            font.MakeBold();
-        if ( m_attr.GetItalic() )
-            font.MakeItalic();
-
-        changeFont.Set(font);
-    }
+        changeFont.Set(m_attr.GetEffectiveFont(dc->GetFont()));
 
     Render(rectItem, dc, state);
 }
 
+wxSize wxDataViewCustomRendererBase::GetTextExtent(const wxString& str) const
+{
+    const wxDataViewCtrl *view = GetView();
+
+    if ( m_attr.HasFont() )
+    {
+        wxFont font(m_attr.GetEffectiveFont(view->GetFont()));
+        wxSize size;
+        view->GetTextExtent(str, &size.x, &size.y, NULL, NULL, &font);
+        return size;
+    }
+    else
+    {
+        return view->GetTextExtent(str);
+    }
+}
+
 void
 wxDataViewCustomRendererBase::RenderText(const wxString& text,
                                          int xoffset,
index ec68fc76a991a0184737473a2a484ac65109de4e..2fe365515373df2bf212701a081beafb8f65be40 100644 (file)
@@ -761,10 +761,10 @@ bool wxDataViewTextRenderer::Render(wxRect rect, wxDC *dc, int state)
 
 wxSize wxDataViewTextRenderer::GetSize() const
 {
-    const wxDataViewCtrl *view = GetView();
     if (!m_text.empty())
-        return view->wxWindowBase::GetTextExtent( m_text );
-    return wxSize(wxDVC_DEFAULT_RENDERER_SIZE,wxDVC_DEFAULT_RENDERER_SIZE);
+        return GetTextExtent(m_text);
+    else
+        return wxSize(wxDVC_DEFAULT_RENDERER_SIZE,wxDVC_DEFAULT_RENDERER_SIZE);
 }
 
 // ---------------------------------------------------------
@@ -1016,11 +1016,7 @@ bool wxDataViewDateRenderer::Render( wxRect cell, wxDC *dc, int state )
 
 wxSize wxDataViewDateRenderer::GetSize() const
 {
-    const wxDataViewCtrl* view = GetView();
-    wxString tmp = m_date.FormatDate();
-    wxCoord x,y,d;
-    view->GetTextExtent( tmp, &x, &y, &d );
-    return wxSize(x,y+d);
+    return GetTextExtent(m_date.FormatDate());
 }
 
 void wxDataViewDateRenderer::WXOnActivate(wxDataViewModel *model,
@@ -1085,15 +1081,13 @@ bool wxDataViewIconTextRenderer::Render(wxRect rect, wxDC *dc, int state)
 
 wxSize wxDataViewIconTextRenderer::GetSize() const
 {
-    const wxDataViewCtrl *view = GetView();
     if (!m_value.GetText().empty())
     {
-        int x,y;
-        view->GetTextExtent( m_value.GetText(), &x, &y );
+        wxSize size = GetTextExtent(m_value.GetText());
 
         if (m_value.GetIcon().IsOk())
-            x += m_value.GetIcon().GetWidth() + 4;
-        return wxSize( x, y );
+            size.x += m_value.GetIcon().GetWidth() + 4;
+        return size;
     }
     return wxSize(80,20);
 }
@@ -2524,12 +2518,17 @@ int wxDataViewMainWindow::GetLineStart( unsigned int row ) const
                     !model->HasContainerColumns(item))
                     continue;      // skip it!
 
-                wxVariant value;
-                model->GetValue( value, item, column->GetModelColumn() );
-
                 wxDataViewRenderer *renderer =
                     const_cast<wxDataViewRenderer*>(column->GetRenderer());
+
+                wxVariant value;
+                model->GetValue( value, item, column->GetModelColumn() );
                 renderer->SetValue( value );
+
+                wxDataViewItemAttr attr;
+                model->GetAttr(item, column->GetModelColumn(), attr);
+                renderer->SetAttr(attr);
+
                 height = wxMax( height, renderer->GetSize().y );
             }
 
@@ -2587,12 +2586,17 @@ int wxDataViewMainWindow::GetLineAt( unsigned int y ) const
                 !model->HasContainerColumns(item))
                 continue;      // skip it!
 
-            wxVariant value;
-            model->GetValue( value, item, column->GetModelColumn() );
-
             wxDataViewRenderer *renderer =
                 const_cast<wxDataViewRenderer*>(column->GetRenderer());
+
+            wxVariant value;
+            model->GetValue( value, item, column->GetModelColumn() );
             renderer->SetValue( value );
+
+            wxDataViewItemAttr attr;
+            model->GetAttr(item, column->GetModelColumn(), attr);
+            renderer->SetAttr(attr);
+
             height = wxMax( height, renderer->GetSize().y );
         }
 
@@ -2640,12 +2644,17 @@ int wxDataViewMainWindow::GetLineHeight( unsigned int row ) const
                 !model->HasContainerColumns(item))
                 continue;      // skip it!
 
-            wxVariant value;
-            model->GetValue( value, item, column->GetModelColumn() );
-
             wxDataViewRenderer *renderer =
                 const_cast<wxDataViewRenderer*>(column->GetRenderer());
+
+            wxVariant value;
+            model->GetValue( value, item, column->GetModelColumn() );
             renderer->SetValue( value );
+
+            wxDataViewItemAttr attr;
+            model->GetAttr(item, column->GetModelColumn(), attr);
+            renderer->SetAttr(attr);
+
             height = wxMax( height, renderer->GetSize().y );
         }
 
@@ -3814,6 +3823,11 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
                 wxVariant value;
                 model->GetValue( value, item, col->GetModelColumn() );
                 custom->SetValue( value );
+
+                wxDataViewItemAttr attr;
+                model->GetAttr(item, col->GetModelColumn(), attr);
+                custom->SetAttr(attr);
+
                 wxRect cell_rect( xpos, GetLineStart( current ),
                                   col->GetWidth(), GetLineHeight( current ) );
 
@@ -4169,6 +4183,10 @@ unsigned int wxDataViewCtrl::GetBestColumnWidth(int idx) const
         GetModel()->GetValue(value, item, column->GetModelColumn());
         renderer->SetValue(value);
 
+        wxDataViewItemAttr attr;
+        GetModel()->GetAttr(item, column->GetModelColumn(), attr);
+        renderer->SetAttr(attr);
+
         max_width = (unsigned)wxMax((int)max_width, renderer->GetSize().x);
     }