Skip to content
Permalink
Browse files
Merge pull request #6359 from rukai/dolphinQtTAS
Qt TAS input windows
  • Loading branch information
Helios747 committed Feb 12, 2018
2 parents 1e8f4ce + 5fe7270 commit 50f52e5
Show file tree
Hide file tree
Showing 19 changed files with 1,226 additions and 2 deletions.
@@ -96,6 +96,7 @@ set(SRCS
QtUtils/ElidedButton.cpp
QtUtils/ListTabWidget.cpp
QtUtils/WindowActivationEventFilter.cpp
QtUtils/AspectRatioWidget.cpp
Settings/AdvancedPane.cpp
Settings/AudioPane.cpp
Settings/GameCubePane.cpp
@@ -104,6 +105,11 @@ set(SRCS
Settings/PathPane.cpp
Settings/WiiPane.cpp
Settings/USBDeviceAddToWhitelistDialog.cpp
TAS/GCTASInputWindow.cpp
TAS/WiiTASInputWindow.cpp
TAS/Shared.cpp
TAS/StickWidget.cpp
TAS/IRWidget.cpp
)

list(APPEND LIBS core uicommon)
@@ -47,7 +47,7 @@
<AdditionalDependencies>avrt.lib;iphlpapi.lib;winmm.lib;setupapi.lib;opengl32.lib;glu32.lib;rpcrt4.lib;comctl32.lib;avcodec.lib;avformat.lib;avutil.lib;swresample.lib;swscale.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
<ClCompile>
<AdditionalIncludeDirectories>$(ProjectDir)VideoInterface;$(ProjectDir)GameList;$(ProjectDir)Debugger;$(ProjectDir)Settings;$(ProjectDir)Config;$(ProjectDir)Config\Mapping;$(ProjectDir)Config\Graphics;$(ProjectDir)NetPlay;$(ProjectDir)QtUtils;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<AdditionalIncludeDirectories>$(ProjectDir)VideoInterface;$(ProjectDir)GameList;$(ProjectDir)Debugger;$(ProjectDir)Settings;$(ProjectDir)Config;$(ProjectDir)Config\Mapping;$(ProjectDir)Config\Graphics;$(ProjectDir)NetPlay;$(ProjectDir)QtUtils;$(ProjectDir)TAS;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile>
<Manifest>
<AdditionalManifestFiles>DolphinQt2.manifest;%(AdditionalManifestFiles)</AdditionalManifestFiles>
@@ -86,6 +86,10 @@
<QtMoc Include="Config\PropertiesDialog.h" />
<QtMoc Include="Config\SettingsWindow.h" />
<QtMoc Include="FIFOPlayerWindow.h" />
<QtMoc Include="TAS\GCTASInputWindow.h" />
<QtMoc Include="TAS\WiiTASInputWindow.h" />
<QtMoc Include="TAS\StickWidget.h" />
<QtMoc Include="TAS\IRWidget.h" />
<QtMoc Include="Debugger\BreakpointWidget.h" />
<QtMoc Include="Debugger\NewBreakpointDialog.h" />
<QtMoc Include="Debugger\RegisterWidget.h" />
@@ -112,6 +116,7 @@
<QtMoc Include="NetPlay\PadMappingDialog.h" />
<QtMoc Include="QtUtils\DoubleClickEventFilter.h" />
<QtMoc Include="QtUtils\WindowActivationEventFilter.h" />
<QtMoc Include="QtUtils\AspectRatioWidget.h" />
<QtMoc Include="RenderWidget.h" />
<QtMoc Include="Settings.h" />
<QtMoc Include="Settings\AdvancedPane.h" />
@@ -131,6 +136,10 @@
<ClCompile Include="$(QtMocOutPrefix)ControllersWindow.cpp" />
<ClCompile Include="$(QtMocOutPrefix)EnhancementsWidget.cpp" />
<ClCompile Include="$(QtMocOutPrefix)FIFOPlayerWindow.cpp" />
<ClCompile Include="$(QtMocOutPrefix)GCTASInputWindow.cpp" />
<ClCompile Include="$(QtMocOutPrefix)WiiTASInputWindow.cpp" />
<ClCompile Include="$(QtMocOutPrefix)StickWidget.cpp" />
<ClCompile Include="$(QtMocOutPrefix)IRWidget.cpp" />
<ClCompile Include="$(QtMocOutPrefix)FilesystemWidget.cpp" />
<ClCompile Include="$(QtMocOutPrefix)WindowActivationEventFilter.cpp" />
<ClCompile Include="$(QtMocOutPrefix)GameList.cpp" />
@@ -220,6 +229,11 @@
<ClCompile Include="Config\PropertiesDialog.cpp" />
<ClCompile Include="Config\SettingsWindow.cpp" />
<ClCompile Include="FIFOPlayerWindow.cpp" />
<ClCompile Include="TAS\GCTASInputWindow.cpp" />
<ClCompile Include="TAS\WiiTASInputWindow.cpp" />
<ClCompile Include="TAS\StickWidget.cpp" />
<ClCompile Include="TAS\IRWidget.cpp" />
<ClCompile Include="TAS\Shared.cpp" />
<ClCompile Include="Debugger\BreakpointWidget.cpp" />
<ClCompile Include="Debugger\NewBreakpointDialog.cpp" />
<ClCompile Include="Debugger\RegisterColumn.cpp" />
@@ -249,6 +263,7 @@
<ClCompile Include="QtUtils\ElidedButton.cpp" />
<ClCompile Include="QtUtils\ListTabWidget.cpp" />
<ClCompile Include="QtUtils\WindowActivationEventFilter.cpp" />
<ClCompile Include="QtUtils\AspectRatioWidget.cpp" />
<ClCompile Include="RenderWidget.cpp" />
<ClCompile Include="Resources.cpp" />
<ClCompile Include="Settings.cpp" />
@@ -275,6 +290,7 @@
<ClInclude Include="Config\Mapping\HotkeyGraphics.h" />
<ClInclude Include="Config\Mapping\HotkeyStates.h" />
<ClInclude Include="Config\Mapping\HotkeyTAS.h" />
<ClInclude Include="TAS\Shared.h" />
<ClInclude Include="Config\Mapping\HotkeyWii.h" />
<ClInclude Include="Config\Mapping\MappingBool.h" />
<ClInclude Include="Config\Mapping\MappingCommon.h" />
@@ -64,6 +64,8 @@
#include "DolphinQt2/QtUtils/WindowActivationEventFilter.h"
#include "DolphinQt2/Resources.h"
#include "DolphinQt2/Settings.h"
#include "DolphinQt2/TAS/GCTASInputWindow.h"
#include "DolphinQt2/TAS/WiiTASInputWindow.h"
#include "DolphinQt2/WiiUpdate.h"

#include "InputCommon/ControllerInterface/ControllerInterface.h"
@@ -167,6 +169,21 @@ void MainWindow::CreateComponents()
m_controllers_window = new ControllersWindow(this);
m_settings_window = new SettingsWindow(this);

for (int i = 0; i < 4; i++)
{
m_gc_tas_input_windows[i] = new GCTASInputWindow(this, i);
m_wii_tas_input_windows[i] = new WiiTASInputWindow(this, i);
}

Movie::SetGCInputManip([this](GCPadStatus* pad_status, int controller_id) {
m_gc_tas_input_windows[controller_id]->GetValues(pad_status);
});

Movie::SetWiiInputManip([this](u8* input_data, WiimoteEmu::ReportFeatures rptf, int controller_id,
int ext, wiimote_key key) {
m_wii_tas_input_windows[controller_id]->GetValues(input_data, rptf, ext, key);
});

m_hotkey_window = new MappingWindow(this, MappingWindow::Type::MAPPING_HOTKEYS, 0);

m_log_widget = new LogWidget(this);
@@ -249,6 +266,7 @@ void MainWindow::ConnectMenuBar()
connect(m_menu_bar, &MenuBar::StartRecording, this, &MainWindow::OnStartRecording);
connect(m_menu_bar, &MenuBar::StopRecording, this, &MainWindow::OnStopRecording);
connect(m_menu_bar, &MenuBar::ExportRecording, this, &MainWindow::OnExportRecording);
connect(m_menu_bar, &MenuBar::ShowTASInput, this, &MainWindow::ShowTASInput);

// View
connect(m_menu_bar, &MenuBar::ShowList, m_game_list, &GameList::SetListView);
@@ -1079,6 +1097,31 @@ void MainWindow::OnExportRecording()
Movie::SaveRecording(dtm_file.toStdString());
}

void MainWindow::ShowTASInput()
{
for (int i = 0; i < num_gc_controllers; i++)
{
if (SConfig::GetInstance().m_SIDevice[i] != SerialInterface::SIDEVICE_NONE &&
SConfig::GetInstance().m_SIDevice[i] != SerialInterface::SIDEVICE_GC_GBA)
{
m_gc_tas_input_windows[i]->show();
m_gc_tas_input_windows[i]->raise();
m_gc_tas_input_windows[i]->activateWindow();
}
}

for (int i = 0; i < num_wii_controllers; i++)
{
if (g_wiimote_sources[i] == WIIMOTE_SRC_EMU &&
(!Core::IsRunning() || SConfig::GetInstance().bWii))
{
m_wii_tas_input_windows[i]->show();
m_wii_tas_input_windows[i]->raise();
m_wii_tas_input_windows[i]->activateWindow();
}
}
}

void MainWindow::OnConnectWiiRemote(int id)
{
const auto ios = IOS::HLE::GetIOS();
@@ -34,6 +34,8 @@ class DragEnterEvent;
class GraphicsWindow;
class RegisterWidget;
class WatchWidget;
class GCTASInputWindow;
class WiiTASInputWindow;

class MainWindow final : public QMainWindow
{
@@ -120,6 +122,7 @@ class MainWindow final : public QMainWindow
void OnStartRecording();
void OnStopRecording();
void OnExportRecording();
void ShowTASInput();

void EnableScreenSaver(bool enable);

@@ -146,6 +149,10 @@ class MainWindow final : public QMainWindow
NetPlayDialog* m_netplay_dialog;
NetPlaySetupDialog* m_netplay_setup_dialog;
GraphicsWindow* m_graphics_window;
static constexpr int num_gc_controllers = 4;
std::array<GCTASInputWindow*, num_gc_controllers> m_gc_tas_input_windows{};
static constexpr int num_wii_controllers = 4;
std::array<WiiTASInputWindow*, num_wii_controllers> m_wii_tas_input_windows{};

BreakpointWidget* m_breakpoint_widget;
LogWidget* m_log_widget;
@@ -488,6 +488,8 @@ void MenuBar::AddMovieMenu()
m_recording_read_only->setChecked(Movie::IsReadOnly());
connect(m_recording_read_only, &QAction::toggled, [](bool value) { Movie::SetReadOnly(value); });

AddAction(movie_menu, tr("TAS Input"), this, [this] { emit ShowTASInput(); });

movie_menu->addSeparator();

auto* pause_at_end = movie_menu->addAction(tr("Pause at End of Movie"));
@@ -87,6 +87,7 @@ class MenuBar final : public QMenuBar
void StartRecording();
void StopRecording();
void ExportRecording();
void ShowTASInput();

void SelectionChanged(QSharedPointer<GameFile> game_file);
void RecordingStatusChanged(bool recording);
@@ -0,0 +1,45 @@
// Copyright 2018 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.

// Based on:
// https://stackoverflow.com/questions/30005540/keeping-the-aspect-ratio-of-a-sub-classed-qwidget-during-resize

#include "DolphinQt2/QtUtils/AspectRatioWidget.h"

#include <QBoxLayout>
#include <QResizeEvent>

AspectRatioWidget::AspectRatioWidget(QWidget* widget, float width, float height, QWidget* parent)
: QWidget(parent), m_ar_width(width), m_ar_height(height)
{
m_layout = new QBoxLayout(QBoxLayout::LeftToRight, this);

// add spacer, then your widget, then spacer
m_layout->addItem(new QSpacerItem(0, 0));
m_layout->addWidget(widget);
m_layout->addItem(new QSpacerItem(0, 0));
}

void AspectRatioWidget::resizeEvent(QResizeEvent* event)
{
float aspect_ratio = static_cast<float>(event->size().width()) / event->size().height();
int widget_stretch, outer_stretch;

if (aspect_ratio > (m_ar_width / m_ar_height)) // too wide
{
m_layout->setDirection(QBoxLayout::LeftToRight);
widget_stretch = height() * (m_ar_width / m_ar_height); // i.e., my width
outer_stretch = (width() - widget_stretch) / 2 + 0.5;
}
else // too tall
{
m_layout->setDirection(QBoxLayout::TopToBottom);
widget_stretch = width() * (m_ar_height / m_ar_width); // i.e., my height
outer_stretch = (height() - widget_stretch) / 2 + 0.5;
}

m_layout->setStretch(0, outer_stretch);
m_layout->setStretch(1, widget_stretch);
m_layout->setStretch(2, outer_stretch);
}
@@ -0,0 +1,21 @@
// Copyright 2018 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.

#pragma once

#include <QWidget>

class QBoxLayout;

class AspectRatioWidget : public QWidget
{
public:
AspectRatioWidget(QWidget* widget, float width, float height, QWidget* parent = nullptr);
void resizeEvent(QResizeEvent* event);

private:
QBoxLayout* m_layout;
float m_ar_width;
float m_ar_height;
};

0 comments on commit 50f52e5

Please sign in to comment.