Account for text attrs in generic wxDataViewCtrl's renderers.

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
This commit is contained in:
Václav Slavík
2010-10-30 15:57:49 +00:00
parent d0154e3a5a
commit 86755098f5
4 changed files with 83 additions and 31 deletions

View File

@@ -172,6 +172,9 @@ public:
bool IsDefault() const { return !(HasColour() || HasFont()); } 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: private:
wxColour m_colour; wxColour m_colour;
bool m_bold; bool m_bold;

View File

@@ -267,6 +267,10 @@ public:
// Prepare DC to use attributes and call Render(). // Prepare DC to use attributes and call Render().
void WXCallRender(wxRect rect, wxDC *dc, int state); void WXCallRender(wxRect rect, wxDC *dc, int state);
protected:
// helper for GetSize() implementations, respects attributes
wxSize GetTextExtent(const wxString& str) const;
private: private:
wxDataViewItemAttr m_attr; wxDataViewItemAttr m_attr;

View File

@@ -69,6 +69,24 @@ private:
} // anonymous namespace } // 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 // wxDataViewModelNotifier
// --------------------------------------------------------- // ---------------------------------------------------------
@@ -826,19 +844,28 @@ wxDataViewCustomRendererBase::WXCallRender(wxRect rectCell, wxDC *dc, int state)
wxDCFontChanger changeFont(*dc); wxDCFontChanger changeFont(*dc);
if ( m_attr.HasFont() ) if ( m_attr.HasFont() )
{ changeFont.Set(m_attr.GetEffectiveFont(dc->GetFont()));
wxFont font(dc->GetFont());
if ( m_attr.GetBold() )
font.MakeBold();
if ( m_attr.GetItalic() )
font.MakeItalic();
changeFont.Set(font);
}
Render(rectItem, dc, state); 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 void
wxDataViewCustomRendererBase::RenderText(const wxString& text, wxDataViewCustomRendererBase::RenderText(const wxString& text,
int xoffset, int xoffset,

View File

@@ -761,10 +761,10 @@ bool wxDataViewTextRenderer::Render(wxRect rect, wxDC *dc, int state)
wxSize wxDataViewTextRenderer::GetSize() const wxSize wxDataViewTextRenderer::GetSize() const
{ {
const wxDataViewCtrl *view = GetView();
if (!m_text.empty()) if (!m_text.empty())
return view->wxWindowBase::GetTextExtent( m_text ); return GetTextExtent(m_text);
return wxSize(wxDVC_DEFAULT_RENDERER_SIZE,wxDVC_DEFAULT_RENDERER_SIZE); 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 wxSize wxDataViewDateRenderer::GetSize() const
{ {
const wxDataViewCtrl* view = GetView(); return GetTextExtent(m_date.FormatDate());
wxString tmp = m_date.FormatDate();
wxCoord x,y,d;
view->GetTextExtent( tmp, &x, &y, &d );
return wxSize(x,y+d);
} }
void wxDataViewDateRenderer::WXOnActivate(wxDataViewModel *model, void wxDataViewDateRenderer::WXOnActivate(wxDataViewModel *model,
@@ -1085,15 +1081,13 @@ bool wxDataViewIconTextRenderer::Render(wxRect rect, wxDC *dc, int state)
wxSize wxDataViewIconTextRenderer::GetSize() const wxSize wxDataViewIconTextRenderer::GetSize() const
{ {
const wxDataViewCtrl *view = GetView();
if (!m_value.GetText().empty()) if (!m_value.GetText().empty())
{ {
int x,y; wxSize size = GetTextExtent(m_value.GetText());
view->GetTextExtent( m_value.GetText(), &x, &y );
if (m_value.GetIcon().IsOk()) if (m_value.GetIcon().IsOk())
x += m_value.GetIcon().GetWidth() + 4; size.x += m_value.GetIcon().GetWidth() + 4;
return wxSize( x, y ); return size;
} }
return wxSize(80,20); return wxSize(80,20);
} }
@@ -2524,12 +2518,17 @@ int wxDataViewMainWindow::GetLineStart( unsigned int row ) const
!model->HasContainerColumns(item)) !model->HasContainerColumns(item))
continue; // skip it! continue; // skip it!
wxVariant value;
model->GetValue( value, item, column->GetModelColumn() );
wxDataViewRenderer *renderer = wxDataViewRenderer *renderer =
const_cast<wxDataViewRenderer*>(column->GetRenderer()); const_cast<wxDataViewRenderer*>(column->GetRenderer());
wxVariant value;
model->GetValue( value, item, column->GetModelColumn() );
renderer->SetValue( value ); renderer->SetValue( value );
wxDataViewItemAttr attr;
model->GetAttr(item, column->GetModelColumn(), attr);
renderer->SetAttr(attr);
height = wxMax( height, renderer->GetSize().y ); height = wxMax( height, renderer->GetSize().y );
} }
@@ -2587,12 +2586,17 @@ int wxDataViewMainWindow::GetLineAt( unsigned int y ) const
!model->HasContainerColumns(item)) !model->HasContainerColumns(item))
continue; // skip it! continue; // skip it!
wxVariant value;
model->GetValue( value, item, column->GetModelColumn() );
wxDataViewRenderer *renderer = wxDataViewRenderer *renderer =
const_cast<wxDataViewRenderer*>(column->GetRenderer()); const_cast<wxDataViewRenderer*>(column->GetRenderer());
wxVariant value;
model->GetValue( value, item, column->GetModelColumn() );
renderer->SetValue( value ); renderer->SetValue( value );
wxDataViewItemAttr attr;
model->GetAttr(item, column->GetModelColumn(), attr);
renderer->SetAttr(attr);
height = wxMax( height, renderer->GetSize().y ); height = wxMax( height, renderer->GetSize().y );
} }
@@ -2640,12 +2644,17 @@ int wxDataViewMainWindow::GetLineHeight( unsigned int row ) const
!model->HasContainerColumns(item)) !model->HasContainerColumns(item))
continue; // skip it! continue; // skip it!
wxVariant value;
model->GetValue( value, item, column->GetModelColumn() );
wxDataViewRenderer *renderer = wxDataViewRenderer *renderer =
const_cast<wxDataViewRenderer*>(column->GetRenderer()); const_cast<wxDataViewRenderer*>(column->GetRenderer());
wxVariant value;
model->GetValue( value, item, column->GetModelColumn() );
renderer->SetValue( value ); renderer->SetValue( value );
wxDataViewItemAttr attr;
model->GetAttr(item, column->GetModelColumn(), attr);
renderer->SetAttr(attr);
height = wxMax( height, renderer->GetSize().y ); height = wxMax( height, renderer->GetSize().y );
} }
@@ -3814,6 +3823,11 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
wxVariant value; wxVariant value;
model->GetValue( value, item, col->GetModelColumn() ); model->GetValue( value, item, col->GetModelColumn() );
custom->SetValue( value ); custom->SetValue( value );
wxDataViewItemAttr attr;
model->GetAttr(item, col->GetModelColumn(), attr);
custom->SetAttr(attr);
wxRect cell_rect( xpos, GetLineStart( current ), wxRect cell_rect( xpos, GetLineStart( current ),
col->GetWidth(), GetLineHeight( current ) ); col->GetWidth(), GetLineHeight( current ) );
@@ -4169,6 +4183,10 @@ unsigned int wxDataViewCtrl::GetBestColumnWidth(int idx) const
GetModel()->GetValue(value, item, column->GetModelColumn()); GetModel()->GetValue(value, item, column->GetModelColumn());
renderer->SetValue(value); renderer->SetValue(value);
wxDataViewItemAttr attr;
GetModel()->GetAttr(item, column->GetModelColumn(), attr);
renderer->SetAttr(attr);
max_width = (unsigned)wxMax((int)max_width, renderer->GetSize().x); max_width = (unsigned)wxMax((int)max_width, renderer->GetSize().x);
} }