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.
This commit is contained in:
Vadim Zeitlin
2022-05-08 18:30:23 +01:00
parent d8abdfbdee
commit 5556ea8429
2 changed files with 80 additions and 0 deletions

View File

@@ -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_

View File

@@ -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<wxBitmapBundleVariantData&>(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<wxBitmapBundleVariantData*>(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
// ----------------------------------------------------------------------------