summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/tools/uic/cpp/cppwriteinitialization.cpp95
-rw-r--r--src/tools/uic/cpp/cppwriteinitialization.h2
-rw-r--r--tests/auto/tools/uic/baseline/icontheme.ui29
-rw-r--r--tests/auto/tools/uic/baseline/icontheme.ui.h33
4 files changed, 124 insertions, 35 deletions
diff --git a/src/tools/uic/cpp/cppwriteinitialization.cpp b/src/tools/uic/cpp/cppwriteinitialization.cpp
index 8276eb049f..c1e3e98f43 100644
--- a/src/tools/uic/cpp/cppwriteinitialization.cpp
+++ b/src/tools/uic/cpp/cppwriteinitialization.cpp
@@ -1808,6 +1808,59 @@ void WriteInitialization::writePixmapFunctionIcon(QTextStream &output,
}
}
+// Write QIcon::fromTheme() (value from enum or variable)
+struct iconFromTheme
+{
+ explicit iconFromTheme(const QString &theme) : m_theme(theme) {}
+
+ QString m_theme;
+};
+
+QTextStream &operator<<(QTextStream &str, const iconFromTheme &i)
+{
+ str << "QIcon" << language::qualifier << "fromTheme(" << i.m_theme << ')';
+ return str;
+}
+
+// Write QIcon::fromTheme() for an XDG icon from string literal
+struct iconFromThemeStringLiteral
+{
+ explicit iconFromThemeStringLiteral(const QString &theme) : m_theme(theme) {}
+
+ QString m_theme;
+};
+
+QTextStream &operator<<(QTextStream &str, const iconFromThemeStringLiteral &i)
+{
+ str << "QIcon" << language::qualifier << "fromTheme(" << language::qstring(i.m_theme) << ')';
+ return str;
+}
+
+// Write QIcon::fromTheme() with a path as fallback, add a check using
+// QIcon::hasThemeIcon().
+void WriteInitialization::writeThemeIconCheckAssignment(const QString &themeValue,
+ const QString &iconName,
+ const DomResourceIcon *i)
+
+{
+ const bool isCpp = language::language() == Language::Cpp;
+ m_output << m_indent << "if ";
+ if (isCpp)
+ m_output << '(';
+ m_output << "QIcon" << language::qualifier << "hasThemeIcon("
+ << themeValue << ')' << (isCpp ? ") {" : ":") << '\n'
+ << m_dindent << iconName << " = " << iconFromTheme(themeValue)
+ << language::eol;
+ m_output << m_indent << (isCpp ? "} else {" : "else:") << '\n';
+ if (m_uic->pixmapFunction().isEmpty())
+ writeResourceIcon(m_output, iconName, m_dindent, i);
+ else
+ writePixmapFunctionIcon(m_output, iconName, m_dindent, i);
+ if (isCpp)
+ m_output << m_indent << '}';
+ m_output << '\n';
+}
+
QString WriteInitialization::writeIconProperties(const DomResourceIcon *i)
{
// check cache
@@ -1832,7 +1885,8 @@ QString WriteInitialization::writeIconProperties(const DomResourceIcon *i)
}
// 4.4 onwards
- if (i->attributeTheme().isEmpty()) {
+ QString theme = i->attributeTheme();
+ if (theme.isEmpty()) {
// No theme: Write resource icon as is
m_output << m_indent << language::stackVariable("QIcon", iconName)
<< language::eol;
@@ -1843,12 +1897,21 @@ QString WriteInitialization::writeIconProperties(const DomResourceIcon *i)
return iconName;
}
+ const bool isThemeEnum = theme.startsWith("QIcon::"_L1);
+ if (isThemeEnum)
+ theme = language::enumValue(theme);
+
// Theme: Generate code to check the theme and default to resource
if (iconHasStatePixmaps(i)) {
// Theme + default state pixmaps:
// Generate code to check the theme and default to state pixmaps
m_output << m_indent << language::stackVariable("QIcon", iconName) << language::eol;
- const char themeNameStringVariableC[] = "iconThemeName";
+ if (isThemeEnum) {
+ writeThemeIconCheckAssignment(theme, iconName, i);
+ return iconName;
+ }
+
+ static constexpr auto themeNameStringVariableC = "iconThemeName"_L1;
// Store theme name in a variable
m_output << m_indent;
if (m_firstThemeIcon) { // Declare variable string
@@ -1857,31 +1920,19 @@ QString WriteInitialization::writeIconProperties(const DomResourceIcon *i)
m_firstThemeIcon = false;
}
m_output << themeNameStringVariableC << " = "
- << language::qstring(i->attributeTheme()) << language::eol;
- m_output << m_indent << "if ";
- if (isCpp)
- m_output << '(';
- m_output << "QIcon" << language::qualifier << "hasThemeIcon("
- << themeNameStringVariableC << ')' << (isCpp ? ") {" : ":") << '\n'
- << m_dindent << iconName << " = QIcon" << language::qualifier << "fromTheme("
- << themeNameStringVariableC << ')' << language::eol
- << m_indent << (isCpp ? "} else {" : "else:") << '\n';
- if (m_uic->pixmapFunction().isEmpty())
- writeResourceIcon(m_output, iconName, m_dindent, i);
- else
- writePixmapFunctionIcon(m_output, iconName, m_dindent, i);
- if (isCpp)
- m_output << m_indent << '}';
- m_output << '\n';
+ << language::qstring(theme) << language::eol;
+ writeThemeIconCheckAssignment(themeNameStringVariableC, iconName, i);
return iconName;
}
// Theme, but no state pixmaps: Construct from theme directly.
m_output << m_indent
- << language::stackVariableWithInitParameters("QIcon", iconName)
- << "QIcon" << language::qualifier << "fromTheme("
- << language::qstring(i->attributeTheme()) << "))"
- << language::eol;
+ << language::stackVariableWithInitParameters("QIcon", iconName);
+ if (isThemeEnum)
+ m_output << iconFromTheme(theme);
+ else
+ m_output << iconFromThemeStringLiteral(theme);
+ m_output << ')' << language::eol;
return iconName;
}
diff --git a/src/tools/uic/cpp/cppwriteinitialization.h b/src/tools/uic/cpp/cppwriteinitialization.h
index a336a7ea8f..0973def52d 100644
--- a/src/tools/uic/cpp/cppwriteinitialization.h
+++ b/src/tools/uic/cpp/cppwriteinitialization.h
@@ -209,6 +209,8 @@ private:
private:
QString writeFontProperties(const DomFont *f);
QString writeIconProperties(const DomResourceIcon *i);
+ void writeThemeIconCheckAssignment(const QString &themeValue, const QString &iconName,
+ const DomResourceIcon *i);
void writePixmapFunctionIcon(QTextStream &output, const QString &iconName,
const QString &indent, const DomResourceIcon *i) const;
QString writeSizePolicy(const DomSizePolicy *sp);
diff --git a/tests/auto/tools/uic/baseline/icontheme.ui b/tests/auto/tools/uic/baseline/icontheme.ui
index a21463561b..328e86602b 100644
--- a/tests/auto/tools/uic/baseline/icontheme.ui
+++ b/tests/auto/tools/uic/baseline/icontheme.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>122</width>
- <height>117</height>
+ <width>343</width>
+ <height>478</height>
</rect>
</property>
<property name="windowTitle">
@@ -42,9 +42,28 @@
<string>PushButton</string>
</property>
<property name="icon">
- <iconset theme="edit-copy">
- <normaloff/>
- </iconset>
+ <iconset theme="edit-copy"/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="themeenum">
+ <property name="text">
+ <string>PushButton</string>
+ </property>
+ <property name="icon">
+ <iconset theme="QIcon::ThemeIcon::EditCopy"/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="fileandthemeenum">
+ <property name="text">
+ <string>PushButton</string>
+ </property>
+ <property name="icon">
+ <iconset theme="QIcon::ThemeIcon::EditCopy">
+ <normaloff>image7.png</normaloff>image7.png</iconset>
</property>
</widget>
</item>
diff --git a/tests/auto/tools/uic/baseline/icontheme.ui.h b/tests/auto/tools/uic/baseline/icontheme.ui.h
index e73326c4c7..633ba81d37 100644
--- a/tests/auto/tools/uic/baseline/icontheme.ui.h
+++ b/tests/auto/tools/uic/baseline/icontheme.ui.h
@@ -25,12 +25,14 @@ public:
QPushButton *fileicon;
QPushButton *fileandthemeicon;
QPushButton *themeicon;
+ QPushButton *themeenum;
+ QPushButton *fileandthemeenum;
void setupUi(QWidget *Form)
{
if (Form->objectName().isEmpty())
Form->setObjectName("Form");
- Form->resize(122, 117);
+ Form->resize(343, 478);
verticalLayout = new QVBoxLayout(Form);
verticalLayout->setObjectName("verticalLayout");
fileicon = new QPushButton(Form);
@@ -56,17 +58,30 @@ public:
themeicon = new QPushButton(Form);
themeicon->setObjectName("themeicon");
- QIcon icon2;
- iconThemeName = QString::fromUtf8("edit-copy");
- if (QIcon::hasThemeIcon(iconThemeName)) {
- icon2 = QIcon::fromTheme(iconThemeName);
- } else {
- icon2.addFile(QString::fromUtf8(""), QSize(), QIcon::Normal, QIcon::Off);
- }
+ QIcon icon2(QIcon::fromTheme(QString::fromUtf8("edit-copy")));
themeicon->setIcon(icon2);
verticalLayout->addWidget(themeicon);
+ themeenum = new QPushButton(Form);
+ themeenum->setObjectName("themeenum");
+ QIcon icon3(QIcon::fromTheme(QIcon::ThemeIcon::EditCopy));
+ themeenum->setIcon(icon3);
+
+ verticalLayout->addWidget(themeenum);
+
+ fileandthemeenum = new QPushButton(Form);
+ fileandthemeenum->setObjectName("fileandthemeenum");
+ QIcon icon4;
+ if (QIcon::hasThemeIcon(QIcon::ThemeIcon::EditCopy)) {
+ icon4 = QIcon::fromTheme(QIcon::ThemeIcon::EditCopy);
+ } else {
+ icon4.addFile(QString::fromUtf8("image7.png"), QSize(), QIcon::Normal, QIcon::Off);
+ }
+ fileandthemeenum->setIcon(icon4);
+
+ verticalLayout->addWidget(fileandthemeenum);
+
retranslateUi(Form);
@@ -79,6 +94,8 @@ public:
fileicon->setText(QCoreApplication::translate("Form", "fileicon", nullptr));
fileandthemeicon->setText(QCoreApplication::translate("Form", "PushButton", nullptr));
themeicon->setText(QCoreApplication::translate("Form", "PushButton", nullptr));
+ themeenum->setText(QCoreApplication::translate("Form", "PushButton", nullptr));
+ fileandthemeenum->setText(QCoreApplication::translate("Form", "PushButton", nullptr));
} // retranslateUi
};