2017-05-20 15:53:17 +00:00
|
|
|
// Copyright 2017 Dolphin Emulator Project
|
|
|
|
// Licensed under GPLv2+
|
|
|
|
// Refer to the license.txt file included.
|
|
|
|
|
2018-07-06 22:40:15 +00:00
|
|
|
#include "DolphinQt/Config/Mapping/MappingWidget.h"
|
2018-05-28 01:48:04 +00:00
|
|
|
|
2017-05-20 15:53:17 +00:00
|
|
|
#include <QFormLayout>
|
|
|
|
#include <QGroupBox>
|
|
|
|
#include <QPushButton>
|
2019-03-15 01:27:49 +00:00
|
|
|
#include <QTimer>
|
2017-05-20 15:53:17 +00:00
|
|
|
|
2018-07-06 22:40:15 +00:00
|
|
|
#include "DolphinQt/Config/Mapping/IOWindow.h"
|
|
|
|
#include "DolphinQt/Config/Mapping/MappingBool.h"
|
|
|
|
#include "DolphinQt/Config/Mapping/MappingButton.h"
|
|
|
|
#include "DolphinQt/Config/Mapping/MappingIndicator.h"
|
|
|
|
#include "DolphinQt/Config/Mapping/MappingNumeric.h"
|
|
|
|
#include "DolphinQt/Config/Mapping/MappingRadio.h"
|
|
|
|
#include "DolphinQt/Config/Mapping/MappingWindow.h"
|
2019-03-15 01:27:49 +00:00
|
|
|
#include "DolphinQt/Settings.h"
|
2018-05-28 01:48:04 +00:00
|
|
|
|
2017-05-20 15:53:17 +00:00
|
|
|
#include "InputCommon/ControlReference/ControlReference.h"
|
|
|
|
#include "InputCommon/ControllerEmu/Control/Control.h"
|
|
|
|
#include "InputCommon/ControllerEmu/ControlGroup/ControlGroup.h"
|
2019-03-15 01:27:49 +00:00
|
|
|
#include "InputCommon/ControllerEmu/ControllerEmu.h"
|
2017-05-20 15:53:17 +00:00
|
|
|
#include "InputCommon/ControllerEmu/Setting/BooleanSetting.h"
|
|
|
|
#include "InputCommon/ControllerEmu/Setting/NumericSetting.h"
|
2019-02-05 00:50:07 +00:00
|
|
|
#include "InputCommon/ControllerEmu/StickGate.h"
|
2017-05-20 15:53:17 +00:00
|
|
|
|
2019-03-15 01:27:49 +00:00
|
|
|
MappingWidget::MappingWidget(MappingWindow* parent) : m_parent(parent)
|
2017-05-20 15:53:17 +00:00
|
|
|
{
|
2019-03-15 01:27:49 +00:00
|
|
|
connect(parent, &MappingWindow::Update, this, &MappingWidget::Update);
|
|
|
|
connect(parent, &MappingWindow::Save, this, &MappingWidget::SaveSettings);
|
|
|
|
connect(parent, &MappingWindow::ConfigChanged, this, &MappingWidget::ConfigChanged);
|
|
|
|
|
|
|
|
const auto timer = new QTimer(this);
|
|
|
|
connect(timer, &QTimer::timeout, this, [this] {
|
|
|
|
// TODO: The SetControllerStateNeeded interface leaks input into the game.
|
|
|
|
const auto lock = m_parent->GetController()->GetStateLock();
|
|
|
|
Settings::Instance().SetControllerStateNeeded(true);
|
|
|
|
emit Update();
|
|
|
|
Settings::Instance().SetControllerStateNeeded(false);
|
|
|
|
});
|
|
|
|
|
|
|
|
timer->start(1000 / INDICATOR_UPDATE_FREQ);
|
2017-05-20 15:53:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
MappingWindow* MappingWidget::GetParent() const
|
|
|
|
{
|
|
|
|
return m_parent;
|
|
|
|
}
|
|
|
|
|
2018-04-01 14:25:34 +00:00
|
|
|
bool MappingWidget::IsIterativeInput() const
|
|
|
|
{
|
|
|
|
return m_parent->IsIterativeInput();
|
|
|
|
}
|
|
|
|
|
|
|
|
void MappingWidget::NextButton(MappingButton* button)
|
|
|
|
{
|
|
|
|
auto iterator = std::find(m_buttons.begin(), m_buttons.end(), button);
|
|
|
|
|
|
|
|
if (iterator == m_buttons.end())
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (++iterator == m_buttons.end())
|
|
|
|
return;
|
|
|
|
|
|
|
|
MappingButton* next = *iterator;
|
|
|
|
|
|
|
|
if (next->IsInput() && next->isVisible())
|
|
|
|
next->Detect();
|
|
|
|
else
|
|
|
|
NextButton(next);
|
|
|
|
}
|
|
|
|
|
2017-05-20 15:53:17 +00:00
|
|
|
int MappingWidget::GetPort() const
|
|
|
|
{
|
|
|
|
return m_parent->GetPort();
|
|
|
|
}
|
|
|
|
|
|
|
|
QGroupBox* MappingWidget::CreateGroupBox(const QString& name, ControllerEmu::ControlGroup* group)
|
|
|
|
{
|
|
|
|
QGroupBox* group_box = new QGroupBox(name);
|
|
|
|
QFormLayout* form_layout = new QFormLayout();
|
|
|
|
|
|
|
|
group_box->setLayout(form_layout);
|
|
|
|
|
2019-02-05 00:50:07 +00:00
|
|
|
const bool need_indicator = group->type == ControllerEmu::GroupType::Cursor ||
|
|
|
|
group->type == ControllerEmu::GroupType::Stick ||
|
|
|
|
group->type == ControllerEmu::GroupType::Tilt ||
|
2019-01-29 20:39:14 +00:00
|
|
|
group->type == ControllerEmu::GroupType::MixedTriggers ||
|
|
|
|
group->type == ControllerEmu::GroupType::Force;
|
2019-02-05 00:50:07 +00:00
|
|
|
|
|
|
|
const bool need_calibration = group->type == ControllerEmu::GroupType::Cursor ||
|
|
|
|
group->type == ControllerEmu::GroupType::Stick ||
|
2019-01-29 20:39:14 +00:00
|
|
|
group->type == ControllerEmu::GroupType::Tilt ||
|
|
|
|
group->type == ControllerEmu::GroupType::Force;
|
2018-02-06 10:00:23 +00:00
|
|
|
|
2017-05-20 15:53:17 +00:00
|
|
|
for (auto& control : group->controls)
|
|
|
|
{
|
2018-02-06 10:00:23 +00:00
|
|
|
auto* button = new MappingButton(this, control->control_ref.get(), !need_indicator);
|
2017-06-13 15:16:41 +00:00
|
|
|
|
2017-06-14 04:24:24 +00:00
|
|
|
button->setMinimumWidth(100);
|
2017-05-20 15:53:17 +00:00
|
|
|
button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
|
2018-04-10 15:22:30 +00:00
|
|
|
const bool translate = control->translate == ControllerEmu::Translate;
|
|
|
|
const QString translated_name =
|
|
|
|
translate ? tr(control->ui_name.c_str()) : QString::fromStdString(control->ui_name);
|
2018-03-30 19:42:26 +00:00
|
|
|
form_layout->addRow(translated_name, button);
|
2017-06-13 15:16:41 +00:00
|
|
|
|
2017-05-20 15:53:17 +00:00
|
|
|
m_buttons.push_back(button);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (auto& numeric : group->numeric_settings)
|
|
|
|
{
|
|
|
|
auto* spinbox = new MappingNumeric(this, numeric.get());
|
2018-03-30 19:42:26 +00:00
|
|
|
form_layout->addRow(tr(numeric->m_name.c_str()), spinbox);
|
2017-05-20 15:53:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
for (auto& boolean : group->boolean_settings)
|
|
|
|
{
|
2018-07-02 13:16:43 +00:00
|
|
|
if (!boolean->IsExclusive())
|
|
|
|
continue;
|
|
|
|
|
|
|
|
auto* checkbox = new MappingRadio(this, boolean.get());
|
|
|
|
|
|
|
|
form_layout->addRow(checkbox);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (auto& boolean : group->boolean_settings)
|
|
|
|
{
|
|
|
|
if (boolean->IsExclusive())
|
|
|
|
continue;
|
|
|
|
|
2017-05-20 15:53:17 +00:00
|
|
|
auto* checkbox = new MappingBool(this, boolean.get());
|
2018-07-02 13:16:43 +00:00
|
|
|
|
2017-05-20 15:53:17 +00:00
|
|
|
form_layout->addRow(checkbox);
|
|
|
|
}
|
|
|
|
|
2018-02-06 10:00:23 +00:00
|
|
|
if (need_indicator)
|
2019-02-05 00:50:07 +00:00
|
|
|
{
|
|
|
|
auto const indicator = new MappingIndicator(group);
|
2019-03-15 01:27:49 +00:00
|
|
|
connect(this, &MappingWidget::Update, indicator, QOverload<>::of(&MappingIndicator::update));
|
2019-02-05 00:50:07 +00:00
|
|
|
|
|
|
|
if (need_calibration)
|
|
|
|
{
|
|
|
|
const auto calibrate =
|
|
|
|
new CalibrationWidget(*static_cast<ControllerEmu::ReshapableInput*>(group), *indicator);
|
|
|
|
|
|
|
|
form_layout->addRow(calibrate);
|
|
|
|
}
|
|
|
|
|
|
|
|
form_layout->addRow(indicator);
|
|
|
|
}
|
2018-02-06 10:00:23 +00:00
|
|
|
|
2017-05-20 15:53:17 +00:00
|
|
|
return group_box;
|
|
|
|
}
|
|
|
|
|
2017-06-13 15:16:41 +00:00
|
|
|
ControllerEmu::EmulatedController* MappingWidget::GetController() const
|
|
|
|
{
|
|
|
|
return m_parent->GetController();
|
|
|
|
}
|