From 73dc6be1dae314384ffec47a7be97f9ebdd08b8d Mon Sep 17 00:00:00 2001 From: Relintai Date: Sun, 20 Nov 2022 18:57:11 +0100 Subject: [PATCH] Added export and import tool to the PaintToolsPropertyInspector. --- modules/paint/nodes/paint_canvas.cpp | 21 +++++ modules/paint/nodes/paint_canvas.h | 2 + .../paint_tools_property_inspector.cpp | 82 +++++++++++++++++++ .../paint_tools_property_inspector.h | 10 +++ 4 files changed, 115 insertions(+) diff --git a/modules/paint/nodes/paint_canvas.cpp b/modules/paint/nodes/paint_canvas.cpp index 08b3526e9..7549a92de 100644 --- a/modules/paint/nodes/paint_canvas.cpp +++ b/modules/paint/nodes/paint_canvas.cpp @@ -15,6 +15,7 @@ #include "../bush_prefabs.h" #include "../paint_utilities.h" #include "core/io/image.h" +#include "core/io/image_loader.h" #include "core/os/keyboard.h" #include "paint_project.h" #include "scene/resources/texture.h" @@ -923,6 +924,24 @@ bool PaintCanvas::_forward_canvas_gui_input(const Ref &event) { return false; } +Error PaintCanvas::load_image(const String &path) { + if (path.empty()) { + return ERR_FILE_NOT_FOUND; + } + + Error err = ImageLoader::load_image(path, _image); + + if (err != OK) { + return err; + } + + Vector2 size = _image->get_size(); + + set_size(size); + + return OK; +} + PaintCanvas::PaintCanvas() { _symmetry_x = false; _symmetry_y = false; @@ -1083,6 +1102,8 @@ void PaintCanvas::_bind_methods() { ClassDB::bind_method(D_METHOD("_on_tool_changed"), &PaintCanvas::_on_tool_changed); ClassDB::bind_method(D_METHOD("tool_process", "local_position", "event"), &PaintCanvas::tool_process); + ClassDB::bind_method(D_METHOD("load_image", "path"), &PaintCanvas::load_image); + ClassDB::bind_method(D_METHOD("_on_size_changed"), &PaintCanvas::_on_size_changed); BIND_ENUM_CONSTANT(TOOL_PENCIL); diff --git a/modules/paint/nodes/paint_canvas.h b/modules/paint/nodes/paint_canvas.h index c308d7c48..3f4613db8 100644 --- a/modules/paint/nodes/paint_canvas.h +++ b/modules/paint/nodes/paint_canvas.h @@ -107,6 +107,8 @@ public: void tool_process(const Vector2 &local_position, const Ref &event); bool _forward_canvas_gui_input(const Ref &event); + Error load_image(const String &path); + PaintCanvas(); ~PaintCanvas(); diff --git a/modules/paint/ui/property_inspectors/paint_tools_property_inspector.cpp b/modules/paint/ui/property_inspectors/paint_tools_property_inspector.cpp index 7a07cd54a..4a08fcaad 100644 --- a/modules/paint/ui/property_inspectors/paint_tools_property_inspector.cpp +++ b/modules/paint/ui/property_inspectors/paint_tools_property_inspector.cpp @@ -22,8 +22,10 @@ SOFTWARE. #include "paint_tools_property_inspector.h" +#include "core/io/image_loader.h" #include "scene/gui/box_container.h" #include "scene/gui/button.h" +#include "scene/gui/file_dialog.h" #include "scene/gui/flow_container.h" #include "scene/gui/label.h" #include "scene/gui/slider.h" @@ -118,6 +120,36 @@ PaintToolsPropertyInspector::PaintToolsPropertyInspector() { _paint_canvas = 0; _group.instance(); + Control *popups = memnew(Control); + add_child(popups); + popups->set_mouse_filter(MOUSE_FILTER_IGNORE); + + _import_file_dialog = memnew(FileDialog); + popups->add_child(_import_file_dialog); + _import_file_dialog->set_access(FileDialog::ACCESS_FILESYSTEM); + _import_file_dialog->set_resizable(true); + _import_file_dialog->set_mode(FileDialog::MODE_OPEN_FILE); + _import_file_dialog->set_title("Import image"); + _import_file_dialog->connect("confirmed", this, "_on_import_dialog_confirmed"); + _import_file_dialog->connect("file_selected", this, "_on_import_dialog_file_selected"); + + List extensions; + ImageLoader::get_recognized_extensions(&extensions); + + for (List::Element *E = extensions.front(); E; E = E->next()) { + _import_file_dialog->add_filter("*." + E->get()); + } + + _export_file_dialog = memnew(FileDialog); + popups->add_child(_export_file_dialog); + _export_file_dialog->set_access(FileDialog::ACCESS_FILESYSTEM); + _export_file_dialog->set_resizable(true); + _export_file_dialog->set_mode(FileDialog::MODE_SAVE_FILE); + _export_file_dialog->set_title("Import image"); + _export_file_dialog->add_filter("*.png"); + _export_file_dialog->connect("confirmed", this, "_on_export_dialog_confirmed"); + _export_file_dialog->connect("file_selected", this, "_on_export_dialog_file_selected"); + VBoxContainer *box_container = memnew(VBoxContainer); add_child(box_container); @@ -138,8 +170,11 @@ PaintToolsPropertyInspector::PaintToolsPropertyInspector() { add_tool_button(PaintCanvas::TOOL_COLORPICKER, "Colorpicker", "ColorPick", "EditorIcons"); add_tool_button(PaintCanvas::TOOL_CUT, "Cut", "ActionCut", "EditorIcons"); add_tool_button(PaintCanvas::TOOL_PASTECUT, "Pastecut", "ActionPaste", "EditorIcons"); + add_action_button("_on_undo_pressed", "Undo", "ArrowLeft", "EditorIcons"); add_action_button("_on_redo_pressed", "Redo", "ArrowRight", "EditorIcons"); + add_action_button("_on_import_pressed", "Import Image", "Load", "EditorIcons"); + add_action_button("_on_export_pressed", "Export Image", "Save", "EditorIcons"); _brush_prefabs = memnew(HFlowContainer); box_container->add_child(_brush_prefabs); @@ -254,6 +289,44 @@ void PaintToolsPropertyInspector::_on_redo_pressed() { paint_canvas->redo_action(); } +void PaintToolsPropertyInspector::_on_export_pressed() { + _export_file_dialog->popup_centered_ratio(); +} + +void PaintToolsPropertyInspector::_on_import_pressed() { + _import_file_dialog->popup_centered_ratio(); +} + +void PaintToolsPropertyInspector::_on_import_dialog_confirmed() { + _on_import_dialog_file_selected(_import_file_dialog->get_current_file()); +} +void PaintToolsPropertyInspector::_on_import_dialog_file_selected(const String &f) { + PaintCanvas *paint_canvas = Object::cast_to(ObjectDB::get_instance(_paint_canvas)); + + ERR_FAIL_COND(!paint_canvas); + + if (f.empty()) { + return; + } + + paint_canvas->load_image(f); +} + +void PaintToolsPropertyInspector::_on_export_dialog_confirmed() { + _on_export_dialog_file_selected(_export_file_dialog->get_current_file()); +} +void PaintToolsPropertyInspector::_on_export_dialog_file_selected(const String &f) { + PaintCanvas *paint_canvas = Object::cast_to(ObjectDB::get_instance(_paint_canvas)); + + ERR_FAIL_COND(!paint_canvas); + + if (f.empty()) { + return; + } + + paint_canvas->get_image()->save_png(f); +} + void PaintToolsPropertyInspector::_bind_methods() { ClassDB::bind_method(D_METHOD("_on_button_toggled"), &PaintToolsPropertyInspector::_on_button_toggled); ClassDB::bind_method(D_METHOD("_on_tool_changed"), &PaintToolsPropertyInspector::_on_tool_changed); @@ -263,4 +336,13 @@ void PaintToolsPropertyInspector::_bind_methods() { ClassDB::bind_method(D_METHOD("_on_undo_pressed"), &PaintToolsPropertyInspector::_on_undo_pressed); ClassDB::bind_method(D_METHOD("_on_redo_pressed"), &PaintToolsPropertyInspector::_on_redo_pressed); + + ClassDB::bind_method(D_METHOD("_on_import_pressed"), &PaintToolsPropertyInspector::_on_import_pressed); + ClassDB::bind_method(D_METHOD("_on_export_pressed"), &PaintToolsPropertyInspector::_on_export_pressed); + + ClassDB::bind_method(D_METHOD("_on_import_dialog_confirmed"), &PaintToolsPropertyInspector::_on_import_dialog_confirmed); + ClassDB::bind_method(D_METHOD("_on_import_dialog_file_selected"), &PaintToolsPropertyInspector::_on_import_dialog_file_selected); + + ClassDB::bind_method(D_METHOD("_on_export_dialog_confirmed"), &PaintToolsPropertyInspector::_on_export_dialog_confirmed); + ClassDB::bind_method(D_METHOD("_on_export_dialog_file_selected"), &PaintToolsPropertyInspector::_on_export_dialog_file_selected); } diff --git a/modules/paint/ui/property_inspectors/paint_tools_property_inspector.h b/modules/paint/ui/property_inspectors/paint_tools_property_inspector.h index 0842f80fe..4ff09c8ee 100644 --- a/modules/paint/ui/property_inspectors/paint_tools_property_inspector.h +++ b/modules/paint/ui/property_inspectors/paint_tools_property_inspector.h @@ -34,6 +34,7 @@ class PaintProject; class ButtonGroup; class HSlider; class Label; +class FileDialog; class PaintToolsPropertyInspector : public PaintCustomPropertyInspector { GDCLASS(PaintToolsPropertyInspector, PaintCustomPropertyInspector); @@ -56,9 +57,18 @@ protected: void _on_brush_size_changed(); void _on_undo_pressed(); void _on_redo_pressed(); + void _on_import_pressed(); + void _on_export_pressed(); + void _on_import_dialog_confirmed(); + void _on_import_dialog_file_selected(const String &f); + void _on_export_dialog_confirmed(); + void _on_export_dialog_file_selected(const String &f); static void _bind_methods(); + FileDialog *_import_file_dialog; + FileDialog *_export_file_dialog; + HFlowContainer *_grid; HFlowContainer *_brush_prefabs; HSlider *_brush_size_slider;