inputbindingwidgets.h (2845B)
1 // SPDX-FileCopyrightText: 2019-2022 Connor McLaughlin <stenzek@gmail.com> 2 // SPDX-License-Identifier: (GPL-3.0 OR CC-BY-NC-ND-4.0) 3 4 #pragma once 5 #include "common/types.h" 6 #include "util/input_manager.h" 7 #include <QtWidgets/QPushButton> 8 #include <optional> 9 10 class QTimer; 11 12 class ControllerSettingsWindow; 13 class SettingsInterface; 14 15 class InputBindingWidget : public QPushButton 16 { 17 Q_OBJECT 18 19 public: 20 InputBindingWidget(QWidget* parent); 21 InputBindingWidget(QWidget* parent, SettingsInterface* sif, InputBindingInfo::Type bind_type, 22 std::string section_name, std::string key_name); 23 ~InputBindingWidget(); 24 25 static bool isMouseMappingEnabled(SettingsInterface* sif); 26 27 void initialize(SettingsInterface* sif, InputBindingInfo::Type bind_type, std::string section_name, 28 std::string key_name); 29 30 public Q_SLOTS: 31 void clearBinding(); 32 void reloadBinding(); 33 34 protected Q_SLOTS: 35 void onClicked(); 36 void onInputListenTimerTimeout(); 37 void inputManagerHookCallback(InputBindingKey key, float value); 38 39 protected: 40 enum : u32 41 { 42 TIMEOUT_FOR_SINGLE_BINDING = 5, 43 TIMEOUT_FOR_ALL_BINDING = 10 44 }; 45 46 virtual bool eventFilter(QObject* watched, QEvent* event) override; 47 virtual bool event(QEvent* event) override; 48 virtual void mouseReleaseEvent(QMouseEvent* e) override; 49 50 virtual void startListeningForInput(u32 timeout_in_seconds); 51 virtual void stopListeningForInput(); 52 virtual void openDialog(); 53 54 bool isListeningForInput() const { return m_input_listen_timer != nullptr; } 55 void setNewBinding(); 56 void updateText(); 57 58 void hookInputManager(); 59 void unhookInputManager(); 60 61 SettingsInterface* m_sif = nullptr; 62 InputBindingInfo::Type m_bind_type = InputBindingInfo::Type::Unknown; 63 std::string m_section_name; 64 std::string m_key_name; 65 std::vector<std::string> m_bindings; 66 std::vector<InputBindingKey> m_new_bindings; 67 std::vector<std::pair<InputBindingKey, std::pair<float, float>>> m_value_ranges; 68 QTimer* m_input_listen_timer = nullptr; 69 u32 m_input_listen_remaining_seconds = 0; 70 QPoint m_input_listen_start_position{}; 71 bool m_mouse_mapping_enabled = false; 72 }; 73 74 class InputVibrationBindingWidget : public QPushButton 75 { 76 Q_OBJECT 77 78 public: 79 InputVibrationBindingWidget(QWidget* parent); 80 InputVibrationBindingWidget(QWidget* parent, ControllerSettingsWindow* dialog, std::string section_name, 81 std::string key_name); 82 ~InputVibrationBindingWidget(); 83 84 void setKey(ControllerSettingsWindow* dialog, std::string section_name, std::string key_name); 85 86 public Q_SLOTS: 87 void clearBinding(); 88 89 protected Q_SLOTS: 90 void onClicked(); 91 92 protected: 93 virtual void mouseReleaseEvent(QMouseEvent* e) override; 94 95 private: 96 std::string m_section_name; 97 std::string m_key_name; 98 std::string m_binding; 99 100 ControllerSettingsWindow* m_dialog; 101 };