Browse Source

Merge pull request #50745 from LightningAA/fix-texture-preview-crash-3.x

[3.x] Fix `TexturePreview` crashing
Rémi Verschelde 4 years ago
parent
commit
b856841b99
2 changed files with 31 additions and 9 deletions
  1. 25 9
      editor/plugins/texture_editor_plugin.cpp
  2. 6 0
      editor/plugins/texture_editor_plugin.h

+ 25 - 9
editor/plugins/texture_editor_plugin.cpp

@@ -37,9 +37,31 @@ 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<DynamicFont> metadata_label_font = get_font("expression", "EditorFonts")->duplicate();
+			metadata_label_font->set_size(16 * EDSCALE);
+			metadata_label_font->set_outline_size(2 * EDSCALE);
+			metadata_label_font->set_outline_color(Color::named("black"));
+			metadata_label->add_font_override("font", metadata_label_font);
+
+			checkerboard->set_texture(get_icon("Checkerboard", "EditorIcons"));
+		} break;
+	}
+}
+
 TexturePreview::TexturePreview(Ref<Texture> p_texture, bool p_show_metadata) {
-	TextureRect *checkerboard = memnew(TextureRect);
-	checkerboard->set_texture(get_icon("Checkerboard", "EditorIcons"));
+	checkerboard = memnew(TextureRect);
 	checkerboard->set_stretch_mode(TextureRect::STRETCH_TILE);
 	checkerboard->set_custom_minimum_size(Size2(0.0, 256.0) * EDSCALE);
 	add_child(checkerboard);
@@ -52,7 +74,7 @@ TexturePreview::TexturePreview(Ref<Texture> 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,12 +87,6 @@ TexturePreview::TexturePreview(Ref<Texture> p_texture, bool p_show_metadata) {
 
 		metadata_label->set_text(itos(p_texture->get_width()) + "x" + itos(p_texture->get_height()) + " " + format);
 
-		Ref<DynamicFont> metadata_label_font = get_font("expression", "EditorFonts")->duplicate();
-		metadata_label_font->set_size(16 * EDSCALE);
-		metadata_label_font->set_outline_size(2 * EDSCALE);
-		metadata_label_font->set_outline_color(Color::named("black"));
-		metadata_label->add_font_override("font", metadata_label_font);
-
 		// It's okay that these colors are static since the grid color is static too.
 		metadata_label->add_color_override("font_color", Color::named("white"));
 		metadata_label->add_color_override("font_color_shadow", Color::named("black"));

+ 6 - 0
editor/plugins/texture_editor_plugin.h

@@ -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<Texture> p_texture, bool p_show_metadata);