FullscreenUI: Add binding of vibration motors

This commit is contained in:
Stenzek 2025-01-11 18:54:07 +10:00
parent 6f9caa6b12
commit 2298227054
No known key found for this signature in database
1 changed files with 63 additions and 6 deletions

View File

@ -73,7 +73,9 @@ public:
#define FSUI_FSTR(str) fmt::runtime(Host::TranslateToStringView(TR_CONTEXT, str)) #define FSUI_FSTR(str) fmt::runtime(Host::TranslateToStringView(TR_CONTEXT, str))
#define FSUI_NSTR(str) str #define FSUI_NSTR(str) str
using ImGuiFullscreen::ChoiceDialogOptions;
using ImGuiFullscreen::FocusResetType; using ImGuiFullscreen::FocusResetType;
using ImGuiFullscreen::LAYOUT_FOOTER_HEIGHT; using ImGuiFullscreen::LAYOUT_FOOTER_HEIGHT;
using ImGuiFullscreen::LAYOUT_LARGE_FONT_SIZE; using ImGuiFullscreen::LAYOUT_LARGE_FONT_SIZE;
using ImGuiFullscreen::LAYOUT_MEDIUM_FONT_SIZE; using ImGuiFullscreen::LAYOUT_MEDIUM_FONT_SIZE;
@ -373,6 +375,8 @@ static void PopulatePatchesAndCheatsList(const std::string_view serial);
static void PopulatePostProcessingChain(SettingsInterface* si, const char* section); static void PopulatePostProcessingChain(SettingsInterface* si, const char* section);
static void BeginInputBinding(SettingsInterface* bsi, InputBindingInfo::Type type, std::string_view section, static void BeginInputBinding(SettingsInterface* bsi, InputBindingInfo::Type type, std::string_view section,
std::string_view key, std::string_view display_name); std::string_view key, std::string_view display_name);
static void BeginVibrationMotorBinding(SettingsInterface* bsi, InputBindingInfo::Type type, const char* section,
const char* key, std::string_view display_name);
static void DrawInputBindingWindow(); static void DrawInputBindingWindow();
static void DrawInputBindingButton(SettingsInterface* bsi, InputBindingInfo::Type type, const char* section, static void DrawInputBindingButton(SettingsInterface* bsi, InputBindingInfo::Type type, const char* section,
const char* name, const char* display_name, const char* icon_name, const char* name, const char* display_name, const char* icon_name,
@ -1823,7 +1827,10 @@ void FullscreenUI::DrawInputBindingButton(SettingsInterface* bsi, InputBindingIn
if (clicked) if (clicked)
{ {
BeginInputBinding(bsi, type, section, name, display_name); if (type == InputBindingInfo::Type::Motor)
BeginVibrationMotorBinding(bsi, type, section, name, display_name);
else
BeginInputBinding(bsi, type, section, name, display_name);
} }
else if (ImGui::IsItemClicked(ImGuiMouseButton_Right) || ImGui::IsKeyPressed(ImGuiKey_NavGamepadMenu, false)) else if (ImGui::IsItemClicked(ImGuiMouseButton_Right) || ImGui::IsKeyPressed(ImGuiKey_NavGamepadMenu, false))
{ {
@ -1935,6 +1942,55 @@ void FullscreenUI::BeginInputBinding(SettingsInterface* bsi, InputBindingInfo::T
}); });
} }
void FullscreenUI::BeginVibrationMotorBinding(SettingsInterface* bsi, InputBindingInfo::Type type, const char* section,
const char* key, std::string_view display_name)
{
// vibration motors use a list to select
const bool game_settings = IsEditingGameSettings(bsi);
InputManager::VibrationMotorList motors = InputManager::EnumerateVibrationMotors();
if (motors.empty())
{
ShowToast({}, FSUI_STR("No devices with vibration motors were detected."));
return;
}
const TinyString current_binding = bsi->GetTinyStringValue(section, key);
size_t current_index = motors.size();
ChoiceDialogOptions options;
options.reserve(motors.size() + 1);
for (size_t i = 0; i < motors.size(); i++)
{
std::string text = InputManager::ConvertInputBindingKeyToString(InputBindingInfo::Type::Motor, motors[i]);
const bool this_index = (current_binding.view() == text);
current_index = this_index ? i : current_index;
options.emplace_back(std::move(text), this_index);
}
// empty/no mapping value
options.emplace_back(FSUI_STR("No Vibration"), current_binding.empty());
// add current value to list if it's not currently available
if (!current_binding.empty() && current_index == motors.size())
options.emplace_back(std::make_pair(std::string(current_binding.view()), true));
OpenChoiceDialog(display_name, false, std::move(options),
[game_settings, section = std::string(section), key = std::string(key),
motors = std::move(motors)](s32 index, const std::string& title, bool checked) {
if (index >= 0)
{
auto lock = Host::GetSettingsLock();
SettingsInterface* bsi = GetEditingSettingsInterface(game_settings);
if (static_cast<size_t>(index) == motors.size())
bsi->DeleteValue(section.c_str(), key.c_str());
else
bsi->SetStringValue(section.c_str(), key.c_str(), title.c_str());
SetSettingsChanged(bsi);
}
CloseChoiceDialog();
});
}
void FullscreenUI::DrawInputBindingWindow() void FullscreenUI::DrawInputBindingWindow()
{ {
DebugAssert(s_state.input_binding_type != InputBindingInfo::Type::Unknown); DebugAssert(s_state.input_binding_type != InputBindingInfo::Type::Unknown);
@ -3755,11 +3811,10 @@ void FullscreenUI::DrawEmulationSettingsPage()
FSUI_NSTR("4 Frames"), FSUI_NSTR("5 Frames"), FSUI_NSTR("6 Frames"), FSUI_NSTR("7 Frames"), FSUI_NSTR("4 Frames"), FSUI_NSTR("5 Frames"), FSUI_NSTR("6 Frames"), FSUI_NSTR("7 Frames"),
FSUI_NSTR("8 Frames"), FSUI_NSTR("9 Frames"), FSUI_NSTR("10 Frames")}; FSUI_NSTR("8 Frames"), FSUI_NSTR("9 Frames"), FSUI_NSTR("10 Frames")};
DrawIntListSetting( DrawIntListSetting(bsi, FSUI_ICONSTR(ICON_FA_RUNNING, "Runahead"),
bsi, FSUI_ICONSTR(ICON_FA_RUNNING, "Runahead"), FSUI_CSTR("Simulates the system ahead of time and rolls back/replays to reduce input lag. Very "
FSUI_CSTR( "high system requirements."),
"Simulates the system ahead of time and rolls back/replays to reduce input lag. Very high system requirements."), "Main", "RunaheadFrameCount", 0, runahead_options);
"Main", "RunaheadFrameCount", 0, runahead_options);
TinyString rewind_summary; TinyString rewind_summary;
if (runahead_enabled) if (runahead_enabled)
@ -8410,7 +8465,9 @@ TRANSLATE_NOOP("FullscreenUI", "Mute CD Audio");
TRANSLATE_NOOP("FullscreenUI", "Navigate"); TRANSLATE_NOOP("FullscreenUI", "Navigate");
TRANSLATE_NOOP("FullscreenUI", "No Binding"); TRANSLATE_NOOP("FullscreenUI", "No Binding");
TRANSLATE_NOOP("FullscreenUI", "No Game Selected"); TRANSLATE_NOOP("FullscreenUI", "No Game Selected");
TRANSLATE_NOOP("FullscreenUI", "No Vibration");
TRANSLATE_NOOP("FullscreenUI", "No cheats are available for this game."); TRANSLATE_NOOP("FullscreenUI", "No cheats are available for this game.");
TRANSLATE_NOOP("FullscreenUI", "No devices with vibration motors were detected.");
TRANSLATE_NOOP("FullscreenUI", "No input profiles available."); TRANSLATE_NOOP("FullscreenUI", "No input profiles available.");
TRANSLATE_NOOP("FullscreenUI", "No patches are available for this game."); TRANSLATE_NOOP("FullscreenUI", "No patches are available for this game.");
TRANSLATE_NOOP("FullscreenUI", "No resume save state found."); TRANSLATE_NOOP("FullscreenUI", "No resume save state found.");