Skip to content

Commit

Permalink
Gui: unify getPyTypeObjectForTypeName
Browse files Browse the repository at this point in the history
  • Loading branch information
3x380V committed Jan 24, 2024
1 parent 5ec81cf commit 25582fc
Showing 1 changed file with 48 additions and 88 deletions.
136 changes: 48 additions & 88 deletions src/Gui/PythonWrapper.cpp
Expand Up @@ -245,8 +245,34 @@ void registerTypes()
// --------------------------------------------------------

namespace Gui {

template<typename qttype>
PyTypeObject *getPyTypeObjectForTypeName();
#if defined (HAVE_SHIBOKEN2)
SbkObjectType*
#else
PyTypeObject*
#endif
getPyTypeObjectForTypeName()
{
#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE)
#if defined (HAVE_SHIBOKEN_TYPE_FOR_TYPENAME)
# if defined (HAVE_SHIBOKEN2)
auto sbkType = Shiboken::ObjectType::typeForTypeName(typeid(qttype).name());
if (sbkType)
return reinterpret_cast<SbkObjectType*>&(sbkType->type);
# else
return Shiboken::ObjectType::typeForTypeName(typeid(qttype).name());
# endif
#else
# if defined (HAVE_SHIBOKEN2)
return reinterpret_cast<SbkObjectType*>(Shiboken::SbkType<qttype>());
# else
return Shiboken::SbkType<qttype>();
# endif
#endif
#endif
return nullptr;
}

/*!
* \brief The WrapperManager class
Expand Down Expand Up @@ -318,15 +344,9 @@ class WrapperManager : public QObject
// import gc
// gc.collect()
#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE)
PyTypeObject * type = getPyTypeObjectForTypeName<QApplication>();
auto type = getPyTypeObjectForTypeName<QApplication>();
if (type) {
#if defined (HAVE_SHIBOKEN2)
auto sbk_type = reinterpret_cast<SbkObjectType*>(type);
#else
auto sbk_type = type;
#endif
std::string typeName = "QApplication";
PyObject* pyobj = Shiboken::Object::newObject(sbk_type, qApp, false, false, typeName.c_str());
PyObject* pyobj = Shiboken::Object::newObject(type, qApp, false, false, "QApplication");
addQObject(qApp, pyobj);
}
#endif
Expand Down Expand Up @@ -415,35 +435,15 @@ void* qt_getCppPointer(const Py::Object& pyobject, const std::string& unwrap)
return PyLong_AsVoidPtr(result[0].ptr());
}


template<typename qttype>
PyTypeObject *getPyTypeObjectForTypeName()
{
#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE)
#if defined (HAVE_SHIBOKEN_TYPE_FOR_TYPENAME)
#if defined (HAVE_SHIBOKEN2)
SbkObjectType* sbkType = Shiboken::ObjectType::typeForTypeName(typeid(qttype).name());
if (sbkType)
return &(sbkType->type);
#else
return Shiboken::ObjectType::typeForTypeName(typeid(qttype).name());
#endif
#else
return Shiboken::SbkType<qttype>();
#endif
#endif
return nullptr;
}

template<typename qttype>
qttype* qt_getCppType(PyObject* pyobj)
{
#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE)
PyTypeObject * type = getPyTypeObjectForTypeName<qttype>();
auto type = getPyTypeObjectForTypeName<qttype>();
if (type) {
if (Shiboken::Object::checkType(pyobj)) {
auto sbkobject = reinterpret_cast<SbkObject *>(pyobj);
void* cppobject = Shiboken::Object::cppPointer(sbkobject, type);
void* cppobject = Shiboken::Object::cppPointer(sbkobject, reinterpret_cast<PyTypeObject *>(type));
return static_cast<qttype*>(cppobject);
}
}
Expand Down Expand Up @@ -536,22 +536,17 @@ QGraphicsObject* PythonWrapper::toQGraphicsObject(const Py::Object& pyobject)
Py::Object PythonWrapper::fromQImage(const QImage& img)
{
#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE)
#if defined (HAVE_SHIBOKEN2)
PyObject* pyobj = Shiboken::Conversions::copyToPython(reinterpret_cast<SbkObjectType*>(getPyTypeObjectForTypeName<QImage>()),
const_cast<QImage*>(&img));
#else
PyObject* pyobj = Shiboken::Conversions::copyToPython(getPyTypeObjectForTypeName<QImage>(),
const_cast<QImage*>(&img));
#endif
if (pyobj) {
return Py::asObject(pyobj);
}

throw Py::RuntimeError("Failed to wrap image");
#else
// Access shiboken/PySide via Python
//
return qt_wrapInstance<const QImage*>(&img, "QImage", "QtGui", "wrapInstance");
#endif
throw Py::RuntimeError("Failed to wrap icon");
}

QImage *PythonWrapper::toQImage(PyObject *pyobj)
Expand All @@ -563,21 +558,16 @@ Py::Object PythonWrapper::fromQIcon(const QIcon* icon)
{
#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE)
const char* typeName = typeid(*const_cast<QIcon*>(icon)).name();
#if defined (HAVE_SHIBOKEN2)
PyObject* pyobj = Shiboken::Object::newObject(reinterpret_cast<SbkObjectType*>(getPyTypeObjectForTypeName<QIcon>()),
const_cast<QIcon*>(icon), true, false, typeName);
#else
PyObject* pyobj = Shiboken::Object::newObject(getPyTypeObjectForTypeName<QIcon>(),
const_cast<QIcon*>(icon), true, false, typeName);
#endif
if (pyobj)
return Py::asObject(pyobj);

throw Py::RuntimeError("Failed to wrap icon");
#else
// Access shiboken/PySide via Python
//
return qt_wrapInstance<const QIcon*>(icon, "QIcon", "QtGui", "wrapInstance");
#endif
throw Py::RuntimeError("Failed to wrap icon");
}

QIcon *PythonWrapper::toQIcon(PyObject *pyobj)
Expand All @@ -589,19 +579,14 @@ Py::Object PythonWrapper::fromQDir(const QDir& dir)
{
#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE)
const char* typeName = typeid(dir).name();
#if defined (HAVE_SHIBOKEN2)
PyObject* pyobj = Shiboken::Object::newObject(reinterpret_cast<SbkObjectType*>(getPyTypeObjectForTypeName<QDir>()),
const_cast<QDir*>(&dir), false, false, typeName);
#else
PyObject* pyobj = Shiboken::Object::newObject(getPyTypeObjectForTypeName<QDir>(),
const_cast<QDir*>(&dir), false, false, typeName);
#endif
if (pyobj)
return Py::asObject(pyobj);
#else
Q_UNUSED(dir)
#endif
throw Py::RuntimeError("Failed to wrap icon");
throw Py::RuntimeError("Failed to wrap directory");
}

QDir* PythonWrapper::toQDir(PyObject* pyobj)
Expand All @@ -615,25 +600,23 @@ Py::Object PythonWrapper::fromQPrinter(QPrinter* printer)
return Py::None();
#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE)
// Access shiboken/PySide via C++
//
PyTypeObject * type = getPyTypeObjectForTypeName<QPrinter>();
auto type = getPyTypeObjectForTypeName<QPrinter>();
if (!type) {
type = Shiboken::Conversions::getPythonTypeObject("QPrinter");
}
if (type) {
// XXX: Why is QPrinter special?
#if defined (HAVE_SHIBOKEN2)
auto sbk_type = reinterpret_cast<SbkObjectType*>(type);
type = reinterpret_cast<SbkObjectType*>(Shiboken::Conversions::getPythonTypeObject("QPrinter"));
#else
auto sbk_type = type;
type = Shiboken::Conversions::getPythonTypeObject("QPrinter");
#endif
PyObject* pyobj = Shiboken::Object::newObject(sbk_type, printer, false, false, "QPrinter");
}
if (type) {
PyObject* pyobj = Shiboken::Object::newObject(type, printer, false, false, "QPrinter");
return Py::asObject(pyobj);
}

throw Py::RuntimeError("Failed to wrap object");
throw Py::RuntimeError("Failed to wrap printer");
#else
// Access shiboken/PySide via Python
//
return qt_wrapInstance<QPrinter*>(printer, "QPrinter", "QtCore", "wrapInstance");
#endif
}
Expand All @@ -644,27 +627,20 @@ Py::Object PythonWrapper::fromQObject(QObject* object, const char* className)
return Py::None();
#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE)
// Access shiboken/PySide via C++
//
PyTypeObject * type = getPyTypeObjectForTypeName<QObject>();
auto type = getPyTypeObjectForTypeName<QObject>();
if (type) {
#if defined (HAVE_SHIBOKEN2)
auto sbk_type = reinterpret_cast<SbkObjectType*>(type);
#else
auto sbk_type = type;
#endif
std::string typeName;
if (className)
typeName = className;
else
typeName = object->metaObject()->className();
PyObject* pyobj = Shiboken::Object::newObject(sbk_type, object, false, false, typeName.c_str());
PyObject* pyobj = Shiboken::Object::newObject(type, object, false, false, typeName.c_str());
WrapperManager::instance().addQObject(object, pyobj);
return Py::asObject(pyobj);
}
throw Py::RuntimeError("Failed to wrap object");
#else
// Access shiboken/PySide via Python
//
return qt_wrapInstance<QObject*>(object, className, "QtCore", "wrapInstance");
#endif
}
Expand All @@ -673,28 +649,20 @@ Py::Object PythonWrapper::fromQWidget(QWidget* widget, const char* className)
{
#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE)
// Access shiboken/PySide via C++
//
PyTypeObject * type = getPyTypeObjectForTypeName<QWidget>();
auto type = getPyTypeObjectForTypeName<QWidget>();
if (type) {
#if defined (HAVE_SHIBOKEN2)
auto sbk_type = reinterpret_cast<SbkObjectType*>(type);
#else
auto sbk_type = type;
#endif
std::string typeName;
if (className)
typeName = className;
else
typeName = widget->metaObject()->className();
PyObject* pyobj = Shiboken::Object::newObject(sbk_type, widget, false, false, typeName.c_str());
PyObject* pyobj = Shiboken::Object::newObject(type, widget, false, false, typeName.c_str());
WrapperManager::instance().addQObject(widget, pyobj);
return Py::asObject(pyobj);
}
throw Py::RuntimeError("Failed to wrap widget");

#else
// Access shiboken/PySide via Python
//
return qt_wrapInstance<QWidget*>(widget, className, "QtWidgets", "wrapInstance");
#endif
}
Expand Down Expand Up @@ -768,11 +736,7 @@ void PythonWrapper::createChildrenNameAttributes(PyObject* root, QObject* object
bool hasAttr = PyObject_HasAttrString(root, name.constData());
if (!hasAttr) {
#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE)
#if defined (HAVE_SHIBOKEN2)
Shiboken::AutoDecRef pyChild(Shiboken::Conversions::pointerToPython(reinterpret_cast<SbkObjectType*>(getPyTypeObjectForTypeName<QObject>()), child));
#else
Shiboken::AutoDecRef pyChild(Shiboken::Conversions::pointerToPython(getPyTypeObjectForTypeName<QObject>(), child));
#endif
PyObject_SetAttrString(root, name.constData(), pyChild);
#else
const char* className = qt_identifyType(child, "QtWidgets");
Expand All @@ -797,11 +761,7 @@ void PythonWrapper::setParent(PyObject* pyWdg, QObject* parent)
{
#if defined (HAVE_SHIBOKEN) && defined(HAVE_PYSIDE)
if (parent) {
#if defined (HAVE_SHIBOKEN2)
Shiboken::AutoDecRef pyParent(Shiboken::Conversions::pointerToPython(reinterpret_cast<SbkObjectType*>(getPyTypeObjectForTypeName<QWidget>()), parent));
#else
Shiboken::AutoDecRef pyParent(Shiboken::Conversions::pointerToPython(getPyTypeObjectForTypeName<QWidget>(), parent));
#endif
Shiboken::Object::setParent(pyParent, pyWdg);
}
#else
Expand Down

0 comments on commit 25582fc

Please sign in to comment.