diff --git a/src/dusk/ui/controller_config.cpp b/src/dusk/ui/controller_config.cpp index aef911f996..43b913b6a7 100644 --- a/src/dusk/ui/controller_config.cpp +++ b/src/dusk/ui/controller_config.cpp @@ -37,7 +37,7 @@ Rml::String current_controller_name(int port) { Rml::String controller_index_name(u32 index) { const char* name = PADGetNameForControllerIndex(index); if (name == nullptr) { - return fmt::format("Controller {}", index + 1); + return fmt::format("Device {}", index + 1); } return name; } @@ -124,7 +124,7 @@ Rml::String native_axis_name(const PADAxisMapping& mapping, SDL_Gamepad* gamepad return native_button_name(gamepad, static_cast(mapping.nativeButton)); } - return "Not bound"; + return "Not Bound"; } bool is_dpad_button(PADButton button) { @@ -162,7 +162,7 @@ bool keyboard_escape_pressed() { Rml::String keyboard_key_name(s32 scancode) { if (scancode == PAD_KEY_INVALID) { - return "Not bound"; + return "Not Bound"; } switch (scancode) { case PAD_KEY_MOUSE_LEFT: @@ -303,7 +303,7 @@ void ControllerConfigWindow::build_port_tab(Rml::Element* content, int port) { }); }; - addPageButton(Page::Controller, "Controller", [port] { return current_controller_name(port); }, [] { return false; }); + addPageButton(Page::Controller, "Device", [port] { return current_controller_name(port); }, [] { return false; }); addPageButton(Page::Buttons, "Buttons", [] { return Rml::String(">"); }, [] { return false; }); addPageButton(Page::Triggers, "Triggers", [] { return Rml::String(">"); }, [] { return false; }); addPageButton(Page::Sticks, "Sticks", [] { return Rml::String(">"); }, [] { return false; }); @@ -349,7 +349,14 @@ void ControllerConfigWindow::build_port_tab(Rml::Element* content, int port) { rightPane, [](Pane& pane) { pane.add_text("Treat analog trigger movement as digital L and R button input."); }); - + leftPane.register_control(leftPane.add_button("Restore Default Controls").on_pressed([this, port] { + mDoAud_seStartMenu(kSoundClick); + PADRestoreDefaultMapping(port); + }), + rightPane, [](Pane& pane) { + pane.clear(); + pane.add_text("Restores all binding configurations for the currently selected device to their defaults."); + }); render_page(rightPane, port, mPage); } @@ -365,7 +372,7 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { [port] { return PADGetIndexForPort(port) < 0 && !keyboard_active(port); }, }) .on_pressed([this, port] { - mDoAud_seStartMenu(kSoundItemChange); + mDoAud_seStartMenu(kSoundClick); cancel_pending_binding(); PADClearPort(port); PADSetKeyboardActive(static_cast(port), FALSE); @@ -378,7 +385,7 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { .isSelected = [port] { return keyboard_active(port); }, }) .on_pressed([this, port] { - mDoAud_seStartMenu(kSoundItemChange); + mDoAud_seStartMenu(kSoundClick); cancel_pending_binding(); PADClearPort(port); PADSetKeyboardActive(static_cast(port), TRUE); @@ -388,7 +395,7 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { const u32 controllerCount = PADCount(); if (controllerCount == 0) { - pane.add_text("No controllers detected"); + pane.add_text("No Device Detected"); break; } @@ -400,7 +407,7 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { [port, i] { return PADGetIndexForPort(port) == static_cast(i); }, }) .on_pressed([this, port, i] { - mDoAud_seStartMenu(kSoundItemChange); + mDoAud_seStartMenu(kSoundClick); cancel_pending_binding(); PADSetKeyboardActive(static_cast(port), FALSE); PADSetPortForIndex(i, port); @@ -425,17 +432,18 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { PADKeyButtonBinding* bindings = PADGetKeyButtonBindings(static_cast(port), &count); if (bindings == nullptr) { - return Rml::String("Not bound"); + return Rml::String("Not Bound"); } for (u32 i = 0; i < PAD_BUTTON_COUNT; ++i) { if (bindings[i].padButton == button) { return keyboard_key_name(bindings[i].scancode); } } - return Rml::String("Not bound"); + return Rml::String("Not Bound"); }, }) .on_pressed([this, port, button] { + mDoAud_seStartMenu(kSoundClick); cancel_pending_binding(); mPendingPort = port; mPendingBindingArmed = false; @@ -462,7 +470,7 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { u32 buttonCount = 0; PADButtonMapping* mappings = PADGetButtonMappings(port, &buttonCount); if (mappings == nullptr) { - pane.add_text("No controller selected"); + pane.add_text("No Device Selected"); break; } @@ -486,6 +494,7 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { }, }) .on_pressed([this, port, &mapping] { + mDoAud_seStartMenu(kSoundClick); cancel_pending_binding(); mPendingPort = port; mPendingBindingArmed = false; @@ -512,6 +521,7 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { }, }) .on_pressed([this, port, &mapping] { + mDoAud_seStartMenu(kSoundClick); cancel_pending_binding(); mPendingPort = port; mPendingBindingArmed = false; @@ -535,17 +545,18 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { PADKeyButtonBinding* bindings = PADGetKeyButtonBindings(static_cast(port), &count); if (bindings == nullptr) { - return Rml::String("Not bound"); + return Rml::String("Not Bound"); } for (u32 i = 0; i < PAD_BUTTON_COUNT; ++i) { if (bindings[i].padButton == button) { return keyboard_key_name(bindings[i].scancode); } } - return Rml::String("Not bound"); + return Rml::String("Not Bound"); }, }) .on_pressed([this, port, button] { + mDoAud_seStartMenu(kSoundClick); cancel_pending_binding(); mPendingPort = port; mPendingBindingArmed = false; @@ -566,17 +577,18 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { PADKeyAxisBinding* bindings = PADGetKeyAxisBindings(static_cast(port), &count); if (bindings == nullptr) { - return Rml::String("Not bound"); + return Rml::String("Not Bound"); } for (u32 i = 0; i < PAD_AXIS_COUNT; ++i) { if (bindings[i].padAxis == axis) { return keyboard_key_name(bindings[i].scancode); } } - return Rml::String("Not bound"); + return Rml::String("Not Bound"); }, }) .on_pressed([this, port, axis] { + mDoAud_seStartMenu(kSoundClick); cancel_pending_binding(); mPendingPort = port; mPendingBindingArmed = false; @@ -599,7 +611,7 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { u32 buttonCount = 0; PADButtonMapping* buttons = PADGetButtonMappings(port, &buttonCount); if (axes == nullptr && buttons == nullptr) { - pane.add_text("No controller selected"); + pane.add_text("No Device Selected"); break; } @@ -623,6 +635,7 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { }, }) .on_pressed([this, port, &mapping] { + mDoAud_seStartMenu(kSoundClick); cancel_pending_binding(); mPendingPort = port; mPendingBindingArmed = false; @@ -631,30 +644,33 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { } } - pane.add_section("Digital"); - if (buttons != nullptr) { - for (u32 i = 0; i < buttonCount; ++i) { - PADButtonMapping& mapping = buttons[i]; - if (mapping.padButton != PAD_TRIGGER_L && mapping.padButton != PAD_TRIGGER_R) { - continue; + if (getSettings().backend.enableAdvancedSettings) { + pane.add_section("Digital"); + if (buttons != nullptr) { + for (u32 i = 0; i < buttonCount; ++i) { + PADButtonMapping& mapping = buttons[i]; + if (mapping.padButton != PAD_TRIGGER_L && mapping.padButton != PAD_TRIGGER_R) { + continue; + } + pane.add_select_button({ + .key = PADGetButtonName(mapping.padButton), + .getValue = + [this, &mapping, gamepad] { + if (mPendingButtonMapping == &mapping) { + return pending_button_label(); + } + return native_button_name( + gamepad, mapping.nativeButton); + }, + }) + .on_pressed([this, port, &mapping] { + mDoAud_seStartMenu(kSoundClick); + cancel_pending_binding(); + mPendingPort = port; + mPendingBindingArmed = false; + mPendingButtonMapping = &mapping; + }); } - pane.add_select_button({ - .key = PADGetButtonName(mapping.padButton), - .getValue = - [this, &mapping, gamepad] { - if (mPendingButtonMapping == &mapping) { - return pending_button_label(); - } - return native_button_name( - gamepad, mapping.nativeButton); - }, - }) - .on_pressed([this, port, &mapping] { - cancel_pending_binding(); - mPendingPort = port; - mPendingBindingArmed = false; - mPendingButtonMapping = &mapping; - }); } } @@ -706,17 +722,18 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { PADKeyAxisBinding* bindings = PADGetKeyAxisBindings(static_cast(port), &count); if (bindings == nullptr) { - return Rml::String("Not bound"); + return Rml::String("Not Bound"); } for (u32 i = 0; i < PAD_AXIS_COUNT; ++i) { if (bindings[i].padAxis == axis) { return keyboard_key_name(bindings[i].scancode); } } - return Rml::String("Not bound"); + return Rml::String("Not Bound"); }, }) .on_pressed([this, port, axis] { + mDoAud_seStartMenu(kSoundClick); cancel_pending_binding(); mPendingPort = port; mPendingBindingArmed = false; @@ -741,7 +758,7 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { u32 axisCount = 0; PADAxisMapping* axes = PADGetAxisMappings(port, &axisCount); if (axes == nullptr) { - pane.add_text("No controller selected"); + pane.add_text("No Device Selected"); break; } @@ -762,6 +779,7 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { }, }) .on_pressed([this, port, &mapping] { + mDoAud_seStartMenu(kSoundClick); cancel_pending_binding(); mPendingPort = port; mPendingBindingArmed = false; @@ -907,6 +925,7 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { }, }) .on_pressed([this, port, actionBind] { + mDoAud_seStartMenu(kSoundClick); cancel_pending_binding(); mPendingPort = port; mPendingBindingArmed = false; @@ -926,7 +945,7 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { u32 buttonCount = 0; PADButtonMapping* mappings = PADGetButtonMappings(port, &buttonCount); if (mappings == nullptr) { - pane.add_text("No controller selected"); + pane.add_text("No Device Selected"); break; } @@ -950,6 +969,7 @@ void ControllerConfigWindow::render_page(Pane& pane, int port, Page page) { }, }) .on_pressed([this, port, actionBind] { + mDoAud_seStartMenu(kSoundClick); cancel_pending_binding(); mPendingPort = port; mPendingBindingArmed = false; @@ -1058,6 +1078,7 @@ void ControllerConfigWindow::poll_pending_binding() { } void ControllerConfigWindow::finish_pending_binding(int completedPort) { + mDoAud_seStartMenu(kSoundBindingChanged); mPendingButtonMapping = nullptr; mPendingAxisMapping = nullptr; mPendingActionBinding = nullptr; @@ -1110,11 +1131,11 @@ bool ControllerConfigWindow::pending_input_neutral() const { } Rml::String ControllerConfigWindow::pending_button_label() const { - return mPendingBindingArmed ? "Press a button..." : "Waiting..."; + return mPendingBindingArmed ? "Press a Key or Button..." : "Waiting..."; } Rml::String ControllerConfigWindow::pending_axis_label() const { - return mPendingBindingArmed ? "Move axis or press a button..." : "Waiting..."; + return mPendingBindingArmed ? "Move Axis or press a Key or Button..." : "Waiting..."; } void ControllerConfigWindow::cancel_pending_binding() { @@ -1143,7 +1164,7 @@ void ControllerConfigWindow::finish_pending_key_binding() { } Rml::String ControllerConfigWindow::pending_key_label() const { - return mPendingBindingArmed ? "Press a key or mouse button..." : "Waiting..."; + return mPendingBindingArmed ? "Press a Key or Mouse Button..." : "Waiting..."; } void ControllerConfigWindow::stop_rumble_test() { @@ -1159,7 +1180,7 @@ void ControllerConfigWindow::stop_rumble_test() { Rml::String native_button_name(SDL_Gamepad* gamepad, u32 buttonUntyped) { if (buttonUntyped == PAD_NATIVE_BUTTON_INVALID) { - return "Not bound"; + return "Not Bound"; } auto button = static_cast(buttonUntyped); diff --git a/src/dusk/ui/overlay.cpp b/src/dusk/ui/overlay.cpp index 2ec47e6215..69c262720e 100644 --- a/src/dusk/ui/overlay.cpp +++ b/src/dusk/ui/overlay.cpp @@ -103,13 +103,13 @@ Rml::Element* create_controller_warning(Rml::Element* parent) { auto* heading = append(elem, "heading"); auto* title = append(heading, "span"); - title->SetInnerRML("No controller assigned"); + title->SetInnerRML("No Device Assigned"); auto* icon = append(heading, "icon"); icon->SetClass("warning", true); auto* message = append(elem, "message"); auto* content = append(message, "span"); - content->SetInnerRML("Configure controller port 1 in Settings."); + content->SetInnerRML("Configure Port 1 in Settings."); return elem; } diff --git a/src/dusk/ui/settings.cpp b/src/dusk/ui/settings.cpp index f12cb11ade..eb0df9fa6f 100644 --- a/src/dusk/ui/settings.cpp +++ b/src/dusk/ui/settings.cpp @@ -829,18 +829,18 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) { }); }; - leftPane.add_section("Controller"); - leftPane.register_control(leftPane.add_button("Configure Controller").on_pressed([this] { + leftPane.add_section("Inputs"); + leftPane.register_control(leftPane.add_button("Configure Inputs").on_pressed([this] { push(std::make_unique(mPrelaunch)); }), rightPane, [](Pane& pane) { pane.clear(); - pane.add_text("Open controller binding configuration."); + pane.add_text("Open input binding configuration."); }); config_bool_select(leftPane, rightPane, getSettings().game.allowBackgroundInput, { - .key = "Allow Background Input", - .helpText = "Allow controller input even when the game window is not focused.", + .key = "Allow Background Inputs", + .helpText = "Allow inputs even when the game window is not focused.", .onChange = [](bool value) { aurora_set_background_input(value); }, }); @@ -1247,7 +1247,7 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) { }); pane.add_button( { - .text = "Controller", + .text = "Missing Device", .isSelected = [] { return getSettings().game.enableControllerToasts.getValue(); }, }) diff --git a/src/dusk/ui/ui.cpp b/src/dusk/ui/ui.cpp index 89a174b000..90c1453948 100644 --- a/src/dusk/ui/ui.cpp +++ b/src/dusk/ui/ui.cpp @@ -132,7 +132,7 @@ void handle_event(const SDL_Event& event) noexcept { if (getSettings().game.enableControllerToasts) { const char* name = SDL_GetGamepadName(gamepad); Rml::String content = fmt::format("{}", name ? name : "[Unknown]"); - Rml::String title = "Controller connected"; + Rml::String title = "Device Connected"; if (const char* icon = connection_state_icon(SDL_GetGamepadConnectionState(gamepad))) { title = fmt::format( "{} &#x{};", title, @@ -165,7 +165,7 @@ void handle_event(const SDL_Event& event) noexcept { const char* name = SDL_GetGamepadNameForID(event.gdevice.which); push_toast({ .type = "controller", - .title = "Controller disconnected", + .title = "Device Disconnected", .content = name ? name : "[Unknown]", .duration = std::chrono::seconds(4), }); diff --git a/src/dusk/ui/ui.hpp b/src/dusk/ui/ui.hpp index 4a27ac7aac..cbfe3dcc9d 100644 --- a/src/dusk/ui/ui.hpp +++ b/src/dusk/ui/ui.hpp @@ -26,6 +26,8 @@ struct Toast { constexpr u32 kSoundClick = Z2SE_SY_CURSOR_OK; // "Play" button clicked/pressed constexpr u32 kSoundPlay = Z2SE_SY_ITEM_COMBINE_ON; +// Input binding changed +constexpr u32 kSoundBindingChanged = Z2SE_SY_ITEM_SET_X; // Menu button pressed (open/close menu bar or hide/show the active window) constexpr u32 kSoundMenuOpen = Z2SE_SY_MENU_SUB_IN; @@ -49,6 +51,8 @@ constexpr u32 kSoundItemDisable = Z2SE_SUBJ_VIEW_OUT; // Achievement unlocked constexpr u32 kSoundAchievementUnlock = Z2SE_NAVI_FLY; +// Warning prompt +constexpr u32 kSoundWarning = Z2SE_SY_COW_GET_IN; struct Insets { float top = 0.0f;