diff options
Diffstat (limited to 'tests/baseline/stylesheet')
23 files changed, 548 insertions, 0 deletions
diff --git a/tests/baseline/stylesheet/CMakeLists.txt b/tests/baseline/stylesheet/CMakeLists.txt new file mode 100644 index 0000000000..3fdaa739fe --- /dev/null +++ b/tests/baseline/stylesheet/CMakeLists.txt @@ -0,0 +1,33 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +file(GLOB_RECURSE test_data_glob + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + qss/*) +list(APPEND test_data ${test_data_glob}) + +qt_internal_add_test(tst_baseline_stylesheet + SOURCES + ../shared/baselineprotocol.cpp ../shared/baselineprotocol.h ../shared/lookup3.cpp + ../shared/qbaselinetest.cpp ../shared/qbaselinetest.h + ../shared/qwidgetbaselinetest.cpp ../shared/qwidgetbaselinetest.h + tst_baseline_stylesheet.cpp + INCLUDE_DIRECTORIES + ../shared + LIBRARIES + Qt::Gui + Qt::Widgets + Qt::WidgetsPrivate + Qt::Network + TESTDATA ${test_data} +) + +qt6_add_resources(tst_baseline_stylesheet "tst_baseline_stylesheet" + PREFIX + "/" + FILES + "icons/align-center.png" + "icons/align-left.png" + "icons/align-right.png" + "icons/arrow-up.png" +) diff --git a/tests/baseline/stylesheet/icons.qrc b/tests/baseline/stylesheet/icons.qrc new file mode 100644 index 0000000000..8b3e7ca6cc --- /dev/null +++ b/tests/baseline/stylesheet/icons.qrc @@ -0,0 +1,9 @@ +<!DOCTYPE RCC> +<RCC version="1.0"> +<qresource> + <file>icons/align-center.png</file> + <file>icons/align-left.png</file> + <file>icons/align-right.png</file> + <file>icons/arrow-up.png</file> +</qresource> +</RCC> diff --git a/tests/baseline/stylesheet/icons/align-center.png b/tests/baseline/stylesheet/icons/align-center.png Binary files differnew file mode 100644 index 0000000000..a7ce2fad52 --- /dev/null +++ b/tests/baseline/stylesheet/icons/align-center.png diff --git a/tests/baseline/stylesheet/icons/align-left.png b/tests/baseline/stylesheet/icons/align-left.png Binary files differnew file mode 100644 index 0000000000..ad5b975480 --- /dev/null +++ b/tests/baseline/stylesheet/icons/align-left.png diff --git a/tests/baseline/stylesheet/icons/align-right.png b/tests/baseline/stylesheet/icons/align-right.png Binary files differnew file mode 100644 index 0000000000..7ebfd6dd35 --- /dev/null +++ b/tests/baseline/stylesheet/icons/align-right.png diff --git a/tests/baseline/stylesheet/icons/arrow-up.png b/tests/baseline/stylesheet/icons/arrow-up.png Binary files differnew file mode 100644 index 0000000000..70c43a7c62 --- /dev/null +++ b/tests/baseline/stylesheet/icons/arrow-up.png diff --git a/tests/baseline/stylesheet/qss/default.qss b/tests/baseline/stylesheet/qss/default.qss new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/tests/baseline/stylesheet/qss/default.qss diff --git a/tests/baseline/stylesheet/qss/dummy.qss b/tests/baseline/stylesheet/qss/dummy.qss new file mode 100644 index 0000000000..7f09309153 --- /dev/null +++ b/tests/baseline/stylesheet/qss/dummy.qss @@ -0,0 +1,31 @@ +/* dummy stylesheet to reproduce QTBUG-100433 for QToolButton +QDummyView { + alternate-background-color: yellow; +} + +QDummyView { + show-decoration-selected: 1; +} + +QDummyView::item { + border: 1px solid #d9d9d9; + border-top-color: transparent; + border-bottom-color: transparent; +} + +QDummyView::item:hover { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #e7effd, stop: 1 #cbdaf1); + border: 1px solid #bfcde4; +} + +QDummyView::item:selected { + border: 1px solid #567dbc; +} + +QDummyView::item:selected:active{ + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6ea1f1, stop: 1 #567dbc); +} + +QDummyView::item:selected:!active { + background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #6b9be8, stop: 1 #577fbf); +} diff --git a/tests/baseline/stylesheet/qss/qheaderview/selectedFontWeight.qss b/tests/baseline/stylesheet/qss/qheaderview/selectedFontWeight.qss new file mode 100644 index 0000000000..1c45a99767 --- /dev/null +++ b/tests/baseline/stylesheet/qss/qheaderview/selectedFontWeight.qss @@ -0,0 +1,16 @@ +QHeaderView::section { + background-color: red; + font-size: 10px; +} + +QHeaderView::section:checked { + background-color: green; + font-size: 20px; + font-weight: bold; +} + +QHeaderView::section:first { + background-color: yellow; + font-size: 20px; + font-weight: normal; +} diff --git a/tests/baseline/stylesheet/qss/qscrollarea/no_border.qss b/tests/baseline/stylesheet/qss/qscrollarea/no_border.qss new file mode 100644 index 0000000000..0c9744de7c --- /dev/null +++ b/tests/baseline/stylesheet/qss/qscrollarea/no_border.qss @@ -0,0 +1 @@ +border: none diff --git a/tests/baseline/stylesheet/qss/qscrollarea/styled_scrollbars.qss b/tests/baseline/stylesheet/qss/qscrollarea/styled_scrollbars.qss new file mode 100644 index 0000000000..94fa3db183 --- /dev/null +++ b/tests/baseline/stylesheet/qss/qscrollarea/styled_scrollbars.qss @@ -0,0 +1,72 @@ +QScrollBar:horizontal { + border: 2px solid grey; + background: #32CC99; + height: 15px; + margin: 0px 20px 0 20px; +} +QScrollBar::handle:horizontal { + background: white; + min-width: 20px; +} +QScrollBar::add-line:horizontal { + border: 2px solid grey; + background: #32CC99; + width: 20px; + subcontrol-position: right; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:horizontal { + border: 2px solid grey; + background: #32CC99; + width: 20px; + subcontrol-position: left; + subcontrol-origin: margin; +} + +QScrollBar:left-arrow:horizontal, QScrollBar::right-arrow:horizontal { + border: 2px solid grey; + width: 3px; + height: 3px; + background: white; +} + +QScrollBar::add-page:horizontal, QScrollBar::sub-page:horizontal { + background: none; +} + +QScrollBar:vertical { + border: 2px solid grey; + background: #32CC99; + width: 15px; + margin: 22px 0 22px 0; +} +QScrollBar::handle:vertical { + background: white; + min-height: 20px; +} +QScrollBar::add-line:vertical { + border: 2px solid grey; + background: #32CC99; + height: 20px; + subcontrol-position: bottom; + subcontrol-origin: margin; +} + +QScrollBar::sub-line:vertical { + border: 2px solid grey; + background: #32CC99; + height: 20px; + subcontrol-position: top; + subcontrol-origin: margin; +} +QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical { + border: 2px solid grey; + width: 3px; + height: 3px; + background: white; +} + +QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { + background: none; +} diff --git a/tests/baseline/stylesheet/qss/qtoolbutton/menuButton_no_border.qss b/tests/baseline/stylesheet/qss/qtoolbutton/menuButton_no_border.qss new file mode 100644 index 0000000000..e9e098eb5c --- /dev/null +++ b/tests/baseline/stylesheet/qss/qtoolbutton/menuButton_no_border.qss @@ -0,0 +1 @@ +QToolButton::menu-button { border: none } diff --git a/tests/baseline/stylesheet/qss/qtoolbutton/menuButton_subcontrol_padding.qss b/tests/baseline/stylesheet/qss/qtoolbutton/menuButton_subcontrol_padding.qss new file mode 100644 index 0000000000..44e67671f0 --- /dev/null +++ b/tests/baseline/stylesheet/qss/qtoolbutton/menuButton_subcontrol_padding.qss @@ -0,0 +1,12 @@ +QToolButton { + border: 5px solid #9e9e9e; + background: #ffffff; + padding-top: 8px; + padding-bottom: 8px; +} +QToolButton[popupMode=InstantPopup] { + padding-right: 75px; +} +QToolButton::menu-indicator { + subcontrol-position: right; +}; diff --git a/tests/baseline/stylesheet/qss/qtoolbutton/menuButton_subcontrol_position.qss b/tests/baseline/stylesheet/qss/qtoolbutton/menuButton_subcontrol_position.qss new file mode 100644 index 0000000000..4a1a5f0c23 --- /dev/null +++ b/tests/baseline/stylesheet/qss/qtoolbutton/menuButton_subcontrol_position.qss @@ -0,0 +1,4 @@ +QToolButton::menu-indicator { + subcontrol-position: right center; + subcontrol-origin: padding; +} diff --git a/tests/baseline/stylesheet/qss/qtoolbutton/no_border.qss b/tests/baseline/stylesheet/qss/qtoolbutton/no_border.qss new file mode 100644 index 0000000000..0c9744de7c --- /dev/null +++ b/tests/baseline/stylesheet/qss/qtoolbutton/no_border.qss @@ -0,0 +1 @@ +border: none diff --git a/tests/baseline/stylesheet/qss/qtoolbutton/styled.qss b/tests/baseline/stylesheet/qss/qtoolbutton/styled.qss new file mode 100644 index 0000000000..799be9bf31 --- /dev/null +++ b/tests/baseline/stylesheet/qss/qtoolbutton/styled.qss @@ -0,0 +1,38 @@ +QToolButton::menu-button { + border: 2px solid gray; + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + /* 16px width + 4px for border = 20px allocated above */ + width: 16px; +} + +QToolButton::menu-indicator { + image: url(:/icons/arrow-up.png); + width: 16px; + height: 16px; + subcontrol-position: right bottom; +} + +QToolButton::menu-arrow { + subcontrol-position: bottom right; + image: url(:/icons/arrow-up.png); +} +QToolButton::down-arrow { + image: url(:/icons/arrow-up.png); + background-color: blue +} +QToolButton::up-arrow { + image: url(:/icons/arrow-up.png); + background-color: green +} +QToolButton::left-arrow { + image: url(:/icons/arrow-up.png); + background-color: red +} +QToolButton::right-arrow { + image: url(:/icons/arrow-up.png); + background-color: cyan; + width: 15px; + height: 15px; + subcontrol-position: right bottom; +} diff --git a/tests/baseline/stylesheet/qss/qtoolbutton/styled_no_border.qss b/tests/baseline/stylesheet/qss/qtoolbutton/styled_no_border.qss new file mode 100644 index 0000000000..7cb753120f --- /dev/null +++ b/tests/baseline/stylesheet/qss/qtoolbutton/styled_no_border.qss @@ -0,0 +1,42 @@ +QToolButton { + border: none +} + +QToolButton::menu-button { + border: 2px solid gray; + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; + /* 16px width + 4px for border = 20px allocated above */ + width: 16px; +} + +QToolButton::menu-indicator { + image: url(:/icons/arrow-up.png); + width: 16px; + height: 16px; + subcontrol-position: right bottom; +} + +QToolButton::menu-arrow { + subcontrol-position: bottom right; + image: url(:/icons/arrow-up.png); +} +QToolButton::down-arrow { + image: url(:/icons/arrow-up.png); + background-color: blue +} +QToolButton::up-arrow { + image: url(:/icons/arrow-up.png); + background-color: green +} +QToolButton::left-arrow { + image: url(:/icons/arrow-up.png); + background-color: red +} +QToolButton::right-arrow { + image: url(:/icons/arrow-up.png); + background-color: cyan; + width: 15px; + height: 15px; + subcontrol-position: right bottom; +} diff --git a/tests/baseline/stylesheet/qss/qtreeview/showDecorationSelected.qss b/tests/baseline/stylesheet/qss/qtreeview/showDecorationSelected.qss new file mode 100644 index 0000000000..b279b587bd --- /dev/null +++ b/tests/baseline/stylesheet/qss/qtreeview/showDecorationSelected.qss @@ -0,0 +1,3 @@ +QTreeView { + show-decoration-selected: 1 +} diff --git a/tests/baseline/stylesheet/qss/qtreeview/styledIndicators.qss b/tests/baseline/stylesheet/qss/qtreeview/styledIndicators.qss new file mode 100644 index 0000000000..02263ad644 --- /dev/null +++ b/tests/baseline/stylesheet/qss/qtreeview/styledIndicators.qss @@ -0,0 +1,18 @@ +QTreeWidget::indicator:indeterminate { + background: red +} +QTreeWidget::indicator:indeterminate:disabled { + background: pink +} +QTreeWidget::indicator:checked { + background: green +} +QTreeWidget::indicator:checked:disabled { + background: lightgreen +} +QTreeWidget::indicator:unchecked { + background: blue +} +QTreeWidget::indicator:unchecked:disabled { + background: lightblue +}; diff --git a/tests/baseline/stylesheet/qss/qtreeview/styledItem.qss b/tests/baseline/stylesheet/qss/qtreeview/styledItem.qss new file mode 100644 index 0000000000..1da627881c --- /dev/null +++ b/tests/baseline/stylesheet/qss/qtreeview/styledItem.qss @@ -0,0 +1,7 @@ +QAbstractItemView::item +{ + background: grey; +} +QTreeWidget::indicator:checked { + background: green +} diff --git a/tests/baseline/stylesheet/qss/qtreeview/styledSelection.qss b/tests/baseline/stylesheet/qss/qtreeview/styledSelection.qss new file mode 100644 index 0000000000..7d54a74fe5 --- /dev/null +++ b/tests/baseline/stylesheet/qss/qtreeview/styledSelection.qss @@ -0,0 +1,10 @@ +QTreeView { + alternate-background-color: yellow; + show-decoration-selected: 1; +} +QTreeView::item:selected:active { + background: qlineargradient(x1:0, y1:0 x2: 0, y2: 1, stop: 0 #fea1f1 stop: 1 #567dbc) +} +QTreeView::branch { + border: 2px +} diff --git a/tests/baseline/stylesheet/stylesheet.pro b/tests/baseline/stylesheet/stylesheet.pro new file mode 100644 index 0000000000..8c6d79124c --- /dev/null +++ b/tests/baseline/stylesheet/stylesheet.pro @@ -0,0 +1,10 @@ +CONFIG += testcase +TARGET = tst_baseline_stylesheet +QT += widgets testlib gui-private + +SOURCES += tst_baseline_stylesheet.cpp +RESOURCES += icons.qrc + +include($$PWD/../shared/qbaselinetest.pri) + +TESTDATA += qss/* diff --git a/tests/baseline/stylesheet/tst_baseline_stylesheet.cpp b/tests/baseline/stylesheet/tst_baseline_stylesheet.cpp new file mode 100644 index 0000000000..67a618988b --- /dev/null +++ b/tests/baseline/stylesheet/tst_baseline_stylesheet.cpp @@ -0,0 +1,240 @@ +// Copyright (C) 2021 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <qbaselinetest.h> +#include <qwidgetbaselinetest.h> +#include <QtWidgets> +#include <QByteArray> + +class tst_Stylesheet : public QWidgetBaselineTest +{ + Q_OBJECT + +public: + tst_Stylesheet(); + + void loadTestFiles(); + + void doInit() override; + +private slots: + void tst_QToolButton_data(); + void tst_QToolButton(); + + void tst_QScrollArea_data(); + void tst_QScrollArea(); + + void tst_QTreeView_data(); + void tst_QTreeView(); + + void tst_QHeaderView_data(); + void tst_QHeaderView(); + +private: + QDir styleSheetDir; +}; + +tst_Stylesheet::tst_Stylesheet() +{ + QString baseDir = QFINDTESTDATA("qss/default.qss"); + styleSheetDir = QDir(QFileInfo(baseDir).path()); +} + +void tst_Stylesheet::doInit() +{ + QFETCH(QString, styleSheet); + testWindow()->setStyleSheet(styleSheet); +} + +void tst_Stylesheet::loadTestFiles() +{ + QTest::addColumn<QString>("styleSheet"); + + QStringList qssFiles; + // first add generic test files + for (const auto &qssFile : styleSheetDir.entryList({QStringLiteral("*.qss")}, QDir::Files | QDir::Readable)) + qssFiles << styleSheetDir.absoluteFilePath(qssFile); + + // then test-function specific files + const QString testFunction = QString(QTest::currentTestFunction()).remove("tst_").toLower(); + if (styleSheetDir.cd(testFunction)) { + for (const auto &qssFile : styleSheetDir.entryList({QStringLiteral("*.qss")}, QDir::Files | QDir::Readable)) + qssFiles << styleSheetDir.absoluteFilePath(qssFile); + styleSheetDir.cdUp(); + } + + for (const auto &qssFile : qssFiles) { + QFileInfo fileInfo(qssFile); + QFile file(qssFile); + QVERIFY(file.open(QFile::ReadOnly)); + QString styleSheet = QString::fromUtf8(file.readAll()); + QBaselineTest::newRow(fileInfo.baseName().toUtf8()) << styleSheet; + } +} + +void tst_Stylesheet::tst_QToolButton_data() +{ + loadTestFiles(); +} + +void tst_Stylesheet::tst_QToolButton() +{ + const QIcon trashIcon = QApplication::style()->standardIcon(QStyle::SP_TrashIcon); + + QVBoxLayout *vbox = new QVBoxLayout; + + QHBoxLayout *normalButtons = new QHBoxLayout; + for (const auto &buttonStyle : {Qt::ToolButtonIconOnly, Qt::ToolButtonTextOnly, + Qt::ToolButtonTextUnderIcon, Qt::ToolButtonTextBesideIcon}) { + QToolButton *normal = new QToolButton; + normal->setToolButtonStyle(buttonStyle); + normal->setText("Norm"); + normal->setIcon(trashIcon); + normalButtons->addWidget(normal); + } + vbox->addLayout(normalButtons); + + QHBoxLayout *arrowButtons = new QHBoxLayout; + for (const auto &arrowType : {Qt::LeftArrow, Qt::RightArrow, Qt::UpArrow, Qt::DownArrow}) { + QToolButton *arrow = new QToolButton; + arrow->setText("Arrs"); + arrow->setArrowType(arrowType); + arrowButtons->addWidget(arrow); + } + vbox->addLayout(arrowButtons); + + QHBoxLayout *arrowWithTextButtons = new QHBoxLayout; + for (const auto &buttonStyle : {Qt::ToolButtonTextOnly, + Qt::ToolButtonTextUnderIcon, Qt::ToolButtonTextBesideIcon}) { + QToolButton *arrow = new QToolButton; + arrow->setText("ArrTxt"); + arrow->setArrowType(Qt::UpArrow); + arrow->setToolButtonStyle(buttonStyle); + arrowWithTextButtons->addWidget(arrow); + } + vbox->addLayout(arrowWithTextButtons); + + QHBoxLayout *menuButtons = new QHBoxLayout; + for (const auto &popupMode : {QToolButton::InstantPopup, QToolButton::MenuButtonPopup, + QToolButton::DelayedPopup}) { + QToolButton *menuButton = new QToolButton; + menuButton->setText("PppMd"); + menuButton->setIcon(trashIcon); + QMenu *menuButtonMenu = new QMenu; + menuButtonMenu->addAction(QIcon(":/icons/align-left.png"), "Left"); + menuButtonMenu->addAction(QIcon(":/icons/align-right.png"), "Right"); + menuButtonMenu->addAction(QIcon(":/icons/align-center.png"), "Center"); + menuButton->setMenu(menuButtonMenu); + menuButton->setPopupMode(popupMode); + menuButtons->addWidget(menuButton); + } + vbox->addLayout(menuButtons); + testWindow()->setLayout(vbox); + + makeVisible(); + QBASELINE_TEST(takeSnapshot()); +} + +void tst_Stylesheet::tst_QScrollArea_data() +{ + loadTestFiles(); +} + +void tst_Stylesheet::tst_QScrollArea() +{ + QHBoxLayout *layout = new QHBoxLayout; + QTableWidget *table = new QTableWidget(20, 20); + layout->addWidget(table); + testWindow()->setLayout(layout); + + makeVisible(); + QBASELINE_TEST(takeSnapshot()); +} + +void tst_Stylesheet::tst_QTreeView_data() +{ + loadTestFiles(); +} + +void tst_Stylesheet::tst_QTreeView() +{ + QHBoxLayout *layout = new QHBoxLayout; + QTreeWidget *tw = new QTreeWidget(); + tw->header()->hide(); + layout->addWidget(tw); + + enum { + Unchecked = 0, + Checked = 1, + Children = 2, + Disabled = 3, + CheckedDisabled = 4, + ChildrenDisabled = 5, + NConfigs + }; + + for (int i = 0; i < NConfigs; ++i) { + QTreeWidgetItem *topLevelItem = new QTreeWidgetItem(tw, QStringList{QString("top %1").arg(i)}); + switch (i) { + case Unchecked: + case Disabled: + topLevelItem->setCheckState(0, Qt::Unchecked); + break; + case Checked: + case CheckedDisabled: + topLevelItem->setCheckState(0, Qt::Checked); + break; + case Children: + case ChildrenDisabled: + topLevelItem->setCheckState(0, Qt::PartiallyChecked); + topLevelItem->setExpanded(true); + for (int j = 0; j < 2; ++j) { + QTreeWidgetItem *childItem = new QTreeWidgetItem(topLevelItem, QStringList{QString("child %1").arg(j)}); + childItem->setCheckState(0, j % 2 ? Qt::Unchecked : Qt::Checked); + } + break; + } + topLevelItem->setDisabled(i >= Disabled); + } + testWindow()->setLayout(layout); + tw->setRootIsDecorated(true); + makeVisible(); + + QBASELINE_CHECK_DEFERRED(takeSnapshot(), "rootDecorated"); + tw->setRootIsDecorated(false); + QBASELINE_CHECK_DEFERRED(takeSnapshot(), "rootNotDecorated"); + + tw->topLevelItem(Children)->child(0)->setSelected(true); + QBASELINE_CHECK_DEFERRED(takeSnapshot(), "itemSelected"); +} + +void tst_Stylesheet::tst_QHeaderView_data() +{ + loadTestFiles(); +} + +void tst_Stylesheet::tst_QHeaderView() +{ + QHBoxLayout *layout = new QHBoxLayout; + QTableWidget *tw = new QTableWidget(10, 10); + tw->setCurrentCell(1, 1); + layout->addWidget(tw); + testWindow()->setLayout(layout); + makeVisible(); + QBASELINE_TEST(takeSnapshot()); +} + +#define main _realmain +QTEST_MAIN(tst_Stylesheet) +#undef main + +int main(int argc, char *argv[]) +{ + // Avoid rendering variations caused by QHash randomization + QHashSeed::setDeterministicGlobalSeed(); + + QBaselineTest::handleCmdLineArgs(&argc, &argv); + return _realmain(argc, argv); +} + +#include "tst_baseline_stylesheet.moc" |