#include "recompui/recompui.h" #include "zelda_game.h" #include "zelda_launcher.h" #include "hlsl++.h" // UI Components namespace { using namespace recompui; class SubtitleTitleButton : public Element { protected: Style selected_style; Style hover_style; Style focus_style; std::function pressed_callback; bool selected = false; bool right = false; bool soon = false; Element *exposed_contents = nullptr; Label *title = nullptr; Label *subtitle = nullptr; Element *soon_label_wrap = nullptr; Label *soon_label = nullptr; Label *soon_label_tm = nullptr; int soon_opacity = 0; int soon_opacity_goal = 0; // Element overrides. virtual void process_event(const Event &e) override { switch (e.type) { case EventType::Click: if (!soon && !selected && pressed_callback) { pressed_callback(); } break; case EventType::Hover: if (soon) { soon_opacity_goal = std::get(e.variant).active ? 255 : 0; queue_update(); } else { set_style_enabled(hover_state, std::get(e.variant).active && !selected); } break; case EventType::Focus: if (!soon) { set_style_enabled(focus_state, std::get(e.variant).active); } break; case EventType::Update: if (soon && soon_opacity_goal != soon_opacity) { int rate = soon_opacity_goal < soon_opacity ? -1 : 1; soon_opacity += rate; soon_label_tm->set_color(theme::color::TextDim, soon_opacity); queue_update(); } break; default: assert(false && "Unknown event type."); break; } }; std::string_view get_type_name() override { return "SubtitleTitleButton"; } public: SubtitleTitleButton(ResourceId rid, Element *parent, const std::string &text, bool right_align = false, bool soon = false) : Element(rid, parent, Events(EventType::Click, EventType::Hover, EventType::Enable, EventType::Focus, EventType::Update), "button", false) { auto context = recompui::get_current_context(); this->soon = soon; right = right_align; set_display(Display::Block); set_position(Position::Relative); set_width_auto(); set_height_auto(); set_padding(0); set_background_color(theme::color::Transparent); set_color(theme::color::TextDim); set_text_align(right ? TextAlign::Right : TextAlign::Left); set_opacity(0.5); selected_style.set_color(theme::color::Text); selected_style.set_cursor(Cursor::None); selected_style.set_opacity(1); hover_style.set_color(theme::color::Primary); hover_style.set_opacity(1); focus_style.set_color(theme::color::Primary); focus_style.set_opacity(1); if (!soon) { enable_focus(); set_cursor(Cursor::Pointer); } add_style(&selected_style, checked_state); add_style(&hover_style, hover_state); add_style(&focus_style, focus_state); title = context.create_element