Qt/TAS: Implement turbo mode

This commit is contained in:
spycrab 2019-03-31 04:49:57 +02:00
parent 0bce1c509d
commit 039b1baa3a
10 changed files with 162 additions and 89 deletions

View File

@ -111,7 +111,7 @@ add_executable(dolphin-emu
QtUtils/WinIconHelper.cpp QtUtils/WinIconHelper.cpp
QtUtils/WrapInScrollArea.cpp QtUtils/WrapInScrollArea.cpp
QtUtils/AspectRatioWidget.cpp QtUtils/AspectRatioWidget.cpp
ResourcePackManager.cpp ResourcePackManager.cpp
Settings/AdvancedPane.cpp Settings/AdvancedPane.cpp
Settings/AudioPane.cpp Settings/AudioPane.cpp
Settings/GameCubePane.cpp Settings/GameCubePane.cpp
@ -122,6 +122,7 @@ add_executable(dolphin-emu
Settings/USBDeviceAddToWhitelistDialog.cpp Settings/USBDeviceAddToWhitelistDialog.cpp
TAS/GCTASInputWindow.cpp TAS/GCTASInputWindow.cpp
TAS/WiiTASInputWindow.cpp TAS/WiiTASInputWindow.cpp
TAS/TASCheckBox.cpp
TAS/TASInputWindow.cpp TAS/TASInputWindow.cpp
TAS/StickWidget.cpp TAS/StickWidget.cpp
TAS/IRWidget.cpp TAS/IRWidget.cpp

View File

@ -115,6 +115,7 @@
<QtMoc Include="FIFO\FIFOPlayerWindow.h" /> <QtMoc Include="FIFO\FIFOPlayerWindow.h" />
<QtMoc Include="TAS\GCTASInputWindow.h" /> <QtMoc Include="TAS\GCTASInputWindow.h" />
<QtMoc Include="TAS\WiiTASInputWindow.h" /> <QtMoc Include="TAS\WiiTASInputWindow.h" />
<QtMoc Include="TAS\TASCheckBox.h" />
<QtMoc Include="TAS\TASInputWindow.h" /> <QtMoc Include="TAS\TASInputWindow.h" />
<QtMoc Include="TAS\StickWidget.h" /> <QtMoc Include="TAS\StickWidget.h" />
<QtMoc Include="TAS\IRWidget.h" /> <QtMoc Include="TAS\IRWidget.h" />
@ -263,6 +264,7 @@
<ClCompile Include="$(QtMocOutPrefix)SettingsWindow.cpp" /> <ClCompile Include="$(QtMocOutPrefix)SettingsWindow.cpp" />
<ClCompile Include="$(QtMocOutPrefix)SoftwareRendererWidget.cpp" /> <ClCompile Include="$(QtMocOutPrefix)SoftwareRendererWidget.cpp" />
<ClCompile Include="$(QtMocOutPrefix)StickWidget.cpp" /> <ClCompile Include="$(QtMocOutPrefix)StickWidget.cpp" />
<ClCompile Include="$(QtMocOutPrefix)TASCheckBox.cpp" />
<ClCompile Include="$(QtMocOutPrefix)TASInputWindow.cpp" /> <ClCompile Include="$(QtMocOutPrefix)TASInputWindow.cpp" />
<ClCompile Include="$(QtMocOutPrefix)ToolBar.cpp" /> <ClCompile Include="$(QtMocOutPrefix)ToolBar.cpp" />
<ClCompile Include="$(QtMocOutPrefix)USBDeviceAddToWhitelistDialog.cpp" /> <ClCompile Include="$(QtMocOutPrefix)USBDeviceAddToWhitelistDialog.cpp" />
@ -342,6 +344,7 @@
<ClCompile Include="ResourcePackManager.cpp" /> <ClCompile Include="ResourcePackManager.cpp" />
<ClCompile Include="TAS\GCTASInputWindow.cpp" /> <ClCompile Include="TAS\GCTASInputWindow.cpp" />
<ClCompile Include="TAS\WiiTASInputWindow.cpp" /> <ClCompile Include="TAS\WiiTASInputWindow.cpp" />
<ClCompile Include="TAS\TASCheckBox.cpp" />
<ClCompile Include="TAS\TASInputWindow.cpp" /> <ClCompile Include="TAS\TASInputWindow.cpp" />
<ClCompile Include="TAS\StickWidget.cpp" /> <ClCompile Include="TAS\StickWidget.cpp" />
<ClCompile Include="TAS\IRWidget.cpp" /> <ClCompile Include="TAS\IRWidget.cpp" />

View File

@ -14,6 +14,8 @@
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "DolphinQt/TAS/TASCheckBox.h"
#include "InputCommon/GCPadStatus.h" #include "InputCommon/GCPadStatus.h"
GCTASInputWindow::GCTASInputWindow(QWidget* parent, int num) : TASInputWindow(parent) GCTASInputWindow::GCTASInputWindow(QWidget* parent, int num) : TASInputWindow(parent)
@ -41,18 +43,18 @@ GCTASInputWindow::GCTASInputWindow(QWidget* parent, int num) : TASInputWindow(pa
triggers_layout->addLayout(r_trigger_layout); triggers_layout->addLayout(r_trigger_layout);
m_triggers_box->setLayout(triggers_layout); m_triggers_box->setLayout(triggers_layout);
m_a_button = new QCheckBox(QStringLiteral("&A")); m_a_button = new TASCheckBox(QStringLiteral("&A"));
m_b_button = new QCheckBox(QStringLiteral("&B")); m_b_button = new TASCheckBox(QStringLiteral("&B"));
m_x_button = new QCheckBox(QStringLiteral("&X")); m_x_button = new TASCheckBox(QStringLiteral("&X"));
m_y_button = new QCheckBox(QStringLiteral("&Y")); m_y_button = new TASCheckBox(QStringLiteral("&Y"));
m_z_button = new QCheckBox(QStringLiteral("&Z")); m_z_button = new TASCheckBox(QStringLiteral("&Z"));
m_l_button = new QCheckBox(QStringLiteral("&L")); m_l_button = new TASCheckBox(QStringLiteral("&L"));
m_r_button = new QCheckBox(QStringLiteral("&R")); m_r_button = new TASCheckBox(QStringLiteral("&R"));
m_start_button = new QCheckBox(QStringLiteral("&START")); m_start_button = new TASCheckBox(QStringLiteral("&START"));
m_left_button = new QCheckBox(QStringLiteral("L&eft")); m_left_button = new TASCheckBox(QStringLiteral("L&eft"));
m_up_button = new QCheckBox(QStringLiteral("&Up")); m_up_button = new TASCheckBox(QStringLiteral("&Up"));
m_down_button = new QCheckBox(QStringLiteral("&Down")); m_down_button = new TASCheckBox(QStringLiteral("&Down"));
m_right_button = new QCheckBox(QStringLiteral("R&ight")); m_right_button = new TASCheckBox(QStringLiteral("R&ight"));
auto* buttons_layout = new QGridLayout; auto* buttons_layout = new QGridLayout;
buttons_layout->addWidget(m_a_button, 0, 0); buttons_layout->addWidget(m_a_button, 0, 0);

View File

@ -6,9 +6,9 @@
#include "DolphinQt/TAS/TASInputWindow.h" #include "DolphinQt/TAS/TASInputWindow.h"
class QCheckBox;
class QGroupBox; class QGroupBox;
class QSpinBox; class QSpinBox;
class TASCheckBox;
struct GCPadStatus; struct GCPadStatus;
class GCTASInputWindow : public TASInputWindow class GCTASInputWindow : public TASInputWindow
@ -19,18 +19,18 @@ public:
void GetValues(GCPadStatus* pad); void GetValues(GCPadStatus* pad);
private: private:
QCheckBox* m_a_button; TASCheckBox* m_a_button;
QCheckBox* m_b_button; TASCheckBox* m_b_button;
QCheckBox* m_x_button; TASCheckBox* m_x_button;
QCheckBox* m_y_button; TASCheckBox* m_y_button;
QCheckBox* m_z_button; TASCheckBox* m_z_button;
QCheckBox* m_l_button; TASCheckBox* m_l_button;
QCheckBox* m_r_button; TASCheckBox* m_r_button;
QCheckBox* m_start_button; TASCheckBox* m_start_button;
QCheckBox* m_left_button; TASCheckBox* m_left_button;
QCheckBox* m_up_button; TASCheckBox* m_up_button;
QCheckBox* m_down_button; TASCheckBox* m_down_button;
QCheckBox* m_right_button; TASCheckBox* m_right_button;
QSpinBox* m_l_trigger_value; QSpinBox* m_l_trigger_value;
QSpinBox* m_r_trigger_value; QSpinBox* m_r_trigger_value;
QSpinBox* m_x_main_stick_value; QSpinBox* m_x_main_stick_value;

View File

@ -0,0 +1,40 @@
// Copyright 2019 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
#include "DolphinQt/TAS/TASCheckBox.h"
#include <QMouseEvent>
#include "Core/Movie.h"
TASCheckBox::TASCheckBox(const QString& text) : QCheckBox(text)
{
setTristate(true);
}
bool TASCheckBox::GetValue()
{
if (checkState() == Qt::PartiallyChecked)
return Movie::GetCurrentFrame() % 2 == static_cast<u64>(m_trigger_on_odd);
return isChecked();
}
void TASCheckBox::mousePressEvent(QMouseEvent* event)
{
if (event->button() != Qt::RightButton)
{
setChecked(!isChecked());
return;
}
if (checkState() == Qt::PartiallyChecked)
{
setCheckState(Qt::Unchecked);
return;
}
m_trigger_on_odd = Movie::GetCurrentFrame() % 2 == 0;
setCheckState(Qt::PartiallyChecked);
}

View File

@ -0,0 +1,24 @@
// Copyright 2019 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
#pragma once
#include <QCheckBox>
class QMouseEvent;
class TASCheckBox : public QCheckBox
{
Q_OBJECT
public:
explicit TASCheckBox(const QString& text);
bool GetValue();
protected:
void mousePressEvent(QMouseEvent* event) override;
private:
bool m_trigger_on_odd;
};

View File

@ -18,6 +18,7 @@
#include "DolphinQt/QtUtils/AspectRatioWidget.h" #include "DolphinQt/QtUtils/AspectRatioWidget.h"
#include "DolphinQt/QtUtils/QueueOnObject.h" #include "DolphinQt/QtUtils/QueueOnObject.h"
#include "DolphinQt/TAS/StickWidget.h" #include "DolphinQt/TAS/StickWidget.h"
#include "DolphinQt/TAS/TASCheckBox.h"
#include "DolphinQt/TAS/TASInputWindow.h" #include "DolphinQt/TAS/TASInputWindow.h"
#include "InputCommon/GCPadStatus.h" #include "InputCommon/GCPadStatus.h"
@ -130,7 +131,7 @@ QSpinBox* TASInputWindow::CreateSliderValuePair(QBoxLayout* layout, u16 max,
} }
template <typename UX> template <typename UX>
void TASInputWindow::GetButton(QCheckBox* checkbox, UX& buttons, UX mask) void TASInputWindow::GetButton(TASCheckBox* checkbox, UX& buttons, UX mask)
{ {
const bool pressed = (buttons & mask) != 0; const bool pressed = (buttons & mask) != 0;
if (m_use_controller->isChecked()) if (m_use_controller->isChecked())
@ -147,13 +148,13 @@ void TASInputWindow::GetButton(QCheckBox* checkbox, UX& buttons, UX mask)
} }
} }
if (checkbox->isChecked()) if (checkbox->GetValue())
buttons |= mask; buttons |= mask;
else else
buttons &= ~mask; buttons &= ~mask;
} }
template void TASInputWindow::GetButton<u8>(QCheckBox* button, u8& pad, u8 mask); template void TASInputWindow::GetButton<u8>(TASCheckBox* button, u8& pad, u8 mask);
template void TASInputWindow::GetButton<u16>(QCheckBox* button, u16& pad, u16 mask); template void TASInputWindow::GetButton<u16>(TASCheckBox* button, u16& pad, u16 mask);
void TASInputWindow::GetSpinBoxU8(QSpinBox* spin, u8& controller_value) void TASInputWindow::GetSpinBoxU8(QSpinBox* spin, u8& controller_value)
{ {

View File

@ -15,6 +15,7 @@ class QDialog;
class QGroupBox; class QGroupBox;
class QSpinBox; class QSpinBox;
class QString; class QString;
class TASCheckBox;
class TASInputWindow : public QDialog class TASInputWindow : public QDialog
{ {
@ -32,13 +33,13 @@ protected:
Qt::Orientation orientation, QWidget* shortcut_widget, Qt::Orientation orientation, QWidget* shortcut_widget,
bool invert = false); bool invert = false);
template <typename UX> template <typename UX>
void GetButton(QCheckBox* button, UX& pad, UX mask); void GetButton(TASCheckBox* button, UX& pad, UX mask);
void GetSpinBoxU8(QSpinBox* spin, u8& controller_value); void GetSpinBoxU8(QSpinBox* spin, u8& controller_value);
void GetSpinBoxU16(QSpinBox* spin, u16& controller_value); void GetSpinBoxU16(QSpinBox* spin, u16& controller_value);
QCheckBox* m_use_controller; QCheckBox* m_use_controller;
private: private:
std::map<QCheckBox*, bool> m_checkbox_set_by_controller; std::map<TASCheckBox*, bool> m_checkbox_set_by_controller;
std::map<QSpinBox*, u8> m_spinbox_most_recent_values_u8; std::map<QSpinBox*, u8> m_spinbox_most_recent_values_u8;
std::map<QSpinBox*, u8> m_spinbox_most_recent_values_u16; std::map<QSpinBox*, u8> m_spinbox_most_recent_values_u16;
}; };

View File

@ -31,6 +31,7 @@
#include "DolphinQt/QtUtils/AspectRatioWidget.h" #include "DolphinQt/QtUtils/AspectRatioWidget.h"
#include "DolphinQt/QtUtils/QueueOnObject.h" #include "DolphinQt/QtUtils/QueueOnObject.h"
#include "DolphinQt/TAS/IRWidget.h" #include "DolphinQt/TAS/IRWidget.h"
#include "DolphinQt/TAS/TASCheckBox.h"
#include "DolphinQt/TAS/WiiTASInputWindow.h" #include "DolphinQt/TAS/WiiTASInputWindow.h"
#include "InputCommon/InputConfig.h" #include "InputCommon/InputConfig.h"
@ -161,19 +162,19 @@ WiiTASInputWindow::WiiTASInputWindow(QWidget* parent, int num) : TASInputWindow(
triggers_layout->addLayout(r_trigger_layout); triggers_layout->addLayout(r_trigger_layout);
m_triggers_box->setLayout(triggers_layout); m_triggers_box->setLayout(triggers_layout);
m_a_button = new QCheckBox(QStringLiteral("&A")); m_a_button = new TASCheckBox(QStringLiteral("&A"));
m_b_button = new QCheckBox(QStringLiteral("&B")); m_b_button = new TASCheckBox(QStringLiteral("&B"));
m_1_button = new QCheckBox(QStringLiteral("&1")); m_1_button = new TASCheckBox(QStringLiteral("&1"));
m_2_button = new QCheckBox(QStringLiteral("&2")); m_2_button = new TASCheckBox(QStringLiteral("&2"));
m_plus_button = new QCheckBox(QStringLiteral("&+")); m_plus_button = new TASCheckBox(QStringLiteral("&+"));
m_minus_button = new QCheckBox(QStringLiteral("&-")); m_minus_button = new TASCheckBox(QStringLiteral("&-"));
m_home_button = new QCheckBox(QStringLiteral("&HOME")); m_home_button = new TASCheckBox(QStringLiteral("&HOME"));
m_left_button = new QCheckBox(QStringLiteral("&Left")); m_left_button = new TASCheckBox(QStringLiteral("&Left"));
m_up_button = new QCheckBox(QStringLiteral("&Up")); m_up_button = new TASCheckBox(QStringLiteral("&Up"));
m_down_button = new QCheckBox(QStringLiteral("&Down")); m_down_button = new TASCheckBox(QStringLiteral("&Down"));
m_right_button = new QCheckBox(QStringLiteral("&Right")); m_right_button = new TASCheckBox(QStringLiteral("&Right"));
m_c_button = new QCheckBox(QStringLiteral("&C")); m_c_button = new TASCheckBox(QStringLiteral("&C"));
m_z_button = new QCheckBox(QStringLiteral("&Z")); m_z_button = new TASCheckBox(QStringLiteral("&Z"));
auto* buttons_layout = new QGridLayout; auto* buttons_layout = new QGridLayout;
buttons_layout->addWidget(m_a_button, 0, 0); buttons_layout->addWidget(m_a_button, 0, 0);
@ -202,21 +203,21 @@ WiiTASInputWindow::WiiTASInputWindow(QWidget* parent, int num) : TASInputWindow(
m_nunchuk_buttons_box = new QGroupBox(tr("Nunchuk Buttons")); m_nunchuk_buttons_box = new QGroupBox(tr("Nunchuk Buttons"));
m_nunchuk_buttons_box->setLayout(nunchuk_buttons_layout); m_nunchuk_buttons_box->setLayout(nunchuk_buttons_layout);
m_classic_a_button = new QCheckBox(QStringLiteral("&A")); m_classic_a_button = new TASCheckBox(QStringLiteral("&A"));
m_classic_b_button = new QCheckBox(QStringLiteral("&B")); m_classic_b_button = new TASCheckBox(QStringLiteral("&B"));
m_classic_x_button = new QCheckBox(QStringLiteral("&X")); m_classic_x_button = new TASCheckBox(QStringLiteral("&X"));
m_classic_y_button = new QCheckBox(QStringLiteral("&Y")); m_classic_y_button = new TASCheckBox(QStringLiteral("&Y"));
m_classic_l_button = new QCheckBox(QStringLiteral("&L")); m_classic_l_button = new TASCheckBox(QStringLiteral("&L"));
m_classic_r_button = new QCheckBox(QStringLiteral("&R")); m_classic_r_button = new TASCheckBox(QStringLiteral("&R"));
m_classic_zl_button = new QCheckBox(QStringLiteral("&ZL")); m_classic_zl_button = new TASCheckBox(QStringLiteral("&ZL"));
m_classic_zr_button = new QCheckBox(QStringLiteral("ZR")); m_classic_zr_button = new TASCheckBox(QStringLiteral("ZR"));
m_classic_plus_button = new QCheckBox(QStringLiteral("&+")); m_classic_plus_button = new TASCheckBox(QStringLiteral("&+"));
m_classic_minus_button = new QCheckBox(QStringLiteral("&-")); m_classic_minus_button = new TASCheckBox(QStringLiteral("&-"));
m_classic_home_button = new QCheckBox(QStringLiteral("&HOME")); m_classic_home_button = new TASCheckBox(QStringLiteral("&HOME"));
m_classic_left_button = new QCheckBox(QStringLiteral("L&eft")); m_classic_left_button = new TASCheckBox(QStringLiteral("L&eft"));
m_classic_up_button = new QCheckBox(QStringLiteral("&Up")); m_classic_up_button = new TASCheckBox(QStringLiteral("&Up"));
m_classic_down_button = new QCheckBox(QStringLiteral("&Down")); m_classic_down_button = new TASCheckBox(QStringLiteral("&Down"));
m_classic_right_button = new QCheckBox(QStringLiteral("R&ight")); m_classic_right_button = new TASCheckBox(QStringLiteral("R&ight"));
auto* classic_buttons_layout = new QGridLayout; auto* classic_buttons_layout = new QGridLayout;
classic_buttons_layout->addWidget(m_classic_a_button, 0, 0); classic_buttons_layout->addWidget(m_classic_a_button, 0, 0);

View File

@ -16,9 +16,9 @@ namespace WiimoteEmu
class EncryptionKey; class EncryptionKey;
} }
class QCheckBox;
class QGroupBox; class QGroupBox;
class QSpinBox; class QSpinBox;
class TASCheckBox;
class WiiTASInputWindow : public TASInputWindow class WiiTASInputWindow : public TASInputWindow
{ {
@ -31,34 +31,34 @@ public:
private: private:
void UpdateExt(u8 ext); void UpdateExt(u8 ext);
int m_num; int m_num;
QCheckBox* m_a_button; TASCheckBox* m_a_button;
QCheckBox* m_b_button; TASCheckBox* m_b_button;
QCheckBox* m_1_button; TASCheckBox* m_1_button;
QCheckBox* m_2_button; TASCheckBox* m_2_button;
QCheckBox* m_plus_button; TASCheckBox* m_plus_button;
QCheckBox* m_minus_button; TASCheckBox* m_minus_button;
QCheckBox* m_home_button; TASCheckBox* m_home_button;
QCheckBox* m_left_button; TASCheckBox* m_left_button;
QCheckBox* m_up_button; TASCheckBox* m_up_button;
QCheckBox* m_down_button; TASCheckBox* m_down_button;
QCheckBox* m_right_button; TASCheckBox* m_right_button;
QCheckBox* m_c_button; TASCheckBox* m_c_button;
QCheckBox* m_z_button; TASCheckBox* m_z_button;
QCheckBox* m_classic_a_button; TASCheckBox* m_classic_a_button;
QCheckBox* m_classic_b_button; TASCheckBox* m_classic_b_button;
QCheckBox* m_classic_x_button; TASCheckBox* m_classic_x_button;
QCheckBox* m_classic_y_button; TASCheckBox* m_classic_y_button;
QCheckBox* m_classic_plus_button; TASCheckBox* m_classic_plus_button;
QCheckBox* m_classic_minus_button; TASCheckBox* m_classic_minus_button;
QCheckBox* m_classic_l_button; TASCheckBox* m_classic_l_button;
QCheckBox* m_classic_r_button; TASCheckBox* m_classic_r_button;
QCheckBox* m_classic_zl_button; TASCheckBox* m_classic_zl_button;
QCheckBox* m_classic_zr_button; TASCheckBox* m_classic_zr_button;
QCheckBox* m_classic_home_button; TASCheckBox* m_classic_home_button;
QCheckBox* m_classic_left_button; TASCheckBox* m_classic_left_button;
QCheckBox* m_classic_up_button; TASCheckBox* m_classic_up_button;
QCheckBox* m_classic_down_button; TASCheckBox* m_classic_down_button;
QCheckBox* m_classic_right_button; TASCheckBox* m_classic_right_button;
QSpinBox* m_remote_orientation_x_value; QSpinBox* m_remote_orientation_x_value;
QSpinBox* m_remote_orientation_y_value; QSpinBox* m_remote_orientation_y_value;
QSpinBox* m_remote_orientation_z_value; QSpinBox* m_remote_orientation_z_value;