diff --git a/docs/user/static/img/screens/rx-applet.png b/docs/user/static/img/screens/rx-applet.png index 13b44bb56b..78cecf0c4b 100644 Binary files a/docs/user/static/img/screens/rx-applet.png and b/docs/user/static/img/screens/rx-applet.png differ diff --git a/src/gui/RxApplet.cpp b/src/gui/RxApplet.cpp index f7bd586ea8..6393d7654b 100644 --- a/src/gui/RxApplet.cpp +++ b/src/gui/RxApplet.cpp @@ -3548,7 +3548,10 @@ void RxApplet::rebuildFilterButtons() btn->setAccessibleName(QStringLiteral("Receive filter %1") .arg(preset.label)); } - btn->setStyleSheet(kButtonBase() + kBlueActive()); + // Three preset columns must leave room for the 60 px AGC slider + // and Auto button within the dock's 248 px viewport. + btn->setStyleSheet(kButtonBase() + kBlueActive() + + QStringLiteral("QPushButton { padding: 1px; }")); connect(btn, &QPushButton::clicked, this, [this, i, customisable, stablePresets, preset](bool) { if (!m_slice) { diff --git a/tests/auto_agc_threshold_gui_test.cpp b/tests/auto_agc_threshold_gui_test.cpp index fc8873a044..491e448b29 100644 --- a/tests/auto_agc_threshold_gui_test.cpp +++ b/tests/auto_agc_threshold_gui_test.cpp @@ -23,6 +23,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -30,9 +33,14 @@ #include #include #include +#include #include #include +#include +#include #include +#include +#include #include #include #include @@ -325,6 +333,70 @@ private slots: "Link THEME_TEST_RESOURCES so screenshots use the production theme resources"); } + void compactLayoutFitsDock_data() + { + QTest::addColumn("fontFamily"); + // DejaVu Sans is the row that needs the compact preset padding (#6641); + // a host without it runs only rows that already fit. + QTest::newRow("system") << QString(); + const QStringList families = QFontDatabase::families(); + for (const QString& family : {QStringLiteral("DejaVu Sans"), + QStringLiteral("Liberation Sans")}) { + if (families.contains(family)) { + QTest::newRow(qPrintable(family)) << family; + } + } + } + + void compactLayoutFitsDock() + { + QFETCH(QString, fontFamily); + const QFont defaultFont = QApplication::font(); + const auto restoreFont = qScopeGuard([defaultFont] { + QApplication::setFont(defaultFont); + }); + if (!fontFamily.isEmpty()) { + QFont font = defaultFont; + font.setFamily(fontFamily); + QApplication::setFont(font); + } + + Fixture fixture; + QVERIFY(fixture.capture(QStringLiteral("compact-layout-") + + (fontFamily.isEmpty() ? QStringLiteral("system") : fontFamily))); + QCOMPARE(fixture.rx.width(), 248); + QVERIFY(fixture.rx.minimumSizeHint().width() <= 248); + QVERIFY(fixture.threshold()); + QVERIFY(fixture.threshold()->width() >= 60); + for (QWidget* widget : fixture.rx.findChildren()) { + if (widget->isVisibleTo(&fixture.rx) && !widget->isWindow()) { + const QRect bounds(widget->mapTo(&fixture.rx, QPoint()), widget->size()); + QVERIFY2(fixture.rx.rect().contains(bounds), + qPrintable(widget->accessibleName().isEmpty() + ? QString::fromLatin1(widget->metaObject()->className()) + : widget->accessibleName())); + } + } + + const QStringList presets{QStringLiteral("1.8K"), QStringLiteral("2.1K"), + QStringLiteral("2.4K"), QStringLiteral("2.7K"), + QStringLiteral("2.9K"), QStringLiteral("3.3K")}; + int presetCount = 0; + for (QPushButton* button : fixture.rx.findChildren()) { + if (presets.contains(button->text())) { + ++presetCount; + QVERIFY(button->isVisibleTo(&fixture.rx)); + QStyleOptionButton option; + option.initFrom(button); + const QRect contents = button->style()->subElementRect( + QStyle::SE_PushButtonContents, &option, button); + QVERIFY(button->fontMetrics().horizontalAdvance(button->text()) + <= contents.width()); + } + } + QCOMPARE(presetCount, 6); + } + void bridgeClickWaitsForConfirmedStatus() { Fixture fixture;