6#include <customwidgetsinfo.h>
13#include <QtCore/qdir.h>
14#include <QtCore/qfileinfo.h>
15#include <QtCore/qtextstream.h>
21using namespace Qt::StringLiterals;
34 {QStringLiteral(
"QtCore"),
35 {QStringLiteral(
"QCoreApplication"), QStringLiteral(
"QDate"),
36 QStringLiteral(
"QDateTime"), QStringLiteral(
"QLocale"),
37 QStringLiteral(
"QMetaObject"), QStringLiteral(
"QObject"),
38 QStringLiteral(
"QPoint"), QStringLiteral(
"QRect"),
39 QStringLiteral(
"QSize"), QStringLiteral(
"QTime"),
40 QStringLiteral(
"QUrl"), QStringLiteral(
"Qt")},
42 {QStringLiteral(
"QtGui"),
43 {QStringLiteral(
"QBrush"), QStringLiteral(
"QColor"),
44 QStringLiteral(
"QConicalGradient"), QStringLiteral(
"QCursor"),
45 QStringLiteral(
"QGradient"), QStringLiteral(
"QFont"),
46 QStringLiteral(
"QFontDatabase"), QStringLiteral(
"QIcon"),
47 QStringLiteral(
"QImage"), QStringLiteral(
"QKeySequence"),
48 QStringLiteral(
"QLinearGradient"), QStringLiteral(
"QPalette"),
49 QStringLiteral(
"QPainter"), QStringLiteral(
"QPixmap"),
50 QStringLiteral(
"QTransform"), QStringLiteral(
"QRadialGradient")}
53 {QStringLiteral(
"QtWidgets"),
54 {QStringLiteral(
"QSizePolicy"), QStringLiteral(
"QWidget")}
60static void insertClass(
const QString &module,
const QString &className,
61 WriteImports::ClassesPerModule *c)
63 auto usedIt = c->find(module);
64 if (usedIt == c->end())
65 c->insert(module, {className});
66 else if (!usedIt.value().contains(className))
67 usedIt.value().append(className);
73 std::sort(classList.begin(), classList.end());
75 const qsizetype size = classList.size();
78 for (qsizetype i = 0; i < size; ++i) {
80 str << (i % 4 == 0 ?
",\n " :
", ");
81 str << classList.at(i);
87static void formatClasses(QTextStream &str,
const WriteImports::ClassesPerModule &c,
88 bool useStarImports =
false,
89 const QByteArray &modulePrefix = {})
91 for (
auto it = c.cbegin(), end = c.cend(); it != end; ++it) {
92 str <<
"from " << modulePrefix << it.key() <<
" import ";
94 str <<
"* # type: ignore";
96 formatImportClasses(str, it.value());
104 for (
const auto &e : classInfoEntries())
105 m_classToModule.insert(QLatin1StringView(e.klass), QLatin1StringView(e.module));
112 auto &output = uic()->output();
113 const bool useStarImports = uic()->driver()->option().useStarImports;
115 const QByteArray qtPrefix = QByteArrayLiteral(
"PySide")
116 + QByteArray::number(QT_VERSION_MAJOR) +
'.';
118 formatClasses(output, m_qtClasses, useStarImports, qtPrefix);
120 if (!m_customWidgets.isEmpty() || !m_plainCustomWidgets.isEmpty()) {
122 formatClasses(output, m_customWidgets, useStarImports);
123 for (
const auto &w : m_plainCustomWidgets)
124 output <<
"import " << w <<
'\n';
127 if (
auto *resources = node->elementResources()) {
128 const auto &includes = resources->elementInclude();
129 for (
auto *include : includes) {
130 if (include->hasAttributeLocation())
131 writeResourceImport(include->attributeLocation());
137QString
WriteImports::resourceAbsolutePath(QString resource)
const
142 const auto &options = uic()->option();
143 if (!options.inputFile.isEmpty() && !options.pythonRoot.isEmpty()) {
144 resource = QDir::cleanPath(QFileInfo(options.inputFile).canonicalPath() + u'/' + resource);
145 if (resource.size() > options.pythonRoot.size())
146 resource.remove(0, options.pythonRoot.size() + 1);
149 while (resource.startsWith(u"../"))
150 resource.remove(0, 3);
151 resource.replace(u'/', u'.');
155void WriteImports::writeResourceImport(
const QString &module)
157 const auto &options = uic()->option();
158 auto &str = uic()->output();
160 QString resource = QDir::cleanPath(module);
161 if (resource.endsWith(u".qrc"))
163 const qsizetype basePos = resource.lastIndexOf(u'/') + 1;
166 if (options.rcPrefix)
167 resource.insert(basePos, u"rc_");
169 resource.append(u"_rc");
171 switch (options.pythonResourceImport) {
172 case Option::PythonResourceImport::Default:
173 str <<
"import " << QStringView{resource}.sliced(basePos) <<
'\n';
175 case Option::PythonResourceImport::FromDot:
176 str <<
"from . import " << QStringView{resource}.sliced(basePos) <<
'\n';
178 case Option::PythonResourceImport::Absolute:
179 str <<
"import " << resourceAbsolutePath(resource) <<
'\n';
184void WriteImports::doAdd(
const QString &className,
const DomCustomWidget *dcw)
187 if (cwi->extends(className,
"QListWidget"))
188 add(QStringLiteral(
"QListWidgetItem"));
189 else if (cwi->extends(className,
"QTreeWidget"))
190 add(QStringLiteral(
"QTreeWidgetItem"));
191 else if (cwi->extends(className,
"QTableWidget"))
192 add(QStringLiteral(
"QTableWidgetItem"));
194 if (dcw !=
nullptr) {
195 addPythonCustomWidget(className, dcw);
199 if (!addQtClass(className))
200 qWarning(
"WriteImports::add(): Unknown Qt class %s",
qPrintable(className));
206 if (className == u"QVariant" || className == u"Qt")
209 const auto moduleIt = m_classToModule.constFind(className);
210 const bool result = moduleIt != m_classToModule.cend();
212 insertClass(moduleIt.value(), className, &m_qtClasses);
216void WriteImports::addPythonCustomWidget(
const QString &className,
const DomCustomWidget *node)
218 if (className.contains(
"::"_L1))
221 if (addQtClass(className))
226 if (!node->elementHeader() || node->elementHeader()->text().isEmpty()) {
227 m_plainCustomWidgets.append(className);
229 QString modulePath = node->elementHeader()->text();
231 modulePath.replace(u'/', u'.');
233 if (modulePath.endsWith(
".h"_L1, Qt::CaseInsensitive))
235 else if (modulePath.endsWith(
".hh"_L1))
237 else if (modulePath.endsWith(
".hpp"_L1))
239 insertClass(modulePath, className, &m_customWidgets);
245 switch (node->kind()) {
246 case DomProperty::Enum:
247 addEnumBaseClass(node->elementEnum());
249 case DomProperty::Set:
250 addEnumBaseClass(node->elementSet());
262 const auto colonPos = v.indexOf(u"::");
264 const QString base = v.left(colonPos);
265 if (base.startsWith(u'Q') && base != u"Qt")
void acceptUI(DomUI *node) override
void acceptProperty(DomProperty *node) override
WriteIncludesBase(Uic *uic)
void acceptUI(DomUI *node) override
void acceptProperty(DomProperty *node) override
static void formatImportClasses(QTextStream &str, QStringList classList)
static void insertClass(const QString &module, const QString &className, WriteImports::ClassesPerModule *c)
static void formatClasses(QTextStream &str, const WriteImports::ClassesPerModule &c, bool useStarImports=false, const QByteArray &modulePrefix={})
static WriteImports::ClassesPerModule defaultClasses()
Combined button and popup list for selecting options.
const QString & asString(const QString &s)
#define qPrintable(string)