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