From af48059e9774dab4288a1b58db59e06867463f0d Mon Sep 17 00:00:00 2001 From: arkology <43543909+arkology@users.noreply.github.com> Date: Mon, 23 Dec 2024 13:33:22 +0300 Subject: [PATCH] Add borders to `BitMap` in `BitMapEditor` --- editor/plugins/bit_map_editor_plugin.cpp | 43 +++++++++++++++++++++--- editor/plugins/bit_map_editor_plugin.h | 11 ++++++ 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/editor/plugins/bit_map_editor_plugin.cpp b/editor/plugins/bit_map_editor_plugin.cpp index 668ea04d698..cb4d8d49112 100644 --- a/editor/plugins/bit_map_editor_plugin.cpp +++ b/editor/plugins/bit_map_editor_plugin.cpp @@ -30,22 +30,57 @@ #include "bit_map_editor_plugin.h" +#include "editor/editor_string_names.h" #include "editor/themes/editor_scale.h" +#include "scene/gui/aspect_ratio_container.h" #include "scene/gui/label.h" +#include "scene/gui/margin_container.h" #include "scene/gui/texture_rect.h" #include "scene/resources/image_texture.h" void BitMapEditor::setup(const Ref &p_bitmap) { - texture_rect->set_texture(ImageTexture::create_from_image(p_bitmap->convert_to_image())); + Ref bitmap_texture = ImageTexture::create_from_image(p_bitmap->convert_to_image()); + texture_rect->set_texture(bitmap_texture); + centering_container->set_ratio(bitmap_texture->get_size().aspect()); size_label->set_text(vformat(U"%s×%s", p_bitmap->get_size().width, p_bitmap->get_size().height)); } +void BitMapEditor::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + cached_outline_color = get_theme_color(SNAME("extra_border_color_1"), EditorStringName(Editor)); + } break; + } +} + +void BitMapEditor::_draw_outline() { + const float outline_width = Math::round(EDSCALE); + const Rect2 outline_rect = Rect2(Vector2(), texture_rect->get_size()).grow(outline_width * 0.5); + outline_overlay->draw_rect(outline_rect, cached_outline_color, false, outline_width); +} + BitMapEditor::BitMapEditor() { + MarginContainer *margin_container = memnew(MarginContainer); + const float outline_width = Math::round(EDSCALE); + margin_container->add_theme_constant_override("margin_right", outline_width); + margin_container->add_theme_constant_override("margin_top", outline_width); + margin_container->add_theme_constant_override("margin_left", outline_width); + margin_container->add_theme_constant_override("margin_bottom", outline_width); + add_child(margin_container); + + centering_container = memnew(AspectRatioContainer); + centering_container->set_custom_minimum_size(Size2(0, 250) * EDSCALE); + margin_container->add_child(centering_container); + texture_rect = memnew(TextureRect); - texture_rect->set_stretch_mode(TextureRect::STRETCH_KEEP_ASPECT_CENTERED); texture_rect->set_texture_filter(TEXTURE_FILTER_NEAREST); - texture_rect->set_custom_minimum_size(Size2(0, 250) * EDSCALE); - add_child(texture_rect); + texture_rect->set_expand_mode(TextureRect::EXPAND_IGNORE_SIZE); + centering_container->add_child(texture_rect); + + outline_overlay = memnew(Control); + outline_overlay->connect(SceneStringName(draw), callable_mp(this, &BitMapEditor::_draw_outline)); + centering_container->add_child(outline_overlay); size_label = memnew(Label); size_label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_RIGHT); diff --git a/editor/plugins/bit_map_editor_plugin.h b/editor/plugins/bit_map_editor_plugin.h index 2816931463c..5f67d6b55da 100644 --- a/editor/plugins/bit_map_editor_plugin.h +++ b/editor/plugins/bit_map_editor_plugin.h @@ -34,14 +34,25 @@ #include "editor/plugins/editor_plugin.h" #include "scene/resources/bit_map.h" +class AspectRatioContainer; class TextureRect; class BitMapEditor : public VBoxContainer { GDCLASS(BitMapEditor, VBoxContainer); +private: + AspectRatioContainer *centering_container = nullptr; + Control *outline_overlay = nullptr; TextureRect *texture_rect = nullptr; Label *size_label = nullptr; + Color cached_outline_color; + + void _draw_outline(); + +protected: + void _notification(int p_what); + public: void setup(const Ref &p_bitmap);