From 0129ffd4663c003d4f4e0f3c0320b6f35a81dbb2 Mon Sep 17 00:00:00 2001 From: Michael Alexsander Date: Thu, 30 Oct 2025 13:21:45 -0300 Subject: [PATCH] Fix author names not showing up in the AssetLib --- .../asset_library_editor_plugin.cpp | 59 ++++++++++++++++++- .../asset_library_editor_plugin.h | 11 ++++ scene/gui/link_button.cpp | 4 ++ scene/gui/link_button.h | 1 + 4 files changed, 72 insertions(+), 3 deletions(-) diff --git a/editor/asset_library/asset_library_editor_plugin.cpp b/editor/asset_library/asset_library_editor_plugin.cpp index 16667f10772..42de15d8b6b 100644 --- a/editor/asset_library/asset_library_editor_plugin.cpp +++ b/editor/asset_library/asset_library_editor_plugin.cpp @@ -65,6 +65,8 @@ void EditorAssetLibraryItem::configure(const String &p_title, int p_asset_id, co author->set_text(p_author); author_id = p_author_id; price->set_text(p_cost); + + _calculate_misc_links_size(); } void EditorAssetLibraryItem::set_image(int p_type, int p_index, const Ref &p_image) { @@ -87,10 +89,53 @@ void EditorAssetLibraryItem::_notification(int p_what) { author->add_theme_color_override("font_pressed_color", Color(0.5, 0.5, 0.5)); author->add_theme_color_override("font_hover_color", Color(0.5, 0.5, 0.5)); } + + calculate_misc_links_ratio(); + } break; + + case NOTIFICATION_THEME_CHANGED: + case NOTIFICATION_TRANSLATION_CHANGED: { + _calculate_misc_links_size(); + calculate_misc_links_ratio(); } break; } } +void EditorAssetLibraryItem::_calculate_misc_links_size() { + Ref text_buf; + text_buf.instantiate(); + text_buf->add_string(author->get_text(), author->get_button_font(), author->get_button_font_size()); + author_width = text_buf->get_line_width(); + + text_buf->clear(); + const Ref font = get_theme_font(SceneStringName(font), SNAME("Label")); + const int font_size = get_theme_font_size(SceneStringName(font_size), SNAME("Label")); + text_buf->add_string(price->get_text(), font, font_size); + price_width = text_buf->get_line_width(); +} + +void EditorAssetLibraryItem::calculate_misc_links_ratio() { + const int separators_width = 15 * EDSCALE; + const float total_width = author_price_hbox->get_size().width - (separator->get_size().width + separators_width); + if (total_width <= 0) { + return; + } + + float ratio_left = 1; + // Make the ratios a fraction bigger, to avoid unnecessary trimming. + const float extra_ratio = 4.0 / total_width; + + const float author_ratio = MIN(1, author_width / total_width); + author->set_stretch_ratio(author_ratio + extra_ratio); + ratio_left -= author_ratio; + + const float price_ratio = MIN(1, price_width / total_width); + price->set_stretch_ratio(price_ratio + extra_ratio); + ratio_left -= price_ratio; + + spacer->set_stretch_ratio(ratio_left); +} + void EditorAssetLibraryItem::_asset_clicked() { emit_signal(SNAME("asset_selected"), asset_id); } @@ -144,7 +189,7 @@ EditorAssetLibraryItem::EditorAssetLibraryItem(bool p_clickable) { category->set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER); vb->add_child(category); - HBoxContainer *author_price_hbox = memnew(HBoxContainer); + author_price_hbox = memnew(HBoxContainer); author_price_hbox->add_theme_constant_override("separation", 5 * EDSCALE); vb->add_child(author_price_hbox); @@ -152,9 +197,11 @@ EditorAssetLibraryItem::EditorAssetLibraryItem(bool p_clickable) { author->set_tooltip_text(TTRC("Author")); author->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS); author->set_accessibility_name(TTRC("Author")); + author->set_h_size_flags(Control::SIZE_EXPAND_FILL); author_price_hbox->add_child(author); - author_price_hbox->add_child(memnew(HSeparator)); + separator = memnew(HSeparator); + author_price_hbox->add_child(separator); if (p_clickable) { author->set_underline_mode(LinkButton::UNDERLINE_MODE_ON_HOVER); @@ -178,11 +225,16 @@ EditorAssetLibraryItem::EditorAssetLibraryItem(bool p_clickable) { price->set_focus_mode(FOCUS_ACCESSIBILITY); price->add_theme_style_override(CoreStringName(normal), label_margin); price->set_tooltip_text(TTRC("License")); + price->set_text_overrun_behavior(TextServer::OVERRUN_TRIM_ELLIPSIS); price->set_accessibility_name(TTRC("License")); + price->set_h_size_flags(Control::SIZE_EXPAND_FILL); price->set_mouse_filter(MOUSE_FILTER_PASS); - author_price_hbox->add_child(price); + spacer = memnew(Control); + spacer->set_h_size_flags(Control::SIZE_EXPAND_FILL); + author_price_hbox->add_child(spacer); + set_custom_minimum_size(Size2(250, 80) * EDSCALE); set_h_size_flags(Control::SIZE_EXPAND_FILL); } @@ -1386,6 +1438,7 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const EditorAssetLibraryItem *item = memnew(EditorAssetLibraryItem(true)); asset_items->add_child(item); + asset_items->connect(SceneStringName(sort_children), callable_mp(item, &EditorAssetLibraryItem::calculate_misc_links_ratio)); item->configure(r["title"], r["asset_id"], category_map[r["category_id"]], r["category_id"], r["author"], r["author_id"], r["cost"]); item->connect("asset_selected", callable_mp(this, &EditorAssetLibrary::_select_asset)); item->connect("author_selected", callable_mp(this, &EditorAssetLibrary::_select_author)); diff --git a/editor/asset_library/asset_library_editor_plugin.h b/editor/asset_library/asset_library_editor_plugin.h index 2628dfdaabb..757b7fa2260 100644 --- a/editor/asset_library/asset_library_editor_plugin.h +++ b/editor/asset_library/asset_library_editor_plugin.h @@ -47,6 +47,7 @@ #include "scene/main/http_request.h" class EditorFileDialog; +class HSeparator; class MenuButton; class EditorAssetLibraryItem : public PanelContainer { @@ -57,16 +58,24 @@ class EditorAssetLibraryItem : public PanelContainer { LinkButton *category = nullptr; LinkButton *author = nullptr; Label *price = nullptr; + HSeparator *separator = nullptr; + Control *spacer = nullptr; + HBoxContainer *author_price_hbox = nullptr; String title_text; int asset_id = 0; int category_id = 0; int author_id = 0; + int author_width = 0; + int price_width = 0; + void _asset_clicked(); void _category_clicked(); void _author_clicked(); + void _calculate_misc_links_size(); + void set_image(int p_type, int p_index, const Ref &p_image); protected: @@ -76,6 +85,8 @@ protected: public: void configure(const String &p_title, int p_asset_id, const String &p_category, int p_category_id, const String &p_author, int p_author_id, const String &p_cost); + void calculate_misc_links_ratio(); + EditorAssetLibraryItem(bool p_clickable = false); }; diff --git a/scene/gui/link_button.cpp b/scene/gui/link_button.cpp index abb12ec2cde..54e5cf58ef9 100644 --- a/scene/gui/link_button.cpp +++ b/scene/gui/link_button.cpp @@ -154,6 +154,10 @@ Ref LinkButton::get_button_font() const { return theme_cache.font; } +int LinkButton::get_button_font_size() const { + return theme_cache.font_size; +} + void LinkButton::pressed() { if (uri.is_empty()) { return; diff --git a/scene/gui/link_button.h b/scene/gui/link_button.h index a833c2c024d..324b9ad6d28 100644 --- a/scene/gui/link_button.h +++ b/scene/gui/link_button.h @@ -108,6 +108,7 @@ public: UnderlineMode get_underline_mode() const; Ref get_button_font() const; + int get_button_font_size() const; LinkButton(const String &p_text = String()); };