From 3e60a3c1471d7573e4e05ebc97006b9274a279ae Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 12 Oct 2009 22:44:09 +0000 Subject: [PATCH] Make generic wxDataViewProgressRenderer fill the entire cell. After the fixes in the previous commit it is finally possibly to make the progress renderer expand to the entire cell area instead of taking a fixed width, it is enough to simply override RenderWithAttr() instead of Render() and ignore the alignment as this avoids the use of (arbitrary and hardcoded) wxDataViewProgressRenderer::GetSize(). git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62394 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/generic/dataview.h | 31 +++++++++++++++++++++++-------- src/generic/datavgen.cpp | 30 ++++++++++++++++-------------- 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/include/wx/generic/dataview.h b/include/wx/generic/dataview.h index 3e32fa8ffa..66090fa892 100644 --- a/include/wx/generic/dataview.h +++ b/include/wx/generic/dataview.h @@ -93,12 +93,23 @@ public: // implementation int CalculateAlignment() const; +protected: + // This is just a convenience for the derived classes overriding + // RenderWithAttr() to avoid repeating the same wxFAIL_MSG() in all of them + bool DummyRender(wxRect WXUNUSED(cell), + wxDC * WXUNUSED(dc), + int WXUNUSED(state)) + { + wxFAIL_MSG("shouldn't be called at all, use RenderWithAttr() instead"); + + return false; + } + private: wxDC *m_dc; int m_align; wxDataViewCellMode m_mode; -protected: DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewRenderer) }; @@ -149,12 +160,9 @@ public: int align, const wxDataViewItemAttr *attr, int state); - virtual bool Render(wxRect WXUNUSED(cell), - wxDC * WXUNUSED(dc), - int WXUNUSED(state)) + virtual bool Render(wxRect cell, wxDC *dc, int state) { - wxFAIL_MSG("only RenderWithAttr() should be called"); - return false; + return DummyRender(cell, dc, state); } wxSize GetSize() const; @@ -234,12 +242,19 @@ public: const wxString &varianttype = wxT("long"), wxDataViewCellMode mode = wxDATAVIEW_CELL_INERT, int align = wxDVR_DEFAULT_ALIGNMENT ); - virtual ~wxDataViewProgressRenderer(); bool SetValue( const wxVariant &value ); bool GetValue( wxVariant& value ) const; - virtual bool Render( wxRect cell, wxDC *dc, int state ); + virtual bool RenderWithAttr(wxDC& dc, + const wxRect& rect, + int align, + const wxDataViewItemAttr *attr, + int state); + virtual bool Render(wxRect cell, wxDC *dc, int state) + { + return DummyRender(cell, dc, state); + } virtual wxSize GetSize() const; private: diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index d407c82285..1653ebfcca 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -938,10 +938,6 @@ wxDataViewProgressRenderer::wxDataViewProgressRenderer( const wxString &label, m_value = 0; } -wxDataViewProgressRenderer::~wxDataViewProgressRenderer() -{ -} - bool wxDataViewProgressRenderer::SetValue( const wxVariant &value ) { m_value = (long) value; @@ -958,18 +954,24 @@ bool wxDataViewProgressRenderer::GetValue( wxVariant &value ) const return true; } -bool wxDataViewProgressRenderer::Render( wxRect cell, wxDC *dc, int WXUNUSED(state) ) +bool wxDataViewProgressRenderer::RenderWithAttr(wxDC& dc, + const wxRect& rect, + int WXUNUSED(align), + const wxDataViewItemAttr *attr, + int WXUNUSED(state)) { - double pct = (double)m_value / 100.0; - wxRect bar = cell; - bar.width = (int)(cell.width * pct); - dc->SetPen( *wxTRANSPARENT_PEN ); - dc->SetBrush( *wxBLUE_BRUSH ); - dc->DrawRectangle( bar ); + // deflat the rect to leave a small border between bars in adjacent rows + wxRect bar = rect.Deflate(0, 1); - dc->SetBrush( *wxTRANSPARENT_BRUSH ); - dc->SetPen( *wxBLACK_PEN ); - dc->DrawRectangle( cell ); + dc.SetBrush( *wxTRANSPARENT_BRUSH ); + dc.SetPen( *wxBLACK_PEN ); + dc.DrawRectangle( bar ); + + bar.width = (int)(bar.width * m_value / 100.); + dc.SetPen( *wxTRANSPARENT_PEN ); + dc.SetBrush( attr && attr->HasColour() ? wxBrush(attr->GetColour()) + : *wxBLUE_BRUSH ); + dc.DrawRectangle( bar ); return true; } -- 2.47.2