Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/src/duckstation-qt/controllerbindingwidgets.h
4802 views
1
// SPDX-FileCopyrightText: 2019-2025 Connor McLaughlin <[email protected]>
2
// SPDX-License-Identifier: CC-BY-NC-ND-4.0
3
4
#pragma once
5
6
#include "core/controller.h"
7
#include "core/settings.h"
8
#include <QtWidgets/QDialog>
9
#include <QtWidgets/QWidget>
10
#include <functional>
11
#include <vector>
12
13
#include "ui_controllerbindingwidget.h"
14
#include "ui_controllermacroeditwidget.h"
15
#include "ui_controllermacrowidget.h"
16
17
class QVBoxLayout;
18
19
class InputBindingWidget;
20
class ControllerSettingsWindow;
21
class ControllerCustomSettingsWidget;
22
class ControllerMacroWidget;
23
class ControllerMacroEditWidget;
24
25
//////////////////////////////////////////////////////////////////////////
26
27
class ControllerBindingWidget final : public QWidget
28
{
29
Q_OBJECT
30
31
public:
32
ControllerBindingWidget(QWidget* parent, ControllerSettingsWindow* dialog, u32 port);
33
~ControllerBindingWidget();
34
35
ALWAYS_INLINE ControllerSettingsWindow* getDialog() const { return m_dialog; }
36
ALWAYS_INLINE const std::string& getConfigSection() const { return m_config_section; }
37
ALWAYS_INLINE const Controller::ControllerInfo* getControllerInfo() const { return m_controller_info; }
38
ALWAYS_INLINE u32 getPortNumber() const { return m_port_number; }
39
ALWAYS_INLINE const QIcon& getIcon() { return m_icon; }
40
41
static bool doMultipleDeviceAutomaticBinding(QWidget* parent, ControllerSettingsWindow* parent_dialog, u32 port);
42
43
private:
44
void populateControllerTypes();
45
void populateWidgets();
46
void createBindingWidgets(QWidget* parent);
47
void bindBindingWidgets(QWidget* parent);
48
void updateHeaderToolButtons();
49
void doDeviceAutomaticBinding(const QString& device);
50
void saveAndRefresh();
51
52
void onTypeChanged();
53
void onAutomaticBindingClicked();
54
void onClearBindingsClicked();
55
void onBindingsClicked();
56
void onSettingsClicked();
57
void onMacrosClicked();
58
void onMultipleDeviceAutomaticBindingTriggered();
59
60
Ui::ControllerBindingWidget m_ui;
61
62
ControllerSettingsWindow* m_dialog;
63
64
std::string m_config_section;
65
const Controller::ControllerInfo* m_controller_info;
66
u32 m_port_number;
67
68
QIcon m_icon;
69
QWidget* m_bindings_widget = nullptr;
70
ControllerCustomSettingsWidget* m_settings_widget = nullptr;
71
ControllerMacroWidget* m_macros_widget = nullptr;
72
};
73
74
//////////////////////////////////////////////////////////////////////////
75
76
class ControllerMacroWidget : public QWidget
77
{
78
Q_OBJECT
79
80
public:
81
explicit ControllerMacroWidget(ControllerBindingWidget* parent);
82
~ControllerMacroWidget();
83
84
void updateListItem(u32 index);
85
86
private:
87
static constexpr u32 NUM_MACROS = InputManager::NUM_MACRO_BUTTONS_PER_CONTROLLER;
88
89
void createWidgets(ControllerBindingWidget* parent);
90
91
Ui::ControllerMacroWidget m_ui;
92
std::array<ControllerMacroEditWidget*, NUM_MACROS> m_macros;
93
};
94
95
//////////////////////////////////////////////////////////////////////////
96
97
class ControllerMacroEditWidget : public QWidget
98
{
99
Q_OBJECT
100
101
public:
102
ControllerMacroEditWidget(ControllerMacroWidget* parent, ControllerBindingWidget* bwidget, u32 index);
103
~ControllerMacroEditWidget();
104
105
QString getSummary() const;
106
107
private:
108
void modFrequency(s32 delta);
109
void updateFrequency();
110
void updateFrequencyText();
111
112
void onPressureChanged();
113
void onDeadzoneChanged();
114
void onSetFrequencyClicked();
115
void updateBinds();
116
117
Ui::ControllerMacroEditWidget m_ui;
118
119
ControllerMacroWidget* m_parent;
120
ControllerBindingWidget* m_bwidget;
121
u32 m_index;
122
123
std::vector<const Controller::ControllerBindingInfo*> m_binds;
124
u32 m_frequency = 0;
125
};
126
127
//////////////////////////////////////////////////////////////////////////
128
129
class ControllerCustomSettingsWidget : public QWidget
130
{
131
Q_OBJECT
132
133
public:
134
explicit ControllerCustomSettingsWidget(ControllerBindingWidget* parent);
135
~ControllerCustomSettingsWidget();
136
137
private:
138
void restoreDefaults();
139
140
ControllerBindingWidget* m_parent;
141
};
142
143
//////////////////////////////////////////////////////////////////////////
144
145
class ControllerCustomSettingsDialog : public QDialog
146
{
147
public:
148
explicit ControllerCustomSettingsDialog(QWidget* parent, SettingsInterface* sif, const std::string& section,
149
std::span<const SettingInfo> settings, const char* tr_context,
150
const QString& window_title);
151
~ControllerCustomSettingsDialog();
152
};
153
154