From b8b0294501e48faed8a431cb701a1ef5561157b4 Mon Sep 17 00:00:00 2001 From: Relintai Date: Mon, 13 Jun 2022 21:38:34 +0200 Subject: [PATCH] Fix ImagePickerButton. --- .../file_dialog/mat_maker_file_dialog.cpp | 5 +- .../file_dialog/mat_maker_file_dialog.h | 2 +- .../image_picker_button.cpp | 54 ++++++++++++++----- .../image_picker_button/image_picker_button.h | 6 +++ 4 files changed, 49 insertions(+), 18 deletions(-) diff --git a/modules/material_maker/editor/widgets/file_dialog/mat_maker_file_dialog.cpp b/modules/material_maker/editor/widgets/file_dialog/mat_maker_file_dialog.cpp index 82406ea2e..20ac7cdb8 100644 --- a/modules/material_maker/editor/widgets/file_dialog/mat_maker_file_dialog.cpp +++ b/modules/material_maker/editor/widgets/file_dialog/mat_maker_file_dialog.cpp @@ -43,11 +43,8 @@ void MatMakerFileDialog::_on_FileDialog_popup_hide() { emit_signal("return_paths", Array()); } -Array MatMakerFileDialog::select_files() { +void MatMakerFileDialog::select_files() { popup_centered(); - Variant = yield(self, "return_paths"); - queue_free(); - return result; } void MatMakerFileDialog::add_favorite() { diff --git a/modules/material_maker/editor/widgets/file_dialog/mat_maker_file_dialog.h b/modules/material_maker/editor/widgets/file_dialog/mat_maker_file_dialog.h index 8eb47074c..7a483ee00 100644 --- a/modules/material_maker/editor/widgets/file_dialog/mat_maker_file_dialog.h +++ b/modules/material_maker/editor/widgets/file_dialog/mat_maker_file_dialog.h @@ -20,7 +20,7 @@ public: void _on_FileDialog_dir_selected(const String &dir); void _on_FileDialog_popup_hide(); - Array select_files(); + void select_files(); void add_favorite(); MatMakerFileDialog(); diff --git a/modules/material_maker/editor/widgets/image_picker_button/image_picker_button.cpp b/modules/material_maker/editor/widgets/image_picker_button/image_picker_button.cpp index 0ab70a73c..370a65cc1 100644 --- a/modules/material_maker/editor/widgets/image_picker_button/image_picker_button.cpp +++ b/modules/material_maker/editor/widgets/image_picker_button/image_picker_button.cpp @@ -1,6 +1,10 @@ #include "image_picker_button.h" +#include "../file_dialog/mat_maker_file_dialog.h" +#include "core/io/resource_loader.h" +#include "scene/resources/texture.h" + String ImagePickerButton::get_image_path() { return image_path; } @@ -16,15 +20,30 @@ void ImagePickerButton::do_set_image_path(const String &path) { } image_path = path; - texture_normal.load(image_path); + + Ref img = ResourceLoader::load("image_path", "Image"); + Ref tex = get_normal_texture(); + + if (!tex.is_valid()) { + tex.instance(); + } + + tex->create_from_image(img); + + set_normal_texture(tex); } void ImagePickerButton::_on_ImagePicker_pressed() { - //var dialog = preload("res://addons/mat_maker_gd/windows/file_dialog/file_dialog.tscn").instance(); + if (dialog) { + dialog->queue_delete(); + dialog = nullptr; + } + + dialog = memnew(MatMakerFileDialog); add_child(dialog); - dialog->set_rect_min_size(Vector2(500, 500)); - dialog->set_access(FileDialog.ACCESS_FILESYSTEM); - dialog->set_mode(FileDialog.MODE_OPEN_FILE); + dialog->set_custom_minimum_size(Vector2(500, 500)); + dialog->set_access(FileDialog::ACCESS_FILESYSTEM); + dialog->set_mode(FileDialog::MODE_OPEN_FILE); dialog->add_filter("*.bmp;BMP Image"); dialog->add_filter("*.exr;EXR Image"); dialog->add_filter("*.hdr;Radiance HDR Image"); @@ -33,15 +52,19 @@ void ImagePickerButton::_on_ImagePicker_pressed() { dialog->add_filter("*.svg;SVG Image"); dialog->add_filter("*.tga;TGA Image"); dialog->add_filter("*.webp;WebP Image"); - image_path = dialog->select_files(); - - while (files is GDScriptFunctionState) { - files = yield(files, "completed"); - } + dialog->connect("return_paths", this, "on_file_selected"); + dialog->select_files(); +} +void ImagePickerButton::on_file_selected(const Array &files) { if (files.size() > 0) { set_image_path(files[0]); } + + if (dialog) { + dialog->queue_delete(); + dialog = nullptr; + } } void ImagePickerButton::on_drop_image_file(const String &file_name) { @@ -49,12 +72,14 @@ void ImagePickerButton::on_drop_image_file(const String &file_name) { } ImagePickerButton::ImagePickerButton() { + dialog = nullptr; + set_custom_minimum_size(Vector2(64, 64)); set_clip_contents(true); Ref imagepicker_prop_texture_normal; imagepicker_prop_texture_normal.instance(); - set_texture_normal(imagepicker_prop_texture_normal); + set_normal_texture(imagepicker_prop_texture_normal); set_expand(true); set_stretch_mode(STRETCH_KEEP_ASPECT_CENTERED); } @@ -64,7 +89,10 @@ ImagePickerButton::~ImagePickerButton() { void ImagePickerButton::_notification(int p_what) { if (p_what == NOTIFICATION_POSTINITIALIZE) { - texture_normal = memnew(ImageTexture); + Ref it; + it.instance(); + + set_normal_texture(it); connect("pressed", this, "_on_ImagePicker_pressed"); } @@ -77,9 +105,9 @@ void ImagePickerButton::_bind_methods() { ClassDB::bind_method(D_METHOD("set_image_path", "path"), &ImagePickerButton::set_image_path); ADD_PROPERTY(PropertyInfo(Variant::STRING, "image_path"), "set_image_path", "get_image_path"); - ClassDB::bind_method(D_METHOD("_ready"), &ImagePickerButton::_ready); ClassDB::bind_method(D_METHOD("do_set_image_path", "path"), &ImagePickerButton::do_set_image_path); ClassDB::bind_method(D_METHOD("set_image_path", "path"), &ImagePickerButton::set_image_path); ClassDB::bind_method(D_METHOD("_on_ImagePicker_pressed"), &ImagePickerButton::_on_ImagePicker_pressed); ClassDB::bind_method(D_METHOD("on_drop_image_file", "file_name"), &ImagePickerButton::on_drop_image_file); + ClassDB::bind_method(D_METHOD("on_file_selected", "files"), &ImagePickerButton::on_file_selected); } diff --git a/modules/material_maker/editor/widgets/image_picker_button/image_picker_button.h b/modules/material_maker/editor/widgets/image_picker_button/image_picker_button.h index e403b89bc..37c4030d0 100644 --- a/modules/material_maker/editor/widgets/image_picker_button/image_picker_button.h +++ b/modules/material_maker/editor/widgets/image_picker_button/image_picker_button.h @@ -1,10 +1,13 @@ #ifndef IMAGE_PICKER_BUTTON_H #define IMAGE_PICKER_BUTTON_H +#include "core/array.h" #include "core/ustring.h" #include "scene/gui/texture_button.h" +class MatMakerFileDialog; + class ImagePickerButton : public TextureButton { GDCLASS(ImagePickerButton, TextureButton); @@ -16,6 +19,7 @@ public: void _on_ImagePicker_pressed(); void on_drop_image_file(const String &file_name); + void on_file_selected(const Array &arr); ImagePickerButton(); ~ImagePickerButton(); @@ -25,6 +29,8 @@ protected: static void _bind_methods(); String image_path; + + MatMakerFileDialog *dialog; }; #endif