Merge pull request #50746 from LightningAA/fix-texture-preview-crash-4.0

Fix `TexturePreview` crashing
This commit is contained in:
Rémi Verschelde 2021-07-22 23:33:11 +02:00 committed by GitHub
commit 90aab0402b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 9 deletions

View file

@ -36,9 +36,28 @@ TextureRect *TexturePreview::get_texture_display() {
return texture_display;
}
void TexturePreview::_notification(int p_what) {
switch (p_what) {
case NOTIFICATION_ENTER_TREE:
case NOTIFICATION_THEME_CHANGED: {
if (!is_inside_tree()) {
// TODO: This is a workaround because `NOTIFICATION_THEME_CHANGED`
// is getting called for some reason when the `TexturePreview` is
// getting destroyed, which causes `get_theme_font()` to return `nullptr`.
// See https://github.com/godotengine/godot/issues/50743.
break;
}
Ref<Font> metadata_label_font = get_theme_font(SNAME("expression"), SNAME("EditorFonts"));
metadata_label->add_theme_font_override("font", metadata_label_font);
checkerboard->set_texture(get_theme_icon(SNAME("Checkerboard"), SNAME("EditorIcons")));
} break;
}
}
TexturePreview::TexturePreview(Ref<Texture2D> p_texture, bool p_show_metadata) {
TextureRect *checkerboard = memnew(TextureRect);
checkerboard->set_texture(get_theme_icon("Checkerboard", "EditorIcons"));
checkerboard = memnew(TextureRect);
checkerboard->set_stretch_mode(TextureRect::STRETCH_TILE);
checkerboard->set_texture_repeat(CanvasItem::TEXTURE_REPEAT_ENABLED);
checkerboard->set_custom_minimum_size(Size2(0.0, 256.0) * EDSCALE);
@ -52,7 +71,7 @@ TexturePreview::TexturePreview(Ref<Texture2D> p_texture, bool p_show_metadata) {
add_child(texture_display);
if (p_show_metadata) {
Label *metadata_label = memnew(Label);
metadata_label = memnew(Label);
String format;
if (Object::cast_to<ImageTexture>(*p_texture)) {
@ -65,16 +84,14 @@ TexturePreview::TexturePreview(Ref<Texture2D> p_texture, bool p_show_metadata) {
metadata_label->set_text(itos(p_texture->get_width()) + "x" + itos(p_texture->get_height()) + " " + format);
metadata_label->add_theme_font_size_override("font_size", 16 * EDSCALE);
metadata_label->add_theme_color_override("font_outline_color", Color::named("black"));
metadata_label->add_theme_constant_override("outline_size", 2 * EDSCALE);
Ref<Font> metadata_label_font = get_theme_font("expression", "EditorFonts");
metadata_label->add_theme_font_override("font", metadata_label_font);
// It's okay that these colors are static since the grid color is static too.
metadata_label->add_theme_color_override("font_color", Color::named("white"));
metadata_label->add_theme_color_override("font_color_shadow", Color::named("black"));
metadata_label->add_theme_font_size_override("font_size", 16 * EDSCALE);
metadata_label->add_theme_color_override("font_outline_color", Color::named("black"));
metadata_label->add_theme_constant_override("outline_size", 2 * EDSCALE);
metadata_label->add_theme_constant_override("shadow_as_outline", 1);
metadata_label->set_h_size_flags(Control::SIZE_SHRINK_END);
metadata_label->set_v_size_flags(Control::SIZE_SHRINK_END);

View file

@ -41,6 +41,12 @@ class TexturePreview : public MarginContainer {
private:
TextureRect *texture_display;
TextureRect *checkerboard;
Label *metadata_label;
protected:
void _notification(int p_what);
public:
TextureRect *get_texture_display();
TexturePreview(Ref<Texture2D> p_texture, bool p_show_metadata);