X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/62dc9cb4f159e2d4cac08308b96e63238935e6bb..849a28d0da2d036a78c7252c2baa42e8aee8a65d:/include/wx/renderer.h diff --git a/include/wx/renderer.h b/include/wx/renderer.h index adb2076bc5..e343989a2a 100644 --- a/include/wx/renderer.h +++ b/include/wx/renderer.h @@ -30,6 +30,13 @@ class WXDLLEXPORT wxWindow; #include "wx/gdicmn.h" // for wxPoint +// some platforms have their own renderers, others use the generic one +#if defined(__WXMSW__) || defined(__WXMAC__) || defined(__WXGTK__) + #define wxHAS_NATIVE_RENDERER +#else + #undef wxHAS_NATIVE_RENDERER +#endif + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -55,6 +62,60 @@ enum wxCONTROL_DIRTY = 0x80000000 }; +// ---------------------------------------------------------------------------- +// helper structs +// ---------------------------------------------------------------------------- + +// wxSplitterWindow parameters +struct WXDLLEXPORT wxSplitterRenderParams +{ + // the only way to initialize this struct is by using this ctor + wxSplitterRenderParams(wxCoord widthSash_, wxCoord border_, bool isSens_) + : widthSash(widthSash_), border(border_), isHotSensitive(isSens_) + { + } + + // the width of the splitter sash + const wxCoord widthSash; + + // the width of the border of the splitter window + const wxCoord border; + + // true if the splitter changes its appearance when the mouse is over it + const bool isHotSensitive; +}; + +// wxRendererNative interface version +struct WXDLLEXPORT wxRendererVersion +{ + wxRendererVersion(int version_, int age_) : version(version_), age(age_) { } + + // default copy ctor, assignment operator and dtor are ok + + // the current version and age of wxRendererNative interface: different + // versions are incompatible (in both ways) while the ages inside the same + // version are upwards compatible, i.e. the version of the renderer must + // match the version of the main program exactly while the age may be + // highergreater or equal to it + // + // NB: don't forget to increment age after adding any new virtual function! + enum + { + Current_Version = 1, + Current_Age = 5 + }; + + + // check if the given version is compatible with the current one + static bool IsCompatible(const wxRendererVersion& ver) + { + return ver.version == Current_Version && ver.age >= Current_Age; + } + + const int version; + const int age; +}; + // ---------------------------------------------------------------------------- // wxRendererNative: abstracts drawing methods needed by the native controls // ---------------------------------------------------------------------------- @@ -62,8 +123,6 @@ enum class WXDLLEXPORT wxRendererNative { public: - virtual ~wxRendererNative() { } // stop GCC warning - // drawing functions // ----------------- @@ -83,14 +142,16 @@ public: // drawn by DrawSash() blends into it well virtual void DrawSplitterBorder(wxWindow *win, wxDC& dc, - const wxRect& rect) = 0; + const wxRect& rect, + int flags = 0) = 0; // draw a (vertical) sash virtual void DrawSplitterSash(wxWindow *win, wxDC& dc, const wxSize& size, wxCoord position, - wxOrientation orient) = 0; + wxOrientation orient, + int flags = 0) = 0; // geometry functions @@ -98,7 +159,7 @@ public: // get the splitter parameters: the x field of the returned point is the // sash width and the y field is the border width - virtual wxPoint GetSplitterSashAndBorder(const wxWindow *win) = 0; + virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win) = 0; // pseudo constructors @@ -109,6 +170,37 @@ public: // return the generic implementation of the renderer static wxRendererNative& GetGeneric(); + + // return the default (native) implementation for this platform + static wxRendererNative& GetDefault(); + + + // changing the global renderer + // ---------------------------- + +#if wxUSE_DYNLIB_CLASS + // load the renderer from the specified DLL, the returned pointer must be + // deleted by caller if not NULL when it is not used any more + static wxRendererNative *Load(const wxString& name); +#endif // wxUSE_DYNLIB_CLASS + + // set the renderer to use, passing NULL reverts to using the default + // renderer + // + // return the previous renderer used with Set() or NULL if none + static wxRendererNative *Set(wxRendererNative *renderer); + + + // miscellaneous stuff + // ------------------- + + // this function is used for version checking: Load() refuses to load any + // DLLs implementing an older or incompatible version; it should be + // implemented simply by returning wxRendererVersion::Current_XXX values + virtual wxRendererVersion GetVersion() const = 0; + + // virtual dtor for any base class + virtual ~wxRendererNative(); }; // ---------------------------------------------------------------------------- @@ -139,19 +231,25 @@ public: virtual void DrawSplitterBorder(wxWindow *win, wxDC& dc, - const wxRect& rect) - { m_rendererNative.DrawSplitterBorder(win, dc, rect); } + const wxRect& rect, + int flags = 0) + { m_rendererNative.DrawSplitterBorder(win, dc, rect, flags); } virtual void DrawSplitterSash(wxWindow *win, wxDC& dc, const wxSize& size, wxCoord position, - wxOrientation orient) - { m_rendererNative.DrawSplitterSash(win, dc, size, position, orient); } + wxOrientation orient, + int flags = 0) + { m_rendererNative.DrawSplitterSash(win, dc, size, + position, orient, flags); } + + virtual wxSplitterRenderParams GetSplitterParams(const wxWindow *win) + { return m_rendererNative.GetSplitterParams(win); } - virtual wxPoint GetSplitterSashAndBorder(const wxWindow *win) - { return m_rendererNative.GetSplitterSashAndBorder(win); } + virtual wxRendererVersion GetVersion() const + { return m_rendererNative.GetVersion(); } protected: wxRendererNative& m_rendererNative; @@ -159,5 +257,20 @@ protected: DECLARE_NO_COPY_CLASS(wxDelegateRendererNative) }; +// ---------------------------------------------------------------------------- +// inline functions implementation +// ---------------------------------------------------------------------------- + +#ifndef wxHAS_NATIVE_RENDERER + +// default native renderer is the generic one then +/* static */ inline +wxRendererNative& wxRendererNative::GetDefault() +{ + return GetGeneric(); +} + +#endif // !wxHAS_NATIVE_RENDERER + #endif // _WX_RENDERER_H_