From c63b1604b344fce5a811966e62aea8d95a3165a2 Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Sun, 30 Aug 2015 19:46:34 +0200 Subject: [PATCH] Use native renderer to draw rectangle indicating that wxPG category property is selected. Because on some ports native renderers require a valid reference to the windows be drawn then it is necessary to implement and use new wxPGCellRenderer::DrawCaptionSelectionRect method which passes this additional argument. --- include/wx/propgrid/property.h | 5 ++++ src/propgrid/property.cpp | 54 +++++++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/include/wx/propgrid/property.h b/include/wx/propgrid/property.h index 2da6019650..0c8480e799 100644 --- a/include/wx/propgrid/property.h +++ b/include/wx/propgrid/property.h @@ -119,9 +119,14 @@ public: /** Paints property category selection rectangle. */ +#if WXWIN_COMPATIBILITY_3_0 virtual void DrawCaptionSelectionRect( wxDC& dc, int x, int y, int w, int h ) const; +#else + virtual void DrawCaptionSelectionRect(wxWindow *win, wxDC& dc, + int x, int y, int w, int h) const; +#endif // WXWIN_COMPATIBILITY_3_0 /** Utility to draw vertically centered text. */ diff --git a/src/propgrid/property.cpp b/src/propgrid/property.cpp index 77607c67ae..3b8a6bbcc0 100644 --- a/src/propgrid/property.cpp +++ b/src/propgrid/property.cpp @@ -37,8 +37,16 @@ #include "wx/image.h" -#include "wx/propgrid/propgrid.h" +// This define is necessary to prevent macro clearing +#define __wxPG_SOURCE_FILE__ +#include "wx/propgrid/propgrid.h" +#include "wx/propgrid/property.h" +#include "wx/propgrid/props.h" + +#if wxPG_USE_RENDERER_NATIVE +#include "wx/renderer.h" +#endif #define PWC_CHILD_SUMMARY_LIMIT 16 // Maximum number of children summarized in a parent property's // value field. @@ -54,12 +62,25 @@ const char* g_invalidStringContent = "@__TOTALLY_INVALID_STRING__@"; // ----------------------------------------------------------------------- -static void wxPGDrawFocusRect( wxDC& dc, const wxRect& rect ) +// In 3.0 comaptibilty mode we always need to use custom renderer because +// native renderer for this port requires a reference to the valid window +// to be drawn which is not passed to DrawCaptionSelectionRect function. +#if wxPG_USE_RENDERER_NATIVE && !WXWIN_COMPATIBILITY_3_0 + #define wxPG_USE_NATIVE_FOCUS_RECT_RENDERER 1 +#else + #define wxPG_USE_NATIVE_FOCUS_RECT_RENDERER 0 +#endif // wxPG_USE_RENDERER_NATIVE/!wxPG_USE_RENDERER_NATIVE + +static void wxPGDrawFocusRect(wxWindow *win, wxDC& dc, + int x, int y, int w, int h) { -#if defined(__WXMSW__) && !defined(__WXWINCE__) - // FIXME: Use DrawFocusRect code above (currently it draws solid line - // for caption focus but works ok for other stuff). - // Also, it seems that this code may not work in future wx versions. + wxRect rect(x, y+((h-dc.GetCharHeight())/2), w, h); +#if wxPG_USE_NATIVE_FOCUS_RECT_RENDERER + wxASSERT_MSG( win, wxS("Invalid window to be drawn") ); + wxRendererNative::Get().DrawFocusRect(win, dc, rect); +#else + wxUnusedVar(win); +#ifdef __WXMSW__ dc.SetLogicalFunction(wxINVERT); wxPen pen(*wxBLACK,1,wxPENSTYLE_DOT); @@ -79,7 +100,8 @@ static void wxPGDrawFocusRect( wxDC& dc, const wxRect& rect ) dc.DrawRectangle(rect); dc.SetLogicalFunction(wxCOPY); -#endif +#endif // __WXMSW__/!__WXMSW__ +#endif // wxPG_USE_NATIVE_FOCUS_RECT_RENDERER/!wxPG_USE_NATIVE_FOCUS_RECT_RENDERER } // ----------------------------------------------------------------------- @@ -123,11 +145,19 @@ void wxPGCellRenderer::DrawEditorValue( wxDC& dc, const wxRect& rect, } } -void wxPGCellRenderer::DrawCaptionSelectionRect( wxDC& dc, int x, int y, int w, int h ) const +#if WXWIN_COMPATIBILITY_3_0 +void wxPGCellRenderer::DrawCaptionSelectionRect(wxDC& dc, + int x, int y, int w, int h) const { - wxRect focusRect(x,y+((h-dc.GetCharHeight())/2),w,h); - wxPGDrawFocusRect(dc,focusRect); + wxPGDrawFocusRect(NULL, dc, x, y, w, h); } +#else +void wxPGCellRenderer::DrawCaptionSelectionRect(wxWindow* win, wxDC& dc, + int x, int y, int w, int h) const +{ + wxPGDrawFocusRect(win, dc, x, y, w, h); +} +#endif // WXWIN_COMPATIBILITY_3_0/!WXWIN_COMPATIBILITY_3_0 int wxPGCellRenderer::PreDrawCell( wxDC& dc, const wxRect& rect, const wxPGCell& cell, int flags ) const { @@ -306,7 +336,11 @@ bool wxPGDefaultRenderer::Render( wxDC& dc, const wxRect& rect, imageOffset += wxCC_CUSTOM_IMAGE_MARGIN2 + 4; } +#if WXWIN_COMPATIBILITY_3_0 DrawCaptionSelectionRect( dc, +#else + DrawCaptionSelectionRect( const_cast(propertyGrid), dc, +#endif // WXWIN_COMPATIBILITY_3_0 rect.x+wxPG_XBEFORETEXT-wxPG_CAPRECTXMARGIN+imageOffset, rect.y-wxPG_CAPRECTYMARGIN+1, ((wxPropertyCategory*)property)->GetTextExtent(propertyGrid,