diff --git a/gui/include/qmlbackend.h b/gui/include/qmlbackend.h index 605ebbc2..711b716e 100644 --- a/gui/include/qmlbackend.h +++ b/gui/include/qmlbackend.h @@ -183,7 +183,7 @@ class QmlBackend : public QObject void currentControllerTypeChanged(); void controllerMappingInProgressChanged(); void controllerMappingDefaultMappingChanged(); - void controllerMappingButtonSelected(QStringList original_button_map, int chiaki_button_value, QString chiaki_button_name); + void controllerMappingButtonSelected(QString button); void controllerMappingAlteredChanged(); void controllerMappingSteamControllerSelected(); void enableAnalogStickMappingChanged(); diff --git a/gui/src/controllermanager.cpp b/gui/src/controllermanager.cpp index 3f9370e5..57c79897 100644 --- a/gui/src/controllermanager.cpp +++ b/gui/src/controllermanager.cpp @@ -230,6 +230,10 @@ void ControllerManager::HandleEvents() case SDL_JOYDEVICEREMOVED: UpdateAvailableControllers(); break; + case SDL_JOYAXISMOTION: + case SDL_JOYBUTTONDOWN: + case SDL_JOYBUTTONUP: + case SDL_JOYHATMOTION: case SDL_CONTROLLERBUTTONUP: case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERAXISMOTION: @@ -254,7 +258,6 @@ void ControllerManager::ControllerEvent(SDL_Event event) switch(event.type) { case SDL_CONTROLLERBUTTONDOWN: - start_updating_mapping = true; device_id = event.cbutton.which; break; case SDL_CONTROLLERBUTTONUP: @@ -268,7 +271,6 @@ void ControllerManager::ControllerEvent(SDL_Event event) device_id = event.csensor.which; break; case SDL_CONTROLLERTOUCHPADDOWN: - start_updating_mapping = true; device_id = event.ctouchpad.which; break; case SDL_CONTROLLERTOUCHPADMOTION: @@ -276,6 +278,20 @@ void ControllerManager::ControllerEvent(SDL_Event event) device_id = event.ctouchpad.which; break; #endif + case SDL_JOYAXISMOTION: + device_id = event.jaxis.which; + break; + case SDL_JOYBUTTONDOWN: + start_updating_mapping = true; + device_id = event.jbutton.which; + break; + case SDL_JOYBUTTONUP: + device_id = event.jbutton.which; + break; + case SDL_JOYHATMOTION: + start_updating_mapping = true; + device_id = event.jhat.which; + break; default: return; } @@ -399,6 +415,29 @@ void Controller::UpdateState(SDL_Event event) { switch(event.type) { + case SDL_JOYAXISMOTION: + if(updating_mapping_button && enable_analog_stick_mapping) + { + emit NewButtonMapping(QString("a%1").arg(QString::number(event.jaxis.axis))); + updating_mapping_button = false; + } + return; + case SDL_JOYBUTTONDOWN: + if(updating_mapping_button) + { + emit NewButtonMapping(QString("b%1").arg(QString::number(event.jbutton.button))); + updating_mapping_button = false; + } + return; + case SDL_JOYBUTTONUP: + return; + case SDL_JOYHATMOTION: + if(updating_mapping_button) + { + emit NewButtonMapping(QString("h%1.%2").arg(QString::number(event.jhat.hat)).arg(QString::number(event.jhat.value))); + updating_mapping_button = false; + } + return; case SDL_CONTROLLERBUTTONDOWN: case SDL_CONTROLLERBUTTONUP: if(!HandleButtonEvent(event.cbutton)) @@ -432,168 +471,63 @@ inline bool Controller::HandleButtonEvent(SDL_ControllerButtonEvent event) { switch(event.button) { case SDL_CONTROLLER_BUTTON_A: - if(updating_mapping_button) - { - emit NewButtonMapping("a"); - updating_mapping_button = false; - } ps_btn = CHIAKI_CONTROLLER_BUTTON_CROSS; break; case SDL_CONTROLLER_BUTTON_B: - if(updating_mapping_button) - { - emit NewButtonMapping("b"); - updating_mapping_button = false; - } ps_btn = CHIAKI_CONTROLLER_BUTTON_MOON; break; case SDL_CONTROLLER_BUTTON_X: - if(updating_mapping_button) - { - emit NewButtonMapping("x"); - updating_mapping_button = false; - } ps_btn = CHIAKI_CONTROLLER_BUTTON_BOX; break; case SDL_CONTROLLER_BUTTON_Y: - if(updating_mapping_button) - { - emit NewButtonMapping("y"); - updating_mapping_button = false; - } ps_btn = CHIAKI_CONTROLLER_BUTTON_PYRAMID; break; case SDL_CONTROLLER_BUTTON_DPAD_LEFT: - if(updating_mapping_button) - { - emit NewButtonMapping("dpleft"); - updating_mapping_button = false; - } ps_btn = CHIAKI_CONTROLLER_BUTTON_DPAD_LEFT; break; case SDL_CONTROLLER_BUTTON_DPAD_RIGHT: - if(updating_mapping_button) - { - emit NewButtonMapping("dpright"); - updating_mapping_button = false; - } ps_btn = CHIAKI_CONTROLLER_BUTTON_DPAD_RIGHT; break; case SDL_CONTROLLER_BUTTON_DPAD_UP: - if(updating_mapping_button) - { - emit NewButtonMapping("dpup"); - updating_mapping_button = false; - } ps_btn = CHIAKI_CONTROLLER_BUTTON_DPAD_UP; break; case SDL_CONTROLLER_BUTTON_DPAD_DOWN: - if(updating_mapping_button) - { - emit NewButtonMapping("dpdown"); - updating_mapping_button = false; - } ps_btn = CHIAKI_CONTROLLER_BUTTON_DPAD_DOWN; break; case SDL_CONTROLLER_BUTTON_LEFTSHOULDER: - if(updating_mapping_button) - { - emit NewButtonMapping("leftshoulder"); - updating_mapping_button = false; - } ps_btn = CHIAKI_CONTROLLER_BUTTON_L1; break; case SDL_CONTROLLER_BUTTON_RIGHTSHOULDER: - if(updating_mapping_button) - { - emit NewButtonMapping("rightshoulder"); - updating_mapping_button = false; - } ps_btn = CHIAKI_CONTROLLER_BUTTON_R1; break; case SDL_CONTROLLER_BUTTON_LEFTSTICK: - if(updating_mapping_button) - { - emit NewButtonMapping("leftstick"); - updating_mapping_button = false; - } ps_btn = CHIAKI_CONTROLLER_BUTTON_L3; break; case SDL_CONTROLLER_BUTTON_RIGHTSTICK: - if(updating_mapping_button) - { - emit NewButtonMapping("rightstick"); - updating_mapping_button = false; - } ps_btn = CHIAKI_CONTROLLER_BUTTON_R3; break; case SDL_CONTROLLER_BUTTON_START: - if(updating_mapping_button) - { - emit NewButtonMapping("start"); - updating_mapping_button = false; - } ps_btn = CHIAKI_CONTROLLER_BUTTON_OPTIONS; break; case SDL_CONTROLLER_BUTTON_BACK: - if(updating_mapping_button) - { - emit NewButtonMapping("back"); - updating_mapping_button = false; - } ps_btn = CHIAKI_CONTROLLER_BUTTON_SHARE; break; case SDL_CONTROLLER_BUTTON_GUIDE: - if(updating_mapping_button) - { - emit NewButtonMapping("guide"); - updating_mapping_button = false; - } ps_btn = CHIAKI_CONTROLLER_BUTTON_PS; break; case SDL_CONTROLLER_BUTTON_MISC1: - if(updating_mapping_button) - { - emit NewButtonMapping("misc1"); - updating_mapping_button = false; - } micbutton_push = true; break; case SDL_CONTROLLER_BUTTON_PADDLE1: - if(updating_mapping_button) - { - emit NewButtonMapping("paddle1"); - updating_mapping_button = false; - } return false; case SDL_CONTROLLER_BUTTON_PADDLE2: - if(updating_mapping_button) - { - emit NewButtonMapping("paddle2"); - updating_mapping_button = false; - } return false; case SDL_CONTROLLER_BUTTON_PADDLE3: - if(updating_mapping_button) - { - emit NewButtonMapping("paddle3"); - updating_mapping_button = false; - } return false; case SDL_CONTROLLER_BUTTON_PADDLE4: - if(updating_mapping_button) - { - emit NewButtonMapping("paddle4"); - updating_mapping_button = false; - } return false; #if SDL_VERSION_ATLEAST(2, 0, 14) case SDL_CONTROLLER_BUTTON_TOUCHPAD: - if(updating_mapping_button) - { - emit NewButtonMapping("touchpad"); - updating_mapping_button = false; - } ps_btn = CHIAKI_CONTROLLER_BUTTON_TOUCHPAD; break; #endif @@ -623,51 +557,21 @@ inline bool Controller::HandleAxisEvent(SDL_ControllerAxisEvent event) { switch(event.axis) { case SDL_CONTROLLER_AXIS_TRIGGERLEFT: - if(updating_mapping_button) - { - emit NewButtonMapping("lefttrigger"); - updating_mapping_button = false; - } state.l2_state = (uint8_t)(event.value >> 7); break; case SDL_CONTROLLER_AXIS_TRIGGERRIGHT: - if(updating_mapping_button) - { - emit NewButtonMapping("righttrigger"); - updating_mapping_button = false; - } state.r2_state = (uint8_t)(event.value >> 7); break; case SDL_CONTROLLER_AXIS_LEFTX: - if(updating_mapping_button && enable_analog_stick_mapping) - { - emit NewButtonMapping("leftx"); - updating_mapping_button = false; - } state.left_x = event.value; break; case SDL_CONTROLLER_AXIS_LEFTY: - if(updating_mapping_button && enable_analog_stick_mapping) - { - emit NewButtonMapping("lefty"); - updating_mapping_button = false; - } state.left_y = event.value; break; case SDL_CONTROLLER_AXIS_RIGHTX: - if(updating_mapping_button && enable_analog_stick_mapping) - { - emit NewButtonMapping("rightx"); - updating_mapping_button = false; - } state.right_x = event.value; break; case SDL_CONTROLLER_AXIS_RIGHTY: - if(updating_mapping_button && enable_analog_stick_mapping) - { - emit NewButtonMapping("righty"); - updating_mapping_button = false; - } state.right_y = event.value; break; default: diff --git a/gui/src/qml/ControllerMappingDialog.qml b/gui/src/qml/ControllerMappingDialog.qml index 4f0b5f0c..9bbb81d5 100644 --- a/gui/src/qml/ControllerMappingDialog.qml +++ b/gui/src/qml/ControllerMappingDialog.qml @@ -43,7 +43,7 @@ DialogView { id: analogStickMapping property bool firstInFocusChain: true property bool lastInFocusChain: false - text: qsTr("Allow mapping analog sticks' x/y-axis") + text: qsTr("Allow mapping analog sticks and L2/R2") checked: Chiaki.enableAnalogStickMapping onToggled: Chiaki.enableAnalogStickMapping = checked Keys.onPressed: (event) => { @@ -330,103 +330,6 @@ DialogView { } } - Dialog { - id: chooseButtonDialog - property int buttonValue - property var buttons - property var oldButtonName - property int buttonIndex - property int mappingIndex - focus: false - parent: Overlay.overlay - x: Math.round((root.width - width) / 2) - y: Math.round((root.height - height) / 2) - title: qsTr("Choose Button") - modal: true - standardButtons: Dialog.Close - onOpened: { - quitButtonMapping = false; - button0.forceActiveFocus((Qt.TabFocusReason)); - } - onClosed: { - if(quitButtonMapping) - Chiaki.controllerMappingButtonQuit(); - else - quitButtonMapping = true; - let item = chiakiButtons.itemAt(mappingIndex) - if(item) - { - let item2 = item.children[buttonIndex + 1]; - if(item2) - item2.forceActiveFocus(Qt.TabFocusReason); - } - focus = false; - } - Material.roundedScale: Material.MediumScale - - function show(opts) { - buttons = opts.buttonList; - oldButtonName = opts.oldChiakiButtonName; - buttonValue = opts.buttonValue; - buttonIndex = opts.buttonIndex; - mappingIndex = opts.mappingIndex; - open(); - } - - ColumnLayout { - spacing: 20 - Label { - id: chooseButtonLabel - Layout.preferredWidth: 400 - text: qsTr("Choose ") + qsTr(" between the 2 physical buttons currently mapped to " + chooseButtonDialog.oldButtonName) - } - - RowLayout { - Layout.topMargin: 30 - Layout.alignment: Qt.AlignCenter - spacing: 30 - - C.Button { - id: button0 - firstInFocusChain: true - Layout.preferredWidth: 170 - Layout.preferredHeight: 52 - text: { - if(typeof chooseButtonDialog.buttons !== "undefined") - chooseButtonDialog.buttons[0] - } - Material.roundedScale: Material.MediumScale - KeyNavigation.priority: KeyNavigation.BeforeItem - KeyNavigation.right: button1 - onClicked: { - Chiaki.updateButton(chooseButtonDialog.buttonValue, chooseButtonDialog.buttons[0], chooseButtonDialog.buttonIndex); - quitButtonMapping = false; - chooseButtonDialog.close(); - } - } - - C.Button { - id: button1 - lastInFocusChain: true - Layout.preferredWidth: 170 - Layout.preferredHeight: 52 - text: { - if(typeof chooseButtonDialog.buttons !== "undefined") - chooseButtonDialog.buttons[1] - } - Material.roundedScale: Material.MediumScale - KeyNavigation.priority: KeyNavigation.BeforeItem - KeyNavigation.left: button0 - onClicked: { - Chiaki.updateButton(chooseButtonDialog.buttonValue, chooseButtonDialog.buttons[1], chooseButtonDialog.buttonIndex); - quitButtonMapping = false; - chooseButtonDialog.close(); - } - } - } - } - } - Connections { target: Chiaki @@ -436,28 +339,11 @@ DialogView { dialog.close(); } - function onControllerMappingButtonSelected(original_button_map, chiaki_button_value, chiaki_button_name) + function onControllerMappingButtonSelected(pressedButton, chiaki_button_value, chiaki_button_name) { - if(original_button_map.length > 1) - { - buttonDialog.resetFocus = false; - buttonDialog.close(); - chooseButtonDialog.show({ - buttonList: original_button_map, - oldChiakiButton: chiaki_button_value, - oldChiakiButtonName: chiaki_button_name, - buttonValue: buttonDialog.buttonValue, - buttonIndex: buttonDialog.buttonIndex, - mappingIndex: buttonDialog.mappingIndex, - }); - } - else - { - Chiaki.updateButton(buttonDialog.buttonValue, original_button_map[0], buttonDialog.buttonIndex); - quitButtonMapping = false; - buttonDialog.close(); - } - + Chiaki.updateButton(buttonDialog.buttonValue, pressedButton, buttonDialog.buttonIndex); + quitButtonMapping = false; + buttonDialog.close(); } } } diff --git a/gui/src/qmlbackend.cpp b/gui/src/qmlbackend.cpp index 2348a29b..6ed49118 100644 --- a/gui/src/qmlbackend.cpp +++ b/gui/src/qmlbackend.cpp @@ -1600,36 +1600,7 @@ void QmlBackend::controllerMappingChangeButton(QString button) { if(!controller_mapping_in_progress || !controller_mapping_controller) return; - QStringList mapping_selection = controller_mapping_applied_controller_mappings.value(button); - QMap button_map = - { - {"a", CHIAKI_CONTROLLER_BUTTON_CROSS}, - {"b", CHIAKI_CONTROLLER_BUTTON_MOON}, - {"x", CHIAKI_CONTROLLER_BUTTON_BOX}, - {"y", CHIAKI_CONTROLLER_BUTTON_PYRAMID}, - {"dpleft", CHIAKI_CONTROLLER_BUTTON_DPAD_LEFT}, - {"dpright", CHIAKI_CONTROLLER_BUTTON_DPAD_RIGHT}, - {"dpup", CHIAKI_CONTROLLER_BUTTON_DPAD_UP}, - {"dpdown", CHIAKI_CONTROLLER_BUTTON_DPAD_DOWN}, - {"leftshoulder", CHIAKI_CONTROLLER_BUTTON_L1}, - {"rightshoulder", CHIAKI_CONTROLLER_BUTTON_R1}, - {"leftstick", CHIAKI_CONTROLLER_BUTTON_L3}, - {"rightstick", CHIAKI_CONTROLLER_BUTTON_R3}, - {"start", CHIAKI_CONTROLLER_BUTTON_OPTIONS}, - {"back", CHIAKI_CONTROLLER_BUTTON_SHARE}, - {"touchpad", CHIAKI_CONTROLLER_BUTTON_TOUCHPAD}, - {"guide", CHIAKI_CONTROLLER_BUTTON_PS}, - {"lefttrigger", CHIAKI_CONTROLLER_ANALOG_BUTTON_L2}, - {"righttrigger", CHIAKI_CONTROLLER_ANALOG_BUTTON_R2}, - {"leftx", static_cast(ControllerButtonExt::ANALOG_STICK_LEFT_X)}, - {"lefty", static_cast(ControllerButtonExt::ANALOG_STICK_LEFT_Y)}, - {"rightx", static_cast(ControllerButtonExt::ANALOG_STICK_RIGHT_X)}, - {"righty", static_cast(ControllerButtonExt::ANALOG_STICK_RIGHT_Y)}, - {"misc1", static_cast(ControllerButtonExt::MISC1)}, - }; - int chiaki_button_value = button_map.value(button); - QString chiaki_button_name = Settings::GetChiakiControllerButtonName(chiaki_button_value); - emit controllerMappingButtonSelected(std::move(mapping_selection), chiaki_button_value, std::move(chiaki_button_name)); + emit controllerMappingButtonSelected(std::move(button)); } void QmlBackend::updateButton(int chiaki_button, QString physical_button, int new_index) @@ -1760,37 +1731,6 @@ void QmlBackend::controllerMappingUpdate(Controller *controller) controller_mapping_physical_button_mappings.insert(individual_mapping_list[j], key); } } - QStringList xbox_share_button_controllers; - xbox_share_button_controllers.append("Xbox One Controller"); - xbox_share_button_controllers.append("Xbox Series X Controller"); - xbox_share_button_controllers.append("Xbox Wireless Controller"); - if((xbox_share_button_controllers.contains(controller_mapping_controller_type)) && !controller_mapping_physical_button_mappings.contains("b11")) - { - if(controller_mapping_controller_mappings.contains("misc1")) - { - QStringList individual_mapping_list = controller_mapping_controller_mappings.value("misc1"); - individual_mapping_list.append("b11"); - controller_mapping_controller_mappings.insert("misc1", individual_mapping_list); - } - else - controller_mapping_controller_mappings.insert("misc1", QStringList(QString("b11"))); - controller_mapping_physical_button_mappings.insert("b11", "misc1"); - controllerMappingApply(); - } - QString stadia_controller = "Google Stadia Controller"; - if((stadia_controller == controller_mapping_controller_type) && !controller_mapping_physical_button_mappings.contains("b16")) - { - if(controller_mapping_controller_mappings.contains("paddle1")) - { - QStringList individual_mapping_list = controller_mapping_controller_mappings.value("paddle1"); - individual_mapping_list.append("b16"); - controller_mapping_controller_mappings.insert("paddle1", individual_mapping_list); - } - else - controller_mapping_controller_mappings.insert("paddle1", QStringList(QString("b16"))); - controller_mapping_physical_button_mappings.insert("b16", "paddle1"); - controllerMappingApply(); - } controller_mapping_applied_controller_mappings = controller_mapping_controller_mappings; emit currentControllerTypeChanged();