From 4bdc891f548dce13863001de51327c7f9abaea0d Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 12 Feb 2012 22:19:04 +0000 Subject: [PATCH] Implement wxDV_ROW_LINES for generic wxDataViewCtrl. Provide wxDataViewCtrl::SetAlternateRowColour() to specify the colour to use for odd rows explicitly but determine it automatically from the background colour if no explicit colour was specified. Closes #12834. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70576 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/changes.txt | 1 + include/wx/generic/dataview.h | 8 ++++++++ src/generic/datavgen.cpp | 36 +++++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/docs/changes.txt b/docs/changes.txt index a9d343bf7c..8854459475 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -487,6 +487,7 @@ All (GUI): - Implement wxMenuBar::IsEnabledTop() for all major ports (Igor Korot). - Implement best size calculation for report mode wxListCtrl. - Fix setting of the frame icon when using non-standard icon sizes (vid). +- Implement wxDV_ROW_LINES in generic wxDataViewCtrl (RedCAT). GTK: diff --git a/include/wx/generic/dataview.h b/include/wx/generic/dataview.h index 32e7723fd9..c2cf345a4c 100644 --- a/include/wx/generic/dataview.h +++ b/include/wx/generic/dataview.h @@ -191,6 +191,11 @@ public: virtual void EditItem(const wxDataViewItem& item, const wxDataViewColumn *column); + // These methods are specific to generic wxDataViewCtrl implementation and + // should not be used in portable code. + wxColour GetAlternateRowColour() const { return m_alternateRowColour; } + void SetAlternateRowColour(const wxColour& colour); + protected: virtual void EnsureVisible( int row, int column ); @@ -245,6 +250,9 @@ private: wxDataViewMainWindow *m_clientArea; wxDataViewHeaderWindow *m_headerArea; + // user defined color to draw row lines, may be invalid + wxColour m_alternateRowColour; + // the index of the column currently used for sorting or -1 int m_sortingColumnIdx; diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 5fd5797d8c..8d38670876 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -1745,6 +1745,37 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) ) x_last += col->GetWidth(); } + // Draw background of alternate rows specially if required + if ( m_owner->HasFlag(wxDV_ROW_LINES) ) + { + wxColour altRowColour = m_owner->m_alternateRowColour; + if ( !altRowColour.IsOk() ) + { + // Determine the alternate rows colour automatically from the + // background colour. + const wxColour bgColour = m_owner->GetBackgroundColour(); + + // Depending on the background, alternate row color + // will be 3% more dark or 50% brighter. + int alpha = bgColour.GetRGB() > 0x808080 ? 97 : 150; + altRowColour = bgColour.ChangeLightness(alpha); + } + + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush(wxBrush(altRowColour)); + + for (unsigned int item = item_start; item < item_last; item++) + { + if ( item % 2 ) + { + dc.DrawRectangle(x_start, + GetLineStart(item), + GetClientSize().GetWidth(), + GetLineHeight(item)); + } + } + } + // Draw horizontal rules if required if ( m_owner->HasFlag(wxDV_HORIZ_RULES) ) { @@ -4931,6 +4962,11 @@ bool wxDataViewCtrl::IsSelected( const wxDataViewItem & item ) const return false; } +void wxDataViewCtrl::SetAlternateRowColour(const wxColour& colour) +{ + m_alternateRowColour = colour; +} + void wxDataViewCtrl::SelectAll() { m_clientArea->SelectAllRows(true); -- 2.45.2