uic: Refactor CustomWidgetsInfo::extends()

Add a extendsOneOf() helper that takes a QStringList to be searched
and simplify the code accordingly.

In WriteInitialization::acceptWidget(), move the variable
CustomWidgetsInfo *cwi up and reuse everywhere to shorten code.

Task-number: PYSIDE-797
Change-Id: I331e135b6aa58dbbd413ca151eb67b3eb92f09c6
Reviewed-by: Jarek Kobus <jaroslaw.kobus@qt.io>
This commit is contained in:
Friedemann Kleint 2018-11-02 15:20:43 +01:00
parent f370410097
commit 8c47c2a08e
5 changed files with 75 additions and 42 deletions

View File

@ -214,14 +214,14 @@ void WriteIncludes::add(const QString &className, bool determineHeader, const QS
m_knownClasses.insert(className);
const CustomWidgetsInfo *cwi = m_uic->customWidgetsInfo();
if (cwi->extends(className, QLatin1String("QTreeView"))
|| cwi->extends(className, QLatin1String("QTreeWidget"))
|| cwi->extends(className, QLatin1String("QTableView"))
|| cwi->extends(className, QLatin1String("QTableWidget"))) {
static const QStringList treeViewsWithHeaders = {
QLatin1String("QTreeView"), QLatin1String("QTreeWidget"),
QLatin1String("QTableView"), QLatin1String("QTableWidget")
};
if (cwi->extendsOneOf(className, treeViewsWithHeaders))
add(QLatin1String("QHeaderView"));
}
if (!m_laidOut && m_uic->customWidgetsInfo()->extends(className, QLatin1String("QToolBox")))
if (!m_laidOut && cwi->extends(className, QLatin1String("QToolBox")))
add(QLatin1String("QLayout")); // spacing property of QToolBox)
if (className == QLatin1String("Line")) { // ### hmm, deprecate me!

View File

@ -608,18 +608,23 @@ void WriteInitialization::acceptWidget(DomWidget *node)
if (m_uic->isContainer(parentClass))
parentWidget.clear();
if (m_widgetChain.size() != 1)
m_output << m_indent << varName << " = new " << m_uic->customWidgetsInfo()->realClassName(className) << '(' << parentWidget << ");\n";
const auto *cwi = m_uic->customWidgetsInfo();
if (m_widgetChain.size() != 1) {
m_output << m_indent << varName << " = new " << cwi->realClassName(className)
<< '(' << parentWidget << ");\n";
}
parentWidget = savedParentWidget;
if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QComboBox"))) {
if (cwi->extends(className, QLatin1String("QComboBox"))) {
initializeComboBox(node);
} else if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QListWidget"))) {
} else if (cwi->extends(className, QLatin1String("QListWidget"))) {
initializeListWidget(node);
} else if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QTreeWidget"))) {
} else if (cwi->extends(className, QLatin1String("QTreeWidget"))) {
initializeTreeWidget(node);
} else if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QTableWidget"))) {
} else if (cwi->extends(className, QLatin1String("QTableWidget"))) {
initializeTableWidget(node);
}
@ -629,7 +634,7 @@ void WriteInitialization::acceptWidget(DomWidget *node)
writeProperties(varName, className, node->elementProperty());
if (!parentWidget.isEmpty()
&& m_uic->customWidgetsInfo()->extends(className, QLatin1String("QMenu"))) {
&& cwi->extends(className, QLatin1String("QMenu"))) {
initializeMenu(node, parentWidget);
}
@ -657,10 +662,10 @@ void WriteInitialization::acceptWidget(DomWidget *node)
const QString pageDefaultString = QLatin1String("Page");
if (m_uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QMainWindow"))) {
if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QMenuBar"))) {
if (cwi->extends(parentClass, QLatin1String("QMainWindow"))) {
if (cwi->extends(className, QLatin1String("QMenuBar"))) {
m_output << m_indent << parentWidget << "->setMenuBar(" << varName <<");\n";
} else if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QToolBar"))) {
} else if (cwi->extends(className, QLatin1String("QToolBar"))) {
m_output << m_indent << parentWidget << "->addToolBar("
<< toolBarAreaStringFromDOMAttributes(attributes) << varName << ");\n";
@ -670,7 +675,7 @@ void WriteInitialization::acceptWidget(DomWidget *node)
}
}
} else if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QDockWidget"))) {
} else if (cwi->extends(className, QLatin1String("QDockWidget"))) {
m_output << m_indent << parentWidget << "->addDockWidget(";
if (DomProperty *pstyle = attributes.value(QLatin1String("dockWidgetArea")))
m_output << "Qt::" << language::dockWidgetArea(pstyle->elementNumber()) << ", ";
@ -683,9 +688,9 @@ void WriteInitialization::acceptWidget(DomWidget *node)
}
// Check for addPageMethod of a custom plugin first
QString addPageMethod = m_uic->customWidgetsInfo()->customWidgetAddPageMethod(parentClass);
QString addPageMethod = cwi->customWidgetAddPageMethod(parentClass);
if (addPageMethod.isEmpty())
addPageMethod = m_uic->customWidgetsInfo()->simpleContainerAddPageMethod(parentClass);
addPageMethod = cwi->simpleContainerAddPageMethod(parentClass);
if (!addPageMethod.isEmpty()) {
m_output << m_indent << parentWidget << "->" << addPageMethod << '(' << varName << ");\n";
} else if (m_uic->customWidgetsInfo()->extends(parentClass, QLatin1String("QWizard"))) {
@ -753,8 +758,14 @@ void WriteInitialization::acceptWidget(DomWidget *node)
QLatin1String("stretchLastSection"),
};
if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QTreeView"))
|| m_uic->customWidgetsInfo()->extends(className, QLatin1String("QTreeWidget"))) {
static const QStringList trees = {
QLatin1String("QTreeView"), QLatin1String("QTreeWidget")
};
static const QStringList tables = {
QLatin1String("QTableView"), QLatin1String("QTableWidget")
};
if (cwi->extendsOneOf(className, trees)) {
DomPropertyList headerProperties;
for (auto realPropertyName : realPropertyNames) {
const QString fakePropertyName = QLatin1String("header")
@ -767,9 +778,7 @@ void WriteInitialization::acceptWidget(DomWidget *node)
writeProperties(varName + QLatin1String("->header()"), QLatin1String("QHeaderView"),
headerProperties, WritePropertyIgnoreObjectName);
} else if (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QTableView"))
|| m_uic->customWidgetsInfo()->extends(className, QLatin1String("QTableWidget"))) {
} else if (cwi->extendsOneOf(className, tables)) {
static const QLatin1String headerPrefixes[] = {
QLatin1String("horizontalHeader"),
QLatin1String("verticalHeader"),
@ -1166,11 +1175,12 @@ void WriteInitialization::writeProperties(const QString &varName,
<< p->elementNumber() << ");\n";
continue;
}
static const QStringList currentIndexWidgets = {
QLatin1String("QComboBox"), QLatin1String("QStackedWidget"),
QLatin1String("QTabWidget"), QLatin1String("QToolBox")
};
if (propertyName == QLatin1String("currentIndex") // set currentIndex later
&& (m_uic->customWidgetsInfo()->extends(className, QLatin1String("QComboBox"))
|| m_uic->customWidgetsInfo()->extends(className, QLatin1String("QStackedWidget"))
|| m_uic->customWidgetsInfo()->extends(className, QLatin1String("QTabWidget"))
|| m_uic->customWidgetsInfo()->extends(className, QLatin1String("QToolBox")))) {
&& (m_uic->customWidgetsInfo()->extendsOneOf(className, currentIndexWidgets))) {
m_delayedOut << m_indent << varName << "->setCurrentIndex("
<< p->elementNumber() << ");\n";
continue;

View File

@ -75,6 +75,24 @@ bool CustomWidgetsInfo::extends(const QString &classNameIn, QLatin1String baseCl
return false;
}
bool CustomWidgetsInfo::extendsOneOf(const QString &classNameIn,
const QStringList &baseClassNames) const
{
if (baseClassNames.contains(classNameIn))
return true;
QString className = classNameIn;
while (const DomCustomWidget *c = customWidget(className)) {
const QString extends = c->elementExtends();
if (className == extends) // Faulty legacy custom widget entries exist.
return false;
if (baseClassNames.contains(extends))
return true;
className = extends;
}
return false;
}
bool CustomWidgetsInfo::isCustomWidgetContainer(const QString &className) const
{
if (const DomCustomWidget *dcw = m_customWidgets.value(className, 0))

View File

@ -57,6 +57,7 @@ public:
QString realClassName(const QString &className) const;
bool extends(const QString &className, QLatin1String baseClassName) const;
bool extendsOneOf(const QString &className, const QStringList &baseClassNames) const;
bool isCustomWidgetContainer(const QString &className) const;

View File

@ -245,28 +245,32 @@ void Uic::writeHeaderProtectionEnd()
bool Uic::isButton(const QString &className) const
{
return customWidgetsInfo()->extends(className, QLatin1String("QRadioButton"))
|| customWidgetsInfo()->extends(className, QLatin1String("QToolButton"))
|| customWidgetsInfo()->extends(className, QLatin1String("QCheckBox"))
|| customWidgetsInfo()->extends(className, QLatin1String("QPushButton"))
|| customWidgetsInfo()->extends(className, QLatin1String("QCommandLinkButton"));
static const QStringList buttons = {
QLatin1String("QRadioButton"), QLatin1String("QToolButton"),
QLatin1String("QCheckBox"), QLatin1String("QPushButton"),
QLatin1String("QCommandLinkButton")
};
return customWidgetsInfo()->extendsOneOf(className, buttons);
}
bool Uic::isContainer(const QString &className) const
{
return customWidgetsInfo()->extends(className, QLatin1String("QStackedWidget"))
|| customWidgetsInfo()->extends(className, QLatin1String("QToolBox"))
|| customWidgetsInfo()->extends(className, QLatin1String("QTabWidget"))
|| customWidgetsInfo()->extends(className, QLatin1String("QScrollArea"))
|| customWidgetsInfo()->extends(className, QLatin1String("QMdiArea"))
|| customWidgetsInfo()->extends(className, QLatin1String("QWizard"))
|| customWidgetsInfo()->extends(className, QLatin1String("QDockWidget"));
static const QStringList containers = {
QLatin1String("QStackedWidget"), QLatin1String("QToolBox"),
QLatin1String("QTabWidget"), QLatin1String("QScrollArea"),
QLatin1String("QMdiArea"), QLatin1String("QWizard"),
QLatin1String("QDockWidget")
};
return customWidgetsInfo()->extendsOneOf(className, containers);
}
bool Uic::isMenu(const QString &className) const
{
return customWidgetsInfo()->extends(className, QLatin1String("QMenu"))
|| customWidgetsInfo()->extends(className, QLatin1String("QPopupMenu"));
static const QStringList menus = {
QLatin1String("QMenu"), QLatin1String("QPopupMenu")
};
return customWidgetsInfo()->extendsOneOf(className, menus);
}
QT_END_NAMESPACE