Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
stenzek
GitHub Repository: stenzek/duckstation
Path: blob/master/src/duckstation-qt/controllerbindingwidgets.h
4246 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 Q_SLOTS:
44
void onTypeChanged();
45
void onAutomaticBindingClicked();
46
void onClearBindingsClicked();
47
void onBindingsClicked();
48
void onSettingsClicked();
49
void onMacrosClicked();
50
void onMultipleDeviceAutomaticBindingTriggered();
51
52
private:
53
void populateControllerTypes();
54
void populateWidgets();
55
void createBindingWidgets(QWidget* parent);
56
void bindBindingWidgets(QWidget* parent);
57
void updateHeaderToolButtons();
58
void doDeviceAutomaticBinding(const QString& device);
59
void saveAndRefresh();
60
61
Ui::ControllerBindingWidget m_ui;
62
63
ControllerSettingsWindow* m_dialog;
64
65
std::string m_config_section;
66
const Controller::ControllerInfo* m_controller_info;
67
u32 m_port_number;
68
69
QIcon m_icon;
70
QWidget* m_bindings_widget = nullptr;
71
ControllerCustomSettingsWidget* m_settings_widget = nullptr;
72
ControllerMacroWidget* m_macros_widget = nullptr;
73
};
74
75
//////////////////////////////////////////////////////////////////////////
76
77
class ControllerMacroWidget : public QWidget
78
{
79
Q_OBJECT
80
81
public:
82
explicit ControllerMacroWidget(ControllerBindingWidget* parent);
83
~ControllerMacroWidget();
84
85
void updateListItem(u32 index);
86
87
private:
88
static constexpr u32 NUM_MACROS = InputManager::NUM_MACRO_BUTTONS_PER_CONTROLLER;
89
90
void createWidgets(ControllerBindingWidget* parent);
91
92
Ui::ControllerMacroWidget m_ui;
93
ControllerSettingsWindow* m_dialog;
94
std::array<ControllerMacroEditWidget*, NUM_MACROS> m_macros;
95
};
96
97
//////////////////////////////////////////////////////////////////////////
98
99
class ControllerMacroEditWidget : public QWidget
100
{
101
Q_OBJECT
102
103
public:
104
ControllerMacroEditWidget(ControllerMacroWidget* parent, ControllerBindingWidget* bwidget, u32 index);
105
~ControllerMacroEditWidget();
106
107
QString getSummary() const;
108
109
private Q_SLOTS:
110
void onPressureChanged();
111
void onDeadzoneChanged();
112
void onSetFrequencyClicked();
113
void updateBinds();
114
115
private:
116
void modFrequency(s32 delta);
117
void updateFrequency();
118
void updateFrequencyText();
119
120
Ui::ControllerMacroEditWidget m_ui;
121
122
ControllerMacroWidget* m_parent;
123
ControllerBindingWidget* m_bwidget;
124
u32 m_index;
125
126
std::vector<const Controller::ControllerBindingInfo*> m_binds;
127
u32 m_frequency = 0;
128
};
129
130
//////////////////////////////////////////////////////////////////////////
131
132
class ControllerCustomSettingsWidget : public QWidget
133
{
134
Q_OBJECT
135
136
public:
137
explicit ControllerCustomSettingsWidget(ControllerBindingWidget* parent);
138
~ControllerCustomSettingsWidget();
139
140
private Q_SLOTS:
141
void restoreDefaults();
142
143
private:
144
ControllerBindingWidget* m_parent;
145
};
146
147
//////////////////////////////////////////////////////////////////////////
148
149
class ControllerCustomSettingsDialog : public QDialog
150
{
151
Q_OBJECT
152
153
public:
154
explicit ControllerCustomSettingsDialog(QWidget* parent, SettingsInterface* sif, const std::string& section,
155
std::span<const SettingInfo> settings, const char* tr_context,
156
const QString& window_title);
157
~ControllerCustomSettingsDialog();
158
};
159
160