From 5556ea8429c5a619547d26bcd553372fee1bb4fb Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 8 May 2022 18:30:23 +0100 Subject: [PATCH] Add support for storing wxBitmapBundle in a wxVariant Define wxBitmapBundleVariantData without using the standard macros that only work for wxObject-derived classes, but using more or less what they expand into. This will allow using wxBitmapBundle with wxDataViewCustomRenderer subclasses in the upcoming commit. --- include/wx/bmpbndl.h | 15 ++++++++++ src/common/bmpbndl.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+) diff --git a/include/wx/bmpbndl.h b/include/wx/bmpbndl.h index 2f2f099680..d379c1e770 100644 --- a/include/wx/bmpbndl.h +++ b/include/wx/bmpbndl.h @@ -245,4 +245,19 @@ public: virtual wxBitmap GetBitmap(const wxSize& size) = 0; }; +// ---------------------------------------------------------------------------- +// Allow using wxBitmapBundle in wxVariant +// ---------------------------------------------------------------------------- + +#if wxUSE_VARIANT + +class WXDLLIMPEXP_FWD_BASE wxVariant; + +WXDLLIMPEXP_CORE +wxBitmapBundle& operator<<(wxBitmapBundle& value, const wxVariant& variant); +WXDLLIMPEXP_CORE +wxVariant& operator<<(wxVariant& variant, const wxBitmapBundle& value); + +#endif // wxUSE_VARIANT + #endif // _WX_BMPBNDL_H_ diff --git a/src/common/bmpbndl.cpp b/src/common/bmpbndl.cpp index 03ce1dd5b9..7b9d532b74 100644 --- a/src/common/bmpbndl.cpp +++ b/src/common/bmpbndl.cpp @@ -36,6 +36,71 @@ #include "wx/osx/private.h" #endif +#if wxUSE_VARIANT + +#include "wx/variant.h" + +// We can't use the macros from wx/variant.h because they only work for +// wxObject-derived classes, so define our own wxVariantData. + +class wxBitmapBundleVariantData: public wxVariantData +{ +public: + explicit wxBitmapBundleVariantData(const wxBitmapBundle& value) + : m_value(value) + { + } + + virtual bool Eq(wxVariantData& data) const wxOVERRIDE + { + // We're only called with the objects of the same type, so the cast is + // safe. + return static_cast(data).m_value.IsSameAs(m_value); + } + + virtual wxString GetType() const wxOVERRIDE + { + return wxASCII_STR("wxBitmapBundle"); + } + + virtual wxClassInfo* GetValueClassInfo() wxOVERRIDE + { + return NULL; + } + + virtual wxVariantData* Clone() const wxOVERRIDE + { + return new wxBitmapBundleVariantData(m_value); + } + + wxBitmapBundle m_value; + + DECLARE_WXANY_CONVERSION() +}; + +IMPLEMENT_TRIVIAL_WXANY_CONVERSION(wxBitmapBundle, wxBitmapBundleVariantData) + +WXDLLIMPEXP_CORE +wxBitmapBundle& operator<<(wxBitmapBundle& value, const wxVariant& variant) +{ + wxASSERT( variant.GetType() == wxASCII_STR("wxBitmapBundle") ); + + wxBitmapBundleVariantData* const + data = static_cast(variant.GetData()); + + value = data->m_value; + return value; +} + +WXDLLIMPEXP_CORE +wxVariant& operator<<(wxVariant& variant, const wxBitmapBundle& value) +{ + variant.SetData(new wxBitmapBundleVariantData(value)); + return variant; +} + +#endif // wxUSE_VARIANT + // ---------------------------------------------------------------------------- // private helpers // ----------------------------------------------------------------------------