diff options
-rw-r--r-- | src/tools/uic/cpp/cppwriteinitialization.cpp | 95 | ||||
-rw-r--r-- | src/tools/uic/cpp/cppwriteinitialization.h | 2 | ||||
-rw-r--r-- | tests/auto/tools/uic/baseline/icontheme.ui | 29 | ||||
-rw-r--r-- | tests/auto/tools/uic/baseline/icontheme.ui.h | 33 |
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 }; |