mirror of
https://github.com/Mr-Wiseguy/Zelda64Recomp.git
synced 2025-02-22 22:27:15 +01:00
Auto-enabled mods.
This commit is contained in:
parent
aba393b550
commit
3298211a84
@ -6,6 +6,13 @@ namespace recompui {
|
||||
|
||||
Label::Label(Element *parent, LabelStyle label_style) : Element(parent) {
|
||||
switch (label_style) {
|
||||
case LabelStyle::Annotation:
|
||||
set_color(Color{ 185, 125, 242, 255 });
|
||||
set_font_size(18.0f);
|
||||
set_letter_spacing(2.52f);
|
||||
set_line_height(18.0f);
|
||||
set_font_weight(400);
|
||||
break;
|
||||
case LabelStyle::Small:
|
||||
set_font_size(20.0f);
|
||||
set_letter_spacing(0.0f);
|
||||
|
@ -5,6 +5,7 @@
|
||||
namespace recompui {
|
||||
|
||||
enum class LabelStyle {
|
||||
Annotation,
|
||||
Small,
|
||||
Normal,
|
||||
Large
|
||||
|
@ -55,9 +55,18 @@ ModDetailsPanel::ModDetailsPanel(Element *parent) : Element(parent) {
|
||||
buttons_container = context.create_element<Container>(this, FlexDirection::Row, JustifyContent::SpaceAround);
|
||||
buttons_container->set_flex(0.0f, 0.0f);
|
||||
buttons_container->set_padding(16.0f);
|
||||
buttons_container->set_justify_content(JustifyContent::SpaceBetween);
|
||||
{
|
||||
enable_toggle = context.create_element<Toggle>(buttons_container);
|
||||
enable_toggle->add_checked_callback(std::bind(&ModDetailsPanel::enable_toggle_checked, this, std::placeholders::_1));
|
||||
enable_container = context.create_element<Container>(buttons_container, FlexDirection::Row, JustifyContent::FlexStart);
|
||||
enable_container->set_align_items(AlignItems::Center);
|
||||
enable_container->set_gap(16.0f);
|
||||
{
|
||||
enable_toggle = context.create_element<Toggle>(enable_container);
|
||||
enable_toggle->add_checked_callback(std::bind(&ModDetailsPanel::enable_toggle_checked, this, std::placeholders::_1));
|
||||
|
||||
enable_label = context.create_element<Label>(enable_container, "A currently enabled mod requires this mod", LabelStyle::Annotation);
|
||||
}
|
||||
|
||||
configure_button = context.create_element<Button>(buttons_container, "Configure", recompui::ButtonStyle::Secondary);
|
||||
configure_button->add_pressed_callback(std::bind(&ModDetailsPanel::configure_button_pressed, this));
|
||||
}
|
||||
@ -66,7 +75,7 @@ ModDetailsPanel::ModDetailsPanel(Element *parent) : Element(parent) {
|
||||
ModDetailsPanel::~ModDetailsPanel() {
|
||||
}
|
||||
|
||||
void ModDetailsPanel::set_mod_details(const recomp::mods::ModDetails& details, const std::string &thumbnail, bool mod_enabled, bool toggle_enabled, bool configure_enabled) {
|
||||
void ModDetailsPanel::set_mod_details(const recomp::mods::ModDetails& details, const std::string &thumbnail, bool toggle_checked, bool toggle_enabled, bool toggle_label_visible, bool configure_enabled) {
|
||||
cur_details = details;
|
||||
|
||||
thumbnail_image->set_src(thumbnail);
|
||||
@ -83,9 +92,10 @@ void ModDetailsPanel::set_mod_details(const recomp::mods::ModDetails& details, c
|
||||
|
||||
authors_label->set_text(authors_str);
|
||||
description_label->set_text(cur_details.description);
|
||||
enable_toggle->set_checked(mod_enabled);
|
||||
enable_toggle->set_checked(toggle_checked);
|
||||
enable_toggle->set_enabled(toggle_enabled);
|
||||
configure_button->set_enabled(configure_enabled);
|
||||
enable_label->set_display(toggle_label_visible ? Display::Block : Display::None);
|
||||
}
|
||||
|
||||
void ModDetailsPanel::set_mod_toggled_callback(std::function<void(bool)> callback) {
|
||||
|
@ -14,7 +14,7 @@ class ModDetailsPanel : public Element {
|
||||
public:
|
||||
ModDetailsPanel(Element *parent);
|
||||
virtual ~ModDetailsPanel();
|
||||
void set_mod_details(const recomp::mods::ModDetails& details, const std::string &thumbnail, bool mod_enabled, bool toggle_enabled, bool configure_enabled);
|
||||
void set_mod_details(const recomp::mods::ModDetails& details, const std::string &thumbnail, bool toggle_checked, bool toggle_enabled, bool toggle_label_visible, bool configure_enabled);
|
||||
void set_mod_toggled_callback(std::function<void(bool)> callback);
|
||||
void set_mod_configure_pressed_callback(std::function<void()> callback);
|
||||
private:
|
||||
@ -30,7 +30,9 @@ private:
|
||||
Label *authors_label = nullptr;
|
||||
Element *spacer_element = nullptr;
|
||||
Container *buttons_container = nullptr;
|
||||
Container *enable_container = nullptr;
|
||||
Toggle *enable_toggle = nullptr;
|
||||
Label *enable_label = nullptr;
|
||||
Button *configure_button = nullptr;
|
||||
std::function<void(bool)> mod_toggled_callback = nullptr;
|
||||
std::function<void()> mod_configure_pressed_callback = nullptr;
|
||||
|
@ -19,6 +19,10 @@ static std::string generate_thumbnail_src_for_mod(const std::string &mod_id) {
|
||||
return "?/mods/" + mod_id + "/thumb";
|
||||
}
|
||||
|
||||
static bool is_mod_enabled_or_auto(const std::string &mod_id) {
|
||||
return recomp::mods::is_mod_enabled(mod_id) || recomp::mods::is_mod_auto_enabled(mod_id);
|
||||
}
|
||||
|
||||
// ModEntryView
|
||||
|
||||
ModEntryView::ModEntryView(Element *parent) : Element(parent) {
|
||||
@ -80,6 +84,10 @@ void ModEntryView::set_mod_thumbnail(const std::string &thumbnail) {
|
||||
thumbnail_image->set_src(thumbnail);
|
||||
}
|
||||
|
||||
void ModEntryView::set_mod_enabled(bool enabled) {
|
||||
set_opacity(enabled ? 1.0f : 0.5f);
|
||||
}
|
||||
|
||||
void ModEntryView::set_selected(bool selected) {
|
||||
set_style_enabled(checked_state, selected);
|
||||
}
|
||||
@ -115,6 +123,10 @@ void ModEntryButton::set_mod_thumbnail(const std::string &thumbnail) {
|
||||
view->set_mod_thumbnail(thumbnail);
|
||||
}
|
||||
|
||||
void ModEntryButton::set_mod_enabled(bool enabled) {
|
||||
view->set_mod_enabled(enabled);
|
||||
}
|
||||
|
||||
void ModEntryButton::set_selected(bool selected) {
|
||||
view->set_selected(selected);
|
||||
}
|
||||
@ -219,6 +231,11 @@ void ModMenu::open_mods_folder() {
|
||||
void ModMenu::mod_toggled(bool enabled) {
|
||||
if (active_mod_index >= 0) {
|
||||
recomp::mods::enable_mod(mod_details[active_mod_index].mod_id, enabled);
|
||||
|
||||
// Refresh enabled status for all mods in case one of them got auto-enabled due to being a dependency.
|
||||
for (size_t i = 0; i < mod_entry_buttons.size(); i++) {
|
||||
mod_entry_buttons[i]->set_mod_enabled(is_mod_enabled_or_auto(mod_details[i].mod_id));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -232,11 +249,11 @@ void ModMenu::mod_selected(uint32_t mod_index) {
|
||||
if (active_mod_index >= 0) {
|
||||
std::string thumbnail_src = generate_thumbnail_src_for_mod(mod_details[mod_index].mod_id);
|
||||
const recomp::mods::ConfigSchema &config_schema = recomp::mods::get_mod_config_schema(mod_details[active_mod_index].mod_id);
|
||||
bool mod_enabled = recomp::mods::is_mod_enabled(mod_details[mod_index].mod_id);
|
||||
bool toggle_checked = is_mod_enabled_or_auto(mod_details[mod_index].mod_id);
|
||||
bool auto_enabled = recomp::mods::is_mod_auto_enabled(mod_details[mod_index].mod_id);
|
||||
bool toggle_enabled = !auto_enabled && (mod_details[mod_index].runtime_toggleable || !ultramodern::is_game_started());
|
||||
bool configure_enabled = !config_schema.options.empty();
|
||||
mod_details_panel->set_mod_details(mod_details[mod_index], thumbnail_src, mod_enabled, toggle_enabled, configure_enabled);
|
||||
mod_details_panel->set_mod_details(mod_details[mod_index], thumbnail_src, toggle_checked, toggle_enabled, auto_enabled, configure_enabled);
|
||||
mod_entry_buttons[active_mod_index]->set_selected(true);
|
||||
}
|
||||
}
|
||||
@ -260,6 +277,7 @@ void ModMenu::mod_dragged(uint32_t mod_index, EventDrag drag) {
|
||||
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));
|
||||
mod_entry_floating_view->set_mod_enabled(is_mod_enabled_or_auto(mod_details[mod_index].mod_id));
|
||||
mod_entry_floating_view->set_left(left, Unit::Px);
|
||||
mod_entry_floating_view->set_top(top, Unit::Px);
|
||||
mod_entry_floating_view->set_width(width, Unit::Px);
|
||||
@ -318,6 +336,7 @@ void ModMenu::mod_dragged(uint32_t mod_index, EventDrag drag) {
|
||||
for (size_t i = 0; i < mod_entry_buttons.size(); i++) {
|
||||
mod_entry_buttons[i]->set_mod_details(mod_details[i]);
|
||||
mod_entry_buttons[i]->set_mod_thumbnail(generate_thumbnail_src_for_mod(mod_details[i].mod_id));
|
||||
mod_entry_buttons[i]->set_mod_enabled(is_mod_enabled_or_auto(mod_details[i].mod_id));
|
||||
}
|
||||
|
||||
mod_entry_buttons[mod_drag_target_index]->set_selected(true);
|
||||
@ -430,6 +449,7 @@ void ModMenu::create_mod_list() {
|
||||
mod_entry->set_mod_drag_callback(std::bind(&ModMenu::mod_dragged, this, std::placeholders::_1, std::placeholders::_2));
|
||||
mod_entry->set_mod_details(mod_details[mod_index]);
|
||||
mod_entry->set_mod_thumbnail(thumbnail_name);
|
||||
mod_entry->set_mod_enabled(is_mod_enabled_or_auto(mod_details[mod_index].mod_id));
|
||||
mod_entry_buttons.emplace_back(mod_entry);
|
||||
}
|
||||
|
||||
|
@ -16,6 +16,7 @@ public:
|
||||
virtual ~ModEntryView();
|
||||
void set_mod_details(const recomp::mods::ModDetails &details);
|
||||
void set_mod_thumbnail(const std::string &thumbnail);
|
||||
void set_mod_enabled(bool enabled);
|
||||
void set_selected(bool selected);
|
||||
private:
|
||||
Image *thumbnail_image = nullptr;
|
||||
@ -35,6 +36,7 @@ public:
|
||||
void set_mod_drag_callback(std::function<void(uint32_t, EventDrag)> callback);
|
||||
void set_mod_details(const recomp::mods::ModDetails &details);
|
||||
void set_mod_thumbnail(const std::string &thumbnail);
|
||||
void set_mod_enabled(bool enabled);
|
||||
void set_selected(bool selected);
|
||||
protected:
|
||||
virtual void process_event(const Event &e) override;
|
||||
|
Loading…
x
Reference in New Issue
Block a user