From 1cae9b9b3929ca617ad16b72de6fd43efc8a46f7 Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Sun, 3 Mar 2019 08:05:59 -0600 Subject: [PATCH] DolphinQt: Fix ElidedButton (MappingButton) from growing with long text. --- .../DolphinQt/Config/Mapping/MappingButton.cpp | 16 +++++----------- Source/Core/DolphinQt/QtUtils/ElidedButton.cpp | 8 ++++++++ Source/Core/DolphinQt/QtUtils/ElidedButton.h | 5 ++++- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp b/Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp index 11dfe7d924..638a0d0ac8 100644 --- a/Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp +++ b/Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp @@ -32,7 +32,6 @@ #include "InputCommon/ControllerInterface/Device.h" constexpr int SLIDER_TICK_COUNT = 100; -constexpr int VERTICAL_PADDING = 2; static QString EscapeAmpersand(QString&& string) { @@ -48,18 +47,13 @@ MappingButton::MappingButton(MappingWidget* widget, ControlReference* ref, bool : ElidedButton(EscapeAmpersand(QString::fromStdString(ref->GetExpression()))), m_parent(widget), m_reference(ref) { - // Force all mapping buttons to use stay at a minimal height - int height = QFontMetrics(qApp->font()).height() + 2 * VERTICAL_PADDING; + // Force all mapping buttons to stay at a minimal height. + setFixedHeight(minimumSizeHint().height()); - setMinimumHeight(height); + // Make sure that long entries don't throw our layout out of whack. + setFixedWidth(112); - // macOS needs some wiggle room to always get round buttons - setMaximumHeight(height + 8); - - // Make sure that long entries don't throw our layout out of whack - setMaximumWidth(115); - - setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); Connect(); setToolTip( diff --git a/Source/Core/DolphinQt/QtUtils/ElidedButton.cpp b/Source/Core/DolphinQt/QtUtils/ElidedButton.cpp index a77ba82c53..e18c6fd21c 100644 --- a/Source/Core/DolphinQt/QtUtils/ElidedButton.cpp +++ b/Source/Core/DolphinQt/QtUtils/ElidedButton.cpp @@ -27,6 +27,14 @@ void ElidedButton::setElideMode(Qt::TextElideMode elide_mode) repaint(); } +QSize ElidedButton::sizeHint() const +{ + // Long text produces big sizeHints which is throwing layouts off + // even when setting fixed sizes. This seems like a Qt layout bug. + // Let's always return the sizeHint of an empty button to work around this. + return QPushButton(parentWidget()).sizeHint(); +} + void ElidedButton::paintEvent(QPaintEvent* event) { QStyleOptionButton option; diff --git a/Source/Core/DolphinQt/QtUtils/ElidedButton.h b/Source/Core/DolphinQt/QtUtils/ElidedButton.h index 84f0d89da8..bf9354cfd6 100644 --- a/Source/Core/DolphinQt/QtUtils/ElidedButton.h +++ b/Source/Core/DolphinQt/QtUtils/ElidedButton.h @@ -12,10 +12,13 @@ class ElidedButton : public QPushButton public: explicit ElidedButton(const QString& text = QStringLiteral(""), Qt::TextElideMode elide_mode = Qt::ElideRight); + Qt::TextElideMode elideMode() const; void setElideMode(Qt::TextElideMode elide_mode); + QSize sizeHint() const final override; + private: - void paintEvent(QPaintEvent* event) override; + void paintEvent(QPaintEvent* event) final override; Qt::TextElideMode m_elide_mode; };