mirror of
https://github.com/wxWidgets/Phoenix.git
synced 2026-01-11 22:37:08 +01:00
Item() returns either a Node* or (with wxUSE_STL=1) a compatibility_iterator. While the former is silently and erroneously converted to a Variant using the Variant(void*) overload, the STL flavor fortunately failed. Dereference the Node*/iterator before passing it to wxVariant_out_helper(const Variant&).
106 lines
3.0 KiB
Plaintext
106 lines
3.0 KiB
Plaintext
//--------------------------------------------------------------------------
|
|
// Name: variant.sip
|
|
// Purpose: MappedType for wxVariant
|
|
//
|
|
// Author: Kevin Ollivier, Robin Dunn
|
|
//
|
|
// Created: 20-Sept-2011
|
|
// Copyright: (c) 2011 by Kevin Ollivier
|
|
// Copyright: (c) 2011-2020 by Total Control Software
|
|
// Licence: wxWindows license
|
|
//--------------------------------------------------------------------------
|
|
|
|
// We always convert wxVariant to / from the native Python types since its purpose
|
|
// is basically to allow a variable to be multiple types in C++
|
|
%MappedType wxVariant /AllowNone/
|
|
{
|
|
%ConvertToTypeCode
|
|
// Code to test a PyObject for compatibility.
|
|
if (!sipIsErr) {
|
|
// Any type should work since we'll just use the PyObject directly
|
|
// if the type is not one that is explicitly supported.
|
|
return TRUE;
|
|
}
|
|
|
|
// Code to create a new wxVariant from the PyObject
|
|
wxVariant* value = new wxVariant(wxVariant_in_helper(sipPy));
|
|
*sipCppPtr = value;
|
|
return sipGetState(sipTransferObj);
|
|
%End
|
|
|
|
|
|
%ConvertFromTypeCode
|
|
// Code to convert a wxVariant to a PyObject.
|
|
if (sipCpp == NULL) {
|
|
return Py_None;
|
|
} else {
|
|
return wxVariant_out_helper(*sipCpp);
|
|
}
|
|
%End
|
|
};
|
|
|
|
|
|
|
|
|
|
// Add a typemap for wxVariantList
|
|
%MappedType wxVariantList
|
|
{
|
|
%ConvertToTypeCode
|
|
// Code to test a PyObject for compatibility.
|
|
if (!sipIsErr) {
|
|
// Any type sequence type is okay.
|
|
int success = PySequence_Check(sipPy);
|
|
if (!success)
|
|
PyErr_SetString(PyExc_TypeError, "Sequence type expected.");
|
|
return success;
|
|
}
|
|
|
|
// Code to create a new wxVariantList from the PyObject sequence
|
|
wxVariantList* value = new wxVariantList();
|
|
Py_ssize_t len = PySequence_Length(sipPy);
|
|
Py_ssize_t idx = 0;
|
|
while (idx < len) {
|
|
PyObject* item = PySequence_GetItem(sipPy, idx);
|
|
value->Append(new wxVariant(wxVariant_in_helper(item)));
|
|
Py_DECREF(item);
|
|
}
|
|
*sipCppPtr = value;
|
|
return sipGetState(sipTransferObj);
|
|
%End
|
|
|
|
|
|
%ConvertFromTypeCode
|
|
// Code to convert a wxVariantList to a Python list.
|
|
if (sipCpp == NULL) {
|
|
return Py_None;
|
|
} else {
|
|
size_t idx = 0;
|
|
PyObject* value = PyList_New(0);
|
|
for (idx=0; idx < sipCpp->GetCount(); idx++) {
|
|
PyObject* item = wxVariant_out_helper(sipCpp->Item(idx)->GetData());
|
|
PyList_Append(value, item);
|
|
}
|
|
return value;
|
|
}
|
|
%End
|
|
};
|
|
|
|
|
|
|
|
|
|
// Used just for unit testing the MappedType code, it can be removed later
|
|
%ModuleCode
|
|
wxVariant testVariantTypemap(const wxVariant& var)
|
|
{
|
|
wxVariant local = var; // force a copy
|
|
return local;
|
|
}
|
|
|
|
wxString testVariantTypeName(const wxVariant& var)
|
|
{
|
|
return var.GetType();
|
|
}
|
|
%End
|
|
wxVariant testVariantTypemap(const wxVariant& var);
|
|
wxString testVariantTypeName(const wxVariant& var);
|