From: Vadim Zeitlin Date: Mon, 12 Oct 2009 13:59:25 +0000 (+0000) Subject: Remove wxDataViewTextRendererAttr by merging it with wxDataViewTextRenderer. X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/2d0d78133612ffdcc4ac498db54813fc38c64a90 Remove wxDataViewTextRendererAttr by merging it with wxDataViewTextRenderer. There is no reason to have a separate class for rendering the text honouring the attributes defined for it, wxDataViewTextRenderer itself already does this perfectly well. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62383 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/dataview.h b/include/wx/dataview.h index d4da5c66ed..29c1f55d00 100644 --- a/include/wx/dataview.h +++ b/include/wx/dataview.h @@ -144,6 +144,7 @@ public: bool HasColour() const { return m_colour.Ok(); } const wxColour& GetColour() const { return m_colour; } + bool HasFont() const { return m_bold || m_italic; } bool GetBold() const { return m_bold; } bool GetItalic() const { return m_italic; } @@ -983,6 +984,10 @@ private: #endif +// this class is obsolete, its functionality was merged in +// wxDataViewTextRenderer itself now, don't use it any more +#define wxDataViewTextRendererAttr wxDataViewTextRenderer + //----------------------------------------------------------------------------- // wxDataViewListStore //----------------------------------------------------------------------------- diff --git a/include/wx/generic/dataview.h b/include/wx/generic/dataview.h index 032cd62590..c5351892ac 100644 --- a/include/wx/generic/dataview.h +++ b/include/wx/generic/dataview.h @@ -38,7 +38,22 @@ public: int align = wxDVR_DEFAULT_ALIGNMENT ); virtual ~wxDataViewRenderer(); + // these methods are used to draw the cell contents, Render() doesn't care + // about the attributes while RenderWithAttr() does -- override it if you + // want to take the attributes defined for this cell into account, otherwise + // overriding Render() is enough virtual bool Render( wxRect cell, wxDC *dc, int state ) = 0; + + // NB: RenderWithAttr() also has more standard parameter order and types + virtual bool + RenderWithAttr(wxDC& dc, + const wxRect& rect, + const wxDataViewItemAttr * WXUNUSED(attr), // NULL if none + int state) + { + return Render(rect, &dc, state); + } + virtual wxSize GetSize() const = 0; virtual void SetAlignment( int align ); @@ -77,10 +92,6 @@ public: // Create DC on request virtual wxDC *GetDC(); - void SetHasAttr( bool set ) { m_hasAttr = set; } - void SetAttr( const wxDataViewItemAttr &attr ) { m_attr = attr; } - bool GetWantsAttr() const { return m_wantsAttr; } - // implementation int CalculateAlignment() const; @@ -89,11 +100,6 @@ private: int m_align; wxDataViewCellMode m_mode; -protected: - bool m_wantsAttr; - bool m_hasAttr; - wxDataViewItemAttr m_attr; - protected: DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRenderer) }; @@ -109,6 +115,15 @@ public: wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int align = wxDVR_DEFAULT_ALIGNMENT ); + // Draw the text using the provided attributes + void RenderText(wxDC& dc, + const wxRect& rect, + const wxString& text, + const wxDataViewItemAttr *attr, // may be NULL if none + int state, + int xoffset = 0); + + // Overload using standard attributes void RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state ); protected: @@ -130,7 +145,15 @@ public: bool SetValue( const wxVariant &value ); bool GetValue( wxVariant &value ) const; - bool Render( wxRect cell, wxDC *dc, int state ); + virtual bool RenderWithAttr(wxDC& dc, + const wxRect& rect, + const wxDataViewItemAttr *attr, + int state); + virtual bool Render( wxRect cell, wxDC *dc, int state ) + { + return RenderWithAttr(*dc, cell, NULL, state); + } + wxSize GetSize() const; // in-place editing @@ -146,23 +169,6 @@ protected: DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRenderer) }; -// --------------------------------------------------------- -// wxDataViewTextRendererAttr -// --------------------------------------------------------- - -class WXDLLIMPEXP_ADV wxDataViewTextRendererAttr: public wxDataViewTextRenderer -{ -public: - wxDataViewTextRendererAttr( const wxString &varianttype = wxT("string"), - wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, - int align = wxDVR_DEFAULT_ALIGNMENT ); - - bool Render( wxRect cell, wxDC *dc, int state ); - -protected: - DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRendererAttr) -}; - // --------------------------------------------------------- // wxDataViewBitmapRenderer // --------------------------------------------------------- diff --git a/include/wx/gtk/dataview.h b/include/wx/gtk/dataview.h index 486da22cdc..f59d27ee73 100644 --- a/include/wx/gtk/dataview.h +++ b/include/wx/gtk/dataview.h @@ -40,7 +40,6 @@ public: // implementation GtkCellRenderer* GetGtkHandle() { return m_renderer; } void GtkInitHandlers(); - virtual bool GtkHasAttributes() { return false; } void GtkUpdateAlignment(); protected: @@ -71,24 +70,6 @@ protected: DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRenderer) }; -// --------------------------------------------------------- -// wxDataViewTextRendererAttr -// --------------------------------------------------------- - -class WXDLLIMPEXP_ADV wxDataViewTextRendererAttr: public wxDataViewTextRenderer -{ -public: - wxDataViewTextRendererAttr( const wxString &varianttype = wxT("string"), - wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, - int align = wxDVR_DEFAULT_ALIGNMENT ); - - // implementation - bool GtkHasAttributes() { return true; } - -protected: - DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRendererAttr) -}; - // --------------------------------------------------------- // wxDataViewBitmapRenderer // --------------------------------------------------------- diff --git a/include/wx/osx/dataview.h b/include/wx/osx/dataview.h index 679e229ba2..b9bc5c576f 100644 --- a/include/wx/osx/dataview.h +++ b/include/wx/osx/dataview.h @@ -191,22 +191,6 @@ private: DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRenderer) }; -// --------------------------------------------------------- -// wxDataViewTextRendererAttr -// --------------------------------------------------------- - -class WXDLLIMPEXP_ADV wxDataViewTextRendererAttr: public wxDataViewTextRenderer -{ -public: -// -// constructors / destructor -// - wxDataViewTextRendererAttr(wxString const& varianttype=wxT("string"), wxDataViewCellMode mode=wxDATAVIEW_CELL_INERT, int align=wxDVR_DEFAULT_ALIGNMENT); - -private: - DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewTextRendererAttr) -}; - // --------------------------------------------------------- // wxDataViewBitmapRenderer // --------------------------------------------------------- diff --git a/interface/wx/dataview.h b/interface/wx/dataview.h index f7497f28d9..4e6639b172 100644 --- a/interface/wx/dataview.h +++ b/interface/wx/dataview.h @@ -1033,7 +1033,6 @@ enum wxDataViewCellRenderState One instance of a renderer class is owned by a wxDataViewColumn. There is a number of ready-to-use renderers provided: - wxDataViewTextRenderer, - - wxDataViewTextRendererAttr, - wxDataViewIconTextRenderer, - wxDataViewToggleRenderer, - wxDataViewProgressRenderer, @@ -1263,30 +1262,6 @@ public: -/** - @class wxDataViewTextRendererAttr - - The same as wxDataViewTextRenderer but with support for font attributes. - Font attributes are currently only supported under GTK+ and MSW. - - @see wxDataViewModel::GetAttr and wxDataViewItemAttr. - - @library{wxadv} - @category{dvc} -*/ -class wxDataViewTextRendererAttr : public wxDataViewTextRenderer -{ -public: - /** - The ctor. - */ - wxDataViewTextRendererAttr(const wxString& varianttype = "string", - wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, - int align = wxDVR_DEFAULT_ALIGNMENT); -}; - - - /** @class wxDataViewCustomRenderer diff --git a/samples/dataview/dataview.cpp b/samples/dataview/dataview.cpp index 8ebc6a8044..101be7269d 100644 --- a/samples/dataview/dataview.cpp +++ b/samples/dataview/dataview.cpp @@ -553,7 +553,7 @@ void MyFrame::BuildDataViewCtrl(wxPanel* parent, unsigned int nPanel, unsigned l m_ctrl[1]->AppendIconTextColumn("icon", 1, wxDATAVIEW_CELL_INERT); #endif m_ctrl[1]->AppendColumn( - new wxDataViewColumn("attributes", new wxDataViewTextRendererAttr, 2 )); + new wxDataViewColumn("attributes", new wxDataViewTextRenderer, 2 )); } break; diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 462af9ddfc..7221c51138 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -612,8 +612,6 @@ wxDataViewRenderer::wxDataViewRenderer( const wxString &varianttype, m_dc = NULL; m_align = align; m_mode = mode; - m_wantsAttr = false; - m_hasAttr = false; } wxDataViewRenderer::~wxDataViewRenderer() @@ -674,14 +672,42 @@ wxDataViewCustomRenderer::wxDataViewCustomRenderer( const wxString &varianttype, void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state ) { - wxDataViewCtrl *view = GetOwner()->GetOwner(); - wxColour col = (state & wxDATAVIEW_CELL_SELECTED) ? - wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) : - view->GetForegroundColour(); - dc->SetTextForeground(col); - dc->DrawText( text, - cell.x + xoffset, - cell.y + ((cell.height - dc->GetCharHeight()) / 2)); + wxColour col = state & wxDATAVIEW_CELL_SELECTED + ? wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) + : GetOwner()->GetOwner()->GetForegroundColour(); + + wxDataViewItemAttr attr; + attr.SetColour(col); + RenderText(*dc, cell, text, &attr, state, xoffset); +} + +void +wxDataViewCustomRenderer::RenderText(wxDC& dc, + const wxRect& rect, + const wxString& text, + const wxDataViewItemAttr *attr, + int WXUNUSED(state), + int xoffset) +{ + wxDCTextColourChanger changeFg(dc); + if ( attr && attr->HasColour() ) + changeFg.Set(attr->GetColour()); + + wxDCFontChanger changeFont(dc); + if ( attr && attr->HasFont() ) + { + wxFont font(dc.GetFont()); + if ( attr->GetBold() ) + font.MakeBold(); + if ( attr->GetItalic() ) + font.MakeItalic(); + + changeFont.Set(font); + } + + dc.DrawText(text, + rect.x + xoffset, + rect.y + ((rect.height - dc.GetCharHeight()) / 2)); } // --------------------------------------------------------- @@ -734,9 +760,13 @@ bool wxDataViewTextRenderer::GetValueFromEditorCtrl( wxControl *editor, wxVarian return true; } -bool wxDataViewTextRenderer::Render( wxRect cell, wxDC *dc, int state ) +bool +wxDataViewTextRenderer::RenderWithAttr(wxDC& dc, + const wxRect& rect, + const wxDataViewItemAttr *attr, + int state) { - RenderText( m_text, 0, cell, dc, state ); + RenderText(dc, rect, m_text, attr, state); return true; } @@ -748,60 +778,6 @@ wxSize wxDataViewTextRenderer::GetSize() const return wxSize(wxDVC_DEFAULT_RENDERER_SIZE,wxDVC_DEFAULT_RENDERER_SIZE); } -// --------------------------------------------------------- -// wxDataViewTextRendererAttr -// --------------------------------------------------------- - -IMPLEMENT_CLASS(wxDataViewTextRendererAttr, wxDataViewTextRenderer) - -wxDataViewTextRendererAttr::wxDataViewTextRendererAttr( const wxString &varianttype, - wxDataViewCellMode mode, int align ) : - wxDataViewTextRenderer( varianttype, mode, align ) -{ - m_wantsAttr = true; -} - -bool wxDataViewTextRendererAttr::Render( wxRect cell, wxDC *dc, int WXUNUSED(state) ) -{ - wxFont font; - wxColour colour; - - if (m_hasAttr) - { - if (m_attr.HasColour()) - { - colour = dc->GetTextForeground(); - dc->SetTextForeground( m_attr.GetColour() ); - } - - if (m_attr.GetBold() || m_attr.GetItalic()) - { - font = dc->GetFont(); - wxFont myfont = font; - if (m_attr.GetBold()) - myfont.SetWeight( wxFONTWEIGHT_BOLD ); - if (m_attr.GetItalic()) - myfont.SetStyle( wxFONTSTYLE_ITALIC ); - dc->SetFont( myfont ); - } - } - - dc->DrawText( m_text, cell.x, cell.y + ((cell.height - dc->GetCharHeight()) / 2)); - - // restore dc - if (m_hasAttr) - { - if (m_attr.HasColour()) - dc->SetTextForeground( colour ); - - if (m_attr.GetBold() || m_attr.GetItalic()) - dc->SetFont( font ); - } - - return true; -} - - // --------------------------------------------------------- // wxDataViewBitmapRenderer // --------------------------------------------------------- @@ -1602,15 +1578,6 @@ wxBitmap wxDataViewMainWindow::CreateItemBitmap( unsigned int row, int &indent ) model->GetValue( value, item, column->GetModelColumn()); cell->SetValue( value ); - if (cell->GetWantsAttr()) - { - wxDataViewItemAttr attr; - bool ret = model->GetAttr( item, column->GetModelColumn(), attr ); - if (ret) - cell->SetAttr( attr ); - cell->SetHasAttr( ret ); - } - wxSize size = cell->GetSize(); size.x = wxMin( 2*PADDING_RIGHTLEFT + size.x, width ); size.y = height; @@ -1638,7 +1605,10 @@ wxBitmap wxDataViewMainWindow::CreateItemBitmap( unsigned int row, int &indent ) item_rect.width = size.x - 2 * PADDING_RIGHTLEFT; // dc.SetClippingRegion( item_rect ); - cell->Render( item_rect, &dc, 0 ); + wxDataViewItemAttr attr; + const bool + hasAttr = model->GetAttr(item, column->GetModelColumn(), attr); + cell->RenderWithAttr(dc, item_rect, hasAttr ? &attr : NULL, 0); // dc.DestroyClippingRegion(); x += width; @@ -1830,15 +1800,6 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) model->GetValue( value, dataitem, col->GetModelColumn()); cell->SetValue( value ); - if (cell->GetWantsAttr()) - { - wxDataViewItemAttr attr; - bool ret = model->GetAttr( dataitem, col->GetModelColumn(), attr ); - if (ret) - cell->SetAttr( attr ); - cell->SetHasAttr( ret ); - } - // update cell_rect cell_rect.y = GetLineStart( item ); cell_rect.height = GetLineHeight( item ); @@ -1936,7 +1897,12 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) // violating only the left & right coords - however the user can // make its own renderer and thus we cannot be sure of that. dc.SetClippingRegion( item_rect ); - cell->Render( item_rect, &dc, state ); + + wxDataViewItemAttr attr; + const bool + hasAttr = model->GetAttr(dataitem, col->GetModelColumn(), attr); + cell->RenderWithAttr(dc, item_rect, hasAttr ? &attr : NULL, state); + dc.DestroyClippingRegion(); } diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index 7f03b9f813..3228e441f2 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -1790,18 +1790,6 @@ void wxDataViewTextRenderer::SetAlignment( int align ) g_value_unset( &gvalue ); } -// --------------------------------------------------------- -// wxDataViewTextRendererAttr -// --------------------------------------------------------- - -IMPLEMENT_CLASS(wxDataViewTextRendererAttr,wxDataViewTextRenderer) - -wxDataViewTextRendererAttr::wxDataViewTextRendererAttr( const wxString &varianttype, - wxDataViewCellMode mode, int align ) : - wxDataViewTextRenderer( varianttype, mode, align ) -{ -} - // --------------------------------------------------------- // wxDataViewBitmapRenderer // --------------------------------------------------------- @@ -2580,77 +2568,60 @@ static void wxGtkTreeCellDataFunc( GtkTreeViewColumn *WXUNUSED(column), cell->SetValue( value ); - if (cell->GtkHasAttributes()) + wxDataViewItemAttr attr; + if (wx_model->GetAttr( item, cell->GetOwner()->GetModelColumn(), attr )) { - wxDataViewItemAttr attr; - bool colour_set = false; - bool style_set = false; - bool weight_set = false; - - if (wx_model->GetAttr( item, cell->GetOwner()->GetModelColumn(), attr )) + if (attr.HasColour()) { - // this must be a GtkCellRendererText - wxColour colour = attr.GetColour(); - if (colour.IsOk()) - { - 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), "foreground_gdk", &gvalue ); - g_value_unset( &gvalue ); + const GdkColor * const gcol = attr.GetColour().GetColor(); - colour_set = true; - } - - 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 ); - - style_set = true; - } - - 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 ); - - weight_set = true; - } + 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 ); } - - if (!style_set) + 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_object_set_property( G_OBJECT(renderer), "foreground-set", &gvalue ); g_value_unset( &gvalue ); } - if (!weight_set) + 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 ); + } + 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_object_set_property( G_OBJECT(renderer), "style-set", &gvalue ); g_value_unset( &gvalue ); } - if (!colour_set) + + 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 ); + } + 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_object_set_property( G_OBJECT(renderer), "weight-set", &gvalue ); g_value_unset( &gvalue ); } } diff --git a/src/osx/dataview_osx.cpp b/src/osx/dataview_osx.cpp index f2140e4e36..b8f33a85a2 100644 --- a/src/osx/dataview_osx.cpp +++ b/src/osx/dataview_osx.cpp @@ -325,16 +325,6 @@ void wxDataViewCustomRenderer::SetDC(wxDC* newDCPtr) m_DCPtr = newDCPtr; } -// --------------------------------------------------------- -// wxDataViewTextRendererAttr -// --------------------------------------------------------- -wxDataViewTextRendererAttr::wxDataViewTextRendererAttr(wxString const& varianttype, wxDataViewCellMode mode, int align) - :wxDataViewTextRenderer(varianttype,mode,align) -{ -} - -IMPLEMENT_CLASS(wxDataViewTextRendererAttr,wxDataViewTextRenderer) - //----------------------------------------------------------------------------- // wxDataViewCtrl //-----------------------------------------------------------------------------