From 047561b95a4e155c0a3b800bcefdf56b18e8464d Mon Sep 17 00:00:00 2001 From: OverloadedOrama <35376950+OverloadedOrama@users.noreply.github.com> Date: Mon, 22 Jun 2020 15:57:42 +0300 Subject: [PATCH] Added options for when importing an image as a new frame or layer The user can now choose which layer they want the new frame to be, and, similarly, which frame they want the new layer to be when importing an image. --- src/Autoload/OpenSave.gd | 54 +++++++++++++++++-------------- src/UI/CanvasPreview.gd | 2 +- src/UI/Dialogs/PreviewDialog.gd | 26 +++++++++++---- src/UI/Dialogs/PreviewDialog.tscn | 40 +++++++++++++++++++++++ 4 files changed, 90 insertions(+), 32 deletions(-) diff --git a/src/Autoload/OpenSave.gd b/src/Autoload/OpenSave.gd index 34729ffbc..c1f91a395 100644 --- a/src/Autoload/OpenSave.gd +++ b/src/Autoload/OpenSave.gd @@ -373,53 +373,57 @@ func open_image_as_new_frame(image : Image, layer_index := 0) -> void: new_frames.append(frame) - Global.current_project.undos += 1 - Global.current_project.undo_redo.create_action("Add Frame") - Global.current_project.undo_redo.add_do_method(Global, "redo") - Global.current_project.undo_redo.add_undo_method(Global, "undo") + project.undos += 1 + project.undo_redo.create_action("Add Frame") + project.undo_redo.add_do_method(Global, "redo") + project.undo_redo.add_undo_method(Global, "undo") - Global.current_project.undo_redo.add_do_property(project, "frames", new_frames) - Global.current_project.undo_redo.add_do_property(project, "current_frame", new_frames.size() - 1) - Global.current_project.undo_redo.add_do_property(project, "current_layer", layer_index) + project.undo_redo.add_do_property(project, "frames", new_frames) + project.undo_redo.add_do_property(project, "current_frame", new_frames.size() - 1) + project.undo_redo.add_do_property(project, "current_layer", layer_index) - Global.current_project.undo_redo.add_undo_property(project, "frames", project.frames) - Global.current_project.undo_redo.add_undo_property(project, "current_frame", project.current_frame) - Global.current_project.undo_redo.add_undo_property(project, "current_layer", project.current_layer) - Global.current_project.undo_redo.commit_action() + project.undo_redo.add_undo_property(project, "frames", project.frames) + project.undo_redo.add_undo_property(project, "current_frame", project.current_frame) + project.undo_redo.add_undo_property(project, "current_layer", project.current_layer) + project.undo_redo.commit_action() func open_image_as_new_layer(image : Image, file_name : String, frame_index := 0) -> void: var project = Global.current_project image.crop(project.size.x, project.size.y) var new_layers : Array = Global.current_project.layers.duplicate() - var layer := Layer.new(file_name) + + Global.current_project.undos += 1 + Global.current_project.undo_redo.create_action("Add Layer") for i in project.frames.size(): + var new_cels : Array = project.frames[i].cels.duplicate(true) if i == frame_index: image.convert(Image.FORMAT_RGBA8) image.lock() - project.frames[i].cels.append(Cel.new(image, 1)) + new_cels.append(Cel.new(image, 1)) else: var empty_image := Image.new() empty_image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8) empty_image.lock() - project.frames[i].cels.append(Cel.new(empty_image, 1)) + new_cels.append(Cel.new(empty_image, 1)) + + project.undo_redo.add_do_property(project.frames[i], "cels", new_cels) + project.undo_redo.add_undo_property(project.frames[i], "cels", project.frames[i].cels) new_layers.append(layer) - Global.current_project.undos += 1 - Global.current_project.undo_redo.create_action("Add Layer") - Global.current_project.undo_redo.add_do_property(project, "current_layer", new_layers.size() - 1) - Global.current_project.undo_redo.add_do_property(project, "layers", new_layers) - Global.current_project.undo_redo.add_do_property(project, "current_frame", frame_index) + project.undo_redo.add_do_property(project, "current_layer", new_layers.size() - 1) + project.undo_redo.add_do_property(project, "layers", new_layers) + project.undo_redo.add_do_property(project, "current_frame", frame_index) - Global.current_project.undo_redo.add_undo_property(project, "current_layer", project.current_layer) - Global.current_project.undo_redo.add_undo_property(project, "layers", project.layers) - Global.current_project.undo_redo.add_undo_property(project, "current_frame", project.current_frame) + project.undo_redo.add_undo_property(project, "current_layer", project.current_layer) + project.undo_redo.add_undo_property(project, "layers", project.layers) + project.undo_redo.add_undo_property(project, "current_frame", project.current_frame) - Global.current_project.undo_redo.add_undo_method(Global, "undo") - Global.current_project.undo_redo.add_do_method(Global, "redo") - Global.current_project.undo_redo.commit_action() + project.undo_redo.add_undo_method(Global, "undo") + project.undo_redo.add_do_method(Global, "redo") + project.undo_redo.commit_action() func set_new_tab(project : Project, path : String) -> void: diff --git a/src/UI/CanvasPreview.gd b/src/UI/CanvasPreview.gd index 222180e5b..70cc2a64e 100644 --- a/src/UI/CanvasPreview.gd +++ b/src/UI/CanvasPreview.gd @@ -9,5 +9,5 @@ func _draw() -> void: # Draw current frame layers for i in range(current_cels.size()): var modulate_color := Color(1, 1, 1, current_cels[i].opacity) - if i < current_project.layers.size() and current_project.layers[i].visible: # if it's visible + if i < current_project.layers.size() and current_project.layers[i].visible: draw_texture(current_cels[i].image_texture, Vector2.ZERO, modulate_color) diff --git a/src/UI/Dialogs/PreviewDialog.gd b/src/UI/Dialogs/PreviewDialog.gd index 181e954de..f5601f140 100644 --- a/src/UI/Dialogs/PreviewDialog.gd +++ b/src/UI/Dialogs/PreviewDialog.gd @@ -11,6 +11,8 @@ var spritesheet_vertical := 1 onready var texture_rect : TextureRect = $VBoxContainer/CenterContainer/TextureRect onready var spritesheet_options = $VBoxContainer/HBoxContainer/SpritesheetOptions +onready var new_frame_options = $VBoxContainer/HBoxContainer/NewFrameOptions +onready var new_layer_options = $VBoxContainer/HBoxContainer/NewLayerOptions func _on_PreviewDialog_about_to_show() -> void: @@ -36,23 +38,35 @@ func _on_PreviewDialog_confirmed() -> void: elif current_import_option == ImageImportOptions.SPRITESHEET: OpenSave.open_image_as_spritesheet(path, image, spritesheet_horizontal, spritesheet_vertical) elif current_import_option == ImageImportOptions.NEW_FRAME: - OpenSave.open_image_as_new_frame(image) + var layer_index : int = new_frame_options.get_node("AtLayerSpinbox").value + OpenSave.open_image_as_new_frame(image, layer_index) elif current_import_option == ImageImportOptions.NEW_LAYER: - OpenSave.open_image_as_new_layer(image, path.get_file()) + var frame_index : int = new_layer_options.get_node("AtFrameSpinbox").value - 1 + OpenSave.open_image_as_new_layer(image, path.get_file(), frame_index) elif current_import_option == ImageImportOptions.PALETTE: Global.palette_container.on_palette_import_file_selected(path) func _on_ImportOption_item_selected(id : int) -> void: current_import_option = id + spritesheet_options.visible = false + new_frame_options.visible = false + new_layer_options.visible = false + texture_rect.get_child(0).visible = false + texture_rect.get_child(1).visible = false + if id == ImageImportOptions.SPRITESHEET: spritesheet_options.visible = true texture_rect.get_child(0).visible = true texture_rect.get_child(1).visible = true - else: - spritesheet_options.visible = false - texture_rect.get_child(0).visible = false - texture_rect.get_child(1).visible = false + + elif id == ImageImportOptions.NEW_FRAME: + new_frame_options.visible = true + new_frame_options.get_node("AtLayerSpinbox").max_value = Global.current_project.layers.size() - 1 + + elif id == ImageImportOptions.NEW_LAYER: + new_layer_options.visible = true + new_layer_options.get_node("AtFrameSpinbox").max_value = Global.current_project.frames.size() func _on_HorizontalFrames_value_changed(value) -> void: diff --git a/src/UI/Dialogs/PreviewDialog.tscn b/src/UI/Dialogs/PreviewDialog.tscn index 1207f9837..596a186a3 100644 --- a/src/UI/Dialogs/PreviewDialog.tscn +++ b/src/UI/Dialogs/PreviewDialog.tscn @@ -101,6 +101,46 @@ margin_bottom = 24.0 mouse_default_cursor_shape = 2 min_value = 1.0 value = 1.0 + +[node name="NewFrameOptions" type="HBoxContainer" parent="VBoxContainer/HBoxContainer"] +visible = false +margin_left = 155.0 +margin_right = 286.0 +margin_bottom = 24.0 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer/NewFrameOptions"] +margin_top = 5.0 +margin_right = 53.0 +margin_bottom = 19.0 +text = "At layer:" + +[node name="AtLayerSpinbox" type="SpinBox" parent="VBoxContainer/HBoxContainer/NewFrameOptions"] +margin_left = 57.0 +margin_right = 131.0 +margin_bottom = 24.0 +mouse_default_cursor_shape = 2 +max_value = 0.0 + +[node name="NewLayerOptions" type="HBoxContainer" parent="VBoxContainer/HBoxContainer"] +visible = false +margin_left = 155.0 +margin_right = 286.0 +margin_bottom = 24.0 + +[node name="Label" type="Label" parent="VBoxContainer/HBoxContainer/NewLayerOptions"] +margin_top = 5.0 +margin_right = 53.0 +margin_bottom = 19.0 +text = "At frame:" + +[node name="AtFrameSpinbox" type="SpinBox" parent="VBoxContainer/HBoxContainer/NewLayerOptions"] +margin_left = 57.0 +margin_right = 131.0 +margin_bottom = 24.0 +mouse_default_cursor_shape = 2 +min_value = 1.0 +max_value = 1.0 +value = 1.0 [connection signal="about_to_show" from="." to="." method="_on_PreviewDialog_about_to_show"] [connection signal="confirmed" from="." to="." method="_on_PreviewDialog_confirmed"] [connection signal="popup_hide" from="." to="." method="_on_PreviewDialog_popup_hide"]