mirror of
https://github.com/tonytins/CozyPixelStudio.git
synced 2025-06-25 19:34:43 -04:00
Major UI changes - including new icons!
- New UI icons for the tools, layer and frame buttons. - Removed clone, remove and move frame buttons. You can now right click on a frame button to do these actions instead. - Added first, previous, next and last frame buttons to the timeline. - Added rulers for the main canvas viewport. - Window size bumped to 1152x648. - Default FPS is now 6 instead of 1. - Fill tool renamed to Bucket. - Mouse default cursor shape for the canvas is the arrow instead of cross. - Mouse default cursor shape for the mirror and onion skinning buttons is the pointing hand.
This commit is contained in:
parent
22c57a1b36
commit
7318db30ab
127 changed files with 2761 additions and 651 deletions
143
Scripts/Main.gd
143
Scripts/Main.gd
|
@ -10,7 +10,7 @@ var export_all_frames : CheckBox
|
|||
var export_as_single_file : CheckBox
|
||||
var export_vertical_spritesheet : CheckBox
|
||||
var redone := false
|
||||
var fps := 1.0
|
||||
var fps := 6.0
|
||||
var animation_loop := 0 #0 is no loop, 1 is cycle loop, 2 is ping-pong loop
|
||||
var animation_forward := true
|
||||
|
||||
|
@ -19,7 +19,7 @@ func _ready() -> void:
|
|||
OS.set_window_title("Pixelorama %s" % ProjectSettings.get_setting("application/config/Version"))
|
||||
# Set a minimum window size to prevent UI elements from collapsing on each other.
|
||||
# This property is only available in 3.2alpha or later, so use `set()` to fail gracefully if it doesn't exist.
|
||||
OS.set("min_window_size", Vector2(1024, 600))
|
||||
OS.set("min_window_size", Vector2(1152, 648))
|
||||
|
||||
var file_menu_items := {
|
||||
"New..." : KEY_MASK_CTRL + KEY_N,
|
||||
|
@ -78,7 +78,7 @@ func _ready() -> void:
|
|||
#Node, left mouse shortcut, right mouse shortcut
|
||||
tools.append([Global.find_node_by_name(root, "Pencil"), "left_pencil_tool", "right_pencil_tool"])
|
||||
tools.append([Global.find_node_by_name(root, "Eraser"), "left_eraser_tool", "right_eraser_tool"])
|
||||
tools.append([Global.find_node_by_name(root, "Fill"), "left_fill_tool", "right_fill_tool"])
|
||||
tools.append([Global.find_node_by_name(root, "Bucket"), "left_fill_tool", "right_fill_tool"])
|
||||
tools.append([Global.find_node_by_name(root, "PaintAllPixelsSameColor"), "left_paint_all_tool", "right_paint_all_tool"])
|
||||
tools.append([Global.find_node_by_name(root, "LightenDarken"), "left_lightdark_tool", "right_lightdark_tool"])
|
||||
tools.append([Global.find_node_by_name(root, "RectSelect"), "left_rectangle_select_tool", "right_rectangle_select_tool"])
|
||||
|
@ -550,12 +550,21 @@ func _on_Tool_pressed(tool_pressed : BaseButton, mouse_press := true, key_for_le
|
|||
var current_action := tool_pressed.name
|
||||
if (mouse_press && Input.is_action_just_released("left_mouse")) || (!mouse_press && key_for_left):
|
||||
Global.current_left_tool = current_action
|
||||
Global.left_indicator.get_parent().remove_child(Global.left_indicator)
|
||||
tool_pressed.add_child(Global.left_indicator)
|
||||
elif (mouse_press && Input.is_action_just_released("right_mouse")) || (!mouse_press && !key_for_left):
|
||||
Global.current_right_tool = current_action
|
||||
Global.right_indicator.get_parent().remove_child(Global.right_indicator)
|
||||
tool_pressed.add_child(Global.right_indicator)
|
||||
|
||||
for t in tools:
|
||||
var tool_name : String = t[0].name
|
||||
if tool_name == "PaintAllPixelsSameColor":
|
||||
continue
|
||||
if tool_name == Global.current_left_tool && tool_name == Global.current_right_tool:
|
||||
t[0].texture_normal = load("res://Assets/Graphics/Tools/%s_l_r.png" % tool_name)
|
||||
elif tool_name == Global.current_left_tool:
|
||||
t[0].texture_normal = load("res://Assets/Graphics/Tools/%s_l.png" % tool_name)
|
||||
elif tool_name == Global.current_right_tool:
|
||||
t[0].texture_normal = load("res://Assets/Graphics/Tools/%s_r.png" % tool_name)
|
||||
else:
|
||||
t[0].texture_normal = load("res://Assets/Graphics/Tools/%s.png" % tool_name)
|
||||
|
||||
func _on_LeftIndicatorCheckbox_toggled(button_pressed) -> void:
|
||||
Global.left_square_indicator_visible = button_pressed
|
||||
|
@ -643,33 +652,24 @@ func _on_MergeLayer_pressed() -> void:
|
|||
Global.undo_redo.add_do_method(Global, "redo", [Global.canvas])
|
||||
Global.undo_redo.commit_action()
|
||||
|
||||
func add_frame(is_new := true) -> void:
|
||||
var canvas : Canvas = load("res://Prefabs/Canvas.tscn").instance()
|
||||
canvas.size = Global.canvas.size
|
||||
canvas.frame = Global.canvases.size()
|
||||
func add_frame() -> void:
|
||||
var new_canvas : Canvas = load("res://Prefabs/Canvas.tscn").instance()
|
||||
new_canvas.size = Global.canvas.size
|
||||
new_canvas.frame = Global.canvases.size()
|
||||
|
||||
var new_canvases := Global.canvases.duplicate()
|
||||
new_canvases.append(canvas)
|
||||
new_canvases.append(new_canvas)
|
||||
var new_hidden_canvases := Global.hidden_canvases.duplicate()
|
||||
new_hidden_canvases.append(canvas)
|
||||
|
||||
if !is_new: #If we're cloning
|
||||
for layer in Global.canvas.layers: #Copy every layer
|
||||
var sprite := Image.new()
|
||||
sprite.copy_from(layer[0])
|
||||
sprite.lock()
|
||||
var tex := ImageTexture.new()
|
||||
tex.create_from_image(sprite, 0)
|
||||
canvas.layers.append([sprite, tex, layer[2], layer[3]])
|
||||
new_hidden_canvases.append(new_canvas)
|
||||
|
||||
Global.undos += 1
|
||||
Global.undo_redo.create_action("Add Frame")
|
||||
Global.undo_redo.add_do_method(Global, "redo", [canvas])
|
||||
Global.undo_redo.add_undo_method(Global, "undo", [canvas])
|
||||
Global.undo_redo.add_do_method(Global, "redo", [new_canvas])
|
||||
Global.undo_redo.add_undo_method(Global, "undo", [new_canvas])
|
||||
|
||||
Global.undo_redo.add_do_property(Global, "canvases", new_canvases)
|
||||
Global.undo_redo.add_do_property(Global, "hidden_canvases", Global.hidden_canvases)
|
||||
Global.undo_redo.add_do_property(Global, "canvas", canvas)
|
||||
Global.undo_redo.add_do_property(Global, "canvas", new_canvas)
|
||||
Global.undo_redo.add_do_property(Global, "current_frame", new_canvases.size() - 1)
|
||||
for child in Global.frame_container.get_children():
|
||||
var frame_button = child.get_node("FrameButton")
|
||||
|
@ -685,102 +685,55 @@ func add_frame(is_new := true) -> void:
|
|||
Global.undo_redo.add_undo_property(Global, "current_frame", Global.current_frame)
|
||||
Global.undo_redo.commit_action()
|
||||
|
||||
func _on_RemoveFrame_pressed() -> void:
|
||||
var new_canvases := Global.canvases.duplicate()
|
||||
new_canvases.erase(Global.canvas)
|
||||
var new_hidden_canvases := Global.hidden_canvases.duplicate()
|
||||
new_hidden_canvases.append(Global.canvas)
|
||||
var current_frame := Global.current_frame
|
||||
if current_frame > 0 && current_frame == new_canvases.size():
|
||||
current_frame -= 1
|
||||
|
||||
Global.undos += 1
|
||||
Global.undo_redo.create_action("Remove Frame")
|
||||
Global.undo_redo.add_undo_method(Global, "undo", [Global.canvas])
|
||||
|
||||
Global.undo_redo.add_do_property(Global, "canvases", new_canvases)
|
||||
Global.undo_redo.add_do_property(Global, "hidden_canvases", new_hidden_canvases)
|
||||
Global.undo_redo.add_do_property(Global, "canvas", new_canvases[current_frame])
|
||||
Global.undo_redo.add_do_property(Global, "current_frame", current_frame)
|
||||
|
||||
var i := 0
|
||||
for canvas in new_canvases:
|
||||
Global.undo_redo.add_do_property(canvas, "frame", i)
|
||||
Global.undo_redo.add_undo_property(canvas, "frame", canvas.frame)
|
||||
i += 1
|
||||
|
||||
Global.undo_redo.add_undo_property(Global, "canvases", Global.canvases)
|
||||
Global.undo_redo.add_undo_property(Global, "hidden_canvases", Global.hidden_canvases)
|
||||
Global.undo_redo.add_undo_property(Global, "canvas", Global.canvas)
|
||||
Global.undo_redo.add_undo_property(Global, "current_frame", Global.current_frame)
|
||||
|
||||
Global.undo_redo.add_do_method(Global, "redo", [Global.canvas])
|
||||
Global.undo_redo.commit_action()
|
||||
|
||||
func change_frame_order(rate : int) -> void:
|
||||
var change = Global.current_frame + rate
|
||||
|
||||
var new_canvases := Global.canvases.duplicate()
|
||||
var temp = new_canvases[Global.current_frame]
|
||||
new_canvases[Global.current_frame] = new_canvases[change]
|
||||
new_canvases[change] = temp
|
||||
|
||||
Global.undo_redo.create_action("Change Frame Order")
|
||||
Global.undo_redo.add_do_property(Global, "canvases", new_canvases)
|
||||
Global.undo_redo.add_do_property(Global.canvas, "frame", change)
|
||||
Global.undo_redo.add_do_property(Global.canvases[change], "frame", Global.current_frame)
|
||||
Global.undo_redo.add_do_property(Global, "current_frame", change)
|
||||
|
||||
Global.undo_redo.add_undo_property(Global, "canvases", Global.canvases)
|
||||
Global.undo_redo.add_undo_property(Global.canvas, "frame", Global.current_frame)
|
||||
Global.undo_redo.add_undo_property(Global.canvases[change], "frame", change)
|
||||
Global.undo_redo.add_undo_property(Global, "current_frame", Global.current_frame)
|
||||
|
||||
Global.undo_redo.add_undo_method(Global, "undo", [Global.canvas])
|
||||
Global.undo_redo.add_do_method(Global, "redo", [Global.canvas])
|
||||
Global.undo_redo.commit_action()
|
||||
|
||||
func _on_LoopAnim_pressed() -> void:
|
||||
match Global.loop_animation_button.text:
|
||||
"No":
|
||||
match Global.loop_animation_button.texture_normal.resource_path:
|
||||
"res://Assets/Graphics/Timeline/Loop_None.png":
|
||||
#Make it loop
|
||||
animation_loop = 1
|
||||
Global.loop_animation_button.text = "Cycle"
|
||||
"Cycle":
|
||||
Global.loop_animation_button.texture_normal = preload("res://Assets/Graphics/Timeline/Loop.png")
|
||||
"res://Assets/Graphics/Timeline/Loop.png":
|
||||
#Make it ping-pong
|
||||
animation_loop = 2
|
||||
Global.loop_animation_button.text = "Ping-Pong"
|
||||
"Ping-Pong":
|
||||
Global.loop_animation_button.texture_normal = preload("res://Assets/Graphics/Timeline/Loop_PingPong.png")
|
||||
"res://Assets/Graphics/Timeline/Loop_PingPong.png":
|
||||
#Make it stop
|
||||
animation_loop = 0
|
||||
Global.loop_animation_button.text = "No"
|
||||
Global.loop_animation_button.texture_normal = preload("res://Assets/Graphics/Timeline/Loop_None.png")
|
||||
|
||||
func _on_PlayForward_toggled(button_pressed) -> void:
|
||||
Global.play_backwards.pressed = false
|
||||
Global.play_backwards.text = "Play Backwards"
|
||||
|
||||
if button_pressed:
|
||||
Global.play_forward.text = "Stop"
|
||||
$AnimationTimer.wait_time = 1 / fps
|
||||
$AnimationTimer.start()
|
||||
animation_forward = true
|
||||
else:
|
||||
Global.play_forward.text = "Play Forward"
|
||||
$AnimationTimer.stop()
|
||||
|
||||
func _on_PlayBackwards_toggled(button_pressed) -> void:
|
||||
Global.play_forward.pressed = false
|
||||
Global.play_forward.text = "Play Forward"
|
||||
|
||||
if button_pressed:
|
||||
Global.play_backwards.text = "Stop"
|
||||
$AnimationTimer.wait_time = 1 / fps
|
||||
$AnimationTimer.start()
|
||||
animation_forward = false
|
||||
else:
|
||||
Global.play_backwards.text = "Play Backwards"
|
||||
$AnimationTimer.stop()
|
||||
|
||||
func _on_NextFrame_pressed() -> void:
|
||||
if Global.current_frame < Global.canvases.size() - 1:
|
||||
Global.current_frame += 1
|
||||
|
||||
func _on_PreviousFrame_pressed() -> void:
|
||||
if Global.current_frame > 0:
|
||||
Global.current_frame -= 1
|
||||
|
||||
func _on_LastFrame_pressed() -> void:
|
||||
Global.current_frame = Global.canvases.size() - 1
|
||||
|
||||
func _on_FirstFrame_pressed() -> void:
|
||||
Global.current_frame = 0
|
||||
|
||||
func _on_AnimationTimer_timeout() -> void:
|
||||
if animation_forward:
|
||||
if Global.current_frame < Global.canvases.size() - 1:
|
||||
|
@ -789,9 +742,7 @@ func _on_AnimationTimer_timeout() -> void:
|
|||
match animation_loop:
|
||||
0: #No loop
|
||||
Global.play_forward.pressed = false
|
||||
Global.play_forward.text = "Play Forward"
|
||||
Global.play_backwards.pressed = false
|
||||
Global.play_backwards.text = "Play Backwards"
|
||||
$AnimationTimer.stop()
|
||||
1: #Cycle loop
|
||||
Global.current_frame = 0
|
||||
|
@ -806,9 +757,7 @@ func _on_AnimationTimer_timeout() -> void:
|
|||
match animation_loop:
|
||||
0: #No loop
|
||||
Global.play_backwards.pressed = false
|
||||
Global.play_backwards.text = "Play Backwards"
|
||||
Global.play_forward.pressed = false
|
||||
Global.play_forward.text = "Play Forward"
|
||||
$AnimationTimer.stop()
|
||||
1: #Cycle loop
|
||||
Global.current_frame = Global.canvases.size() - 1
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue