aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/PySide6/QtUiTools
diff options
context:
space:
mode:
Diffstat (limited to 'sources/pyside6/PySide6/QtUiTools')
-rw-r--r--sources/pyside6/PySide6/QtUiTools/CMakeLists.txt45
-rw-r--r--sources/pyside6/PySide6/QtUiTools/QtUiTools_global.pre.h.in7
-rw-r--r--sources/pyside6/PySide6/QtUiTools/glue/plugins.h31
-rw-r--r--sources/pyside6/PySide6/QtUiTools/typesystem_uitools.xml88
4 files changed, 171 insertions, 0 deletions
diff --git a/sources/pyside6/PySide6/QtUiTools/CMakeLists.txt b/sources/pyside6/PySide6/QtUiTools/CMakeLists.txt
new file mode 100644
index 000000000..e16d2d585
--- /dev/null
+++ b/sources/pyside6/PySide6/QtUiTools/CMakeLists.txt
@@ -0,0 +1,45 @@
+# Copyright (C) 2023 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+project(QtUiTools)
+
+set(QtUiTools_SRC
+${QtUiTools_GEN_DIR}/quiloader_wrapper.cpp
+# module is always needed
+${QtUiTools_GEN_DIR}/qtuitools_module_wrapper.cpp
+)
+
+set(QtUiTools_glue_sources
+ "${QtUiTools_SOURCE_DIR}/glue/plugins.h"
+)
+
+set(QtUiTools_include_dirs ${QtUiTools_SOURCE_DIR}
+ ${QtUiTools_BINARY_DIR}
+ ${Qt${QT_MAJOR_VERSION}Core_INCLUDE_DIRS}
+ ${Qt${QT_MAJOR_VERSION}Gui_INCLUDE_DIRS}
+ ${Qt${QT_MAJOR_VERSION}Widgets_INCLUDE_DIRS}
+ ${Qt${QT_MAJOR_VERSION}Xml_INCLUDE_DIRS}
+ ${Qt${QT_MAJOR_VERSION}Designer_INCLUDE_DIRS}
+ ${Qt${QT_MAJOR_VERSION}UiTools_INCLUDE_DIRS}
+ ${libpyside_SOURCE_DIR}
+ ${plugins_SOURCE_DIR}
+ ${QtCore_GEN_DIR}
+ ${QtGui_GEN_DIR}
+ ${QtWidgets_GEN_DIR})
+
+set(QtUiTools_libraries pyside6
+ uiplugin
+ ${Qt${QT_MAJOR_VERSION}UiTools_LIBRARIES})
+
+set(QtUiTools_deps QtWidgets)
+
+configure_file("${QtUiTools_SOURCE_DIR}/QtUiTools_global.pre.h.in"
+ "${QtUiTools_BINARY_DIR}/QtUiTools_global.pre.h" @ONLY)
+
+create_pyside_module(NAME QtUiTools
+ INCLUDE_DIRS QtUiTools_include_dirs
+ LIBRARIES QtUiTools_libraries
+ DEPS QtUiTools_deps
+ TYPESYSTEM_PATH QtUiTools_SOURCE_DIR
+ SOURCES QtUiTools_SRC
+ GLUE_SOURCES QtUiTools_glue_sources)
diff --git a/sources/pyside6/PySide6/QtUiTools/QtUiTools_global.pre.h.in b/sources/pyside6/PySide6/QtUiTools/QtUiTools_global.pre.h.in
new file mode 100644
index 000000000..addfe080f
--- /dev/null
+++ b/sources/pyside6/PySide6/QtUiTools/QtUiTools_global.pre.h.in
@@ -0,0 +1,7 @@
+// Those classes are only forward-declared in QtUiLoader
+
+#include <QtWidgets/QLayout>
+#include <QtWidgets/QWidget>
+#include <QtGui/QAction>
+#include <QtGui/QActionGroup>
+#include <QtCore/QDir>
diff --git a/sources/pyside6/PySide6/QtUiTools/glue/plugins.h b/sources/pyside6/PySide6/QtUiTools/glue/plugins.h
new file mode 100644
index 000000000..04ec149ff
--- /dev/null
+++ b/sources/pyside6/PySide6/QtUiTools/glue/plugins.h
@@ -0,0 +1,31 @@
+// Copyright (C) 2020 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#ifndef _PLUGIN_H_
+#define _PLUGIN_H_
+
+#include "customwidgets.h"
+
+#include <QtCore/qpluginloader.h>
+
+static inline PyCustomWidgets *findPlugin()
+{
+ const auto &instances = QPluginLoader::staticInstances();
+ for (QObject *o : instances) {
+ if (auto plugin = qobject_cast<PyCustomWidgets *>(o))
+ return plugin;
+ }
+ return nullptr;
+}
+
+static void registerCustomWidget(PyObject *obj)
+{
+ static PyCustomWidgets *const plugin = findPlugin();
+
+ if (plugin)
+ plugin->registerWidgetType(obj);
+ else
+ qWarning("Qt for Python: Failed to find the static QUiLoader plugin.");
+}
+
+#endif
diff --git a/sources/pyside6/PySide6/QtUiTools/typesystem_uitools.xml b/sources/pyside6/PySide6/QtUiTools/typesystem_uitools.xml
new file mode 100644
index 000000000..9cfa176c8
--- /dev/null
+++ b/sources/pyside6/PySide6/QtUiTools/typesystem_uitools.xml
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+// Copyright (C) 2016 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+-->
+
+<typesystem package="PySide6.QtUiTools"
+ namespace-begin="QT_BEGIN_NAMESPACE" namespace-end="QT_END_NAMESPACE">
+ <load-typesystem name="QtWidgets/typesystem_widgets.xml" generate="no"/>
+
+ <object-type name="QUiLoader">
+ <extra-includes>
+ <include file-name="glue/plugins.h" location="local"/>
+ </extra-includes>
+ <inject-code class="native" position="beginning" file="../glue/qtuitools.cpp" snippet="uitools-loadui"/>
+ <inject-code file="../glue/qtuitools.cpp" snippet="quiloader"/>
+ <add-function signature="registerCustomWidget(PyObject*@customWidgetType@)" return-type="void">
+ <inject-documentation format="target" mode="append" file="../doc/qtuitools.rst"
+ snippet="quiloader-registercustomwidget"/>
+ <inject-code class="target" position="beginning" file="../glue/qtuitools.cpp"
+ snippet="quiloader-registercustomwidget"/>
+ </add-function>
+ <modify-function signature="createAction(QObject*,const QString&amp;)">
+ <modify-argument index="return">
+ <parent index="1" action="add"/>
+ <define-ownership class="native" owner="c++"/>
+ <define-ownership class="target" owner="default"/>
+ </modify-argument>
+ </modify-function>
+
+ <modify-function signature="createActionGroup(QObject*,const QString&amp;)">
+ <modify-argument index="return">
+ <parent index="1" action="add"/>
+ <define-ownership class="native" owner="c++"/>
+ <define-ownership class="target" owner="default"/>
+ </modify-argument>
+ </modify-function>
+
+ <modify-function signature="createLayout(const QString&amp;,QObject*,const QString&amp;)">
+ <modify-argument index="return">
+ <parent index="2" action="add"/>
+ <define-ownership class="native" owner="c++"/>
+ <define-ownership class="target" owner="default"/>
+ </modify-argument>
+ </modify-function>
+
+ <modify-function signature="createWidget(const QString&amp;,QWidget*,const QString&amp;)">
+ <modify-argument index="return">
+ <parent index="2" action="add"/>
+ <define-ownership class="native" owner="c++"/>
+ <define-ownership class="target" owner="default"/>
+ </modify-argument>
+ </modify-function>
+
+ <modify-function signature="load(QIODevice*,QWidget*)">
+ <modify-argument index="2">
+ <replace-default-expression with="0"/>
+ <rename to="parentWidget"/>
+ </modify-argument>
+ <modify-argument index="return">
+ <define-ownership class="target" owner="target"/>
+ </modify-argument>
+ <inject-code file="../glue/qtuitools.cpp" snippet="quiloader-load-1"/>
+ </modify-function>
+
+ <!-- Syntax sugar -->
+ <add-function signature="load(PyPathLike,QWidget*@parentWidget@=nullptr)" return-type="QWidget*">
+ <modify-argument index="return">
+ <define-ownership class="target" owner="target"/>
+ </modify-argument>
+ <inject-code file="../glue/qtuitools.cpp" snippet="quiloader-load-2"/>
+ </add-function>
+ </object-type>
+
+ <!--
+ After the removal of the 'pysideuic' Python module, many users were unable to generate and
+ load UI classes dynamically.
+ This function was created to provide an equivalent solution to the 'loadUiType' function from
+ Riverbank's PyQt.
+ -->
+ <add-function signature="loadUiType(const QString&amp; @uifile@)" return-type="PyObject*">
+ <inject-code file="../glue/qtuitools.cpp" snippet="loaduitype"/>
+ <inject-documentation format="target" mode="append" file="../doc/qtuitools.rst"
+ snippet="loaduitype"/>
+ </add-function>
+
+
+</typesystem>