168 lines
4.6 KiB
C++
Raw Normal View History

2017-05-20 17:53:17 +02:00
// Copyright 2017 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
#include "DolphinQt/Config/Mapping/MappingButton.h"
#include <QApplication>
#include <QFontMetrics>
2017-05-20 17:53:17 +02:00
#include <QMouseEvent>
#include <QRegExp>
#include <QString>
#include <QTimer>
2017-05-20 17:53:17 +02:00
#include "Common/Thread.h"
#include "Core/Core.h"
2018-07-07 00:40:15 +02:00
#include "DolphinQt/Config/Mapping/IOWindow.h"
#include "DolphinQt/Config/Mapping/MappingCommon.h"
#include "DolphinQt/Config/Mapping/MappingWidget.h"
#include "DolphinQt/Config/Mapping/MappingWindow.h"
#include "DolphinQt/QtUtils/BlockUserInputFilter.h"
#include "DolphinQt/QtUtils/QueueOnObject.h"
2018-07-07 00:40:15 +02:00
#include "DolphinQt/Settings.h"
2017-05-20 17:53:17 +02:00
#include "InputCommon/ControlReference/ControlReference.h"
#include "InputCommon/ControllerEmu/ControlGroup/Buttons.h"
2017-05-20 17:53:17 +02:00
#include "InputCommon/ControllerEmu/ControllerEmu.h"
#include "InputCommon/ControllerInterface/ControllerInterface.h"
#include "InputCommon/ControllerInterface/Device.h"
2017-05-20 17:53:17 +02:00
constexpr int SLIDER_TICK_COUNT = 100;
2019-03-03 15:43:18 +01:00
// Escape ampersands and remove ticks
static QString ToDisplayString(QString&& string)
{
2019-03-03 15:43:18 +01:00
return string.replace(QStringLiteral("&"), QStringLiteral("&&"))
.replace(QStringLiteral("`"), QStringLiteral(""));
}
2018-04-01 16:25:34 +02:00
bool MappingButton::IsInput() const
{
return m_reference->IsInput();
}
MappingButton::MappingButton(MappingWidget* widget, ControlReference* ref, bool indicator)
2019-03-03 15:43:18 +01:00
: ElidedButton(ToDisplayString(QString::fromStdString(ref->GetExpression()))), m_parent(widget),
m_reference(ref)
2017-05-20 17:53:17 +02:00
{
// Force all mapping buttons to stay at a minimal height.
setFixedHeight(minimumSizeHint().height());
// Make sure that long entries don't throw our layout out of whack.
setFixedWidth(112);
setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
2017-05-20 17:53:17 +02:00
Connect();
2018-02-07 18:16:15 +01:00
setToolTip(
tr("Left-click to detect input.\nMiddle-click to clear.\nRight-click for more options."));
if (!m_reference->IsInput() || !indicator)
return;
m_timer = new QTimer(this);
connect(m_timer, &QTimer::timeout, this, [this] {
if (!isActiveWindow())
return;
Settings::Instance().SetControllerStateNeeded(true);
if (Core::GetState() == Core::State::Uninitialized || Core::GetState() == Core::State::Paused)
g_controller_interface.UpdateInput();
auto state = m_reference->State();
QFont f = m_parent->font();
QPalette p = m_parent->palette();
if (state > ControllerEmu::Buttons::ACTIVATION_THRESHOLD)
{
f.setBold(true);
p.setColor(QPalette::ButtonText, Qt::red);
}
setFont(f);
setPalette(p);
Settings::Instance().SetControllerStateNeeded(false);
});
m_timer->start(1000 / 30);
2017-05-20 17:53:17 +02:00
}
void MappingButton::Connect()
{
2018-04-01 16:25:34 +02:00
connect(this, &MappingButton::pressed, this, &MappingButton::Detect);
2017-05-20 17:53:17 +02:00
}
2018-04-01 16:25:34 +02:00
void MappingButton::Detect()
2017-05-20 17:53:17 +02:00
{
if (m_parent->GetDevice() == nullptr || !m_reference->IsInput())
2017-05-20 17:53:17 +02:00
return;
const auto default_device_qualifier = m_parent->GetController()->GetDefaultDevice();
QString expression;
2017-05-20 17:53:17 +02:00
if (m_parent->GetParent()->IsMappingAllDevices())
{
expression = MappingCommon::DetectExpression(this, g_controller_interface,
g_controller_interface.GetAllDeviceStrings(),
default_device_qualifier);
}
else
{
expression = MappingCommon::DetectExpression(this, g_controller_interface,
{default_device_qualifier.ToString()},
default_device_qualifier);
}
if (expression.isEmpty())
return;
2018-04-01 16:25:34 +02:00
m_reference->SetExpression(expression.toStdString());
m_parent->SaveSettings();
Update();
m_parent->GetController()->UpdateReferences(g_controller_interface);
2017-05-20 17:53:17 +02:00
if (m_parent->IsIterativeInput())
m_parent->NextButton(this);
2017-05-20 17:53:17 +02:00
}
void MappingButton::Clear()
{
m_reference->SetExpression("");
m_reference->range = 100.0 / SLIDER_TICK_COUNT;
m_parent->SaveSettings();
2018-02-07 18:16:15 +01:00
Update();
2017-05-20 17:53:17 +02:00
}
void MappingButton::Update()
{
const auto lock = ControllerEmu::EmulatedController::GetStateLock();
m_reference->UpdateReference(g_controller_interface,
m_parent->GetController()->GetDefaultDevice());
2019-03-03 15:43:18 +01:00
setText(ToDisplayString(QString::fromStdString(m_reference->GetExpression())));
2017-05-20 17:53:17 +02:00
}
void MappingButton::mouseReleaseEvent(QMouseEvent* event)
{
switch (event->button())
2017-05-20 17:53:17 +02:00
{
case Qt::MouseButton::LeftButton:
if (m_reference->IsInput())
2017-05-20 17:53:17 +02:00
QPushButton::mouseReleaseEvent(event);
else
emit AdvancedPressed();
return;
2018-02-07 18:16:15 +01:00
case Qt::MouseButton::MidButton:
Clear();
return;
case Qt::MouseButton::RightButton:
emit AdvancedPressed();
return;
default:
return;
2017-05-20 17:53:17 +02:00
}
}