[labeling] Fix python bindings for access to data defined properties

This commit is contained in:
Larry Shaffer 2013-08-30 21:55:48 -06:00
parent 1a8a293f74
commit c9c013572f
3 changed files with 87 additions and 22 deletions

View File

@ -1,3 +1,83 @@
// QMap<QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined*> is implemented as a Python dictionary.
%MappedType QMap<QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined*> /DocType="dict-of-QgsPalLayerSettings.DataDefinedProperties-QgsDataDefined*"/
{
%TypeHeaderCode
#include <qmap.h>
#include <qgspallabeling.h>
#include <qgsdatadefined.h>
%End
%ConvertFromTypeCode
// Create the dictionary.
PyObject *d = PyDict_New();
if (!d)
return NULL;
// Set the dictionary elements.
QMap<QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined*>::const_iterator i = sipCpp->constBegin();
while (i != sipCpp->constEnd())
{
QgsDataDefined *t = i.value();
PyObject *kobj = sipConvertFromEnum(i.key(), sipType_QgsPalLayerSettings_DataDefinedProperties);
PyObject *tobj = sipConvertFromType(t, sipType_QgsDataDefined, sipTransferObj);
if (kobj == NULL || tobj == NULL || PyDict_SetItem(d, kobj, tobj) < 0)
{
Py_DECREF(d);
if (kobj)
{
Py_DECREF(kobj);
}
if (tobj)
{
Py_DECREF(tobj);
}
else
{
delete t;
}
return NULL;
}
Py_DECREF(kobj);
Py_DECREF(tobj);
++i;
}
return d;
%End
%ConvertToTypeCode
PyObject *kobj, *tobj;
SIP_SSIZE_T i = 0;
// Check the type if that is all that is required.
if (sipIsErr == NULL)
{
if (!PyDict_Check(sipPy))
return 0;
while (PyDict_Next(sipPy, &i, &kobj, &tobj))
if (!sipCanConvertToType(tobj, sipType_QgsDataDefined, SIP_NOT_NONE))
return 0;
return 1;
}
QMap<QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined*> *qm = new QMap<QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined*>;
while (PyDict_Next(sipPy, &i, &kobj, &tobj))
{
int state, k = SIPLong_AsLong(kobj);
QgsDataDefined *t = reinterpret_cast<QgsDataDefined *>(sipConvertToType(tobj, sipType_QgsDataDefined, sipTransferObj, SIP_NOT_NONE, &state, sipIsErr));
if (*sipIsErr)
{
sipReleaseType(t, sipType_QgsDataDefined, state);
delete qm;
return 0;
}
qm->insert(QgsPalLayerSettings::DataDefinedProperties(k), t);
sipReleaseType(t, sipType_QgsDataDefined, state);
}
*sipCppPtr = qm;
return sipGetState(sipTransferObj);
%End
};
class QgsPalLayerSettings
{
%TypeHeaderCode
@ -361,12 +441,7 @@ class QgsPalLayerSettings
/** Get a data defined property pointer
* @note added in 1.9, helpful for Python access
*/
QgsDataDefined* dataDefinedProperty( DataDefinedProperties p );
/** Get current data defined properties
* @note added in 1.9, helpful for Python access
*/
QList<QgsPalLayerSettings::DataDefinedProperties> dataDefinedPropertyList();
QgsDataDefined* dataDefinedProperty( QgsPalLayerSettings::DataDefinedProperties p );
/** Set a property as data defined
* @note added in 1.9, helpful for Python access
@ -407,9 +482,9 @@ class QgsPalLayerSettings
*/
bool dataDefinedUseExpression( QgsPalLayerSettings::DataDefinedProperties p ) const;
/**Stores field names for data defined layer properties*/
//! @note not available in python bindings
//QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* > dataDefinedProperties;
/** Map of current data defined properties
*/
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* > dataDefinedProperties;
/** Calculates pixel size (considering output size should be in pixel or map units, scale factors and optionally oversampling)

View File

@ -1170,11 +1170,6 @@ QgsDataDefined* QgsPalLayerSettings::dataDefinedProperty( DataDefinedProperties
return 0;
}
QList<QgsPalLayerSettings::DataDefinedProperties> QgsPalLayerSettings::dataDefinedPropertyList()
{
return dataDefinedProperties.keys();
}
QMap<QString, QString> QgsPalLayerSettings::dataDefinedMap( DataDefinedProperties p ) const
{
QMap<QString, QString> map;

View File

@ -415,12 +415,7 @@ class CORE_EXPORT QgsPalLayerSettings
/** Get a data defined property pointer
* @note added in 1.9, helpful for Python access
*/
QgsDataDefined* dataDefinedProperty( DataDefinedProperties p );
/** Get current data defined properties
* @note added in 1.9, helpful for Python access
*/
QList<QgsPalLayerSettings::DataDefinedProperties> dataDefinedPropertyList();
QgsDataDefined* dataDefinedProperty( QgsPalLayerSettings::DataDefinedProperties p );
/** Set a property as data defined
* @note added in 1.9, helpful for Python access
@ -461,8 +456,8 @@ class CORE_EXPORT QgsPalLayerSettings
*/
bool dataDefinedUseExpression( QgsPalLayerSettings::DataDefinedProperties p ) const;
/**Stores field names for data defined layer properties*/
//! @note not available in python bindings
/** Map of current data defined properties
*/
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* > dataDefinedProperties;