From 11170491b525f889d18d97bd48d238ed3a3b8cb0 Mon Sep 17 00:00:00 2001 From: Dario Date: Wed, 16 Apr 2025 20:28:23 -0300 Subject: [PATCH] Focused state for mod entry. --- src/ui/ui_mod_menu.cpp | 32 ++++++++++++++++++++++++++++++-- src/ui/ui_mod_menu.h | 4 ++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/ui/ui_mod_menu.cpp b/src/ui/ui_mod_menu.cpp index 05c8698..b0e39d0 100644 --- a/src/ui/ui_mod_menu.cpp +++ b/src/ui/ui_mod_menu.cpp @@ -1,4 +1,5 @@ #include "ui_mod_menu.h" +#include "ui_utils.h" #include "recomp_ui.h" #include "zelda_support.h" #include "zelda_render.h" @@ -35,7 +36,7 @@ constexpr float modEntryPadding = 4.0f; extern const std::string mod_tab_id; const std::string mod_tab_id = "#tab_mods"; -ModEntryView::ModEntryView(Element *parent) : Element(parent) { +ModEntryView::ModEntryView(Element *parent) : Element(parent, Events(EventType::Update)) { ContextId context = get_current_context(); set_display(Display::Flex); @@ -54,6 +55,7 @@ ModEntryView::ModEntryView(Element *parent) : Element(parent) { checked_style.set_background_color(Color{ 26, 24, 32, 255 }); hover_style.set_border_color(Color{ COL_TEXT_DEFAULT, 64 }); checked_hover_style.set_border_color(Color{ COL_TEXT_DEFAULT, 255 }); + pulsing_style.set_border_color(Color{ 23, 214, 232, 244 }); { thumbnail_image = context.create_element(this, ""); @@ -83,6 +85,7 @@ ModEntryView::ModEntryView(Element *parent) : Element(parent) { add_style(&checked_style, checked_state); add_style(&hover_style, hover_state); add_style(&checked_hover_style, { checked_state, hover_state }); + add_style(&pulsing_style, { focus_state }); } ModEntryView::~ModEntryView() { @@ -106,6 +109,25 @@ void ModEntryView::set_selected(bool selected) { set_style_enabled(checked_state, selected); } +void ModEntryView::set_focused(bool focused) { + set_style_enabled(focus_state, focused); +} + +void ModEntryView::process_event(const Event &e) { + switch (e.type) { + case EventType::Update: + if (is_style_enabled(focus_state)) { + pulsing_style.set_color(recompui::get_pulse_color(750)); + apply_styles(); + queue_update(); + } + + break; + default: + break; + } +} + // ModEntryButton ModEntryButton::ModEntryButton(Element *parent, uint32_t mod_index) : Element(parent, Events(EventType::Click, EventType::Hover, EventType::Focus, EventType::Drag)) { @@ -146,11 +168,16 @@ void ModEntryButton::set_selected(bool selected) { view->set_selected(selected); } +void ModEntryButton::set_focused(bool focused) { + view->set_focused(focused); + view->queue_update(); +} + void ModEntryButton::process_event(const Event& e) { switch (e.type) { - case EventType::Click: case EventType::Focus: selected_callback(mod_index); + set_focused(std::get(e.variant).active); break; case EventType::Hover: view->set_style_enabled(hover_state, std::get(e.variant).active); @@ -335,6 +362,7 @@ void ModMenu::mod_dragged(uint32_t mod_index, EventDrag drag) { float left = mod_entry_buttons[mod_index]->get_absolute_left() - get_absolute_left(); float top = mod_entry_buttons[mod_index]->get_absolute_top() - (height / 2.0f); // TODO: Figure out why this adjustment is even necessary. mod_entry_buttons[mod_index]->set_display(Display::None); + mod_entry_buttons[mod_index]->set_focused(false); mod_entry_floating_view->set_display(Display::Flex); mod_entry_floating_view->set_mod_details(mod_details[mod_index]); mod_entry_floating_view->set_mod_thumbnail(generate_thumbnail_src_for_mod(mod_details[mod_index].mod_id)); diff --git a/src/ui/ui_mod_menu.h b/src/ui/ui_mod_menu.h index e867710..85860c0 100644 --- a/src/ui/ui_mod_menu.h +++ b/src/ui/ui_mod_menu.h @@ -18,7 +18,9 @@ public: void set_mod_thumbnail(const std::string &thumbnail); void set_mod_enabled(bool enabled); void set_selected(bool selected); + void set_focused(bool focused); protected: + virtual void process_event(const Event &e) override; std::string_view get_type_name() override { return "ModEntryView"; } private: Image *thumbnail_image = nullptr; @@ -28,6 +30,7 @@ private: Style checked_style; Style hover_style; Style checked_hover_style; + Style pulsing_style; }; class ModEntryButton : public Element { @@ -40,6 +43,7 @@ public: void set_mod_thumbnail(const std::string &thumbnail); void set_mod_enabled(bool enabled); void set_selected(bool selected); + void set_focused(bool focused); protected: virtual void process_event(const Event &e) override; std::string_view get_type_name() override { return "ModEntryButton"; }