X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/371a5b4e62eb415107e045588f614fa49e866e78..e93523680ba3c83cdae75b511214c82f28a2d853:/include/wx/univ/theme.h diff --git a/include/wx/univ/theme.h b/include/wx/univ/theme.h index ab00b081e7..7d6ebf4a80 100644 --- a/include/wx/univ/theme.h +++ b/include/wx/univ/theme.h @@ -14,19 +14,18 @@ #ifndef _WX_UNIV_THEME_H_ #define _WX_UNIV_THEME_H_ -#ifdef __GNUG__ - #pragma interface "theme.h" -#endif +#include "wx/string.h" // ---------------------------------------------------------------------------- // wxTheme // ---------------------------------------------------------------------------- -class WXDLLEXPORT wxRenderer; -class WXDLLEXPORT wxColourScheme; -class WXDLLEXPORT wxInputHandler; -class WXDLLEXPORT wxArtProvider; -struct WXDLLEXPORT wxThemeInfo; +class WXDLLIMPEXP_FWD_CORE wxArtProvider; +class WXDLLIMPEXP_FWD_CORE wxColourScheme; +class WXDLLIMPEXP_FWD_CORE wxInputConsumer; +class WXDLLIMPEXP_FWD_CORE wxInputHandler; +class WXDLLIMPEXP_FWD_CORE wxRenderer; +struct WXDLLIMPEXP_FWD_CORE wxThemeInfo; class WXDLLEXPORT wxTheme { @@ -52,12 +51,13 @@ public: // get the renderer implementing all the control-drawing operations in // this theme virtual wxRenderer *GetRenderer() = 0; - + // get the art provider to be used together with this theme virtual wxArtProvider *GetArtProvider() = 0; - // get the input handler of the given type - virtual wxInputHandler *GetInputHandler(const wxString& handlerType) = 0; + // get the input handler of the given type, forward to the standard one + virtual wxInputHandler *GetInputHandler(const wxString& handlerType, + wxInputConsumer *consumer) = 0; // get the colour scheme for the control with this name virtual wxColourScheme *GetColourScheme() = 0; @@ -73,7 +73,35 @@ private: // the current theme static wxTheme *ms_theme; - friend struct WXDLLEXPORT wxThemeInfo; + friend struct wxThemeInfo; +}; + +// ---------------------------------------------------------------------------- +// wxDelegateTheme: it is impossible to inherit from any of standard +// themes as their declarations are in private code, but you can use this +// class to override only some of their functions - all the other ones +// will be left to the original theme +// ---------------------------------------------------------------------------- + +class wxDelegateTheme : public wxTheme +{ +public: + wxDelegateTheme(const wxChar *theme); + virtual ~wxDelegateTheme(); + + virtual wxRenderer *GetRenderer(); + virtual wxArtProvider *GetArtProvider(); + virtual wxInputHandler *GetInputHandler(const wxString& control, + wxInputConsumer *consumer); + virtual wxColourScheme *GetColourScheme(); + +protected: + // gets or creates theme and sets m_theme to point to it, + // returns true on success + bool GetOrCreateTheme(); + + wxString m_themeName; + wxTheme *m_theme; }; // ---------------------------------------------------------------------------- @@ -105,10 +133,14 @@ struct WXDLLEXPORT wxThemeInfo // without it, an over optimizing linker may discard the object module // containing the theme implementation entirely #define WX_USE_THEME(themename) \ - WXDLLEXPORT_DATA(extern bool) wxThemeUse##themename; \ + /* this indirection makes it possible to pass macro as the argument */ \ + WX_USE_THEME_IMPL(themename) + +#define WX_USE_THEME_IMPL(themename) \ + extern WXDLLEXPORT_DATA(bool) wxThemeUse##themename; \ static struct wxThemeUserFor##themename \ { \ - wxThemeUserFor##themename() { wxThemeUse##themename = TRUE; } \ + wxThemeUserFor##themename() { wxThemeUse##themename = true; } \ } wxThemeDoUse##themename // to declare a new theme, this macro must be used in the class declaration @@ -121,10 +153,50 @@ struct WXDLLEXPORT wxThemeInfo // and this one must be inserted in the source file #define WX_IMPLEMENT_THEME(classname, themename, themedesc) \ - WXDLLEXPORT_DATA(bool) wxThemeUse##themename = TRUE; \ + WXDLLEXPORT_DATA(bool) wxThemeUse##themename = true; \ wxTheme *wxCtorFor##themename() { return new classname; } \ wxThemeInfo classname::ms_info##themename(wxCtorFor##themename, \ wxT( #themename ), themedesc) -#endif // _WX_UNIV_THEME_H_ +// ---------------------------------------------------------------------------- +// determine default theme +// ---------------------------------------------------------------------------- +#if wxUSE_ALL_THEMES + #undef wxUSE_THEME_WIN32 + #define wxUSE_THEME_WIN32 1 + #undef wxUSE_THEME_GTK + #define wxUSE_THEME_GTK 1 + #undef wxUSE_THEME_MONO + #define wxUSE_THEME_MONO 1 + #undef wxUSE_THEME_METAL + #define wxUSE_THEME_METAL 1 +#endif // wxUSE_ALL_THEMES + +// determine the default theme to use: +#if defined(__WXGTK__) && wxUSE_THEME_GTK + #define wxUNIV_DEFAULT_THEME gtk +#elif defined(__WXDFB__) && wxUSE_THEME_MONO + // use mono theme for DirectFB port because it cannot correctly + // render neither win32 nor gtk themes yet: + #define wxUNIV_DEFAULT_THEME mono +#endif + +// if no theme was picked, get any theme compiled in (sorted by +// quality/completeness of the theme): +#ifndef wxUNIV_DEFAULT_THEME + #if wxUSE_THEME_WIN32 + #define wxUNIV_DEFAULT_THEME win32 + #elif wxUSE_THEME_GTK + #define wxUNIV_DEFAULT_THEME gtk + #elif wxUSE_THEME_MONO + #define wxUNIV_DEFAULT_THEME mono + #endif + // If nothing matches, no themes are compiled and the app must provide + // some theme itself + // (note that wxUSE_THEME_METAL depends on win32 theme, so we don't have to + // try it) + // +#endif // !wxUNIV_DEFAULT_THEME + +#endif // _WX_UNIV_THEME_H_