##// END OF EJS Templates
added automatic conversion to QColor,QPen,QCursor and QBrush from enums and colors...
florianlink -
r64:3ef1598f6c5e
parent child
Show More
@@ -753,13 +753,17 void* PythonQtClassInfo::castDownIfPossible(void* ptr, PythonQtClassInfo** resul
753 return resultPtr;
753 return resultPtr;
754 }
754 }
755
755
756 PyObject* PythonQtClassInfo::findEnumWrapper(const QByteArray& name, PythonQtClassInfo* localScope, bool& isLocalEnum)
756 PyObject* PythonQtClassInfo::findEnumWrapper(const QByteArray& name, PythonQtClassInfo* localScope, bool* isLocalEnum)
757 {
757 {
758 isLocalEnum = true;
758 if (isLocalEnum) {
759 *isLocalEnum = true;
760 }
759 int scopePos = name.lastIndexOf("::");
761 int scopePos = name.lastIndexOf("::");
760 if (scopePos != -1) {
762 if (scopePos != -1) {
761 isLocalEnum = false;
763 if (isLocalEnum) {
762 // slit into scope and enum name
764 *isLocalEnum = false;
765 }
766 // split into scope and enum name
763 QByteArray enumScope = name.mid(0,scopePos);
767 QByteArray enumScope = name.mid(0,scopePos);
764 QByteArray enumName = name.mid(scopePos+2);
768 QByteArray enumName = name.mid(scopePos+2);
765 PythonQtClassInfo* info = PythonQt::priv()->getClassInfo(enumScope);
769 PythonQtClassInfo* info = PythonQt::priv()->getClassInfo(enumScope);
@@ -195,7 +195,7 public:
195 void* castDownIfPossible(void* ptr, PythonQtClassInfo** resultClassInfo);
195 void* castDownIfPossible(void* ptr, PythonQtClassInfo** resultClassInfo);
196
196
197 //! returns if the localScope has an enum of that type name or if the enum contains a :: scope, if that class contails the enum
197 //! returns if the localScope has an enum of that type name or if the enum contains a :: scope, if that class contails the enum
198 static PyObject* findEnumWrapper(const QByteArray& name, PythonQtClassInfo* localScope, bool& isLocalEnum);
198 static PyObject* findEnumWrapper(const QByteArray& name, PythonQtClassInfo* localScope, bool* isLocalEnum = NULL);
199
199
200 private:
200 private:
201 void createEnumWrappers();
201 void createEnumWrappers();
@@ -254,10 +254,92 return Py_None;
254 return object;
254 return object;
255 }
255 }
256
256
257 void* PythonQtConv::ConvertPythonToQt(const PythonQtMethodInfo::ParameterInfo& info, PyObject* obj, bool strict, PythonQtClassInfo* /*classInfo*/, void* alreadyAllocatedCPPObject)
257 void* PythonQtConv::handlePythonToQtAutoConversion(int typeId, PyObject* obj, void* alreadyAllocatedCPPObject)
258 {
259 void* ptr = alreadyAllocatedCPPObject;
260
261 static int penId = QMetaType::type("QPen");
262 static int brushId = QMetaType::type("QBrush");
263 static int cursorId = QMetaType::type("QCursor");
264 static int colorId = QMetaType::type("QColor");
265 static PyObject* qtGlobalColorEnum = PythonQtClassInfo::findEnumWrapper("Qt::GlobalColor", NULL);
266 if (typeId == cursorId) {
267 static PyObject* qtCursorShapeEnum = PythonQtClassInfo::findEnumWrapper("Qt::CursorShape", NULL);
268 if ((PyObject*)obj->ob_type == qtCursorShapeEnum) {
269 Qt::CursorShape val = (Qt::CursorShape)PyInt_AS_LONG(obj);
270 if (!ptr) {
271 PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QCursor(), ptr);
272 ptr = (void*)((QVariant*)ptr)->constData();
273 }
274 *((QCursor*)ptr) = QCursor(val);
275 return ptr;
276 }
277 } else if (typeId == penId) {
278 // brushes can be created from QColor and from Qt::GlobalColor (and from brushes, but that's the default)
279 static PyObject* qtColorClass = PythonQt::priv()->getClassInfo("QColor")->pythonQtClassWrapper();
280 if ((PyObject*)obj->ob_type == qtGlobalColorEnum) {
281 Qt::GlobalColor val = (Qt::GlobalColor)PyInt_AS_LONG(obj);
282 if (!ptr) {
283 PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QPen(), ptr);
284 ptr = (void*)((QVariant*)ptr)->constData();
285 }
286 *((QPen*)ptr) = QPen(QColor(val));
287 return ptr;
288 } else if ((PyObject*)obj->ob_type == qtColorClass) {
289 if (!ptr) {
290 PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QPen(), ptr);
291 ptr = (void*)((QVariant*)ptr)->constData();
292 }
293 *((QPen*)ptr) = QPen(*((QColor*)((PythonQtInstanceWrapper*)obj)->_wrappedPtr));
294 return ptr;
295 }
296 } else if (typeId == brushId) {
297 // brushes can be created from QColor and from Qt::GlobalColor (and from brushes, but that's the default)
298 static PyObject* qtColorClass = PythonQt::priv()->getClassInfo("QColor")->pythonQtClassWrapper();
299 if ((PyObject*)obj->ob_type == qtGlobalColorEnum) {
300 Qt::GlobalColor val = (Qt::GlobalColor)PyInt_AS_LONG(obj);
301 if (!ptr) {
302 PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QBrush(), ptr);
303 ptr = (void*)((QVariant*)ptr)->constData();
304 }
305 *((QBrush*)ptr) = QBrush(QColor(val));
306 return ptr;
307 } else if ((PyObject*)obj->ob_type == qtColorClass) {
308 if (!ptr) {
309 PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QBrush(), ptr);
310 ptr = (void*)((QVariant*)ptr)->constData();
311 }
312 *((QBrush*)ptr) = QBrush(*((QColor*)((PythonQtInstanceWrapper*)obj)->_wrappedPtr));
313 return ptr;
314 }
315 } else if (typeId == colorId) {
316 // colors can be created from Qt::GlobalColor (and from colors, but that's the default)
317 if ((PyObject*)obj->ob_type == qtGlobalColorEnum) {
318 Qt::GlobalColor val = (Qt::GlobalColor)PyInt_AS_LONG(obj);
319 if (!ptr) {
320 PythonQtValueStorage_ADD_VALUE(global_variantStorage, QVariant, QColor(), ptr);
321 ptr = (void*)((QVariant*)ptr)->constData();
322 }
323 *((QColor*)ptr) = QColor(val);
324 return ptr;
325 }
326 }
327 return NULL;
328 }
329
330 void* PythonQtConv::ConvertPythonToQt(const PythonQtMethodInfo::ParameterInfo& info, PyObject* obj, bool strict, PythonQtClassInfo* /*classInfo*/, void* alreadyAllocatedCPPObject)
258 {
331 {
259 bool ok = false;
332 bool ok = false;
260 void* ptr = NULL;
333 void* ptr = NULL;
334
335 // autoconversion of QPen/QBrush/QCursor/QColor from different type
336 if (!info.isPointer && !strict) {
337 ptr = handlePythonToQtAutoConversion(info.typeId, obj, alreadyAllocatedCPPObject);
338 if (ptr) {
339 return ptr;
340 }
341 }
342
261 if (PyObject_TypeCheck(obj, &PythonQtInstanceWrapper_Type) && info.typeId != PythonQtMethodInfo::Variant) {
343 if (PyObject_TypeCheck(obj, &PythonQtInstanceWrapper_Type) && info.typeId != PythonQtMethodInfo::Variant) {
262 // if we have a Qt wrapper object and if we do not need a QVariant, we do the following:
344 // if we have a Qt wrapper object and if we do not need a QVariant, we do the following:
263 // (the Variant case is handled below in a switch)
345 // (the Variant case is handled below in a switch)
@@ -152,6 +152,9 public:
152 protected:
152 protected:
153 static QHash<int, PythonQtConvertMetaTypeToPythonCB*> _metaTypeToPythonConverters;
153 static QHash<int, PythonQtConvertMetaTypeToPythonCB*> _metaTypeToPythonConverters;
154 static QHash<int, PythonQtConvertPythonToMetaTypeCB*> _pythonToMetaTypeConverters;
154 static QHash<int, PythonQtConvertPythonToMetaTypeCB*> _pythonToMetaTypeConverters;
155
156 //! handle automatic conversion of some special types (QColor, QBrush, ...)
157 static void* handlePythonToQtAutoConversion(int typeId, PyObject* obj, void* alreadyAllocatedCPPObject);
155
158
156 //! converts the list of pointers of given type to Python
159 //! converts the list of pointers of given type to Python
157 static PyObject* ConvertQListOfPointerTypeToPythonList(QList<void*>* list, const QByteArray& type);
160 static PyObject* ConvertQListOfPointerTypeToPythonList(QList<void*>* list, const QByteArray& type);
@@ -135,7 +135,7 void PythonQtMethodInfo::fillParameterInfo(ParameterInfo& type, const QByteArray
135 if (type.typeId == PythonQtMethodInfo::Unknown || type.typeId >= QMetaType::User) {
135 if (type.typeId == PythonQtMethodInfo::Unknown || type.typeId >= QMetaType::User) {
136 bool isLocalEnum;
136 bool isLocalEnum;
137 // TODOXXX: make use of this flag!
137 // TODOXXX: make use of this flag!
138 type.enumWrapper = PythonQtClassInfo::findEnumWrapper(type.name, classInfo, isLocalEnum);
138 type.enumWrapper = PythonQtClassInfo::findEnumWrapper(type.name, classInfo, &isLocalEnum);
139 }
139 }
140 } else {
140 } else {
141 type.typeId = QMetaType::Void;
141 type.typeId = QMetaType::Void;
General Comments 0
You need to be logged in to leave comments. Login now