// Copyright 2016 Citra Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once #include #include #include #include #include #include #include "common/param_package.h" #include "core/settings.h" #include "ui_configure_input.h" class QKeyEvent; class QPushButton; class QString; class QTimer; namespace InputCommon::Polling { class DevicePoller; enum class DeviceType; } // namespace InputCommon::Polling namespace Ui { class ConfigureInputPlayer; } class ConfigureInputPlayer : public QDialog { Q_OBJECT public: explicit ConfigureInputPlayer(QWidget* parent, std::size_t player_index, bool debug = false); ~ConfigureInputPlayer() override; /// Save all button configurations to settings file void ApplyConfiguration(); private: void changeEvent(QEvent* event) override; void RetranslateUI(); void OnControllerButtonClick(int i); /// Load configuration settings. void LoadConfiguration(); /// Restore all buttons to their default values. void RestoreDefaults(); /// Clear all input configuration void ClearAll(); /// Update UI to reflect current configuration. void UpdateButtonLabels(); /// Called when the button was pressed. void HandleClick(QPushButton* button, std::function new_input_setter, InputCommon::Polling::DeviceType type); /// Finish polling and configure input using the input_setter void SetPollingResult(const Common::ParamPackage& params, bool abort); /// Handle key press events. void keyPressEvent(QKeyEvent* event) override; std::unique_ptr ui; std::size_t player_index; bool debug; std::unique_ptr timeout_timer; std::unique_ptr poll_timer; /// This will be the the setting function when an input is awaiting configuration. std::optional> input_setter; std::array buttons_param; std::array analogs_param; static constexpr int ANALOG_SUB_BUTTONS_NUM = 5; /// Each button input is represented by a QPushButton. std::array button_map; std::vector debug_hidden; std::vector layout_hidden; /// A group of five QPushButtons represent one analog input. The buttons each represent up, /// down, left, right, and modifier, respectively. std::array, Settings::NativeAnalog::NumAnalogs> analog_map_buttons; /// Analog inputs are also represented each with a single button, used to configure with an /// actual analog stick std::array analog_map_stick; static const std::array analog_sub_buttons; std::vector> device_pollers; /// A flag to indicate if keyboard keys are okay when configuring an input. If this is false, /// keyboard events are ignored. bool want_keyboard_keys = false; std::array controller_color_buttons; std::array controller_colors; };