From ddce1b2752aa8f1b2430c05be72c50cd1c2e1228 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 18 Aug 2024 20:30:45 +1000 Subject: [PATCH] ImGuiOverlays: Change icon colour depending on controller mode --- src/core/analog_controller.cpp | 13 +++++++++---- src/core/analog_controller.h | 1 + src/core/controller.cpp | 5 +++++ src/core/controller.h | 3 +++ src/core/digital_controller.cpp | 2 +- src/core/imgui_overlays.cpp | 18 +++++++++++++++--- src/util/imgui_manager.cpp | 12 ++++++------ 7 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/core/analog_controller.cpp b/src/core/analog_controller.cpp index 17bebfd47..909c33306 100644 --- a/src/core/analog_controller.cpp +++ b/src/core/analog_controller.cpp @@ -65,7 +65,7 @@ void AnalogController::Reset() if (g_settings.controller_disable_analog_mode_forcing || System::IsRunningUnknownGame()) { Host::AddIconOSDMessage( - fmt::format("Controller{}AnalogMode", m_index), ICON_FA_GAMEPAD, + fmt::format("Controller{}AnalogMode", m_index), ICON_PF_GAMEPAD_ALT, TRANSLATE_STR("OSDMessage", "Analog mode forcing is disabled by game settings. Controller will start in digital mode."), 10.0f); @@ -279,6 +279,11 @@ std::optional AnalogController::GetAnalogInputBytes() const m_axis_state[static_cast(Axis::RightY)] << 8 | m_axis_state[static_cast(Axis::RightX)]; } +u32 AnalogController::GetInputOverlayIconColor() const +{ + return m_analog_mode ? 0xFF2534F0u : 0xFFCCCCCCu; +} + void AnalogController::ResetTransferState() { if (m_analog_toggle_queued) @@ -300,7 +305,7 @@ void AnalogController::SetAnalogMode(bool enabled, bool show_message) if (show_message) { Host::AddIconOSDMessage( - fmt::format("analog_mode_toggle_{}", m_index), ICON_FA_GAMEPAD, + fmt::format("analog_mode_toggle_{}", m_index), ICON_PF_GAMEPAD_ALT, enabled ? fmt::format(TRANSLATE_FS("Controller", "Controller {} switched to analog mode."), m_index + 1u) : fmt::format(TRANSLATE_FS("Controller", "Controller {} switched to digital mode."), m_index + 1u)); } @@ -313,7 +318,7 @@ void AnalogController::ProcessAnalogModeToggle() if (m_analog_locked) { Host::AddIconOSDMessage( - fmt::format("Controller{}AnalogMode", m_index), ICON_FA_GAMEPAD, + fmt::format("Controller{}AnalogMode", m_index), ICON_PF_GAMEPAD_ALT, fmt::format(m_analog_mode ? TRANSLATE_FS("AnalogController", "Controller {} is locked to analog mode by the game.") : TRANSLATE_FS("AnalogController", "Controller {} is locked to digital mode by the game."), @@ -875,7 +880,7 @@ static const SettingInfo s_settings[] = { const Controller::ControllerInfo AnalogController::INFO = {ControllerType::AnalogController, "AnalogController", TRANSLATE_NOOP("ControllerType", "Analog Controller"), - ICON_PF_GAMEPAD, + ICON_PF_GAMEPAD_ALT, s_binding_info, s_settings, Controller::VibrationCapabilities::LargeSmallMotors}; diff --git a/src/core/analog_controller.h b/src/core/analog_controller.h index 549a8cc37..b744fbf79 100644 --- a/src/core/analog_controller.h +++ b/src/core/analog_controller.h @@ -75,6 +75,7 @@ public: void SetBindState(u32 index, float value) override; u32 GetButtonStateBits() const override; std::optional GetAnalogInputBytes() const override; + u32 GetInputOverlayIconColor() const override; void ResetTransferState() override; bool Transfer(const u8 data_in, u8* data_out) override; diff --git a/src/core/controller.cpp b/src/core/controller.cpp index 7a6e5f6c9..76cf4a3a5 100644 --- a/src/core/controller.cpp +++ b/src/core/controller.cpp @@ -82,6 +82,11 @@ std::optional Controller::GetAnalogInputBytes() const return std::nullopt; } +u32 Controller::GetInputOverlayIconColor() const +{ + return 0xFFFFFFFFu; +} + void Controller::LoadSettings(SettingsInterface& si, const char* section) { } diff --git a/src/core/controller.h b/src/core/controller.h index 607b3b05b..32c20ef5d 100644 --- a/src/core/controller.h +++ b/src/core/controller.h @@ -89,6 +89,9 @@ public: /// Returns analog input bytes packed as a u32. Values are specific to controller type. virtual std::optional GetAnalogInputBytes() const; + /// Returns the colour to use in the input overlay. + virtual u32 GetInputOverlayIconColor() const; + /// Loads/refreshes any per-controller settings. virtual void LoadSettings(SettingsInterface& si, const char* section); diff --git a/src/core/digital_controller.cpp b/src/core/digital_controller.cpp index 76c5a7a0e..43377e47b 100644 --- a/src/core/digital_controller.cpp +++ b/src/core/digital_controller.cpp @@ -182,7 +182,7 @@ static const SettingInfo s_settings[] = { const Controller::ControllerInfo DigitalController::INFO = {ControllerType::DigitalController, "DigitalController", TRANSLATE_NOOP("ControllerType", "Digital Controller"), - ICON_PF_GAMEPAD, + ICON_PF_GAMEPAD_ALT, s_binding_info, s_settings, Controller::VibrationCapabilities::NoVibration}; diff --git a/src/core/imgui_overlays.cpp b/src/core/imgui_overlays.cpp index 25cfb43e5..f4a743fe7 100644 --- a/src/core/imgui_overlays.cpp +++ b/src/core/imgui_overlays.cpp @@ -648,10 +648,22 @@ void ImGuiManager::DrawInputsOverlay() if (!cinfo) continue; + float text_start_x = current_x; if (cinfo->icon_name) - text.format("{} {}", cinfo->icon_name, port + 1u); + { + const ImVec2 icon_size = font->CalcTextSizeA(font->FontSize, FLT_MAX, 0.0f, cinfo->icon_name); + const u32 icon_color = controller->GetInputOverlayIconColor(); + dl->AddText(font, font->FontSize, ImVec2(current_x + shadow_offset, current_y + shadow_offset), shadow_color, + cinfo->icon_name, nullptr, 0.0f, &clip_rect); + dl->AddText(font, font->FontSize, ImVec2(current_x, current_y), icon_color, cinfo->icon_name, nullptr, 0.0f, + &clip_rect); + text_start_x += icon_size.x; + text.format(" {}", port + 1u); + } else + { text.format("{} |", port + 1u); + } for (const Controller::ControllerBindingInfo& bi : cinfo->bindings) { @@ -687,9 +699,9 @@ void ImGuiManager::DrawInputsOverlay() } } - dl->AddText(font, font->FontSize, ImVec2(current_x + shadow_offset, current_y + shadow_offset), shadow_color, + dl->AddText(font, font->FontSize, ImVec2(text_start_x + shadow_offset, current_y + shadow_offset), shadow_color, text.c_str(), text.end_ptr(), 0.0f, &clip_rect); - dl->AddText(font, font->FontSize, ImVec2(current_x, current_y), text_color, text.c_str(), text.end_ptr(), 0.0f, + dl->AddText(font, font->FontSize, ImVec2(text_start_x, current_y), text_color, text.c_str(), text.end_ptr(), 0.0f, &clip_rect); current_y += font->FontSize + spacing; diff --git a/src/util/imgui_manager.cpp b/src/util/imgui_manager.cpp index c36a33260..03a410df1 100644 --- a/src/util/imgui_manager.cpp +++ b/src/util/imgui_manager.cpp @@ -554,12 +554,12 @@ bool ImGuiManager::AddIconFonts(float size) 0xf5aa, 0xf5aa, 0xf5e7, 0xf5e7, 0xf65d, 0xf65e, 0xf6a9, 0xf6a9, 0xf6cf, 0xf6cf, 0xf70c, 0xf70c, 0xf794, 0xf794, 0xf7a0, 0xf7a0, 0xf7c2, 0xf7c2, 0xf807, 0xf807, 0xf815, 0xf815, 0xf818, 0xf818, 0xf84c, 0xf84c, 0xf8cc, 0xf8cc, 0x0, 0x0}; - static constexpr ImWchar range_pf[] = {0x2196, 0x2199, 0x219e, 0x21a1, 0x21b0, 0x21b3, 0x21ba, 0x21c3, 0x21c7, 0x21ca, - 0x21d0, 0x21d4, 0x21dc, 0x21dd, 0x21e0, 0x21e3, 0x21ed, 0x21ee, 0x21f7, 0x21f8, - 0x21fa, 0x21fb, 0x227a, 0x227f, 0x2284, 0x2284, 0x235e, 0x235e, 0x2360, 0x2361, - 0x2364, 0x2366, 0x23b2, 0x23b4, 0x23ce, 0x23ce, 0x23f4, 0x23f7, 0x2427, 0x243a, - 0x243c, 0x243e, 0x2460, 0x246b, 0x24f5, 0x24fd, 0x24ff, 0x24ff, 0x2717, 0x2717, - 0x278a, 0x278e, 0x27fc, 0x27fc, 0xe001, 0xe001, 0xff21, 0xff3a, 0x0, 0x0}; + static constexpr ImWchar range_pf[] = { + 0x2196, 0x2199, 0x219e, 0x21a1, 0x21b0, 0x21b3, 0x21ba, 0x21c3, 0x21c7, 0x21ca, 0x21d0, 0x21d4, 0x21dc, + 0x21dd, 0x21e0, 0x21e3, 0x21ed, 0x21ee, 0x21f3, 0x21f3, 0x21f7, 0x21f8, 0x21fa, 0x21fb, 0x227a, 0x227f, + 0x2284, 0x2284, 0x235e, 0x235e, 0x2360, 0x2361, 0x2364, 0x2366, 0x23b2, 0x23b4, 0x23ce, 0x23ce, 0x23f4, + 0x23f7, 0x2427, 0x243a, 0x243c, 0x243e, 0x2460, 0x246b, 0x24f5, 0x24fd, 0x24ff, 0x24ff, 0x2717, 0x2717, + 0x278a, 0x278e, 0x27fc, 0x27fc, 0xe001, 0xe001, 0xff21, 0xff3a, 0x0, 0x0}; { ImFontConfig cfg;