From d19304dc1537b8ecba3b766972fa2e12308178e4 Mon Sep 17 00:00:00 2001 From: Jordan Woyak Date: Mon, 4 Nov 2024 00:23:34 -0600 Subject: [PATCH] MappingIndicator: Add graphical indicators on the left of MappingButton that don't have a large indicator. --- .../Config/Mapping/MappingIndicator.cpp | 31 +++++++++++++++++++ .../Config/Mapping/MappingIndicator.h | 11 +++++++ .../Config/Mapping/MappingWidget.cpp | 21 +++++++++++-- 3 files changed, 60 insertions(+), 3 deletions(-) diff --git a/Source/Core/DolphinQt/Config/Mapping/MappingIndicator.cpp b/Source/Core/DolphinQt/Config/Mapping/MappingIndicator.cpp index 42f6f28de9..1528e4061a 100644 --- a/Source/Core/DolphinQt/Config/Mapping/MappingIndicator.cpp +++ b/Source/Core/DolphinQt/Config/Mapping/MappingIndicator.cpp @@ -128,6 +128,37 @@ void MappingIndicator::AdjustGateColor(QColor* color) color->setHsvF(color->hueF(), color->saturationF(), 1 - color->valueF()); } +ButtonIndicator::ButtonIndicator(ControlReference* control_ref) : m_control_ref{control_ref} +{ + setSizePolicy(QSizePolicy::Policy::Fixed, QSizePolicy::Policy::Fixed); +} + +QSize ButtonIndicator::sizeHint() const +{ + return QSize{INPUT_DOT_RADIUS + 2, + QFontMetrics(font()).boundingRect(QStringLiteral("[")).height()}; +} + +void ButtonIndicator::Draw() +{ + QPainter p(this); + p.setBrush(GetBBoxBrush()); + p.setPen(GetBBoxPen()); + p.drawRect(QRect{{0, 0}, size() - QSize{1, 1}}); + + const auto input_value = std::clamp(m_control_ref->GetState(), 0.0, 1.0); + const bool is_pressed = std::lround(input_value) != 0; + QSizeF value_size = size() - QSizeF{2, 2}; + value_size.setHeight(value_size.height() * input_value); + + p.translate(0, height()); + p.scale(1, -1); + + p.setPen(Qt::NoPen); + p.setBrush(is_pressed ? GetAdjustedInputColor() : GetRawInputColor()); + p.drawRect(QRectF{{1, 1}, value_size}); +} + SquareIndicator::SquareIndicator() { // Additional pixel for border. diff --git a/Source/Core/DolphinQt/Config/Mapping/MappingIndicator.h b/Source/Core/DolphinQt/Config/Mapping/MappingIndicator.h index f571d5072d..ca6f9b96fd 100644 --- a/Source/Core/DolphinQt/Config/Mapping/MappingIndicator.h +++ b/Source/Core/DolphinQt/Config/Mapping/MappingIndicator.h @@ -53,6 +53,17 @@ private: Clock::time_point m_last_update = Clock::now(); }; +class ButtonIndicator final : public MappingIndicator +{ +public: + ButtonIndicator(ControlReference* control_ref); + +private: + ControlReference* const m_control_ref; + QSize sizeHint() const override; + void Draw() override; +}; + class SquareIndicator : public MappingIndicator { protected: diff --git a/Source/Core/DolphinQt/Config/Mapping/MappingWidget.cpp b/Source/Core/DolphinQt/Config/Mapping/MappingWidget.cpp index 30f0e41e86..1ac0428ca3 100644 --- a/Source/Core/DolphinQt/Config/Mapping/MappingWidget.cpp +++ b/Source/Core/DolphinQt/Config/Mapping/MappingWidget.cpp @@ -313,14 +313,29 @@ QGroupBox* MappingWidget::CreateControlsBox(const QString& name, ControllerEmu:: void MappingWidget::CreateControl(const ControllerEmu::Control* control, QFormLayout* layout, bool indicator) { - auto* button = new MappingButton(this, control->control_ref.get(), indicator); - + auto* const button = new MappingButton(this, control->control_ref.get(), indicator); button->setMinimumWidth(100); button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + const bool translate = control->translate == ControllerEmu::Translatability::Translate; const QString translated_name = translate ? tr(control->ui_name.c_str()) : QString::fromStdString(control->ui_name); - layout->addRow(translated_name, button); + + if (indicator && control->control_ref->IsInput()) + { + auto* const button_indicator = new ButtonIndicator{control->control_ref.get()}; + connect(this, &MappingWidget::Update, button_indicator, qOverload<>(&MappingIndicator::update)); + + auto* const hbox = new QHBoxLayout; + hbox->setSpacing(0); + hbox->addWidget(button_indicator); + hbox->addWidget(button); + layout->addRow(translated_name, hbox); + } + else + { + layout->addRow(translated_name, button); + } } ControllerEmu::EmulatedController* MappingWidget::GetController() const