Merge branch 'master' into text-tool

This commit is contained in:
OverloadedOrama 2020-10-11 02:13:57 +03:00
commit 6d3ba287dd
60 changed files with 13774 additions and 12168 deletions

View file

@ -5,10 +5,25 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
<br><br>
## [v0.8.1] - Unreleased
This update has been brought to you by the contributions of:
Laurenz Reinthaler (Schweini07), PinyaColada
### Added
- Buttons for moving the current frame left or right. ([#344](https://github.com/Orama-Interactive/Pixelorama/pull/344))
- Creating palettes from sprites has been enhanced - you can now choose if you want to get colors from the selection, current cel, entire frame or all frames, and if you want the colors to have an alpha component.
- A new "Cut" option in the Edit menu or by pressing `Ctrl-X`. It cuts (deletes & copies) the selection, and you can later paste it. ([#345](https://github.com/Orama-Interactive/Pixelorama/pull/345))
- A new purple theme.
### Changed
- Guides now move with a step of 0.5 pixels. That makes it possible to have guides (and symmetry guides) to be in the middle of pixels.
- Changed how Dark, Gray, Caramel and Light themes look. All theme elements now have the same spacing and margins.
### Fixed
- Fixed crash where Pixelorama could not load a cached sub-resource - [Issue #339](https://github.com/Orama-Interactive/Pixelorama/issues/339)
- Most likely fixed an issue that occurred when the user attempted to export the project, which failed due to a locking error (error code 23). (Part of [#331](https://github.com/Orama-Interactive/Pixelorama/issues/3391))
- Fixed crash where Pixelorama could not load a cached sub-resource. ([#339](https://github.com/Orama-Interactive/Pixelorama/issues/339))
- When moving tabs, the projects now move along with their respective tabs.
- Fixed crash where the animation was playing in the mini canvas preview and then the user switched to a project with less frames.
- Fixed issue with the selection rectangle, where if it was being moved while using paste or delete, it went back to its original position. ([#346](https://github.com/Orama-Interactive/Pixelorama/pull/346))
<br><br>
## [v0.8] - 2020-09-23
@ -216,9 +231,9 @@ sapient-cogbag, Kinwailo, Igor Santarek (jegor377), Dávid Gábor BODOR (dragonf
- The grid options are now being updated realtime when they're being changed from the preferences, and they are also being saved in the config cache file.
### Fixed
- Fixed crash that occured when trying to delete contents of a selection, that were outside the canvas.
- Fixed crash that occurred when trying to delete contents of a selection, that were outside the canvas.
- Fixed .gpl palettes not being imported correctly - Issue #112
- Fixed crash that occured when pressing the play buttons on the timeline, on Godot 3.2 - Issue #111
- Fixed crash that occurred when pressing the play buttons on the timeline, on Godot 3.2 - Issue #111
- Fixed bug where, if you had a random brush selected and then selected the pencil tool, "brush color from" did not appear.
- Fixed crash on Godot 3.2.beta6 when pressing the Edit Palette button.
- The canvas updates automatically when onion skinning settings change.

View file

@ -103,6 +103,9 @@ msgstr ""
msgid "Copy"
msgstr ""
msgid "Cut"
msgstr ""
msgid "Paste"
msgstr ""
@ -407,6 +410,9 @@ msgstr ""
msgid "Light"
msgstr ""
msgid "Purple"
msgstr ""
msgid "Only affect selection"
msgstr ""
@ -1200,10 +1206,10 @@ msgstr ""
msgid "File autosaved"
msgstr ""
msgid "File failed to open"
msgid "File failed to open. Error code %s"
msgstr ""
msgid "File failed to save"
msgid "File failed to save. Error code %s"
msgstr ""
msgid "File exported"
@ -1242,6 +1248,15 @@ msgstr ""
msgid "Edit Palette"
msgstr ""
msgid "Create colors with alpha component"
msgstr ""
msgid "Get colors only from selection"
msgstr ""
msgid "Get colors from"
msgstr ""
msgid "Patrons:"
msgstr ""
@ -1404,3 +1419,9 @@ msgstr ""
msgid "and"
msgstr ""
msgid "Move the selected frame to the left."
msgstr ""
msgid "Move the selected frame to the right."
msgstr ""

Binary file not shown.

After

Width:  |  Height:  |  Size: 143 B

View file

@ -2,15 +2,15 @@
importer="texture"
type="StreamTexture"
path="res://.import/hsplit.png-a437d5e2d0493714b9a4bb4e31df7099.stex"
path="res://.import/move_arrow.png-a7e1075bf6415244d8e7290d244180b2.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/themes/dark/icons/hsplit.png"
dest_files=[ "res://.import/hsplit.png-a437d5e2d0493714b9a4bb4e31df7099.stex" ]
source_file="res://assets/graphics/dark_themes/timeline/move_arrow.png"
dest_files=[ "res://.import/move_arrow.png-a7e1075bf6415244d8e7290d244180b2.stex" ]
[params]

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

View file

@ -2,15 +2,15 @@
importer="texture"
type="StreamTexture"
path="res://.import/spinbox.png-db435fcd46b95ff41e6b2b17aece2be9.stex"
path="res://.import/move_arrow_disabled.png-52a5629e1ae2c34034b70ce489237c77.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/themes/dark/icons/spinbox.png"
dest_files=[ "res://.import/spinbox.png-db435fcd46b95ff41e6b2b17aece2be9.stex" ]
source_file="res://assets/graphics/dark_themes/timeline/move_arrow_disabled.png"
dest_files=[ "res://.import/move_arrow_disabled.png-52a5629e1ae2c34034b70ce489237c77.stex" ]
[params]

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 B

View file

@ -2,15 +2,15 @@
importer="texture"
type="StreamTexture"
path="res://.import/grabber.png-81d4e5de8b8d25ef28043e12477a5047.stex"
path="res://.import/move_arrow.png-5ac1f48e226beb6e78d77de0e04d0b5e.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/themes/dark/icons/grabber.png"
dest_files=[ "res://.import/grabber.png-81d4e5de8b8d25ef28043e12477a5047.stex" ]
source_file="res://assets/graphics/light_themes/timeline/move_arrow.png"
dest_files=[ "res://.import/move_arrow.png-5ac1f48e226beb6e78d77de0e04d0b5e.stex" ]
[params]

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 B

View file

@ -2,15 +2,15 @@
importer="texture"
type="StreamTexture"
path="res://.import/grabber_hover.png-6e0d9c77ceadc2d1632c9a85a7911876.stex"
path="res://.import/move_arrow_disabled.png-c34712e4f610edb14fd2ab4a585a557a.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/themes/dark/icons/grabber_hover.png"
dest_files=[ "res://.import/grabber_hover.png-6e0d9c77ceadc2d1632c9a85a7911876.stex" ]
source_file="res://assets/graphics/light_themes/timeline/move_arrow_disabled.png"
dest_files=[ "res://.import/move_arrow_disabled.png-c34712e4f610edb14fd2ab4a585a557a.stex" ]
[params]

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 639 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 629 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 592 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 602 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 591 B

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/vsplit.png-3c495e075085fe8f9088eedeae9fcbcb.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/themes/dark/icons/vsplit.png"
dest_files=[ "res://.import/vsplit.png-3c495e075085fe8f9088eedeae9fcbcb.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/grabber.png-61927377c05a6faab6f5ad8d64517a4e.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/themes/light/icons/grabber.png"
dest_files=[ "res://.import/grabber.png-61927377c05a6faab6f5ad8d64517a4e.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/grabber_hover.png-50ed6eb83ae0f5e6818d3317f3ea7425.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/themes/light/icons/grabber_hover.png"
dest_files=[ "res://.import/grabber_hover.png-50ed6eb83ae0f5e6818d3317f3ea7425.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/hsplit.png-cff421f387a40a015e4864c4aad31efb.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/themes/light/icons/hsplit.png"
dest_files=[ "res://.import/hsplit.png-cff421f387a40a015e4864c4aad31efb.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 598 B

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/spinbox.png-d344968329ae29b64e56a477dcbd82f4.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/themes/light/icons/spinbox.png"
dest_files=[ "res://.import/spinbox.png-d344968329ae29b64e56a477dcbd82f4.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -1,34 +0,0 @@
[remap]
importer="texture"
type="StreamTexture"
path="res://.import/vsplit.png-42d8c8f71ee9dacedb0f21c441def848.stex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/themes/light/icons/vsplit.png"
dest_files=[ "res://.import/vsplit.png-42d8c8f71ee9dacedb0f21c441def848.stex" ]
[params]
compress/mode=0
compress/lossy_quality=0.7
compress/hdr_mode=0
compress/bptc_ldr=0
compress/normal_map=0
flags/repeat=0
flags/filter=false
flags/mipmaps=false
flags/anisotropic=false
flags/srgb=2
process/fix_alpha_border=true
process/premult_alpha=false
process/HDR_as_SRGB=false
process/invert_color=false
stream=false
size_limit=0
detect_3d=true
svg/scale=1.0

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -422,6 +422,9 @@ left_text_tool={
right_text_tool={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":true,"shift":false,"control":false,"meta":false,"command":false,"pressed":false,"scancode":65,"unicode":0,"echo":false,"script":null)
cut={
"deadzone": 0.5,
"events": [ Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"alt":false,"shift":false,"control":true,"meta":false,"command":true,"pressed":false,"scancode":88,"unicode":0,"echo":false,"script":null)
]
}

View file

@ -68,15 +68,16 @@ func external_export() -> void:
func process_frame() -> void:
processed_images.clear()
var frame = Global.current_project.frames[frame_number - 1]
var image := Image.new()
image.create(Global.current_project.size.x, Global.current_project.size.y, false, Image.FORMAT_RGBA8)
blend_layers(image, frame)
processed_images.clear()
processed_images.append(image)
func process_spritesheet() -> void:
processed_images.clear()
# Range of frames determined by tags
var frames := []
if frame_current_tag > 0:
@ -98,7 +99,6 @@ func process_spritesheet() -> void:
var whole_image := Image.new()
whole_image.create(width, height, false, Image.FORMAT_RGBA8)
whole_image.lock()
var origin := Vector2.ZERO
var hh := 0
var vv := 0
@ -124,7 +124,6 @@ func process_spritesheet() -> void:
origin.x = Global.current_project.size.x * vv
blend_layers(whole_image, frame, origin)
processed_images.clear()
processed_images.append(whole_image)
@ -185,14 +184,12 @@ func export_processed_images(ignore_overwrites: bool, export_dialog: AcceptDialo
gif_export_thread.start(self, "export_gif", {"export_dialog": export_dialog, "export_paths": export_paths})
else:
for i in range(processed_images.size()):
processed_images[i].unlock()
if OS.get_name() == "HTML5":
Html5FileExchange.save_image(processed_images[i], export_paths[i].get_file())
else:
var err = processed_images[i].save_png(export_paths[i])
if err != OK:
OS.alert("Can't save file. Error code: %s" % err)
processed_images[i].lock()
# Store settings for quick export and when the dialog is opened again
was_exported = true
@ -321,6 +318,7 @@ func blend_layers(image : Image, frame : Frame, origin : Vector2 = Vector2(0, 0)
var alpha : float = pixel_color.a * cel.opacity
cel_image.set_pixel(xx, yy, Color(pixel_color.r, pixel_color.g, pixel_color.b, alpha))
image.blend_rect(cel_image, Rect2(Global.canvas.location, Global.current_project.size), origin)
cel_image.unlock()
layer_i += 1
image.unlock()

View file

@ -139,6 +139,8 @@ var tag_container : Control
var tag_dialog : AcceptDialog
var remove_frame_button : BaseButton
var move_left_frame_button : BaseButton
var move_right_frame_button : BaseButton
var remove_layer_button : BaseButton
var move_up_layer_button : BaseButton
@ -233,6 +235,8 @@ func _ready() -> void:
tag_dialog = find_node_by_name(animation_timeline, "FrameTagDialog")
remove_frame_button = find_node_by_name(animation_timeline, "DeleteFrame")
move_left_frame_button = find_node_by_name(animation_timeline, "MoveLeft")
move_right_frame_button = find_node_by_name(animation_timeline, "MoveRight")
remove_layer_button = find_node_by_name(animation_timeline, "RemoveLayer")
move_up_layer_button = find_node_by_name(animation_timeline, "MoveUpLayer")

View file

@ -53,7 +53,7 @@ func open_pxo_file(path : String, untitled_backup : bool = false) -> void:
err = file.open(path, File.READ) # If the file is not compressed open it raw (pre-v0.7)
if err != OK:
Global.notification_label("File failed to open")
Global.notification_label(tr("File failed to open. Error code %s") % err)
file.close()
return
@ -317,7 +317,7 @@ func save_pxo_file(path : String, autosave : bool, use_zstd_compression := true,
Global.file_menu.get_popup().set_item_text(3, tr("Save") + " %s" % path.get_file())
else:
Global.notification_label("File failed to save")
Global.notification_label(tr("File failed to save. Error code %s") % err)
file.close()

View file

@ -136,6 +136,8 @@ func change_project() -> void:
Global.current_frame_mark_label.text = "%s/%s" % [str(current_frame + 1), frames.size()]
Global.disable_button(Global.remove_frame_button, frames.size() == 1)
Global.disable_button(Global.move_left_frame_button, frames.size() == 1 or current_frame == 0)
Global.disable_button(Global.move_right_frame_button, frames.size() == 1 or current_frame == frames.size() - 1)
toggle_layer_buttons_layers()
toggle_layer_buttons_current_layer()
@ -436,6 +438,8 @@ func frame_changed(value : int) -> void:
layers[current_layer].frame_container.get_child(current_frame).pressed = true
Global.disable_button(Global.remove_frame_button, frames.size() == 1)
Global.disable_button(Global.move_left_frame_button, frames.size() == 1 or current_frame == 0)
Global.disable_button(Global.move_right_frame_button, frames.size() == 1 or current_frame == frames.size() - 1)
Global.canvas.update()
Global.transparent_checker._ready() # To update the rect size

View file

@ -1,10 +1,15 @@
extends GridContainer
enum {CEL, FRAME, ALL_FRAMES}
const palette_button = preload("res://src/Palette/PaletteButton.tscn")
var current_palette = "Default"
var from_palette : Palette
onready var palette_from_sprite_dialog = $"../../../../PaletteFromSpriteDialog"
func _ready() -> void:
_load_palettes()
@ -117,7 +122,8 @@ func add_palette_menu_id_pressed(id : int) -> void:
1: # Import Palette
on_import_palette()
2: # Create Palette From Current Sprite
create_palette_from_sprite()
palette_from_sprite_dialog.popup_centered()
Global.dialog_open(true)
func create_new_palette(name : String, _from_palette : Palette) -> String: # Returns empty string, else error string
@ -188,18 +194,51 @@ func create_palette_from_sprite() -> void:
Global.error_dialog.set_text(result)
Global.error_dialog.popup_centered()
Global.dialog_open(true)
else:
var current_cel : Cel = current_project.frames[current_project.current_frame].cels[current_project.current_layer]
var cel_image : Image = current_cel.image
var palette : Palette = Global.palettes[current_palette]
for x in cel_image.get_size().x:
for y in cel_image.get_size().y:
var color : Color = cel_image.get_pixel(x, y)
if color.a > 0 and !palette.has_color(color):
palette.add_color(color)
return
save_palette(current_palette, current_palette + ".json")
_display_palette(palette)
var alpha_checkbox : CheckBox = palette_from_sprite_dialog.get_node("VBoxContainer/AlphaCheckBox")
var selection_checkbox : CheckBox = palette_from_sprite_dialog.get_node("VBoxContainer/SelectionCheckBox")
var colors_from_optionbutton : OptionButton = palette_from_sprite_dialog.get_node("VBoxContainer/HBoxContainer/ColorsFromOptionButton")
var palette : Palette = Global.palettes[current_palette]
var pixels := []
if selection_checkbox.pressed:
pixels = current_project.selected_pixels.duplicate()
else:
for x in current_project.size.x:
for y in current_project.size.y:
pixels.append(Vector2(x, y))
var cels := []
match colors_from_optionbutton.selected:
CEL:
cels.append(current_project.frames[current_project.current_frame].cels[current_project.current_layer])
FRAME:
for cel in current_project.frames[current_project.current_frame].cels:
cels.append(cel)
ALL_FRAMES:
for frame in current_project.frames:
for cel in frame.cels:
cels.append(cel)
for cel in cels:
var cel_image := Image.new()
cel_image.copy_from(cel.image)
cel_image.lock()
if cel_image.is_invisible():
continue
for i in pixels:
var color : Color = cel_image.get_pixelv(i)
if color.a > 0:
if !alpha_checkbox.pressed:
color.a = 1
if !palette.has_color(color):
palette.add_color(color)
cel_image.unlock()
save_palette(current_palette, current_palette + ".json")
_display_palette(palette)
func _on_PaletteOptionButton_item_selected(ID : int) -> void:
@ -373,3 +412,11 @@ func _on_NewPaletteDialog_popup_hide() -> void:
func _on_RemovePalette_pressed() -> void:
remove_palette(current_palette)
func _on_PaletteFromSpriteDialog_confirmed() -> void:
create_palette_from_sprite()
func _on_PaletteFromSpriteDialog_popup_hide() -> void:
Global.dialog_open(false)

View file

@ -190,6 +190,60 @@ margin_left = 7.0
margin_top = 7.0
margin_right = 607.0
margin_bottom = 577.0
[node name="PaletteFromSpriteDialog" type="ConfirmationDialog" parent="."]
margin_left = 7.0
margin_top = 7.0
margin_right = 281.0
margin_bottom = 127.0
window_title = "Create Palette From Current Sprite"
resizable = true
[node name="VBoxContainer" type="VBoxContainer" parent="PaletteFromSpriteDialog"]
margin_left = 8.0
margin_top = 8.0
margin_right = 266.0
margin_bottom = 84.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="AlphaCheckBox" type="CheckBox" parent="PaletteFromSpriteDialog/VBoxContainer"]
margin_right = 258.0
margin_bottom = 24.0
mouse_default_cursor_shape = 2
pressed = true
text = "Create colors with alpha component"
[node name="SelectionCheckBox" type="CheckBox" parent="PaletteFromSpriteDialog/VBoxContainer"]
margin_top = 28.0
margin_right = 258.0
margin_bottom = 52.0
mouse_default_cursor_shape = 2
text = "Get colors only from selection"
[node name="HBoxContainer" type="HBoxContainer" parent="PaletteFromSpriteDialog/VBoxContainer"]
margin_top = 56.0
margin_right = 258.0
margin_bottom = 76.0
__meta__ = {
"_edit_use_anchors_": false
}
[node name="Label" type="Label" parent="PaletteFromSpriteDialog/VBoxContainer/HBoxContainer"]
margin_top = 3.0
margin_right = 104.0
margin_bottom = 17.0
text = "Get colors from:"
[node name="ColorsFromOptionButton" type="OptionButton" parent="PaletteFromSpriteDialog/VBoxContainer/HBoxContainer"]
margin_left = 108.0
margin_right = 207.0
margin_bottom = 20.0
mouse_default_cursor_shape = 2
text = "Current cel"
items = [ "Current cel", null, false, 0, null, "Current frame", null, false, 1, null, "All frames", null, false, 2, null ]
selected = 0
[connection signal="pressed" from="PaletteVBoxContainer/CenterContainer/PaletteButtons/AddPalette" to="PaletteVBoxContainer/ScrollPalette/CenterPalette/PaletteContainer" method="_on_AddPalette_pressed"]
[connection signal="pressed" from="PaletteVBoxContainer/CenterContainer/PaletteButtons/EditPalette" to="PaletteVBoxContainer/ScrollPalette/CenterPalette/PaletteContainer" method="on_edit_palette"]
[connection signal="pressed" from="PaletteVBoxContainer/CenterContainer/PaletteButtons/RemovePalette" to="PaletteVBoxContainer/ScrollPalette/CenterPalette/PaletteContainer" method="_on_RemovePalette_pressed"]
@ -198,3 +252,5 @@ margin_bottom = 577.0
[connection signal="popup_hide" from="NewPaletteDialog" to="PaletteVBoxContainer/ScrollPalette/CenterPalette/PaletteContainer" method="_on_NewPaletteDialog_popup_hide"]
[connection signal="file_selected" from="PaletteImportFileDialog" to="PaletteVBoxContainer/ScrollPalette/CenterPalette/PaletteContainer" method="on_palette_import_file_selected"]
[connection signal="popup_hide" from="PaletteImportFileDialog" to="PaletteVBoxContainer/ScrollPalette/CenterPalette/PaletteContainer" method="_on_NewPaletteDialog_popup_hide"]
[connection signal="confirmed" from="PaletteFromSpriteDialog" to="PaletteVBoxContainer/ScrollPalette/CenterPalette/PaletteContainer" method="_on_PaletteFromSpriteDialog_confirmed"]
[connection signal="popup_hide" from="PaletteFromSpriteDialog" to="PaletteVBoxContainer/ScrollPalette/CenterPalette/PaletteContainer" method="_on_PaletteFromSpriteDialog_popup_hide"]

View file

@ -7,9 +7,10 @@ onready var themes := [
[preload("res://assets/themes/blue/theme.tres"), "Blue"],
[preload("res://assets/themes/caramel/theme.tres"), "Caramel"],
[preload("res://assets/themes/light/theme.tres"), "Light"],
[preload("res://assets/themes/purple/theme.tres"), "Purple"],
]
onready var buttons_container : BoxContainer = $ThemeButtons
onready var colors_container : BoxContainer = $ThemeColors
onready var colors_container : BoxContainer = $ThemeColorsSpacer/ThemeColors
onready var theme_color_preview_scene = preload("res://src/Preferences/ThemeColorPreview.tscn")
@ -59,12 +60,18 @@ func change_theme(ID : int) -> void:
Global.theme_type = Global.Theme_Types.CARAMEL
elif ID == 4: # Light Theme
Global.theme_type = Global.Theme_Types.LIGHT
elif ID == 5: # Purple Theme
Global.theme_type = Global.Theme_Types.DARK
Global.control.theme = main_theme
Global.control.theme.default_font = font
Global.default_clear_color = main_theme.get_stylebox("panel", "PanelContainer").bg_color
VisualServer.set_default_clear_color(Color(Global.default_clear_color))
(Global.animation_timeline.get_stylebox("panel", "Panel") as StyleBoxFlat).bg_color = main_theme.get_stylebox("panel", "Panel").bg_color
var fake_vsplit_grabber : TextureRect = Global.find_node_by_name(Global.animation_timeline, "FakeVSplitContainerGrabber")
fake_vsplit_grabber.texture = main_theme.get_icon("grabber", "VSplitContainer")
var layer_button_panel_container : PanelContainer = Global.find_node_by_name(Global.animation_timeline, "LayerButtonPanelContainer")
(layer_button_panel_container.get_stylebox("panel", "PanelContainer") as StyleBoxFlat).bg_color = Global.default_clear_color
@ -80,13 +87,6 @@ func change_theme(ID : int) -> void:
Global.vertical_ruler.add_stylebox_override("hover", ruler_style)
Global.vertical_ruler.add_stylebox_override("focus", ruler_style)
var fake_vsplit_grabber : TextureRect = Global.find_node_by_name(Global.animation_timeline, "FakeVSplitContainerGrabber")
if Global.theme_type == Global.Theme_Types.DARK or Global.theme_type == Global.Theme_Types.BLUE:
fake_vsplit_grabber.texture = preload("res://assets/themes/dark/icons/vsplit.png")
else:
fake_vsplit_grabber.texture = preload("res://assets/themes/light/icons/vsplit.png")
for button in get_tree().get_nodes_in_group("UIButtons"):
if button is TextureButton:
var last_backslash = button.texture_normal.resource_path.get_base_dir().find_last("/")

View file

@ -113,20 +113,23 @@ text = "System Language"
[node name="Themes" type="HBoxContainer" parent="HSplitContainer/ScrollContainer/VBoxContainer"]
visible = false
margin_top = 28.0
margin_right = 498.0
margin_bottom = 164.0
script = ExtResource( 5 )
[node name="ThemeButtons" type="VBoxContainer" parent="HSplitContainer/ScrollContainer/VBoxContainer/Themes"]
margin_right = 80.0
margin_bottom = 136.0
[node name="ThemeColors" type="VBoxContainer" parent="HSplitContainer/ScrollContainer/VBoxContainer/Themes"]
margin_left = 84.0
margin_right = 134.0
margin_bottom = 136.0
custom_constants/separation = 6
[node name="ThemeColorsSpacer" type="VBoxContainer" parent="HSplitContainer/ScrollContainer/VBoxContainer/Themes"]
margin_right = 40.0
margin_bottom = 40.0
[node name="Control" type="Control" parent="HSplitContainer/ScrollContainer/VBoxContainer/Themes/ThemeColorsSpacer"]
margin_right = 40.0
margin_bottom = 40.0
[node name="ThemeColors" type="VBoxContainer" parent="HSplitContainer/ScrollContainer/VBoxContainer/Themes/ThemeColorsSpacer"]
margin_left = 4.0
margin_right = 4.0
custom_constants/separation = 12
[node name="Canvas" type="VBoxContainer" parent="HSplitContainer/ScrollContainer/VBoxContainer"]
visible = false

View file

@ -10,6 +10,7 @@
]]
margin_right = 16.0
margin_bottom = 16.0
size_flags_vertical = 4
disabled = true
texture_normal = ExtResource( 1 )
texture_disabled = SubResource( 1 )

View file

@ -3,7 +3,7 @@
[node name="ThemeColorPreview" type="ColorRect"]
margin_right = 50.0
margin_bottom = 14.0
rect_min_size = Vector2( 50, 14 )
rect_min_size = Vector2( 50, 16 )
color = Color( 0.380392, 0.384314, 0.380392, 1 )
__meta__ = {
"_edit_use_anchors_": false

View file

@ -116,6 +116,26 @@ func copy() -> void:
project.brushes.append(brush)
Brushes.add_project_brush(brush)
func cut() -> void: # This is basically the same as copy + delete
if _selected_rect.has_no_area():
return
var undo_data = _get_undo_data(true)
var project := Global.current_project
var image : Image = project.frames[project.current_frame].cels[project.current_layer].image
var size := _selected_rect.size
var rect = Rect2(Vector2.ZERO, size)
_clipboard = image.get_rect(_selected_rect)
if _clipboard.is_invisible():
return
_clear_image.resize(size.x, size.y, Image.INTERPOLATE_NEAREST)
var brush = _clipboard.get_rect(_clipboard.get_used_rect())
project.brushes.append(brush)
Brushes.add_project_brush(brush)
move_end() # The selection_rectangle can be used while is moving, this prevents malfunctioning
image.blit_rect(_clear_image, rect, _selected_rect.position)
commit_undo("Draw", undo_data)
func paste() -> void:
if _clipboard.get_size() <= Vector2.ZERO:
@ -127,6 +147,7 @@ func paste() -> void:
var size := _selected_rect.size
var rect = Rect2(Vector2.ZERO, size)
image.blend_rect(_clipboard, rect, _selected_rect.position)
move_end() # The selection_rectangle can be used while is moving, this prevents malfunctioning
commit_undo("Draw", undo_data)
@ -138,6 +159,7 @@ func delete() -> void:
var rect = Rect2(Vector2.ZERO, size)
_clear_image.resize(size.x, size.y, Image.INTERPOLATE_NEAREST)
image.blit_rect(_clear_image, rect, _selected_rect.position)
move_end() # The selection_rectangle can be used while is moving, this prevents malfunctioning
commit_undo("Draw", undo_data)

View file

@ -1,8 +1,17 @@
[gd_scene load_steps=4 format=2]
[gd_scene load_steps=5 format=2]
[ext_resource path="res://src/Tools/Base.tscn" type="PackedScene" id=2]
[ext_resource path="res://src/Tools/Bucket.gd" type="Script" id=3]
[sub_resource type="StyleBoxFlat" id=2]
bg_color = Color( 1, 1, 1, 1 )
border_color = Color( 1, 1, 1, 1 )
corner_radius_top_left = 5
corner_radius_top_right = 5
corner_radius_bottom_right = 5
corner_radius_bottom_left = 5
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id=1]
bg_color = Color( 1, 1, 1, 1 )
border_color = Color( 1, 1, 1, 1 )
@ -72,9 +81,11 @@ rect_min_size = Vector2( 32, 32 )
hint_tooltip = "Select a brush"
mouse_default_cursor_shape = 2
size_flags_horizontal = 4
custom_styles/hover = SubResource( 1 )
custom_styles/pressed = SubResource( 1 )
custom_styles/normal = SubResource( 1 )
custom_styles/hover = SubResource( 2 )
custom_styles/pressed = SubResource( 2 )
custom_styles/focus = SubResource( 1 )
custom_styles/disabled = SubResource( 1 )
custom_styles/normal = SubResource( 2 )
[node name="Texture" type="TextureRect" parent="FillPattern/Type" index="0"]
margin_right = 32.0

View file

@ -1,8 +1,17 @@
[gd_scene load_steps=4 format=2]
[gd_scene load_steps=5 format=2]
[ext_resource path="res://src/Tools/Base.tscn" type="PackedScene" id=2]
[ext_resource path="res://src/Tools/Draw.gd" type="Script" id=3]
[sub_resource type="StyleBoxFlat" id=2]
bg_color = Color( 1, 1, 1, 1 )
border_color = Color( 1, 1, 1, 1 )
corner_radius_top_left = 5
corner_radius_top_right = 5
corner_radius_bottom_right = 5
corner_radius_bottom_left = 5
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id=1]
bg_color = Color( 1, 1, 1, 1 )
border_color = Color( 1, 1, 1, 1 )
@ -29,9 +38,11 @@ rect_min_size = Vector2( 32, 32 )
hint_tooltip = "Select a brush"
mouse_default_cursor_shape = 2
size_flags_horizontal = 0
custom_styles/hover = SubResource( 1 )
custom_styles/pressed = SubResource( 1 )
custom_styles/normal = SubResource( 1 )
custom_styles/hover = SubResource( 2 )
custom_styles/pressed = SubResource( 2 )
custom_styles/focus = SubResource( 1 )
custom_styles/disabled = SubResource( 1 )
custom_styles/normal = SubResource( 2 )
[node name="Texture" type="TextureRect" parent="Brush/Type" index="0"]
margin_right = 32.0

View file

@ -17,6 +17,8 @@ margin_bottom = 32.0
rect_min_size = Vector2( 32, 32 )
custom_styles/hover = SubResource( 1 )
custom_styles/pressed = SubResource( 1 )
custom_styles/focus = SubResource( 1 )
custom_styles/disabled = SubResource( 1 )
custom_styles/normal = SubResource( 1 )
button_mask = 7
script = ExtResource( 2 )

View file

@ -35,11 +35,13 @@ func _input(_event : InputEvent):
if has_focus and visible:
if Input.is_action_pressed("left_mouse"):
if type == Types.HORIZONTAL:
points[0].y = round(mouse_pos.y)
points[1].y = round(mouse_pos.y)
var yy = stepify(mouse_pos.y, 0.5)
points[0].y = yy
points[1].y = yy
else:
points[0].x = round(mouse_pos.x)
points[1].x = round(mouse_pos.x)
var xx = stepify(mouse_pos.x, 0.5)
points[0].x = xx
points[1].x = xx
if Input.is_action_just_released("left_mouse"):
Global.has_focus = true
has_focus = false
@ -53,10 +55,10 @@ func _draw() -> void:
var zoom: Vector2 = Global.camera.zoom
if type == Types.HORIZONTAL:
draw_set_transform(Vector2(Global.camera.offset.x - (viewport_size.x / 2) * zoom.x, points[0].y + font.get_height() * zoom.x * 2), rotation, zoom * 2)
draw_string(font, Vector2.ZERO, "%spx" % str(round(mouse_pos.y)))
draw_string(font, Vector2.ZERO, "%spx" % str(stepify(mouse_pos.y, 0.5)))
else:
draw_set_transform(Vector2(points[0].x + font.get_height() * zoom.y, Global.camera.offset.y - (viewport_size.y / 2.25) * zoom.y), rotation, zoom * 2)
draw_string(font, Vector2.ZERO, "%spx" % str(round(mouse_pos.x)))
draw_string(font, Vector2.ZERO, "%spx" % str(stepify(mouse_pos.x, 0.5)))
func outside_canvas() -> bool:

View file

@ -38,12 +38,14 @@ func _ready() -> void:
contributors.create_item(contributor_root).set_text(0, " Aaron Franke (aaronfranke)")
contributors.create_item(contributor_root).set_text(0, " rob-a-bolton")
contributors.create_item(contributor_root).set_text(0, " Vriska Weaver (henlo-birb)")
contributors.create_item(contributor_root).set_text(0, " PinyaColada")
var donors_root := donors.create_item()
donors.create_item(donors_root).set_text(0, " pcmxms - https://www.nonamefornowsoft.com.br/")
donors.create_item(donors_root).set_text(0, " Mike King")
donors.create_item(donors_root).set_text(0, " Guillaume Gautier")
donors.create_item(donors_root).set_text(0, " Isambard")
donors.create_item(donors_root).set_text(0, " Hugo Locurcio")
func _on_AboutDialog_about_to_show() -> void:

View file

@ -15,9 +15,6 @@ func _on_SplashDialog_about_to_show() -> void:
var art_by_label : Button = Global.find_node_by_name(self, "ArtistName")
var show_on_startup_button : CheckBox = Global.find_node_by_name(self, "ShowOnStartup")
var copyright_label : Label = Global.find_node_by_name(self, "CopyrightLabel")
var become_platinum : Button = Global.find_node_by_name(self, "BecomePlatinum")
var become_gold : Button = Global.find_node_by_name(self, "BecomeGold")
var become_patron : Button = Global.find_node_by_name(self, "BecomePatron")
if Global.config_cache.has_section_key("preferences", "startup"):
show_on_startup_button.pressed = !Global.config_cache.get_value("preferences", "startup")
@ -29,9 +26,6 @@ func _on_SplashDialog_about_to_show() -> void:
art_by_label.text = tr("Art by: %s") % chosen_artwork
art_by_label.hint_tooltip = artworks[chosen_artwork][1]
become_platinum.text = "- " + tr("Become a Platinum Sponsor")
become_gold.text = "- " + tr("Become a Gold Sponsor")
become_patron.text = "- " + tr("Become a Patron")
if "zh" in TranslationServer.get_locale():
show_on_startup_button.add_font_override("font", preload("res://assets/fonts/CJK/NotoSansCJKtc-Small.tres"))
copyright_label.add_font_override("font", preload("res://assets/fonts/CJK/NotoSansCJKtc-Small.tres"))
@ -62,10 +56,6 @@ func _on_PatreonButton_pressed() -> void:
OS.shell_open("https://www.patreon.com/OramaInteractive")
func _on_TakeThisSpot_pressed() -> void:
OS.shell_open("https://www.patreon.com/OramaInteractive")
func _on_GithubButton_pressed() -> void:
OS.shell_open("https://github.com/Orama-Interactive/Pixelorama")

View file

@ -15,8 +15,8 @@ expand_margin_top = 20.0
[node name="SplashDialog" type="WindowDialog"]
margin_right = 640.0
margin_bottom = 570.0
rect_min_size = Vector2( 640, 572 )
margin_bottom = 583.0
rect_min_size = Vector2( 640, 583 )
custom_styles/panel = SubResource( 1 )
script = ExtResource( 1 )
__meta__ = {
@ -112,72 +112,36 @@ __meta__ = {
"_edit_use_anchors_": false
}
[node name="Sponsors" type="HBoxContainer" parent="Contents/ButtonsPatronsLogos/Info"]
margin_right = 294.0
margin_bottom = 104.0
size_flags_horizontal = 3
size_flags_vertical = 3
custom_constants/separation = 5
[node name="PatronContainer" type="VBoxContainer" parent="Contents/ButtonsPatronsLogos/Info/Sponsors"]
margin_right = 294.0
margin_bottom = 104.0
size_flags_horizontal = 3
custom_constants/separation = 10
[node name="HBoxContainer" type="HBoxContainer" parent="Contents/ButtonsPatronsLogos/Info/Sponsors/PatronContainer"]
margin_right = 294.0
margin_bottom = 31.0
custom_constants/separation = 0
[node name="SpacerControl" type="Control" parent="Contents/ButtonsPatronsLogos/Info/Sponsors/PatronContainer/HBoxContainer"]
[node name="SpacerControl" type="Control" parent="Contents/ButtonsPatronsLogos/Info"]
margin_right = 6.0
margin_bottom = 31.0
margin_bottom = 104.0
rect_min_size = Vector2( 6, 0 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="PatronsLabel" type="Label" parent="Contents/ButtonsPatronsLogos/Info/Sponsors/PatronContainer/HBoxContainer"]
margin_left = 6.0
margin_right = 236.0
margin_bottom = 31.0
[node name="PatronContainer" type="VBoxContainer" parent="Contents/ButtonsPatronsLogos/Info"]
margin_left = 10.0
margin_right = 294.0
margin_bottom = 104.0
size_flags_horizontal = 3
[node name="PatronsLabel" type="Label" parent="Contents/ButtonsPatronsLogos/Info/PatronContainer"]
margin_right = 284.0
margin_bottom = 14.0
rect_min_size = Vector2( 230, 0 )
size_flags_vertical = 8
text = "Want your name or your company to be shown on the splash screen?"
text = "Patrons:"
autowrap = true
[node name="VBoxContainer" type="VBoxContainer" parent="Contents/ButtonsPatronsLogos/Info/Sponsors/PatronContainer"]
margin_top = 41.0
margin_right = 294.0
margin_bottom = 97.0
custom_constants/separation = -2
[node name="BecomePlatinum" type="Button" parent="Contents/ButtonsPatronsLogos/Info/Sponsors/PatronContainer/VBoxContainer"]
margin_right = 294.0
margin_bottom = 20.0
mouse_default_cursor_shape = 2
text = "- Become a Platinum Sponsor"
flat = true
align = 0
[node name="BecomeGold" type="Button" parent="Contents/ButtonsPatronsLogos/Info/Sponsors/PatronContainer/VBoxContainer"]
[node name="PatronsLabel2" type="Label" parent="Contents/ButtonsPatronsLogos/Info/PatronContainer"]
margin_top = 18.0
margin_right = 294.0
margin_bottom = 38.0
mouse_default_cursor_shape = 2
text = "- Become a Gold Sponsor"
flat = true
align = 0
[node name="BecomePatron" type="Button" parent="Contents/ButtonsPatronsLogos/Info/Sponsors/PatronContainer/VBoxContainer"]
margin_top = 36.0
margin_right = 294.0
margin_bottom = 56.0
mouse_default_cursor_shape = 2
text = "- Become a Patron"
flat = true
align = 0
margin_right = 284.0
margin_bottom = 32.0
rect_min_size = Vector2( 230, 0 )
size_flags_vertical = 8
text = "Hugo Locurcio"
autowrap = true
[node name="VBoxContainer" type="VBoxContainer" parent="Contents/ButtonsPatronsLogos/Info"]
margin_left = 298.0
@ -261,9 +225,6 @@ __meta__ = {
[connection signal="pressed" from="Contents/ButtonsPatronsLogos/Buttons/NewBtn" to="." method="_on_NewBtn_pressed"]
[connection signal="pressed" from="Contents/ButtonsPatronsLogos/Buttons/OpenBtn" to="." method="_on_OpenBtn__pressed"]
[connection signal="pressed" from="Contents/ButtonsPatronsLogos/Buttons/OpenLastBtn" to="." method="_on_OpenLastBtn_pressed"]
[connection signal="pressed" from="Contents/ButtonsPatronsLogos/Info/Sponsors/PatronContainer/VBoxContainer/BecomePlatinum" to="." method="_on_TakeThisSpot_pressed"]
[connection signal="pressed" from="Contents/ButtonsPatronsLogos/Info/Sponsors/PatronContainer/VBoxContainer/BecomeGold" to="." method="_on_TakeThisSpot_pressed"]
[connection signal="pressed" from="Contents/ButtonsPatronsLogos/Info/Sponsors/PatronContainer/VBoxContainer/BecomePatron" to="." method="_on_TakeThisSpot_pressed"]
[connection signal="pressed" from="Contents/ButtonsPatronsLogos/Info/VBoxContainer/Branding/Links/GithubButton" to="." method="_on_GithubButton_pressed"]
[connection signal="pressed" from="Contents/ButtonsPatronsLogos/Info/VBoxContainer/Branding/Links/DiscordButton" to="." method="_on_DiscordButton_pressed"]
[connection signal="pressed" from="Contents/ButtonsPatronsLogos/Info/VBoxContainer/Branding/Links/PatreonButton" to="." method="_on_PatreonButton_pressed"]

View file

@ -1,7 +1,16 @@
[gd_scene load_steps=3 format=2]
[gd_scene load_steps=4 format=2]
[ext_resource path="res://src/UI/PatternButton.gd" type="Script" id=2]
[sub_resource type="StyleBoxFlat" id=2]
bg_color = Color( 1, 1, 1, 1 )
border_color = Color( 1, 1, 1, 1 )
corner_radius_top_left = 5
corner_radius_top_right = 5
corner_radius_bottom_right = 5
corner_radius_bottom_left = 5
anti_aliasing = false
[sub_resource type="StyleBoxFlat" id=1]
bg_color = Color( 1, 1, 1, 1 )
border_color = Color( 1, 1, 1, 1 )
@ -15,9 +24,11 @@ anti_aliasing = false
margin_right = 32.0
margin_bottom = 32.0
rect_min_size = Vector2( 32, 32 )
custom_styles/hover = SubResource( 1 )
custom_styles/pressed = SubResource( 1 )
custom_styles/normal = SubResource( 1 )
custom_styles/hover = SubResource( 2 )
custom_styles/pressed = SubResource( 2 )
custom_styles/focus = SubResource( 1 )
custom_styles/disabled = SubResource( 1 )
custom_styles/normal = SubResource( 2 )
button_mask = 7
script = ExtResource( 2 )

View file

@ -166,6 +166,17 @@ func _on_CopyFrame_pressed(frame := -1) -> void:
func _on_FrameTagButton_pressed() -> void:
Global.tag_dialog.popup_centered()
func _on_MoveLeft_pressed() -> void:
var frame : int = Global.current_project.current_frame
if frame == 0:
return
Global.current_project.layers[Global.current_project.current_layer].frame_container.get_child(frame).change_frame_order(-1)
func _on_MoveRight_pressed() -> void:
var frame : int = Global.current_project.current_frame
if frame == last_frame:
return
Global.current_project.layers[Global.current_project.current_layer].frame_container.get_child(frame).change_frame_order(1)
func _on_OnionSkinning_pressed() -> void:
Global.onion_skinning = !Global.onion_skinning
@ -176,7 +187,6 @@ func _on_OnionSkinning_pressed() -> void:
else:
Global.change_button_texturerect(texture_button, "onion_skinning_off.png")
func _on_OnionSkinningSettings_pressed() -> void:
$OnionSkinningSettings.popup(Rect2(Global.onion_skinning_button.rect_global_position.x - $OnionSkinningSettings.rect_size.x - 16, Global.onion_skinning_button.rect_global_position.y - 106, 136, 126))
@ -474,3 +484,4 @@ func _on_OpacitySlider_value_changed(value) -> void:
func _on_OnionSkinningSettings_popup_hide() -> void:
Global.can_draw = true

View file

@ -7,7 +7,7 @@
[ext_resource path="res://assets/graphics/dark_themes/layers/move_down_disabled.png" type="Texture" id=5]
[ext_resource path="res://assets/graphics/dark_themes/layers/merge_down_disabled.png" type="Texture" id=6]
[ext_resource path="res://assets/graphics/dark_themes/layers/clone_layer.png" type="Texture" id=7]
[ext_resource path="res://assets/themes/dark/icons/vsplit.png" type="Texture" id=8]
[ext_resource path="res://assets/graphics/dark_themes/timeline/move_arrow.png" type="Texture" id=8]
[ext_resource path="res://src/UI/Timeline/LayerButton.tscn" type="PackedScene" id=18]
[ext_resource path="res://assets/graphics/dark_themes/timeline/new_frame.png" type="Texture" id=19]
[ext_resource path="res://assets/graphics/dark_themes/timeline/remove_frame.png" type="Texture" id=20]
@ -320,19 +320,19 @@ __meta__ = {
[node name="Control" type="Control" parent="AnimationContainer/TimelineContainer/TimelineButtons"]
margin_left = 225.0
margin_right = 434.0
margin_right = 386.0
margin_bottom = 38.0
size_flags_horizontal = 3
[node name="PanelContainer" type="PanelContainer" parent="AnimationContainer/TimelineContainer/TimelineButtons"]
margin_left = 438.0
margin_left = 390.0
margin_right = 902.0
margin_bottom = 38.0
[node name="AnimationButtons" type="HBoxContainer" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer"]
margin_left = 7.0
margin_top = 7.0
margin_right = 457.0
margin_right = 505.0
margin_bottom = 31.0
rect_min_size = Vector2( 0, 24 )
size_flags_horizontal = 3
@ -340,7 +340,7 @@ custom_constants/separation = 40
alignment = 2
[node name="FrameButtons" type="HBoxContainer" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons"]
margin_right = 92.0
margin_right = 140.0
margin_bottom = 24.0
[node name="AddFrame" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons" groups=[
@ -456,9 +456,66 @@ __meta__ = {
"_edit_use_anchors_": false
}
[node name="MoveLeft" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons" groups=[
"UIButtons",
]]
margin_left = 96.0
margin_top = 2.0
margin_right = 116.0
margin_bottom = 22.0
rect_min_size = Vector2( 20, 0 )
hint_tooltip = "Move the selected frame to the left."
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_horizontal = 0
size_flags_vertical = 4
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/MoveLeft"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -7.5
margin_top = -5.5
margin_right = 7.5
margin_bottom = 5.5
texture = ExtResource( 8 )
flip_h = true
__meta__ = {
"_edit_use_anchors_": false
}
[node name="MoveRight" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons" groups=[
"UIButtons",
]]
margin_left = 120.0
margin_top = 2.0
margin_right = 140.0
margin_bottom = 22.0
rect_min_size = Vector2( 20, 0 )
hint_tooltip = "Move the selected frame to the right."
focus_mode = 0
mouse_default_cursor_shape = 2
size_flags_horizontal = 0
size_flags_vertical = 4
[node name="TextureRect" type="TextureRect" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/MoveRight"]
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
margin_left = -7.5
margin_top = -5.5
margin_right = 7.5
margin_bottom = 5.5
texture = ExtResource( 8 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="PlaybackButtons" type="HBoxContainer" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons"]
margin_left = 132.0
margin_right = 272.0
margin_left = 180.0
margin_right = 320.0
margin_bottom = 24.0
[node name="FirstFrame" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons" groups=[
@ -638,8 +695,8 @@ __meta__ = {
}
[node name="LoopButtons" type="HBoxContainer" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons"]
margin_left = 312.0
margin_right = 450.0
margin_left = 360.0
margin_right = 498.0
margin_bottom = 24.0
[node name="OnionSkinningSettings" type="Button" parent="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/LoopButtons" groups=[
@ -759,9 +816,9 @@ rect_min_size = Vector2( 214, 0 )
[node name="OpacityLabel" type="Label" parent="AnimationContainer/TimelineContainer/OpacityAndTagContainer/OpacityContainer"]
margin_right = 53.0
margin_bottom = 32.0
margin_bottom = 14.0
size_flags_horizontal = 0
size_flags_vertical = 1
size_flags_vertical = 0
text = "Opacity:"
valign = 1
@ -930,7 +987,6 @@ margin_top = -6.0
margin_right = 24.0
margin_bottom = -4.76837e-07
mouse_filter = 2
texture = ExtResource( 8 )
__meta__ = {
"_edit_use_anchors_": false
}
@ -944,6 +1000,8 @@ __meta__ = {
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/DeleteFrame" to="." method="_on_DeleteFrame_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/CopyFrame" to="." method="_on_CopyFrame_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/FrameTagButton" to="." method="_on_FrameTagButton_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/MoveLeft" to="." method="_on_MoveLeft_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/FrameButtons/MoveRight" to="." method="_on_MoveRight_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons/FirstFrame" to="." method="_on_FirstFrame_pressed"]
[connection signal="pressed" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons/PreviousFrame" to="." method="_on_PreviousFrame_pressed"]
[connection signal="toggled" from="AnimationContainer/TimelineContainer/TimelineButtons/PanelContainer/AnimationButtons/PlaybackButtons/PlayBackwards" to="." method="_on_PlayBackwards_toggled"]

View file

@ -26,8 +26,12 @@ __meta__ = {
"_edit_use_anchors_": false
}
[node name="EmptySpacer" type="Control" parent="HBoxContainer"]
margin_bottom = 36.0
[node name="LayerButtons" type="HBoxContainer" parent="HBoxContainer"]
margin_right = 104.0
margin_left = 4.0
margin_right = 108.0
margin_bottom = 36.0
[node name="VisibilityButton" type="Button" parent="HBoxContainer/LayerButtons" groups=[
@ -122,8 +126,8 @@ __meta__ = {
}
[node name="LayerName" type="HBoxContainer" parent="HBoxContainer"]
margin_left = 108.0
margin_right = 212.0
margin_left = 112.0
margin_right = 216.0
margin_bottom = 36.0
rect_min_size = Vector2( 104, 0 )
mouse_default_cursor_shape = 2

View file

@ -43,6 +43,7 @@ func setup_edit_menu() -> void:
"Undo" : InputMap.get_action_list("undo")[0].get_scancode_with_modifiers(),
"Redo" : InputMap.get_action_list("redo")[0].get_scancode_with_modifiers(),
"Copy" : InputMap.get_action_list("copy")[0].get_scancode_with_modifiers(),
"Cut" : InputMap.get_action_list("cut")[0].get_scancode_with_modifiers(),
"Paste" : InputMap.get_action_list("paste")[0].get_scancode_with_modifiers(),
"Delete" : InputMap.get_action_list("delete")[0].get_scancode_with_modifiers(),
"Clear Selection" : 0,
@ -211,14 +212,16 @@ func edit_menu_id_pressed(id : int) -> void:
Global.control.redone = false
2: # Copy
Global.selection_rectangle.copy()
3: # paste
3: # cut
Global.selection_rectangle.cut()
4: # paste
Global.selection_rectangle.paste()
4: # Delete
5: # Delete
Global.selection_rectangle.delete()
5: # Clear selection
6: # Clear selection
Global.selection_rectangle.set_rect(Rect2(0, 0, 0, 0))
Global.selection_rectangle.select_rect()
6: # Preferences
7: # Preferences
Global.preferences_dialog.popup_centered(Vector2(400, 280))
Global.dialog_open(true)

View file

@ -21,7 +21,7 @@ __meta__ = {
[node name="FileMenu" type="MenuButton" parent="MenuItems"]
margin_right = 35.0
margin_bottom = 20.0
margin_bottom = 23.0
mouse_default_cursor_shape = 2
text = "File"
switch_on_hover = true
@ -29,7 +29,7 @@ switch_on_hover = true
[node name="EditMenu" type="MenuButton" parent="MenuItems"]
margin_left = 39.0
margin_right = 75.0
margin_bottom = 20.0
margin_bottom = 23.0
mouse_default_cursor_shape = 2
text = "Edit"
switch_on_hover = true
@ -37,7 +37,7 @@ switch_on_hover = true
[node name="ViewMenu" type="MenuButton" parent="MenuItems"]
margin_left = 79.0
margin_right = 121.0
margin_bottom = 20.0
margin_bottom = 23.0
mouse_default_cursor_shape = 2
text = "View"
switch_on_hover = true
@ -45,7 +45,7 @@ switch_on_hover = true
[node name="ImageMenu" type="MenuButton" parent="MenuItems"]
margin_left = 125.0
margin_right = 177.0
margin_bottom = 20.0
margin_bottom = 23.0
mouse_default_cursor_shape = 2
text = "Image"
switch_on_hover = true
@ -53,7 +53,7 @@ switch_on_hover = true
[node name="HelpMenu" type="MenuButton" parent="MenuItems"]
margin_left = 181.0
margin_right = 223.0
margin_bottom = 20.0
margin_bottom = 23.0
mouse_default_cursor_shape = 2
text = "Help"
switch_on_hover = true
@ -91,10 +91,10 @@ anchor_top = 0.5
anchor_right = 1.0
anchor_bottom = 0.5
margin_left = -330.0
margin_top = -14.0
margin_bottom = 14.0
margin_top = -10.0
margin_right = 0.00012207
margin_bottom = 13.0
grow_horizontal = 2
size_flags_vertical = 0
alignment = 1
__meta__ = {
"_edit_use_anchors_": false
@ -103,10 +103,9 @@ __meta__ = {
[node name="CurrentFrame" type="Label" parent="HBoxContainer"]
margin_left = 106.0
margin_right = 198.0
margin_bottom = 28.0
margin_bottom = 23.0
size_flags_vertical = 1
text = "Current frame:"
valign = 1
__meta__ = {
"_edit_use_anchors_": false
}
@ -114,7 +113,6 @@ __meta__ = {
[node name="CurrentFrameMark" type="Label" parent="HBoxContainer"]
margin_left = 202.0
margin_right = 223.0
margin_bottom = 28.0
margin_bottom = 23.0
size_flags_vertical = 1
text = "1/2"
valign = 1

View file

@ -49,8 +49,10 @@ size_flags_vertical = 3
anchor_left = 0.5
anchor_right = 0.5
margin_left = -20.5
margin_right = 20.5
margin_bottom = 254.0
margin_right = -6.5
margin_bottom = 14.0
size_flags_horizontal = 0
size_flags_vertical = 0
__meta__ = {
"_edit_use_anchors_": false
}
@ -59,7 +61,9 @@ __meta__ = {
margin_left = 7.0
margin_top = 7.0
margin_right = 39.0
margin_bottom = 291.0
margin_bottom = 255.0
size_flags_horizontal = 4
size_flags_vertical = 0
script = ExtResource( 1 )
__meta__ = {
"_edit_use_anchors_": false