Add support for custom attributes to wxGTK wxDataViewCustomRenderer.

Call SetAttr() to store them in wxDataViewCustomRenderer before rendering it
and also honour the attributes in RenderText() (by reusing the same code we
already use for wxDataViewTextRenderer).

The attributes now work correctly in dataview sample under wxGTK as well.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62596 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2009-11-10 17:41:58 +00:00
parent 2a454ffdbd
commit c80cde0001
4 changed files with 137 additions and 99 deletions

View File

@@ -1748,6 +1748,102 @@ static void wxGtkTextRendererEditedCallback( GtkCellRendererText *WXUNUSED(rende
}
namespace
{
// helper function used by wxDataViewTextRenderer and
// wxDataViewCustomRenderer::RenderText(): it applies the attributes to the
// given text renderer and returns true if anything was done
bool GtkApplyAttr(GtkCellRendererText *renderer, const wxDataViewItemAttr& attr)
{
bool usingDefaultAttrs = true;
if (attr.HasColour())
{
const GdkColor * const gcol = attr.GetColour().GetColor();
GValue gvalue = { 0, };
g_value_init( &gvalue, GDK_TYPE_COLOR );
g_value_set_boxed( &gvalue, gcol );
g_object_set_property( G_OBJECT(renderer), "foreground_gdk", &gvalue );
g_value_unset( &gvalue );
usingDefaultAttrs = false;
}
else
{
GValue gvalue = { 0, };
g_value_init( &gvalue, G_TYPE_BOOLEAN );
g_value_set_boolean( &gvalue, FALSE );
g_object_set_property( G_OBJECT(renderer), "foreground-set", &gvalue );
g_value_unset( &gvalue );
}
if (attr.GetItalic())
{
GValue gvalue = { 0, };
g_value_init( &gvalue, PANGO_TYPE_STYLE );
g_value_set_enum( &gvalue, PANGO_STYLE_ITALIC );
g_object_set_property( G_OBJECT(renderer), "style", &gvalue );
g_value_unset( &gvalue );
usingDefaultAttrs = false;
}
else
{
GValue gvalue = { 0, };
g_value_init( &gvalue, G_TYPE_BOOLEAN );
g_value_set_boolean( &gvalue, FALSE );
g_object_set_property( G_OBJECT(renderer), "style-set", &gvalue );
g_value_unset( &gvalue );
}
if (attr.GetBold())
{
GValue gvalue = { 0, };
g_value_init( &gvalue, PANGO_TYPE_WEIGHT );
g_value_set_enum( &gvalue, PANGO_WEIGHT_BOLD );
g_object_set_property( G_OBJECT(renderer), "weight", &gvalue );
g_value_unset( &gvalue );
usingDefaultAttrs = false;
}
else
{
GValue gvalue = { 0, };
g_value_init( &gvalue, G_TYPE_BOOLEAN );
g_value_set_boolean( &gvalue, FALSE );
g_object_set_property( G_OBJECT(renderer), "weight-set", &gvalue );
g_value_unset( &gvalue );
}
#if 0
if (attr.HasBackgroundColour())
{
wxColour colour = attr.GetBackgroundColour();
const GdkColor * const gcol = colour.GetColor();
GValue gvalue = { 0, };
g_value_init( &gvalue, GDK_TYPE_COLOR );
g_value_set_boxed( &gvalue, gcol );
g_object_set_property( G_OBJECT(renderer), "cell-background_gdk", &gvalue );
g_value_unset( &gvalue );
}
else
{
GValue gvalue = { 0, };
g_value_init( &gvalue, G_TYPE_BOOLEAN );
g_value_set_boolean( &gvalue, FALSE );
g_object_set_property( G_OBJECT(renderer), "cell-background-set", &gvalue );
g_value_unset( &gvalue );
}
#endif
return !usingDefaultAttrs;
}
} // anonymous namespace
IMPLEMENT_CLASS(wxDataViewTextRenderer, wxDataViewRenderer)
wxDataViewTextRenderer::wxDataViewTextRenderer( const wxString &varianttype, wxDataViewCellMode mode,
@@ -1818,6 +1914,11 @@ void wxDataViewTextRenderer::SetAlignment( int align )
g_value_unset( &gvalue );
}
bool wxDataViewTextRenderer::GtkSetAttr(const wxDataViewItemAttr& attr)
{
return GtkApplyAttr(GTK_CELL_RENDERER_TEXT(m_renderer), attr);
}
// ---------------------------------------------------------
// wxDataViewBitmapRenderer
// ---------------------------------------------------------
@@ -2036,7 +2137,7 @@ void wxDataViewCustomRenderer::RenderText( const wxString &text,
int WXUNUSED(state) )
{
if (!m_text_renderer)
m_text_renderer = gtk_cell_renderer_text_new();
m_text_renderer = GTK_CELL_RENDERER_TEXT(gtk_cell_renderer_text_new());
GValue gvalue = { 0, };
g_value_init( &gvalue, G_TYPE_STRING );
@@ -2044,12 +2145,14 @@ void wxDataViewCustomRenderer::RenderText( const wxString &text,
g_object_set_property( G_OBJECT(m_text_renderer), "text", &gvalue );
g_value_unset( &gvalue );
GtkApplyAttr(m_text_renderer, GetAttr());
GdkRectangle cell_area;
wxRectToGDKRect(cell, cell_area);
cell_area.x += xoffset;
cell_area.width -= xoffset;
gtk_cell_renderer_render( m_text_renderer,
gtk_cell_renderer_render( GTK_CELL_RENDERER(m_text_renderer),
m_renderParams.window,
m_renderParams.widget,
m_renderParams.background_area,
@@ -2565,108 +2668,21 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column),
cell->SetValue( value );
// deal with attributes if we can handle them here: currently this is only
// the case for wxDataViewTextRenderer (and derived) class(es) because
// GtkCellRendererText is the only GTK renderer that we use which supports
// the properties below (foreground_gdk, style, weight) -- if any other
// renderers added in the future support them too, they should simply
// override their GtkSupportsAttrs() to return true
// deal with attributes: if the renderer doesn't support them at all, we
// don't even need to query the model for them
if ( !cell->GtkSupportsAttrs() )
return;
// it can support attributes so check if this item has any
wxDataViewItemAttr attr;
if ( !wx_model->GetAttr( item, cell->GetOwner()->GetModelColumn(), attr )
&& cell->GtkIsUsingDefaultAttrs() )
if ( wx_model->GetAttr( item, cell->GetOwner()->GetModelColumn(), attr )
|| !cell->GtkIsUsingDefaultAttrs() )
{
// no custom attributes specified and we're already using the default
// ones -- nothing to do
return;
bool usingDefaultAttrs = !cell->GtkSetAttr(attr);
cell->GtkSetUsingDefaultAttrs(usingDefaultAttrs);
}
bool usingDefaultAttrs = true;
if (attr.HasColour())
{
const GdkColor * const gcol = attr.GetColour().GetColor();
GValue gvalue = { 0, };
g_value_init( &gvalue, GDK_TYPE_COLOR );
g_value_set_boxed( &gvalue, gcol );
g_object_set_property( G_OBJECT(renderer), "foreground_gdk", &gvalue );
g_value_unset( &gvalue );
usingDefaultAttrs = false;
}
else
{
GValue gvalue = { 0, };
g_value_init( &gvalue, G_TYPE_BOOLEAN );
g_value_set_boolean( &gvalue, FALSE );
g_object_set_property( G_OBJECT(renderer), "foreground-set", &gvalue );
g_value_unset( &gvalue );
}
if (attr.GetItalic())
{
GValue gvalue = { 0, };
g_value_init( &gvalue, PANGO_TYPE_STYLE );
g_value_set_enum( &gvalue, PANGO_STYLE_ITALIC );
g_object_set_property( G_OBJECT(renderer), "style", &gvalue );
g_value_unset( &gvalue );
usingDefaultAttrs = false;
}
else
{
GValue gvalue = { 0, };
g_value_init( &gvalue, G_TYPE_BOOLEAN );
g_value_set_boolean( &gvalue, FALSE );
g_object_set_property( G_OBJECT(renderer), "style-set", &gvalue );
g_value_unset( &gvalue );
}
if (attr.GetBold())
{
GValue gvalue = { 0, };
g_value_init( &gvalue, PANGO_TYPE_WEIGHT );
g_value_set_enum( &gvalue, PANGO_WEIGHT_BOLD );
g_object_set_property( G_OBJECT(renderer), "weight", &gvalue );
g_value_unset( &gvalue );
usingDefaultAttrs = false;
}
else
{
GValue gvalue = { 0, };
g_value_init( &gvalue, G_TYPE_BOOLEAN );
g_value_set_boolean( &gvalue, FALSE );
g_object_set_property( G_OBJECT(renderer), "weight-set", &gvalue );
g_value_unset( &gvalue );
}
#if 0
if (attr.HasBackgroundColour())
{
wxColour colour = attr.GetBackgroundColour();
const GdkColor * const gcol = colour.GetColor();
GValue gvalue = { 0, };
g_value_init( &gvalue, GDK_TYPE_COLOR );
g_value_set_boxed( &gvalue, gcol );
g_object_set_property( G_OBJECT(renderer), "cell-background_gdk", &gvalue );
g_value_unset( &gvalue );
}
else
{
GValue gvalue = { 0, };
g_value_init( &gvalue, G_TYPE_BOOLEAN );
g_value_set_boolean( &gvalue, FALSE );
g_object_set_property( G_OBJECT(renderer), "cell-background-set", &gvalue );
g_value_unset( &gvalue );
}
#endif
cell->GtkSetUsingDefaultAttrs(usingDefaultAttrs);
// else: no custom attributes specified and we're already using the default
// ones -- nothing to do
}
} // extern "C"