diff --git a/src/Gui/PythonWrapper.cpp b/src/Gui/PythonWrapper.cpp index 40261e6cc2..eee35abc56 100644 --- a/src/Gui/PythonWrapper.cpp +++ b/src/Gui/PythonWrapper.cpp @@ -583,39 +583,40 @@ QObject* PythonWrapper::toQObject(const Py::Object& pyobject) return qt_getCppType(pyobject.ptr()); } +qsizetype PythonWrapper::tryEnum(PyObject* pyPtr) +{ + if (PyObject* number = PyNumber_Long(pyPtr)) { + Py::Long longObj(number, true); + return longObj.as_long(); + } + + // if PyNumber_Long failed then an exception is set + PyErr_Clear(); + + Py::Object object(pyPtr); + if (object.hasAttr(std::string("value"))) { + Py::Long longObj(object.getAttr(std::string("value"))); + return longObj.as_long(); + } + + return 0; +} + qsizetype PythonWrapper::toEnum(PyObject* pyPtr) { -#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) - if (PyLong_Check(pyPtr)) { - return PyLong_AsLong(pyPtr); + try { + return tryEnum(pyPtr); + } + catch (Py::Exception&) { + Base::PyException e; + e.ReportException(); + return 0; } - return Shiboken::Enum::getValue(pyPtr); -#else - return toEnum(Py::Object(pyPtr)); -#endif } qsizetype PythonWrapper::toEnum(const Py::Object& pyobject) { -#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE) return toEnum(pyobject.ptr()); -#else - try { - qsizetype ret {}; - if (pyobject.hasAttr(std::string("value"))) { - ret = Py::Int(pyobject.getAttr(std::string("value"))); - } - else { - ret = Py::Int(pyobject); - } - return ret; - } - catch (Py::Exception&) { - Base::PyException e; // extract the Python error text - e.ReportException(); - return 0; - } -#endif } QGraphicsItem* PythonWrapper::toQGraphicsItem(PyObject* pyPtr) diff --git a/src/Gui/PythonWrapper.h b/src/Gui/PythonWrapper.h index 94c2f7fc50..39d6d61893 100644 --- a/src/Gui/PythonWrapper.h +++ b/src/Gui/PythonWrapper.h @@ -79,6 +79,9 @@ public: QDir* toQDir(PyObject* pyobj); static void createChildrenNameAttributes(PyObject* root, QObject* object); static void setParent(PyObject* pyWdg, QObject* parent); + +private: + qsizetype tryEnum(PyObject* pyPtr); }; } // namespace Gui