diff --git a/Testing/deck_editor_open_test.xml b/Testing/deck_editor_open_test.xml
index 437c4bd23..ab74b1c63 100644
--- a/Testing/deck_editor_open_test.xml
+++ b/Testing/deck_editor_open_test.xml
@@ -1,4 +1,4 @@
-
+
diff --git a/Testing/deck_editor_search_test.xml b/Testing/deck_editor_search_test.xml
index 0b9f88fa1..6641ac3b2 100644
--- a/Testing/deck_editor_search_test.xml
+++ b/Testing/deck_editor_search_test.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/Testing/integration_test.xml b/Testing/integration_test.xml
index 5fc7a971a..33191d1ac 100644
--- a/Testing/integration_test.xml
+++ b/Testing/integration_test.xml
@@ -36,7 +36,7 @@
-
+
diff --git a/cockatrice/src/interface/widgets/general/home_styled_button.cpp b/cockatrice/src/interface/widgets/general/home_styled_button.cpp
index 9c31d3815..a2ac7912d 100644
--- a/cockatrice/src/interface/widgets/general/home_styled_button.cpp
+++ b/cockatrice/src/interface/widgets/general/home_styled_button.cpp
@@ -21,8 +21,8 @@ class QWidget;
HomeStyledButton::HomeStyledButton(const QString &text, QPair _gradientColors, QWidget *parent)
: QPushButton(text, parent), gradientColors(_gradientColors)
{
- setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- setMinimumHeight(25);
+ // Keep the font/style-derived height even when the home page has ample space.
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
setStyleSheet(generateButtonStylesheet(gradientColors));
applyInterfaceDefaultFont();
connect(themeManager, &ThemeManager::fontsChanged, this, &HomeStyledButton::applyInterfaceDefaultFont);
diff --git a/cockatrice/src/interface/widgets/general/home_widget.cpp b/cockatrice/src/interface/widgets/general/home_widget.cpp
index e6b5bf255..db4501efc 100644
--- a/cockatrice/src/interface/widgets/general/home_widget.cpp
+++ b/cockatrice/src/interface/widgets/general/home_widget.cpp
@@ -27,10 +27,11 @@
#include
#include
#include
-#include
+#include
#include
#include
#include
+#include
#include
#include
#include
@@ -44,9 +45,9 @@
#include
#include
#include
+#include
#include
#include
-#include
#include
#include
#include
@@ -60,6 +61,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -69,20 +71,25 @@ HomeWidget::HomeWidget(QWidget *parent, TabSupervisor *_tabSupervisor)
: QWidget(parent), tabSupervisor(_tabSupervisor), background(themePixmap(QStringLiteral("backgrounds/home")))
{
setObjectName("homeWidget");
- layout = new QGridLayout(this);
backgroundSourceCard = new CardInfoPictureArtCropWidget(this);
gradientColors = determineButtonColor();
- layout->addWidget(createButtons(), 1, 1, Qt::AlignVCenter | Qt::AlignHCenter);
+ // The launcher keeps its natural size on a large display and stays centred in the
+ // viewport. On a small window it scrolls, instead of its combined minimum height
+ // becoming the minimum height of the entire application.
+ auto *scrollArea = QtUtils::makeScrollArea(this, Qt::ScrollBarAsNeeded, Qt::ScrollBarAsNeeded);
+ scrollArea->setObjectName("homeActionsScrollArea");
+ scrollArea->setFrameShape(QFrame::NoFrame);
+ scrollArea->setWidgetResizable(false);
+ scrollArea->setAlignment(Qt::AlignCenter);
+ // The home background is painted by this widget, so let it show through the viewport.
+ scrollArea->viewport()->setAutoFillBackground(false);
+ scrollArea->setWidget(createButtons());
- layout->setRowStretch(0, 1);
- layout->setRowStretch(2, 1);
- layout->setColumnStretch(0, 1);
- layout->setColumnStretch(2, 1);
-
- setLayout(layout);
+ auto *layout = new QVBoxLayout(this);
+ layout->addWidget(scrollArea);
cardChangeTimer = new QTimer(this);
connect(cardChangeTimer, &QTimer::timeout, this, &HomeWidget::updateRandomCard);
@@ -289,18 +296,10 @@ QGroupBox *HomeWidget::createButtons()
{
QGroupBox *box = new QGroupBox(this);
box->setObjectName("homeButtonsBox");
- box->setStyleSheet(R"(
- QGroupBox {
- color: white; /* Title text color */
- background: transparent;
- }
-
- QGroupBox::title {
- color: white;
- subcontrol-origin: margin;
- subcontrol-position: top center; /* or top left / right */
- }
-)");
+ // The box only stacks the logo and the actions: no frame, and no background of its
+ // own, so the home background art stays visible. It never shows a title. The rule is
+ // load-bearing: QScrollArea::setWidget() turns autoFillBackground on for its widget.
+ box->setStyleSheet("QGroupBox { background: transparent; border: none; }");
// Family comes from the InterfaceDefault theme role; the 20px size stays caller-side.
auto applyBoxFont = [box]() {
QFont boxFont = themeManager->appFont(AppFont::InterfaceDefault);
@@ -309,9 +308,12 @@ QGroupBox *HomeWidget::createButtons()
};
applyBoxFont();
connect(themeManager, &ThemeManager::fontsChanged, this, applyBoxFont);
- box->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
QVBoxLayout *boxLayout = new QVBoxLayout;
boxLayout->setAlignment(Qt::AlignHCenter);
+ // The scroll area is not resizable, so the box has to size itself: SetFixedSize keeps
+ // it at its content size and re-fixes it whenever the labels or fonts change, which is
+ // what makes the scroll area's scroll bars follow the content.
+ boxLayout->setSizeConstraint(QLayout::SetFixedSize);
logoLabel = new QLabel;
logoLabel->setAlignment(Qt::AlignCenter);
diff --git a/cockatrice/src/interface/widgets/general/home_widget.h b/cockatrice/src/interface/widgets/general/home_widget.h
index aa4745c82..fec1db950 100644
--- a/cockatrice/src/interface/widgets/general/home_widget.h
+++ b/cockatrice/src/interface/widgets/general/home_widget.h
@@ -16,7 +16,6 @@
#include
#include
-class QGridLayout;
class QLabel;
class CardInfoPictureArtCropWidget;
class ExactCard;
@@ -46,7 +45,6 @@ public slots:
void updateConnectButton(const ClientStatus status);
private:
- QGridLayout *layout;
QTimer *cardChangeTimer;
TabSupervisor *tabSupervisor;
QPixmap background;