mirror of
https://github.com/tonytins/CozyPixelStudio.git
synced 2025-06-25 10:14:42 -04:00
Importing spritesheets is now possible
Moved the import png code from Main.gd to a new ImportSprites.gd script, and made ImportSprites a scene of its own.
This commit is contained in:
parent
3cac42ba15
commit
d1e5b23f0b
8 changed files with 203 additions and 78 deletions
16
Scripts/Dialogs/AboutDialog.gd
Normal file
16
Scripts/Dialogs/AboutDialog.gd
Normal file
|
@ -0,0 +1,16 @@
|
|||
extends AcceptDialog
|
||||
|
||||
# Called when the node enters the scene tree for the first time.
|
||||
func _ready() -> void:
|
||||
var current_version : String = ProjectSettings.get_setting("application/config/Version")
|
||||
$AboutUI/Pixelorama.text = "Pixelorama %s\n" % current_version
|
||||
|
||||
func _on_Website_pressed() -> void:
|
||||
OS.shell_open("https://www.orama-interactive.com/pixelorama")
|
||||
|
||||
func _on_GitHub_pressed() -> void:
|
||||
OS.shell_open("https://github.com/OverloadedOrama/Pixelorama")
|
||||
|
||||
func _on_Donate_pressed() -> void:
|
||||
OS.shell_open("https://paypal.me/OverloadedOrama")
|
||||
OS.shell_open("https://ko-fi.com/overloadedorama")
|
112
Scripts/Dialogs/ImportSprites.gd
Normal file
112
Scripts/Dialogs/ImportSprites.gd
Normal file
|
@ -0,0 +1,112 @@
|
|||
extends FileDialog
|
||||
|
||||
var new_frame := false
|
||||
var import_spritesheet := false
|
||||
var spritesheet_horizontal := 1
|
||||
var spritesheet_vertical := 1
|
||||
|
||||
func _ready():
|
||||
var children := []
|
||||
for i in range(get_child_count()):
|
||||
if i > 7:
|
||||
children.append(get_child(i))
|
||||
|
||||
for child in children:
|
||||
remove_child(child)
|
||||
get_vbox().add_child(child)
|
||||
|
||||
func _on_ImportAsNewFrame_pressed() -> void:
|
||||
new_frame = !new_frame
|
||||
|
||||
func _on_ImportSpritesheet_pressed() -> void:
|
||||
import_spritesheet = !import_spritesheet
|
||||
var spritesheet_container = Global.find_node_by_name(self, "Spritesheet")
|
||||
spritesheet_container.visible = import_spritesheet
|
||||
|
||||
func _on_HorizontalFrames_value_changed(value) -> void:
|
||||
spritesheet_horizontal = value
|
||||
|
||||
func _on_VerticalFrames_value_changed(value) -> void:
|
||||
spritesheet_vertical = value
|
||||
|
||||
func _on_ImportSprites_files_selected(paths : PoolStringArray) -> void:
|
||||
Global.control.opensprite_file_selected = true
|
||||
if !new_frame: # If we're not adding a new frame, delete the previous
|
||||
Global.control.clear_canvases()
|
||||
|
||||
var first_path : String = paths[0]
|
||||
var i: int = Global.canvases.size()
|
||||
|
||||
if !import_spritesheet:
|
||||
# Find the biggest image and let it handle the camera zoom options
|
||||
var max_size : Vector2
|
||||
var biggest_canvas : Canvas
|
||||
for path in paths:
|
||||
var image := Image.new()
|
||||
var err := image.load(path)
|
||||
if err != OK: #An error occured
|
||||
OS.alert("Can't load file")
|
||||
continue
|
||||
|
||||
var canvas : Canvas = load("res://Prefabs/Canvas.tscn").instance()
|
||||
canvas.size = image.get_size()
|
||||
image.convert(Image.FORMAT_RGBA8)
|
||||
image.lock()
|
||||
var tex := ImageTexture.new()
|
||||
tex.create_from_image(image, 0)
|
||||
# Store [Image, ImageTexture, Layer Name, Visibity boolean, Opacity]
|
||||
canvas.layers.append([image, tex, "Layer 0", true, 1])
|
||||
canvas.frame = i
|
||||
Global.canvases.append(canvas)
|
||||
Global.canvas_parent.add_child(canvas)
|
||||
canvas.visible = false
|
||||
if path == paths[0]: #If it's the first file
|
||||
max_size = canvas.size
|
||||
biggest_canvas = canvas
|
||||
else:
|
||||
if canvas.size > max_size:
|
||||
biggest_canvas = canvas
|
||||
|
||||
i += 1
|
||||
|
||||
biggest_canvas.camera_zoom()
|
||||
|
||||
else:
|
||||
var image := Image.new()
|
||||
var err := image.load(first_path)
|
||||
if err != OK: #An error occured
|
||||
OS.alert("Can't load file")
|
||||
return
|
||||
|
||||
spritesheet_horizontal = min(spritesheet_horizontal, image.get_size().x)
|
||||
spritesheet_vertical = min(spritesheet_vertical, image.get_size().y)
|
||||
var frame_width := image.get_size().x / spritesheet_horizontal
|
||||
var frame_height := image.get_size().y / spritesheet_vertical
|
||||
for yy in range(spritesheet_vertical):
|
||||
for xx in range(spritesheet_horizontal):
|
||||
var canvas : Canvas = load("res://Prefabs/Canvas.tscn").instance()
|
||||
var cropped_image := Image.new()
|
||||
cropped_image = image.get_rect(Rect2(frame_width * xx, frame_height * yy, frame_width, frame_height))
|
||||
canvas.size = cropped_image.get_size()
|
||||
image.convert(Image.FORMAT_RGBA8)
|
||||
cropped_image.lock()
|
||||
var tex := ImageTexture.new()
|
||||
tex.create_from_image(cropped_image, 0)
|
||||
# Store [Image, ImageTexture, Layer Name, Visibity boolean, Opacity]
|
||||
canvas.layers.append([cropped_image, tex, "Layer 0", true, 1])
|
||||
canvas.frame = i
|
||||
Global.canvases.append(canvas)
|
||||
Global.canvas_parent.add_child(canvas)
|
||||
canvas.visible = false
|
||||
|
||||
i += 1
|
||||
|
||||
Global.canvases[Global.canvases.size() - 1].camera_zoom()
|
||||
|
||||
Global.current_frame = i - 1
|
||||
Global.canvas = Global.canvases[Global.canvases.size() - 1]
|
||||
Global.canvas.visible = true
|
||||
|
||||
Global.undo_redo.clear_history(false)
|
||||
OS.set_window_title(first_path.get_file() + " (imported) - Pixelorama")
|
||||
|
170
Scripts/Dialogs/PreferencesDialog.gd
Normal file
170
Scripts/Dialogs/PreferencesDialog.gd
Normal file
|
@ -0,0 +1,170 @@
|
|||
extends AcceptDialog
|
||||
|
||||
onready var tree : Tree = $HSplitContainer/Tree
|
||||
onready var right_side : VBoxContainer = $HSplitContainer/ScrollContainer/VBoxContainer
|
||||
onready var languages = $HSplitContainer/ScrollContainer/VBoxContainer/Languages
|
||||
onready var themes = $HSplitContainer/ScrollContainer/VBoxContainer/Themes
|
||||
onready var grid_guides = $"HSplitContainer/ScrollContainer/VBoxContainer/Grid&Guides"
|
||||
|
||||
func _ready() -> void:
|
||||
var root := tree.create_item()
|
||||
var language_button := tree.create_item(root)
|
||||
var theme_button := tree.create_item(root)
|
||||
var grid_button := tree.create_item(root)
|
||||
language_button.set_text(0, " Language")
|
||||
language_button.select(0)
|
||||
theme_button.set_text(0, " Themes")
|
||||
grid_button.set_text(0, " Guides & Grid")
|
||||
|
||||
for child in languages.get_children():
|
||||
if child is Button:
|
||||
child.connect("pressed", self, "_on_Language_pressed", [child])
|
||||
|
||||
for child in themes.get_children():
|
||||
if child is Button:
|
||||
child.connect("pressed", self, "_on_Theme_pressed", [child])
|
||||
|
||||
if Global.config_cache.has_section_key("preferences", "theme"):
|
||||
var theme_id = Global.config_cache.get_value("preferences", "theme")
|
||||
change_theme(theme_id)
|
||||
themes.get_child(theme_id + 1).pressed = true
|
||||
|
||||
func _on_Tree_item_selected() -> void:
|
||||
for child in right_side.get_children():
|
||||
child.visible = false
|
||||
var selected := tree.get_selected().get_text(0)
|
||||
if "Language" in selected:
|
||||
languages.visible = true
|
||||
elif "Themes" in selected:
|
||||
themes.visible = true
|
||||
elif "Guides & Grid" in selected:
|
||||
grid_guides.visible = true
|
||||
|
||||
func _on_Language_pressed(button : Button) -> void:
|
||||
var index := 0
|
||||
var i := -1
|
||||
for child in languages.get_children():
|
||||
if child is Button:
|
||||
if child == button:
|
||||
button.pressed = true
|
||||
index = i
|
||||
else:
|
||||
child.pressed = false
|
||||
i += 1
|
||||
if index == -1:
|
||||
TranslationServer.set_locale(OS.get_locale())
|
||||
else:
|
||||
TranslationServer.set_locale(Global.loaded_locales[index])
|
||||
|
||||
if TranslationServer.get_locale() == "zh_TW":
|
||||
Global.control.theme.default_font = preload("res://Assets/Fonts/NotoSansCJKtc-Regular.tres")
|
||||
else:
|
||||
Global.control.theme.default_font = preload("res://Assets/Fonts/Roboto-Regular.tres")
|
||||
|
||||
Global.config_cache.set_value("preferences", "locale", TranslationServer.get_locale())
|
||||
Global.config_cache.save("user://cache.ini")
|
||||
|
||||
func _on_Theme_pressed(button : Button) -> void:
|
||||
var index := 0
|
||||
var i := 0
|
||||
for child in themes.get_children():
|
||||
if child is Button:
|
||||
if child == button:
|
||||
button.pressed = true
|
||||
index = i
|
||||
else:
|
||||
child.pressed = false
|
||||
i += 1
|
||||
|
||||
change_theme(index)
|
||||
|
||||
Global.config_cache.set_value("preferences", "theme", index)
|
||||
Global.config_cache.save("user://cache.ini")
|
||||
|
||||
|
||||
func change_theme(ID : int) -> void:
|
||||
var font = Global.control.theme.default_font
|
||||
var main_theme
|
||||
var top_menu_style
|
||||
var ruler_style
|
||||
if ID == 0: #Dark Theme
|
||||
Global.theme_type = "Dark"
|
||||
Global.transparent_background.create_from_image(preload("res://Assets/Graphics/Transparent Background Dark.png"), 0)
|
||||
VisualServer.set_default_clear_color(Color(0.247059, 0.25098, 0.247059))
|
||||
main_theme = preload("res://Themes & Styles/Dark Theme/Dark Theme.tres")
|
||||
top_menu_style = preload("res://Themes & Styles/Dark Theme/DarkTopMenuStyle.tres")
|
||||
ruler_style = preload("res://Themes & Styles/Dark Theme/DarkRulerStyle.tres")
|
||||
elif ID == 1: #Gray Theme
|
||||
Global.theme_type = "Dark"
|
||||
Global.transparent_background.create_from_image(preload("res://Assets/Graphics/Transparent Background Gray.png"), 0)
|
||||
VisualServer.set_default_clear_color(Color(0.301961, 0.301961, 0.301961))
|
||||
main_theme = preload("res://Themes & Styles/Gray Theme/Gray Theme.tres")
|
||||
top_menu_style = preload("res://Themes & Styles/Gray Theme/GrayTopMenuStyle.tres")
|
||||
ruler_style = preload("res://Themes & Styles/Dark Theme/DarkRulerStyle.tres")
|
||||
elif ID == 2: #Godot's Theme
|
||||
Global.theme_type = "Dark"
|
||||
Global.transparent_background.create_from_image(preload("res://Assets/Graphics/Transparent Background Godot.png"), 0)
|
||||
VisualServer.set_default_clear_color(Color(0.27451, 0.278431, 0.305882))
|
||||
main_theme = preload("res://Themes & Styles/Godot\'s Theme/Godot\'s Theme.tres")
|
||||
top_menu_style = preload("res://Themes & Styles/Godot\'s Theme/TopMenuStyle.tres")
|
||||
ruler_style = preload("res://Themes & Styles/Godot\'s Theme/RulerStyle.tres")
|
||||
elif ID == 3: #Gold Theme
|
||||
Global.theme_type = "Gold"
|
||||
Global.transparent_background.create_from_image(preload("res://Assets/Graphics/Transparent Background Gold.png"), 0)
|
||||
VisualServer.set_default_clear_color(Color(0.694118, 0.619608, 0.458824))
|
||||
main_theme = preload("res://Themes & Styles/Gold Theme/Gold Theme.tres")
|
||||
top_menu_style = preload("res://Themes & Styles/Gold Theme/GoldTopMenuStyle.tres")
|
||||
ruler_style = preload("res://Themes & Styles/Gold Theme/GoldRulerStyle.tres")
|
||||
elif ID == 4: #Light Theme
|
||||
Global.theme_type = "Light"
|
||||
Global.transparent_background.create_from_image(preload("res://Assets/Graphics/Transparent Background Light.png"), 0)
|
||||
VisualServer.set_default_clear_color(Color(0.705882, 0.705882, 0.705882))
|
||||
main_theme = preload("res://Themes & Styles/Light Theme/Light Theme.tres")
|
||||
top_menu_style = preload("res://Themes & Styles/Light Theme/LightTopMenuStyle.tres")
|
||||
ruler_style = preload("res://Themes & Styles/Light Theme/LightRulerStyle.tres")
|
||||
|
||||
Global.control.theme = main_theme
|
||||
Global.control.theme.default_font = font
|
||||
Global.top_menu_container.add_stylebox_override("panel", top_menu_style)
|
||||
Global.horizontal_ruler.add_stylebox_override("normal", ruler_style)
|
||||
Global.horizontal_ruler.add_stylebox_override("pressed", ruler_style)
|
||||
Global.horizontal_ruler.add_stylebox_override("hover", ruler_style)
|
||||
Global.horizontal_ruler.add_stylebox_override("focus", ruler_style)
|
||||
Global.vertical_ruler.add_stylebox_override("normal", ruler_style)
|
||||
Global.vertical_ruler.add_stylebox_override("pressed", ruler_style)
|
||||
Global.vertical_ruler.add_stylebox_override("hover", ruler_style)
|
||||
Global.vertical_ruler.add_stylebox_override("focus", ruler_style)
|
||||
|
||||
for button in get_tree().get_nodes_in_group("UIButtons"):
|
||||
var last_backslash = button.texture_normal.resource_path.get_base_dir().find_last("/")
|
||||
var button_category = button.texture_normal.resource_path.get_base_dir().right(last_backslash + 1)
|
||||
var normal_file_name = button.texture_normal.resource_path.get_file()
|
||||
button.texture_normal = load("res://Assets/Graphics/%s Themes/%s/%s" % [Global.theme_type, button_category, normal_file_name])
|
||||
if button.texture_pressed:
|
||||
var pressed_file_name = button.texture_pressed.resource_path.get_file()
|
||||
button.texture_pressed = load("res://Assets/Graphics/%s Themes/%s/%s" % [Global.theme_type, button_category, pressed_file_name])
|
||||
if button.texture_hover:
|
||||
var hover_file_name = button.texture_hover.resource_path.get_file()
|
||||
button.texture_hover = load("res://Assets/Graphics/%s Themes/%s/%s" % [Global.theme_type, button_category, hover_file_name])
|
||||
if button.texture_disabled:
|
||||
var disabled_file_name = button.texture_disabled.resource_path.get_file()
|
||||
button.texture_disabled = load("res://Assets/Graphics/%s Themes/%s/%s" % [Global.theme_type, button_category, disabled_file_name])
|
||||
|
||||
# Make sure the frame text gets updated
|
||||
Global.current_frame = Global.current_frame
|
||||
|
||||
func _on_GridWidthValue_value_changed(value : float) -> void:
|
||||
Global.grid_width = value
|
||||
|
||||
func _on_GridHeightValue_value_changed(value : float) -> void:
|
||||
Global.grid_height = value
|
||||
|
||||
func _on_GridColor_color_changed(color : Color) -> void:
|
||||
Global.grid_color = color
|
||||
|
||||
func _on_GuideColor_color_changed(color : Color) -> void:
|
||||
Global.guide_color = color
|
||||
for canvas in Global.canvases:
|
||||
for guide in canvas.get_children():
|
||||
if guide is Guide:
|
||||
guide.default_color = color
|
Loading…
Add table
Add a link
Reference in a new issue