From 04a5292672940e80ba00b7b870eda04dbc6c26c5 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 15 Aug 2024 04:36:33 +0300
Subject: [PATCH 001/162] Use exact match for the `draw_color_picker` shortcut
---
src/Tools/BaseShapeDrawer.gd | 4 ++--
src/Tools/DesignTools/Bucket.gd | 2 +-
src/Tools/DesignTools/Eraser.gd | 4 ++--
src/Tools/DesignTools/Pencil.gd | 4 ++--
src/Tools/DesignTools/Shading.gd | 4 ++--
5 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/src/Tools/BaseShapeDrawer.gd b/src/Tools/BaseShapeDrawer.gd
index 44992ad26..54369d670 100644
--- a/src/Tools/BaseShapeDrawer.gd
+++ b/src/Tools/BaseShapeDrawer.gd
@@ -89,7 +89,7 @@ func _input(event: InputEvent) -> void:
func draw_start(pos: Vector2i) -> void:
pos = snap_position(pos)
super.draw_start(pos)
- if Input.is_action_pressed("draw_color_picker"):
+ if Input.is_action_pressed(&"draw_color_picker", true):
_picking_color = true
_pick_color(pos)
return
@@ -111,7 +111,7 @@ func draw_move(pos: Vector2i) -> void:
pos = snap_position(pos)
super.draw_move(pos)
if _picking_color: # Still return even if we released draw_color_picker (Alt)
- if Input.is_action_pressed("draw_color_picker"):
+ if Input.is_action_pressed(&"draw_color_picker", true):
_pick_color(pos)
return
diff --git a/src/Tools/DesignTools/Bucket.gd b/src/Tools/DesignTools/Bucket.gd
index 2e640a365..1862f256c 100644
--- a/src/Tools/DesignTools/Bucket.gd
+++ b/src/Tools/DesignTools/Bucket.gd
@@ -151,7 +151,7 @@ func update_pattern() -> void:
func draw_start(pos: Vector2i) -> void:
super.draw_start(pos)
- if Input.is_action_pressed("draw_color_picker"):
+ if Input.is_action_pressed(&"draw_color_picker", true):
_pick_color(pos)
return
_undo_data = _get_undo_data()
diff --git a/src/Tools/DesignTools/Eraser.gd b/src/Tools/DesignTools/Eraser.gd
index 754b1200a..d4d08fd37 100644
--- a/src/Tools/DesignTools/Eraser.gd
+++ b/src/Tools/DesignTools/Eraser.gd
@@ -37,7 +37,7 @@ func set_config(config: Dictionary) -> void:
func draw_start(pos: Vector2i) -> void:
pos = snap_position(pos)
super.draw_start(pos)
- if Input.is_action_pressed("draw_color_picker"):
+ if Input.is_action_pressed(&"draw_color_picker", true):
_picking_color = true
_pick_color(pos)
return
@@ -71,7 +71,7 @@ func draw_move(pos_i: Vector2i) -> void:
pos = snap_position(pos)
super.draw_move(pos)
if _picking_color: # Still return even if we released Alt
- if Input.is_action_pressed(&"draw_color_picker"):
+ if Input.is_action_pressed(&"draw_color_picker", true):
_pick_color(pos)
return
diff --git a/src/Tools/DesignTools/Pencil.gd b/src/Tools/DesignTools/Pencil.gd
index 1ee1dfcc9..145720671 100644
--- a/src/Tools/DesignTools/Pencil.gd
+++ b/src/Tools/DesignTools/Pencil.gd
@@ -94,7 +94,7 @@ func draw_start(pos: Vector2i) -> void:
_old_spacing_mode = _spacing_mode
pos = snap_position(pos)
super.draw_start(pos)
- if Input.is_action_pressed("draw_color_picker"):
+ if Input.is_action_pressed(&"draw_color_picker", true):
_picking_color = true
_pick_color(pos)
return
@@ -136,7 +136,7 @@ func draw_move(pos_i: Vector2i) -> void:
pos = snap_position(pos)
super.draw_move(pos)
if _picking_color: # Still return even if we released Alt
- if Input.is_action_pressed(&"draw_color_picker"):
+ if Input.is_action_pressed(&"draw_color_picker", true):
_pick_color(pos)
return
diff --git a/src/Tools/DesignTools/Shading.gd b/src/Tools/DesignTools/Shading.gd
index a07fd22fb..1a964430b 100644
--- a/src/Tools/DesignTools/Shading.gd
+++ b/src/Tools/DesignTools/Shading.gd
@@ -208,7 +208,7 @@ func update_strength() -> void:
func draw_start(pos: Vector2i) -> void:
pos = snap_position(pos)
super.draw_start(pos)
- if Input.is_action_pressed("draw_color_picker"):
+ if Input.is_action_pressed(&"draw_color_picker", true):
_picking_color = true
_pick_color(pos)
return
@@ -242,7 +242,7 @@ func draw_move(pos_i: Vector2i) -> void:
pos = snap_position(pos)
super.draw_move(pos)
if _picking_color: # Still return even if we released Alt
- if Input.is_action_pressed(&"draw_color_picker"):
+ if Input.is_action_pressed(&"draw_color_picker", true):
_pick_color(pos)
return
From f6f40e03e595334e0dcf4da605c73481fcf57f3a Mon Sep 17 00:00:00 2001
From: alikin12 <12932510+alikin12@users.noreply.github.com>
Date: Thu, 15 Aug 2024 14:42:01 +0200
Subject: [PATCH 002/162] Fix Orama-Interactive#958 (reset custom brush when
switch another tool) (#1078)
---
src/UI/Buttons/BrushesPopup.gd | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/UI/Buttons/BrushesPopup.gd b/src/UI/Buttons/BrushesPopup.gd
index 426f5710b..4986adb60 100644
--- a/src/UI/Buttons/BrushesPopup.gd
+++ b/src/UI/Buttons/BrushesPopup.gd
@@ -96,6 +96,7 @@ static func clear_project_brush() -> void:
"Background/Brushes/Categories/ProjectBrushContainer"
)
for child in container.get_children():
+ container.remove_child(child)
child.queue_free()
Global.brushes_popup.brush_removed.emit(child.brush)
From 077c57c53a6a228dd50cfe937f2c67e95acbd66d Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 15 Aug 2024 15:52:55 +0300
Subject: [PATCH 003/162] Implement support for group layer blending (#1077)
* Blend group layers on `DrawingAlgos.blend_layers()`
* Support group layer blending on the canvas
* Allow editing of group layer properties
* Fix issues with group layer blending in canvas, and unite common code
* Group layers can now be used as clipping masks
* Make move tool preview work on child layers
* Change OffsetImage's `blend_layers()` to support group layer blending
* Support group layer blending in the canvas preview
* Fix layer blending mode, clipping mask opacity and cel opacity not being updated automatically if the layer/cel changed is not selected
* Add a pass through blending mode to layer groups
Fingers crossed that no bugs were introduced
* Fix issue with layers that belong to pass through groups not updating their textures on the canvas automatically on undo
---
Translations/Translations.pot | 4 +
src/Autoload/DrawingAlgos.gd | 21 +++-
src/Classes/Layers/BaseLayer.gd | 40 ++++++-
src/Classes/Layers/GroupLayer.gd | 120 ++++++++++++++++++---
src/Shaders/BlendLayers.gdshader | 23 +++-
src/UI/Canvas/Canvas.gd | 71 +++++++-----
src/UI/Canvas/CanvasPreview.gd | 13 ++-
src/UI/Dialogs/ImageEffects/OffsetImage.gd | 12 ++-
src/UI/Timeline/AnimationTimeline.gd | 88 +++++++++------
src/UI/Timeline/CelProperties.gd | 1 +
src/UI/Timeline/LayerButton.gd | 5 +-
src/UI/Timeline/LayerProperties.gd | 49 ++++++---
12 files changed, 332 insertions(+), 115 deletions(-)
diff --git a/Translations/Translations.pot b/Translations/Translations.pot
index cf774aa5d..522571def 100644
--- a/Translations/Translations.pot
+++ b/Translations/Translations.pot
@@ -2143,6 +2143,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/src/Autoload/DrawingAlgos.gd b/src/Autoload/DrawingAlgos.gd
index befb565e7..4dda47d4b 100644
--- a/src/Autoload/DrawingAlgos.gd
+++ b/src/Autoload/DrawingAlgos.gd
@@ -53,8 +53,18 @@ func blend_layers(
if DisplayServer.get_name() == "headless":
blend_layers_headless(image, project, layer, cel, origin)
else:
- var cel_image := layer.display_effects(cel)
- textures.append(cel_image)
+ if layer is GroupLayer and layer.blend_mode != BaseLayer.BlendModes.PASS_THROUGH:
+ var cel_image := (layer as GroupLayer).blend_children(frame)
+ textures.append(cel_image)
+ else:
+ var cel_image := layer.display_effects(cel)
+ textures.append(cel_image)
+ if (
+ layer.is_blended_by_ancestor()
+ and not only_selected_cels
+ and not only_selected_layers
+ ):
+ include = false
set_layer_metadata_image(layer, cel, metadata_image, ordered_index, include)
if DisplayServer.get_name() != "headless":
var texture_array := Texture2DArray.new()
@@ -84,9 +94,14 @@ func set_layer_metadata_image(
image.set_pixel(index, 1, Color())
# Store the clipping mask boolean
if layer.clipping_mask:
- image.set_pixel(index, 3, Color.WHITE)
+ image.set_pixel(index, 3, Color.RED)
else:
image.set_pixel(index, 3, Color.BLACK)
+ if not include:
+ # Store a small red value as a way to indicate that this layer should be skipped
+ # Used for layers such as child layers of a group, so that the group layer itself can
+ # sucessfuly be used as a clipping mask with the layer below it.
+ image.set_pixel(index, 3, Color(0.2, 0.0, 0.0, 0.0))
func blend_layers_headless(
diff --git a/src/Classes/Layers/BaseLayer.gd b/src/Classes/Layers/BaseLayer.gd
index aa5898d07..d45ba7333 100644
--- a/src/Classes/Layers/BaseLayer.gd
+++ b/src/Classes/Layers/BaseLayer.gd
@@ -1,3 +1,4 @@
+# gdlint: ignore=max-public-methods
class_name BaseLayer
extends RefCounted
## Base class for layer properties. Different layer types extend from this class.
@@ -9,7 +10,8 @@ signal visibility_changed ## Emits when [member visible] is changed.
## is the blend layer, and the bottom layer is the base layer.
## For more information, refer to: [url]https://en.wikipedia.org/wiki/Blend_modes[/url]
enum BlendModes {
- NORMAL, ## The blend layer colors are simply placed on top of the base colors.
+ PASS_THROUGH = -2, ## Only for group layers. Ignores group blending, like it doesn't exist.
+ NORMAL = 0, ## The blend layer colors are simply placed on top of the base colors.
DARKEN, ## Keeps the darker colors between the blend and the base layers.
MULTIPLY, ## Multiplies the numerical values of the two colors, giving a darker result.
COLOR_BURN, ## Darkens by increasing the contrast between the blend and base colors.
@@ -124,6 +126,17 @@ func is_locked_in_hierarchy() -> bool:
return locked
+## Returns [code]true[/code] if the layer has at least one ancestor
+## that does not have its blend mode set to pass through.
+func is_blended_by_ancestor() -> bool:
+ var is_blended := false
+ for ancestor in get_ancestors():
+ if ancestor.blend_mode != BlendModes.PASS_THROUGH:
+ is_blended = true
+ break
+ return is_blended
+
+
## Returns an [Array] of [BaseLayer]s that are ancestors of this layer.
## If there are no ancestors, returns an empty array.
func get_ancestors() -> Array[BaseLayer]:
@@ -141,6 +154,20 @@ func get_hierarchy_depth() -> int:
return 0
+## Returns the layer's top most parent that is responsible for its blending.
+## For example, if a layer belongs in a group with its blend mode set to anything but pass through,
+## and that group has no parents of its own, then that group gets returned.
+## If that group is a child of another non-pass through group,
+## then the grandparent group is returned, and so on.
+## If the layer has no ancestors, or if they are set to pass through mode, it returns self.
+func get_blender_ancestor() -> BaseLayer:
+ var blender := self
+ for ancestor in get_ancestors():
+ if ancestor.blend_mode != BlendModes.PASS_THROUGH:
+ blender = ancestor
+ return blender
+
+
## Returns the path of the layer in the timeline as a [String].
func get_layer_path() -> String:
if is_instance_valid(parent):
@@ -189,9 +216,12 @@ func link_cel(cel: BaseCel, link_set = null) -> void:
## Returns a copy of the [param cel]'s [Image] with all of the effects applied to it.
## This method is not destructive as it does NOT change the data of the image,
## it just returns a copy.
-func display_effects(cel: BaseCel) -> Image:
+func display_effects(cel: BaseCel, image_override: Image = null) -> Image:
var image := Image.new()
- image.copy_from(cel.get_image())
+ if is_instance_valid(image_override):
+ image.copy_from(image_override)
+ else:
+ image.copy_from(cel.get_image())
if not effects_enabled:
return image
var image_size := image.get_size()
@@ -200,8 +230,10 @@ func display_effects(cel: BaseCel) -> Image:
continue
var shader_image_effect := ShaderImageEffect.new()
shader_image_effect.generate_image(image, effect.shader, effect.params, image_size)
- # Inherit effects from the parents
+ # Inherit effects from the parents, if their blend mode is set to pass through
for ancestor in get_ancestors():
+ if ancestor.blend_mode != BlendModes.PASS_THROUGH:
+ break
if not ancestor.effects_enabled:
continue
for effect in ancestor.effects:
diff --git a/src/Classes/Layers/GroupLayer.gd b/src/Classes/Layers/GroupLayer.gd
index f073dd3f5..d31c49ead 100644
--- a/src/Classes/Layers/GroupLayer.gd
+++ b/src/Classes/Layers/GroupLayer.gd
@@ -11,44 +11,130 @@ func _init(_project: Project, _name := "") -> void:
## Blends all of the images of children layer of the group layer into a single image.
-func blend_children(frame: Frame, origin := Vector2i.ZERO) -> Image:
+func blend_children(frame: Frame, origin := Vector2i.ZERO, apply_effects := true) -> Image:
var image := Image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8)
var children := get_children(false)
if children.size() <= 0:
return image
- var blend_rect := Rect2i(Vector2i.ZERO, project.size)
var textures: Array[Image] = []
- var metadata_image := Image.create(children.size(), 4, false, Image.FORMAT_R8)
+ var metadata_image := Image.create(children.size(), 4, false, Image.FORMAT_RG8)
+ var current_child_index := 0
for i in children.size():
var layer := children[i]
if not layer.is_visible_in_hierarchy():
+ current_child_index += 1
continue
- var cel := frame.cels[layer.index]
if layer is GroupLayer:
- var blended_children: Image = layer.blend_children(frame, origin)
- if DisplayServer.get_name() == "headless":
- image.blend_rect(blended_children, blend_rect, origin)
- else:
- textures.append(blended_children)
- DrawingAlgos.set_layer_metadata_image(layer, cel, metadata_image, i)
+ current_child_index = _blend_child_group(
+ image,
+ layer,
+ frame,
+ textures,
+ metadata_image,
+ current_child_index,
+ origin,
+ apply_effects
+ )
else:
- if DisplayServer.get_name() == "headless":
- DrawingAlgos.blend_layers_headless(image, project, layer, cel, origin)
- else:
- textures.append(layer.display_effects(cel))
- DrawingAlgos.set_layer_metadata_image(layer, cel, metadata_image, i)
+ _include_child_in_blending(
+ image,
+ layer,
+ frame,
+ textures,
+ metadata_image,
+ current_child_index,
+ origin,
+ apply_effects
+ )
+ current_child_index += 1
- if DisplayServer.get_name() != "headless":
+ if DisplayServer.get_name() != "headless" and textures.size() > 0:
var texture_array := Texture2DArray.new()
texture_array.create_from_images(textures)
var params := {
- "layers": texture_array, "metadata": ImageTexture.create_from_image(metadata_image)
+ "layers": texture_array,
+ "metadata": ImageTexture.create_from_image(metadata_image),
+ "origin_x_positive": origin.x > 0,
+ "origin_y_positive": origin.y > 0,
}
var gen := ShaderImageEffect.new()
gen.generate_image(image, DrawingAlgos.blend_layers_shader, params, project.size)
+ if apply_effects:
+ image = display_effects(frame.cels[index], image)
return image
+func _include_child_in_blending(
+ image: Image,
+ layer: BaseLayer,
+ frame: Frame,
+ textures: Array[Image],
+ metadata_image: Image,
+ i: int,
+ origin: Vector2i,
+ apply_effects: bool
+) -> void:
+ var cel := frame.cels[layer.index]
+ if DisplayServer.get_name() == "headless":
+ DrawingAlgos.blend_layers_headless(image, project, layer, cel, origin)
+ else:
+ var cel_image: Image
+ if apply_effects:
+ cel_image = layer.display_effects(cel)
+ else:
+ cel_image = cel.get_image()
+ textures.append(cel_image)
+ DrawingAlgos.set_layer_metadata_image(layer, cel, metadata_image, i)
+ if origin != Vector2i.ZERO:
+ # Only used as a preview for the move tool, when used on a group's children
+ var test_array := [project.frames.find(frame), project.layers.find(layer)]
+ if test_array in project.selected_cels:
+ var origin_fixed := Vector2(origin).abs() / Vector2(cel_image.get_size())
+ metadata_image.set_pixel(i, 2, Color(origin_fixed.x, origin_fixed.y, 0.0, 0.0))
+
+
+## Include a child group in the blending process.
+## If the child group is set to pass through mode, loop through its children
+## and include them as separate images, instead of blending them all together.
+## Gets called recursively if the child group has children groups of its own,
+## and they are also set to pass through mode.
+func _blend_child_group(
+ image: Image,
+ layer: BaseLayer,
+ frame: Frame,
+ textures: Array[Image],
+ metadata_image: Image,
+ i: int,
+ origin: Vector2i,
+ apply_effects: bool
+) -> int:
+ var new_i := i
+ var blend_rect := Rect2i(Vector2i.ZERO, project.size)
+ var cel := frame.cels[layer.index]
+ if layer.blend_mode == BlendModes.PASS_THROUGH:
+ var children := layer.get_children(false)
+ for j in children.size():
+ var child := children[j]
+ if child is GroupLayer:
+ new_i = _blend_child_group(
+ image, child, frame, textures, metadata_image, i + j, origin, apply_effects
+ )
+ else:
+ new_i += j
+ metadata_image.crop(metadata_image.get_width() + 1, metadata_image.get_height())
+ _include_child_in_blending(
+ image, child, frame, textures, metadata_image, new_i, origin, apply_effects
+ )
+ else:
+ var blended_children := (layer as GroupLayer).blend_children(frame, origin)
+ if DisplayServer.get_name() == "headless":
+ image.blend_rect(blended_children, blend_rect, origin)
+ else:
+ textures.append(blended_children)
+ DrawingAlgos.set_layer_metadata_image(layer, cel, metadata_image, i)
+ return new_i
+
+
# Overridden Methods:
diff --git a/src/Shaders/BlendLayers.gdshader b/src/Shaders/BlendLayers.gdshader
index 4aa0576f1..974394e3f 100644
--- a/src/Shaders/BlendLayers.gdshader
+++ b/src/Shaders/BlendLayers.gdshader
@@ -144,6 +144,20 @@ float border_trim(vec4 color, vec2 uv) {
}
+int find_previous_opaque_layer(int index, vec2 metadata_size_float) {
+ for (int i = index - 1; i > 0; i--) {
+ float layer_index = float(i) / metadata_size_float.x;
+ float clipping_mask = texture(metadata, vec2(layer_index, 3.0 / metadata_size_float.y)).r;
+ // If the red value is ~0.2, it means that it should be skipped.
+ // Otherwise, return the index.
+ if (clipping_mask > 0.25 || clipping_mask < 0.15) {
+ return i;
+ }
+ }
+ return 0;
+}
+
+
void fragment() {
ivec2 metadata_size = textureSize(metadata, 0) - 1;
vec2 metadata_size_float = vec2(metadata_size);
@@ -173,17 +187,18 @@ void fragment() {
current_origin.y = -current_origin.y;
}
// get origin of previous layer (used for clipping masks to work correctly)
- vec2 prev_origin = texture(metadata, vec2(float(i - 1), 2.0 / metadata_size_float.y)).rg;
+ float clipping_mask_index = float(find_previous_opaque_layer(i, metadata_size_float));
+ vec2 prev_origin = texture(metadata, vec2(clipping_mask_index, 2.0 / metadata_size_float.y)).rg;
if (!origin_x_positive) {
- prev_origin.x = -prev_origin.x;
+ prev_origin.x = -prev_origin.x;
}
if (!origin_y_positive) {
- prev_origin.y = -prev_origin.y;
+ prev_origin.y = -prev_origin.y;
}
float current_opacity = texture(metadata, vec2(layer_index, 1.0 / metadata_size_float.y)).r;
vec2 uv = UV - current_origin;
vec4 layer_color = texture(layers, vec3(uv, float(i)));
- vec4 prev_layer_color = texture(layers, vec3(UV - prev_origin, float(i - 1)));
+ vec4 prev_layer_color = texture(layers, vec3(UV - prev_origin, clipping_mask_index));
float clipping_mask = texture(metadata, vec2(layer_index, 3.0 / metadata_size_float.y)).r;
layer_color.a *= prev_layer_color.a * step(0.5, clipping_mask) + 1.0 * step(clipping_mask, 0.5);
layer_color.a = border_trim(layer_color, uv);
diff --git a/src/UI/Canvas/Canvas.gd b/src/UI/Canvas/Canvas.gd
index 9b5891ee0..79694f977 100644
--- a/src/UI/Canvas/Canvas.gd
+++ b/src/UI/Canvas/Canvas.gd
@@ -117,17 +117,22 @@ func update_texture(layer_i: int, frame_i := -1, project := Global.current_proje
if frame_i != project.current_frame:
# Don't update if the cel is on a different frame (can happen with undo/redo)
return
- var layer := project.layers[layer_i]
+ var layer := project.layers[layer_i].get_blender_ancestor()
var cel_image: Image
- if Global.display_layer_effects:
- cel_image = layer.display_effects(current_cel)
+ if layer is GroupLayer:
+ cel_image = layer.blend_children(
+ project.frames[project.current_frame], Vector2i.ZERO, Global.display_layer_effects
+ )
else:
- cel_image = current_cel.get_image()
+ if Global.display_layer_effects:
+ cel_image = layer.display_effects(current_cel)
+ else:
+ cel_image = current_cel.get_image()
if (
cel_image.get_size()
== Vector2i(layer_texture_array.get_width(), layer_texture_array.get_height())
):
- layer_texture_array.update_layer(cel_image, project.ordered_layers[layer_i])
+ layer_texture_array.update_layer(cel_image, project.ordered_layers[layer.index])
func update_selected_cels_textures(project := Global.current_project) -> void:
@@ -141,7 +146,6 @@ func update_selected_cels_textures(project := Global.current_project) -> void:
func draw_layers(force_recreate := false) -> void:
var project := Global.current_project
- var current_cels := project.frames[project.current_frame].cels
var recreate_texture_array := (
layer_texture_array.get_layers() != project.layers.size()
or layer_texture_array.get_width() != project.size.x
@@ -157,16 +161,11 @@ func draw_layers(force_recreate := false) -> void:
layer_metadata_image = Image.create(project.layers.size(), 4, false, Image.FORMAT_RG8)
# Draw current frame layers
for i in project.layers.size():
- var ordered_index := project.ordered_layers[i]
var layer := project.layers[i]
- var cel := current_cels[i]
- var cel_image: Image
- if Global.display_layer_effects:
- cel_image = layer.display_effects(cel)
- else:
- cel_image = cel.get_image()
+ var ordered_index := project.ordered_layers[layer.index]
+ var cel_image := Image.new()
+ _update_texture_array_layer(project, layer, cel_image, false)
textures[ordered_index] = cel_image
- DrawingAlgos.set_layer_metadata_image(layer, cel, layer_metadata_image, ordered_index)
# Store the origin
if [project.current_frame, i] in project.selected_cels:
var origin := Vector2(move_preview_location).abs() / Vector2(cel_image.get_size())
@@ -185,18 +184,14 @@ func draw_layers(force_recreate := false) -> void:
var test_array := [project.current_frame, i]
if not test_array in project.selected_cels:
continue
- var ordered_index := project.ordered_layers[i]
var layer := project.layers[i]
- var cel := current_cels[i]
- var cel_image: Image
- if Global.display_layer_effects:
- cel_image = layer.display_effects(cel)
- else:
- cel_image = cel.get_image()
- layer_texture_array.update_layer(cel_image, ordered_index)
- DrawingAlgos.set_layer_metadata_image(
- layer, cel, layer_metadata_image, ordered_index
- )
+ var ordered_index := project.ordered_layers[layer.index]
+ var cel_image := Image.new()
+ _update_texture_array_layer(project, layer, cel_image, true)
+ var parent_layer := layer.get_blender_ancestor()
+ if layer != parent_layer:
+ # True when the layer has parents. In that case, update its top-most parent.
+ _update_texture_array_layer(project, parent_layer, Image.new(), true)
# Update the origin
var origin := Vector2(move_preview_location).abs() / Vector2(cel_image.get_size())
layer_metadata_image.set_pixel(
@@ -209,6 +204,32 @@ func draw_layers(force_recreate := false) -> void:
update_all_layers = false
+func _update_texture_array_layer(
+ project: Project, layer: BaseLayer, cel_image: Image, update_layer: bool
+) -> void:
+ var ordered_index := project.ordered_layers[layer.index]
+ var cel := project.frames[project.current_frame].cels[layer.index]
+ var include := true
+ if layer is GroupLayer and layer.blend_mode != BaseLayer.BlendModes.PASS_THROUGH:
+ cel_image.copy_from(
+ layer.blend_children(
+ project.frames[project.current_frame],
+ move_preview_location,
+ Global.display_layer_effects
+ )
+ )
+ else:
+ if Global.display_layer_effects:
+ cel_image.copy_from(layer.display_effects(cel))
+ else:
+ cel_image.copy_from(cel.get_image())
+ if layer.is_blended_by_ancestor():
+ include = false
+ if update_layer:
+ layer_texture_array.update_layer(cel_image, ordered_index)
+ DrawingAlgos.set_layer_metadata_image(layer, cel, layer_metadata_image, ordered_index, include)
+
+
func refresh_onion() -> void:
onion_past.queue_redraw()
onion_future.queue_redraw()
diff --git a/src/UI/Canvas/CanvasPreview.gd b/src/UI/Canvas/CanvasPreview.gd
index bcd85f74d..23f710efc 100644
--- a/src/UI/Canvas/CanvasPreview.gd
+++ b/src/UI/Canvas/CanvasPreview.gd
@@ -83,14 +83,17 @@ func _draw_layers() -> void:
# Draw current frame layers
for i in project.ordered_layers:
var cel := current_cels[i]
- if current_cels[i] is GroupCel:
- continue
var layer := project.layers[i]
var cel_image: Image
- if Global.display_layer_effects:
- cel_image = layer.display_effects(cel)
+ if layer is GroupLayer and layer.blend_mode != BaseLayer.BlendModes.PASS_THROUGH:
+ cel_image = layer.blend_children(
+ current_frame, Vector2i.ZERO, Global.display_layer_effects
+ )
else:
- cel_image = cel.get_image()
+ if Global.display_layer_effects:
+ cel_image = layer.display_effects(cel)
+ else:
+ cel_image = cel.get_image()
textures.append(cel_image)
DrawingAlgos.set_layer_metadata_image(layer, cel, metadata_image, i)
var texture_array := Texture2DArray.new()
diff --git a/src/UI/Dialogs/ImageEffects/OffsetImage.gd b/src/UI/Dialogs/ImageEffects/OffsetImage.gd
index eed79dd01..bfd94d303 100644
--- a/src/UI/Dialogs/ImageEffects/OffsetImage.gd
+++ b/src/UI/Dialogs/ImageEffects/OffsetImage.gd
@@ -66,7 +66,7 @@ func recalculate_preview(params: Dictionary) -> void:
## Altered version of blend_layers() located in DrawingAlgos.gd
-## This function is REQUIRED in order for offset effect to work correctly with cliping masks
+## This function is REQUIRED in order for offset effect to work correctly with clipping masks
func blend_layers(
image: Image,
frame: Frame,
@@ -101,8 +101,14 @@ func blend_layers(
if not layer_is_selected:
include = false
var cel := frame.cels[ordered_index]
- var cel_image := layer.display_effects(cel)
- if include: ## apply offset effect to it
+ var cel_image: Image
+ if layer is GroupLayer and layer.blend_mode != BaseLayer.BlendModes.PASS_THROUGH:
+ cel_image = (layer as GroupLayer).blend_children(frame)
+ else:
+ cel_image = layer.display_effects(cel)
+ if layer.is_blended_by_ancestor() and not only_selected_cels and not only_selected_layers:
+ include = false
+ if include: # Apply offset effect to it
gen.generate_image(cel_image, shader, effect_params, project.size)
textures.append(cel_image)
DrawingAlgos.set_layer_metadata_image(layer, cel, metadata_image, ordered_index, include)
diff --git a/src/UI/Timeline/AnimationTimeline.gd b/src/UI/Timeline/AnimationTimeline.gd
index ca6405850..12670d988 100644
--- a/src/UI/Timeline/AnimationTimeline.gd
+++ b/src/UI/Timeline/AnimationTimeline.gd
@@ -65,34 +65,7 @@ func _ready() -> void:
frame_scroll_bar.value_changed.connect(_frame_scroll_changed)
Global.animation_timer.wait_time = 1 / Global.current_project.fps
fps_spinbox.value = Global.current_project.fps
-
- # Fill the blend modes OptionButton with items
- blend_modes_button.add_item("Normal", BaseLayer.BlendModes.NORMAL)
- blend_modes_button.add_separator("Darken")
- blend_modes_button.add_item("Darken", BaseLayer.BlendModes.DARKEN)
- blend_modes_button.add_item("Multiply", BaseLayer.BlendModes.MULTIPLY)
- blend_modes_button.add_item("Color burn", BaseLayer.BlendModes.COLOR_BURN)
- blend_modes_button.add_item("Linear burn", BaseLayer.BlendModes.LINEAR_BURN)
- blend_modes_button.add_separator("Lighten")
- blend_modes_button.add_item("Lighten", BaseLayer.BlendModes.LIGHTEN)
- blend_modes_button.add_item("Screen", BaseLayer.BlendModes.SCREEN)
- blend_modes_button.add_item("Color dodge", BaseLayer.BlendModes.COLOR_DODGE)
- blend_modes_button.add_item("Add", BaseLayer.BlendModes.ADD)
- blend_modes_button.add_separator("Contrast")
- blend_modes_button.add_item("Overlay", BaseLayer.BlendModes.OVERLAY)
- blend_modes_button.add_item("Soft light", BaseLayer.BlendModes.SOFT_LIGHT)
- blend_modes_button.add_item("Hard light", BaseLayer.BlendModes.HARD_LIGHT)
- blend_modes_button.add_separator("Inversion")
- blend_modes_button.add_item("Difference", BaseLayer.BlendModes.DIFFERENCE)
- blend_modes_button.add_item("Exclusion", BaseLayer.BlendModes.EXCLUSION)
- blend_modes_button.add_item("Subtract", BaseLayer.BlendModes.SUBTRACT)
- blend_modes_button.add_item("Divide", BaseLayer.BlendModes.DIVIDE)
- blend_modes_button.add_separator("Component")
- blend_modes_button.add_item("Hue", BaseLayer.BlendModes.HUE)
- blend_modes_button.add_item("Saturation", BaseLayer.BlendModes.SATURATION)
- blend_modes_button.add_item("Color", BaseLayer.BlendModes.COLOR)
- blend_modes_button.add_item("Luminosity", BaseLayer.BlendModes.LUMINOSITY)
-
+ _fill_blend_modes_option_button()
# Config loading
layer_frame_h_split.split_offset = Global.config_cache.get_value("timeline", "layer_size", 0)
cel_size = Global.config_cache.get_value("timeline", "cel_size", cel_size) # Call setter
@@ -220,6 +193,48 @@ func _cel_size_changed(value: int) -> void:
tag_c.update_position_and_size()
+## Fill the blend modes OptionButton with items
+func _fill_blend_modes_option_button() -> void:
+ blend_modes_button.clear()
+ var selected_layers_are_groups := true
+ if Global.current_project.layers.size() == 0:
+ selected_layers_are_groups = false
+ else:
+ for idx_pair in Global.current_project.selected_cels:
+ var layer := Global.current_project.layers[idx_pair[1]]
+ if not layer is GroupLayer:
+ selected_layers_are_groups = false
+ break
+ if selected_layers_are_groups:
+ # Special blend mode that appears only when group layers are selected
+ blend_modes_button.add_item("Pass through", BaseLayer.BlendModes.PASS_THROUGH)
+ blend_modes_button.add_item("Normal", BaseLayer.BlendModes.NORMAL)
+ blend_modes_button.add_separator("Darken")
+ blend_modes_button.add_item("Darken", BaseLayer.BlendModes.DARKEN)
+ blend_modes_button.add_item("Multiply", BaseLayer.BlendModes.MULTIPLY)
+ blend_modes_button.add_item("Color burn", BaseLayer.BlendModes.COLOR_BURN)
+ blend_modes_button.add_item("Linear burn", BaseLayer.BlendModes.LINEAR_BURN)
+ blend_modes_button.add_separator("Lighten")
+ blend_modes_button.add_item("Lighten", BaseLayer.BlendModes.LIGHTEN)
+ blend_modes_button.add_item("Screen", BaseLayer.BlendModes.SCREEN)
+ blend_modes_button.add_item("Color dodge", BaseLayer.BlendModes.COLOR_DODGE)
+ blend_modes_button.add_item("Add", BaseLayer.BlendModes.ADD)
+ blend_modes_button.add_separator("Contrast")
+ blend_modes_button.add_item("Overlay", BaseLayer.BlendModes.OVERLAY)
+ blend_modes_button.add_item("Soft light", BaseLayer.BlendModes.SOFT_LIGHT)
+ blend_modes_button.add_item("Hard light", BaseLayer.BlendModes.HARD_LIGHT)
+ blend_modes_button.add_separator("Inversion")
+ blend_modes_button.add_item("Difference", BaseLayer.BlendModes.DIFFERENCE)
+ blend_modes_button.add_item("Exclusion", BaseLayer.BlendModes.EXCLUSION)
+ blend_modes_button.add_item("Subtract", BaseLayer.BlendModes.SUBTRACT)
+ blend_modes_button.add_item("Divide", BaseLayer.BlendModes.DIVIDE)
+ blend_modes_button.add_separator("Component")
+ blend_modes_button.add_item("Hue", BaseLayer.BlendModes.HUE)
+ blend_modes_button.add_item("Saturation", BaseLayer.BlendModes.SATURATION)
+ blend_modes_button.add_item("Color", BaseLayer.BlendModes.COLOR)
+ blend_modes_button.add_item("Luminosity", BaseLayer.BlendModes.LUMINOSITY)
+
+
func _on_blend_modes_item_selected(index: int) -> void:
var project := Global.current_project
var current_mode := blend_modes_button.get_item_id(index)
@@ -231,13 +246,18 @@ func _on_blend_modes_item_selected(index: int) -> void:
project.undo_redo.add_undo_property(layer, "blend_mode", previous_mode)
project.undo_redo.add_do_method(Global.undo_or_redo.bind(false))
project.undo_redo.add_do_method(_update_layer_ui)
- project.undo_redo.add_do_method(Global.canvas.draw_layers)
+ project.undo_redo.add_do_method(_update_layers)
project.undo_redo.add_undo_method(Global.undo_or_redo.bind(true))
project.undo_redo.add_undo_method(_update_layer_ui)
- project.undo_redo.add_undo_method(Global.canvas.draw_layers)
+ project.undo_redo.add_undo_method(_update_layers)
project.undo_redo.commit_action()
+func _update_layers() -> void:
+ Global.canvas.update_all_layers = true
+ Global.canvas.draw_layers()
+
+
func add_frame() -> void:
var project := Global.current_project
var frame_add_index := project.current_frame + 1
@@ -1068,6 +1088,7 @@ func _on_timeline_settings_visibility_changed() -> void:
func _cel_switched() -> void:
_toggle_frame_buttons()
_toggle_layer_buttons()
+ _fill_blend_modes_option_button()
# Temporarily disconnect it in order to prevent layer opacity changing
# in the rest of the selected layers, if there are any.
opacity_slider.value_changed.disconnect(_on_opacity_slider_value_changed)
@@ -1077,10 +1098,9 @@ func _cel_switched() -> void:
func _update_layer_ui() -> void:
var project := Global.current_project
- opacity_slider.value = project.layers[project.current_layer].opacity * 100
- var blend_mode_index := blend_modes_button.get_item_index(
- project.layers[project.current_layer].blend_mode
- )
+ var layer := project.layers[project.current_layer]
+ opacity_slider.value = layer.opacity * 100
+ var blend_mode_index := blend_modes_button.get_item_index(layer.blend_mode)
blend_modes_button.selected = blend_mode_index
diff --git a/src/UI/Timeline/CelProperties.gd b/src/UI/Timeline/CelProperties.gd
index b35e06ba3..0aefdd9da 100644
--- a/src/UI/Timeline/CelProperties.gd
+++ b/src/UI/Timeline/CelProperties.gd
@@ -37,6 +37,7 @@ func _on_opacity_slider_value_changed(value: float) -> void:
for cel_index in cel_indices:
var cel := Global.current_project.frames[cel_index[0]].cels[cel_index[1]]
cel.opacity = value / 100.0
+ Global.canvas.update_all_layers = true
Global.canvas.queue_redraw()
diff --git a/src/UI/Timeline/LayerButton.gd b/src/UI/Timeline/LayerButton.gd
index 4ac8667b6..cbb4dcfdb 100644
--- a/src/UI/Timeline/LayerButton.gd
+++ b/src/UI/Timeline/LayerButton.gd
@@ -145,9 +145,7 @@ func _on_main_button_gui_input(event: InputEvent) -> void:
line_edit.grab_focus()
elif event.button_index == MOUSE_BUTTON_RIGHT and event.pressed:
- var layer := Global.current_project.layers[layer_index]
- if not layer is GroupLayer:
- popup_menu.popup_on_parent(Rect2(get_global_mouse_position(), Vector2.ONE))
+ popup_menu.popup_on_parent(Rect2(get_global_mouse_position(), Vector2.ONE))
func _on_layer_name_line_edit_focus_exited() -> void:
@@ -222,6 +220,7 @@ func _on_popup_menu_id_pressed(id: int) -> void:
layer.clipping_mask = not layer.clipping_mask
popup_menu.set_item_checked(id, layer.clipping_mask)
clipping_mask_icon.visible = layer.clipping_mask
+ Global.canvas.update_all_layers = true
Global.canvas.draw_layers()
diff --git a/src/UI/Timeline/LayerProperties.gd b/src/UI/Timeline/LayerProperties.gd
index 9196933fb..eb58bdff9 100644
--- a/src/UI/Timeline/LayerProperties.gd
+++ b/src/UI/Timeline/LayerProperties.gd
@@ -10,8 +10,34 @@ var layer_indices: PackedInt32Array
@onready var user_data_text_edit := $GridContainer/UserDataTextEdit as TextEdit
-func _ready() -> void:
- # Fill the blend modes OptionButton with items
+func _on_visibility_changed() -> void:
+ if layer_indices.size() == 0:
+ return
+ Global.dialog_open(visible)
+ var first_layer := Global.current_project.layers[layer_indices[0]]
+ if visible:
+ _fill_blend_modes_option_button()
+ name_line_edit.text = first_layer.name
+ opacity_slider.value = first_layer.opacity * 100.0
+ var blend_mode_index := blend_modes_button.get_item_index(first_layer.blend_mode)
+ blend_modes_button.selected = blend_mode_index
+ user_data_text_edit.text = first_layer.user_data
+ else:
+ layer_indices = []
+
+
+## Fill the blend modes OptionButton with items
+func _fill_blend_modes_option_button() -> void:
+ blend_modes_button.clear()
+ var selected_layers_are_groups := true
+ for layer_index in layer_indices:
+ var layer := Global.current_project.layers[layer_index]
+ if not layer is GroupLayer:
+ selected_layers_are_groups = false
+ break
+ if selected_layers_are_groups:
+ # Special blend mode that appears only when group layers are selected
+ blend_modes_button.add_item("Pass through", BaseLayer.BlendModes.PASS_THROUGH)
blend_modes_button.add_item("Normal", BaseLayer.BlendModes.NORMAL)
blend_modes_button.add_item("Darken", BaseLayer.BlendModes.DARKEN)
blend_modes_button.add_item("Multiply", BaseLayer.BlendModes.MULTIPLY)
@@ -34,20 +60,6 @@ func _ready() -> void:
blend_modes_button.add_item("Luminosity", BaseLayer.BlendModes.LUMINOSITY)
-func _on_visibility_changed() -> void:
- if layer_indices.size() == 0:
- return
- Global.dialog_open(visible)
- var first_layer := Global.current_project.layers[layer_indices[0]]
- if visible:
- name_line_edit.text = first_layer.name
- opacity_slider.value = first_layer.opacity * 100.0
- blend_modes_button.selected = first_layer.blend_mode
- user_data_text_edit.text = first_layer.user_data
- else:
- layer_indices = []
-
-
func _on_name_line_edit_text_changed(new_text: String) -> void:
if layer_indices.size() == 0:
return
@@ -63,18 +75,21 @@ func _on_opacity_slider_value_changed(value: float) -> void:
var layer := Global.current_project.layers[layer_index]
layer.opacity = value / 100.0
_emit_layer_property_signal()
+ Global.canvas.update_all_layers = true
Global.canvas.queue_redraw()
func _on_blend_mode_option_button_item_selected(index: BaseLayer.BlendModes) -> void:
if layer_indices.size() == 0:
return
+ Global.canvas.update_all_layers = true
var project := Global.current_project
+ var current_mode := blend_modes_button.get_item_id(index)
project.undo_redo.create_action("Set Blend Mode")
for layer_index in layer_indices:
var layer := project.layers[layer_index]
var previous_mode := layer.blend_mode
- project.undo_redo.add_do_property(layer, "blend_mode", index)
+ project.undo_redo.add_do_property(layer, "blend_mode", current_mode)
project.undo_redo.add_undo_property(layer, "blend_mode", previous_mode)
project.undo_redo.add_do_method(Global.undo_or_redo.bind(false))
project.undo_redo.add_do_method(Global.canvas.draw_layers)
From 2e3f0a26965fa33774f10bfac83c04849b3ec73d Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 15 Aug 2024 20:16:43 +0300
Subject: [PATCH 004/162] Add Control+Shift+Alt as a shortcut that
automatically selects a layer directly from the canvas when using tools
---
project.godot | 5 +++++
src/Autoload/Global.gd | 3 ++-
src/Autoload/Tools.gd | 48 ++++++++++++++++++++++++++++++++++++------
3 files changed, 49 insertions(+), 7 deletions(-)
diff --git a/project.godot b/project.godot
index 2944c9210..2d5e87c41 100644
--- a/project.godot
+++ b/project.godot
@@ -879,6 +879,11 @@ alpha_lock={
"deadzone": 0.5,
"events": []
}
+change_layer_automatically={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":true,"pressed":false,"keycode":0,"physical_keycode":4194328,"key_label":0,"unicode":0,"echo":false,"script":null)
+]
+}
[input_devices]
diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd
index adf1abb6e..5cea961ca 100644
--- a/src/Autoload/Global.gd
+++ b/src/Autoload/Global.gd
@@ -765,7 +765,7 @@ func _initialize_keychain() -> void:
&"view_splash_screen": Keychain.InputAction.new("", "Help menu", true),
&"open_docs": Keychain.InputAction.new("", "Help menu", true),
&"issue_tracker": Keychain.InputAction.new("", "Help menu", true),
- &"open_logs_folder": Keychain.InputAction.new("", "Help menu", true),
+ &"open_editor_data_folder": Keychain.InputAction.new("", "Help menu", true),
&"changelog": Keychain.InputAction.new("", "Help menu", true),
&"about_pixelorama": Keychain.InputAction.new("", "Help menu", true),
&"zoom_in": Keychain.InputAction.new("", "Canvas"),
@@ -817,6 +817,7 @@ func _initialize_keychain() -> void:
&"draw_create_line": Keychain.InputAction.new("", "Draw tools", false),
&"draw_snap_angle": Keychain.InputAction.new("", "Draw tools", false),
&"draw_color_picker": Keychain.InputAction.new("Quick color picker", "Draw tools", false),
+ &"change_layer_automatically": Keychain.InputAction.new("", "Tools", false),
&"shape_perfect": Keychain.InputAction.new("", "Shape tools", false),
&"shape_center": Keychain.InputAction.new("", "Shape tools", false),
&"shape_displace": Keychain.InputAction.new("", "Shape tools", false),
diff --git a/src/Autoload/Tools.gd b/src/Autoload/Tools.gd
index e09e5f482..4c6b8c997 100644
--- a/src/Autoload/Tools.gd
+++ b/src/Autoload/Tools.gd
@@ -524,26 +524,34 @@ func handle_draw(position: Vector2i, event: InputEvent) -> void:
var draw_pos := position
if Global.mirror_view:
draw_pos.x = Global.current_project.size.x - position.x - 1
+ if event.is_action(&"activate_left_tool") or event.is_action(&"activate_right_tool"):
+ if Input.is_action_pressed(&"change_layer_automatically", true):
+ change_layer_automatically(draw_pos)
+ return
- if event.is_action_pressed("activate_left_tool") and _active_button == -1 and not pen_inverted:
+ if event.is_action_pressed(&"activate_left_tool") and _active_button == -1 and not pen_inverted:
_active_button = MOUSE_BUTTON_LEFT
_slots[_active_button].tool_node.draw_start(draw_pos)
- elif event.is_action_released("activate_left_tool") and _active_button == MOUSE_BUTTON_LEFT:
+ elif event.is_action_released(&"activate_left_tool") and _active_button == MOUSE_BUTTON_LEFT:
_slots[_active_button].tool_node.draw_end(draw_pos)
_active_button = -1
elif (
(
- event.is_action_pressed("activate_right_tool")
+ event.is_action_pressed(&"activate_right_tool")
and _active_button == -1
and not pen_inverted
)
- or (event.is_action_pressed("activate_left_tool") and _active_button == -1 and pen_inverted)
+ or (
+ event.is_action_pressed(&"activate_left_tool") and _active_button == -1 and pen_inverted
+ )
):
_active_button = MOUSE_BUTTON_RIGHT
_slots[_active_button].tool_node.draw_start(draw_pos)
elif (
- (event.is_action_released("activate_right_tool") and _active_button == MOUSE_BUTTON_RIGHT)
- or (event.is_action_released("activate_left_tool") and _active_button == MOUSE_BUTTON_RIGHT)
+ (event.is_action_released(&"activate_right_tool") and _active_button == MOUSE_BUTTON_RIGHT)
+ or (
+ event.is_action_released(&"activate_left_tool") and _active_button == MOUSE_BUTTON_RIGHT
+ )
):
_slots[_active_button].tool_node.draw_end(draw_pos)
_active_button = -1
@@ -632,3 +640,31 @@ func _show_relevant_tools(layer_type: Global.LayerTypes) -> void:
func _is_tool_available(layer_type: int, t: Tool) -> bool:
return t.layer_types.is_empty() or layer_type in t.layer_types
+
+
+func change_layer_automatically(pos: Vector2i) -> void:
+ var project := Global.current_project
+ pos = project.tiles.get_canon_position(pos)
+ if pos.x < 0 or pos.y < 0:
+ return
+ var image := Image.new()
+ image.copy_from(project.get_current_cel().get_image())
+ if pos.x > image.get_width() - 1 or pos.y > image.get_height() - 1:
+ return
+
+ var color := Color(0, 0, 0, 0)
+ var curr_frame := project.frames[project.current_frame]
+ for layer in project.layers.size():
+ var layer_index := (project.layers.size() - 1) - layer
+ if project.layers[layer_index].is_visible_in_hierarchy():
+ image = curr_frame.cels[layer_index].get_image()
+ color = image.get_pixelv(pos)
+ if not is_zero_approx(color.a):
+ # Change layer.
+ project.selected_cels.clear()
+ var frame_layer := [project.current_frame, layer_index]
+ if !project.selected_cels.has(frame_layer):
+ project.selected_cels.append(frame_layer)
+
+ project.change_cel(-1, layer_index)
+ break
From cfbe851da5baf937543fa887d9aedb4b401a0f0f Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 16 Aug 2024 04:24:43 +0300
Subject: [PATCH 005/162] Add a convolution matrix layer effect
Still WIP, could use some extra parameters such as RGBA channel, and I should also implement it as an image effect.
---
src/Autoload/Global.gd | 56 +++++++++++++
.../Effects/ConvolutionMatrix.gdshader | 82 +++++++++++++++++++
src/UI/Nodes/BasisSliders.gd | 65 +++++++++++++++
src/UI/Nodes/BasisSliders.tscn | 40 +++++++++
src/UI/Nodes/ValueSliderV3.gd | 4 +-
src/UI/Nodes/ValueSliderV3.tscn | 73 ++++++++---------
.../LayerEffects/LayerEffectsSettings.gd | 3 +
7 files changed, 283 insertions(+), 40 deletions(-)
create mode 100644 src/Shaders/Effects/ConvolutionMatrix.gdshader
create mode 100644 src/UI/Nodes/BasisSliders.gd
create mode 100644 src/UI/Nodes/BasisSliders.tscn
diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd
index 5cea961ca..783d60e76 100644
--- a/src/Autoload/Global.gd
+++ b/src/Autoload/Global.gd
@@ -118,6 +118,7 @@ const CONFIG_SUBDIR_NAME := "pixelorama_data"
## The path of the directory where the UI layouts are being stored.
const LAYOUT_DIR := "user://layouts"
const VALUE_SLIDER_V2_TSCN := preload("res://src/UI/Nodes/ValueSliderV2.tscn")
+const BASIS_SLIDERS_TSCN := preload("res://src/UI/Nodes/BasisSliders.tscn")
const GRADIENT_EDIT_TSCN := preload("res://src/UI/Nodes/GradientEdit.tscn")
## It is path to the executable's base drectory.
@@ -1214,6 +1215,25 @@ func create_ui_for_shader_uniforms(
hbox.add_child(label)
hbox.add_child(color_button)
parent_node.add_child(hbox)
+ elif u_type == "mat3":
+ var label := Label.new()
+ label.text = humanized_u_name
+ label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ var basis := _mat3str_to_basis(u_value)
+ var sliders := BASIS_SLIDERS_TSCN.instantiate() as BasisSliders
+ sliders.allow_greater = true
+ sliders.allow_lesser = true
+ sliders.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ sliders.value = basis
+ if params.has(u_name):
+ sliders.value = params[u_name]
+ else:
+ params[u_name] = sliders.value
+ sliders.value_changed.connect(value_changed.bind(u_name))
+ var hbox := HBoxContainer.new()
+ hbox.add_child(label)
+ hbox.add_child(sliders)
+ parent_node.add_child(hbox)
elif u_type == "sampler2D":
if u_name == "selection":
continue
@@ -1299,6 +1319,24 @@ func _vec2str_to_vector2(vec2: String) -> Vector2:
return vector2
+func _vec3str_to_vector3(vec3: String) -> Vector3:
+ vec3 = vec3.replace("uvec3", "vec3")
+ vec3 = vec3.replace("ivec3", "vec3")
+ vec3 = vec3.replace("vec3(", "")
+ vec3 = vec3.replace(")", "")
+ var vec_values := vec3.split(",")
+ if vec_values.size() == 0:
+ return Vector3.ZERO
+ var y := float(vec_values[0])
+ var z := float(vec_values[0])
+ if vec_values.size() >= 2:
+ y = float(vec_values[1])
+ if vec_values.size() == 3:
+ z = float(vec_values[2])
+ var vector3 := Vector3(float(vec_values[0]), y, z)
+ return vector3
+
+
func _vec4str_to_color(vec4: String) -> Color:
vec4 = vec4.replace("vec4(", "")
vec4 = vec4.replace(")", "")
@@ -1320,6 +1358,24 @@ func _vec4str_to_color(vec4: String) -> Color:
return color
+func _mat3str_to_basis(mat3: String) -> Basis:
+ mat3 = mat3.replace("mat3(", "")
+ mat3 = mat3.replace("))", ")")
+ mat3 = mat3.replace("), ", ")")
+ var vec3_values := mat3.split("vec3", false)
+ var vec3_x := _vec3str_to_vector3(vec3_values[0])
+
+ var vec3_y := _vec3str_to_vector3(vec3_values[0])
+ if vec3_values.size() >= 2:
+ vec3_y = _vec3str_to_vector3(vec3_values[1])
+
+ var vec3_z := _vec3str_to_vector3(vec3_values[0])
+ if vec3_values.size() == 3:
+ vec3_z = _vec3str_to_vector3(vec3_values[2])
+ var basis := Basis(vec3_x, vec3_y, vec3_z)
+ return basis
+
+
func _shader_change_palette(value_changed: Callable, parameter_name: String) -> void:
var palette := Palettes.current_palette
_shader_update_palette_texture(palette, value_changed, parameter_name)
diff --git a/src/Shaders/Effects/ConvolutionMatrix.gdshader b/src/Shaders/Effects/ConvolutionMatrix.gdshader
new file mode 100644
index 000000000..bb709eeba
--- /dev/null
+++ b/src/Shaders/Effects/ConvolutionMatrix.gdshader
@@ -0,0 +1,82 @@
+shader_type canvas_item;
+
+// author : csblo
+// Work made just by consulting :
+// https://en.wikipedia.org/wiki/Kernel_(image_processing)
+
+uniform mat3 kernel = mat3(vec3(0, 0, 0), vec3(0, 1, 0), vec3(0, 0, 0));
+
+// Find coordinate of matrix element from index
+vec2 kpos(int index, vec2 iResolution)
+{
+ return vec2[9] (
+ vec2(-1, -1), vec2(0, -1), vec2(1, -1),
+ vec2(-1, 0), vec2(0, 0), vec2(1, 0),
+ vec2(-1, 1), vec2(0, 1), vec2(1, 1)
+ )[index] / iResolution.xy;
+}
+
+
+// Extract region of dimension 3x3 from sampler centered in uv
+// sampler : texture sampler
+// uv : current coordinates on sampler
+// return : an array of mat3, each index corresponding with a color channel
+mat3[3] region3x3(sampler2D sampler, vec2 uv, vec2 iResolution)
+{
+ // Create each pixels for region
+ vec4[9] region;
+
+ for (int i = 0; i < 9; i++)
+ region[i] = texture(sampler, uv + kpos(i, iResolution));
+
+ // Create 3x3 region with 3 color channels (red, green, blue)
+ mat3[3] mRegion;
+
+ for (int i = 0; i < 3; i++)
+ mRegion[i] = mat3(
+ vec3(region[0][i], region[1][i], region[2][i]),
+ vec3(region[3][i], region[4][i], region[5][i]),
+ vec3(region[6][i], region[7][i], region[8][i])
+ );
+
+ return mRegion;
+}
+
+// Convolve a texture with kernel
+// kernel : kernel used for convolution
+// sampler : texture sampler
+// uv : current coordinates on sampler
+vec3 convolution(sampler2D sampler, vec2 uv, vec2 iResolution)
+{
+ vec3 fragment;
+
+ // Extract a 3x3 region centered in uv
+ mat3[3] region = region3x3(sampler, uv, iResolution);
+
+ // for each color channel of region
+ for (int i = 0; i < 3; i++)
+ {
+ // get region channel
+ mat3 rc = region[i];
+ // component wise multiplication of kernel by region channel
+ mat3 c = matrixCompMult(kernel, rc);
+ // add each component of matrix
+ float r = c[0][0] + c[1][0] + c[2][0]
+ + c[0][1] + c[1][1] + c[2][1]
+ + c[0][2] + c[1][2] + c[2][2];
+
+ // for fragment at channel i, set result
+ fragment[i] = r;
+ }
+
+ return fragment;
+}
+
+void fragment()
+{
+ // Convolve kernel with texture
+ vec3 col = convolution(TEXTURE, UV, 1.0 / TEXTURE_PIXEL_SIZE);
+
+ // Output to screen
+ COLOR.rgb = col;
+}
diff --git a/src/UI/Nodes/BasisSliders.gd b/src/UI/Nodes/BasisSliders.gd
new file mode 100644
index 000000000..b81096dd3
--- /dev/null
+++ b/src/UI/Nodes/BasisSliders.gd
@@ -0,0 +1,65 @@
+@tool
+class_name BasisSliders
+extends HBoxContainer
+
+signal value_changed(value: Basis)
+
+@export var value: Basis:
+ set(val):
+ value = val
+ _can_emit_signal = false
+ get_sliders()[0].value = value.x
+ get_sliders()[1].value = value.y
+ get_sliders()[2].value = value.z
+ _can_emit_signal = true
+@export var min_value := Vector3.ZERO:
+ set(val):
+ min_value = val
+ get_sliders()[0].min_value = val
+ get_sliders()[1].min_value = val
+ get_sliders()[2].min_value = val
+@export var max_value := Vector3(100.0, 100.0, 100.0):
+ set(val):
+ max_value = val
+ get_sliders()[0].max_value = val
+ get_sliders()[1].max_value = val
+ get_sliders()[2].max_value = val
+@export var step := 1.0:
+ set(val):
+ step = val
+ for slider in get_sliders():
+ slider.step = val
+@export var allow_greater := false:
+ set(val):
+ allow_greater = val
+ for slider in get_sliders():
+ slider.allow_greater = val
+@export var allow_lesser := false:
+ set(val):
+ allow_lesser = val
+ for slider in get_sliders():
+ slider.allow_lesser = val
+
+var _can_emit_signal := true
+
+
+func get_sliders() -> Array[ValueSliderV3]:
+ return [$XSlider, $YSlider, $ZSlider]
+
+
+func _on_x_slider_value_changed(val: Vector3) -> void:
+ value.x = val
+ if _can_emit_signal:
+ value_changed.emit(value)
+
+
+func _on_y_slider_value_changed(val: Vector3) -> void:
+ value.y = val
+ if _can_emit_signal:
+ value_changed.emit(value)
+
+
+func _on_z_slider_value_changed(val: Vector3) -> void:
+ value.z = val
+ if _can_emit_signal:
+ value_changed.emit(value)
diff --git a/src/UI/Nodes/BasisSliders.tscn b/src/UI/Nodes/BasisSliders.tscn
new file mode 100644
index 000000000..299ab83d4
--- /dev/null
+++ b/src/UI/Nodes/BasisSliders.tscn
@@ -0,0 +1,40 @@
+[gd_scene load_steps=3 format=3 uid="uid://d0d66oh6bw3kt"]
+
+[ext_resource type="Script" path="res://src/UI/Nodes/BasisSliders.gd" id="1_sbf5t"]
+[ext_resource type="PackedScene" uid="uid://dpoteid430evf" path="res://src/UI/Nodes/ValueSliderV3.tscn" id="2_7swri"]
+
+[node name="BasisSliders" type="HBoxContainer"]
+offset_right = 40.0
+offset_bottom = 40.0
+script = ExtResource("1_sbf5t")
+
+[node name="XSlider" parent="." instance=ExtResource("2_7swri")]
+layout_mode = 2
+size_flags_horizontal = 3
+value = Vector3(1, 0, 0)
+slider_min_size = Vector2(64, 24)
+prefix_x = "XX:"
+prefix_y = "YX:"
+prefix_z = "ZX:"
+
+[node name="YSlider" parent="." instance=ExtResource("2_7swri")]
+layout_mode = 2
+size_flags_horizontal = 3
+value = Vector3(0, 1, 0)
+slider_min_size = Vector2(64, 24)
+prefix_x = "XY:"
+prefix_y = "YY:"
+prefix_z = "ZY:"
+
+[node name="ZSlider" parent="." instance=ExtResource("2_7swri")]
+layout_mode = 2
+size_flags_horizontal = 3
+value = Vector3(0, 0, 1)
+slider_min_size = Vector2(64, 24)
+prefix_x = "XZ:"
+prefix_y = "YZ:"
+prefix_z = "ZZ:"
+
+[connection signal="value_changed" from="XSlider" to="." method="_on_x_slider_value_changed"]
+[connection signal="value_changed" from="YSlider" to="." method="_on_y_slider_value_changed"]
+[connection signal="value_changed" from="ZSlider" to="." method="_on_z_slider_value_changed"]
diff --git a/src/UI/Nodes/ValueSliderV3.gd b/src/UI/Nodes/ValueSliderV3.gd
index 0c9f44874..e1ba93c0c 100644
--- a/src/UI/Nodes/ValueSliderV3.gd
+++ b/src/UI/Nodes/ValueSliderV3.gd
@@ -4,8 +4,8 @@ extends HBoxContainer
## A class that combines three ValueSlider nodes, for easy usage with Vector3 values.
## Also supports aspect ratio locking.
-signal value_changed(value)
-signal ratio_toggled(button_pressed)
+signal value_changed(value: Vector3)
+signal ratio_toggled(button_pressed: bool)
@export var editable := true:
set(val):
diff --git a/src/UI/Nodes/ValueSliderV3.tscn b/src/UI/Nodes/ValueSliderV3.tscn
index 9c96cd74d..4c0eed5d7 100644
--- a/src/UI/Nodes/ValueSliderV3.tscn
+++ b/src/UI/Nodes/ValueSliderV3.tscn
@@ -1,86 +1,83 @@
-[gd_scene load_steps=6 format=2]
+[gd_scene load_steps=6 format=3 uid="uid://dpoteid430evf"]
-[ext_resource path="res://src/UI/Nodes/ValueSlider.gd" type="Script" id=1]
-[ext_resource path="res://src/UI/Nodes/ValueSliderV3.gd" type="Script" id=2]
-[ext_resource path="res://assets/graphics/misc/lock_aspect_2.png" type="Texture2D" id=3]
-[ext_resource path="res://assets/graphics/misc/lock_aspect_guides.png" type="Texture2D" id=4]
-[ext_resource path="res://assets/graphics/misc/lock_aspect.png" type="Texture2D" id=5]
+[ext_resource type="Script" path="res://src/UI/Nodes/ValueSlider.gd" id="1"]
+[ext_resource type="Script" path="res://src/UI/Nodes/ValueSliderV3.gd" id="2"]
+[ext_resource type="Texture2D" uid="uid://cancw70yw0pv7" path="res://assets/graphics/misc/lock_aspect_2.png" id="3"]
+[ext_resource type="Texture2D" uid="uid://kd10jfc1dxf5" path="res://assets/graphics/misc/lock_aspect_guides.png" id="4"]
+[ext_resource type="Texture2D" uid="uid://beqermx8s5q8y" path="res://assets/graphics/misc/lock_aspect.png" id="5"]
[node name="ValueSliderV3" type="HBoxContainer"]
offset_right = 45.0
offset_bottom = 52.0
-script = ExtResource( 2 )
+script = ExtResource("2")
[node name="GridContainer" type="GridContainer" parent="."]
-offset_right = 45.0
-offset_bottom = 80.0
+layout_mode = 2
size_flags_horizontal = 3
[node name="X" type="TextureProgressBar" parent="GridContainer"]
-offset_right = 45.0
-offset_bottom = 24.0
-custom_minimum_size = Vector2( 32, 24 )
-mouse_default_cursor_shape = 2
+custom_minimum_size = Vector2(32, 24)
+layout_mode = 2
size_flags_horizontal = 3
-theme_type_variation = "ValueSlider"
+focus_mode = 2
+mouse_default_cursor_shape = 2
+theme_type_variation = &"ValueSlider"
nine_patch_stretch = true
stretch_margin_left = 3
stretch_margin_top = 3
stretch_margin_right = 3
stretch_margin_bottom = 3
-script = ExtResource( 1 )
+script = ExtResource("1")
prefix = "X:"
[node name="Y" type="TextureProgressBar" parent="GridContainer"]
-offset_top = 28.0
-offset_right = 45.0
-offset_bottom = 52.0
-custom_minimum_size = Vector2( 32, 24 )
-mouse_default_cursor_shape = 2
+custom_minimum_size = Vector2(32, 24)
+layout_mode = 2
size_flags_horizontal = 3
-theme_type_variation = "ValueSlider"
+focus_mode = 2
+mouse_default_cursor_shape = 2
+theme_type_variation = &"ValueSlider"
nine_patch_stretch = true
stretch_margin_left = 3
stretch_margin_top = 3
stretch_margin_right = 3
stretch_margin_bottom = 3
-script = ExtResource( 1 )
+script = ExtResource("1")
prefix = "Y:"
[node name="Z" type="TextureProgressBar" parent="GridContainer"]
-offset_top = 56.0
-offset_right = 45.0
-offset_bottom = 80.0
-custom_minimum_size = Vector2( 32, 24 )
-mouse_default_cursor_shape = 2
+custom_minimum_size = Vector2(32, 24)
+layout_mode = 2
size_flags_horizontal = 3
-theme_type_variation = "ValueSlider"
+focus_mode = 2
+mouse_default_cursor_shape = 2
+theme_type_variation = &"ValueSlider"
nine_patch_stretch = true
stretch_margin_left = 3
stretch_margin_top = 3
stretch_margin_right = 3
stretch_margin_bottom = 3
-script = ExtResource( 1 )
+script = ExtResource("1")
prefix = "Z:"
[node name="Ratio" type="Control" parent="."]
visible = false
-offset_left = 36.0
-offset_right = 52.0
-offset_bottom = 80.0
-custom_minimum_size = Vector2( 16, 0 )
+custom_minimum_size = Vector2(16, 0)
+layout_mode = 2
[node name="RatioGuides" type="NinePatchRect" parent="Ratio" groups=["UIButtons"]]
+custom_minimum_size = Vector2(9, 0)
+layout_mode = 0
anchor_bottom = 1.0
offset_right = 9.0
-custom_minimum_size = Vector2( 9, 0 )
-texture = ExtResource( 4 )
-region_rect = Rect2( 0, 0, 9, 44 )
+texture = ExtResource("4")
+region_rect = Rect2(0, 0, 9, 44)
patch_margin_top = 15
patch_margin_bottom = 13
[node name="RatioButton" type="TextureButton" parent="Ratio" groups=["UIButtons"]]
unique_name_in_owner = true
+layout_mode = 0
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
@@ -92,8 +89,8 @@ offset_bottom = 8.0
tooltip_text = "Lock aspect ratio"
mouse_default_cursor_shape = 2
toggle_mode = true
-texture_normal = ExtResource( 3 )
-texture_pressed = ExtResource( 5 )
+texture_normal = ExtResource("3")
+texture_pressed = ExtResource("5")
[connection signal="value_changed" from="GridContainer/X" to="." method="_on_X_value_changed"]
[connection signal="value_changed" from="GridContainer/Y" to="." method="_on_Y_value_changed"]
diff --git a/src/UI/Timeline/LayerEffects/LayerEffectsSettings.gd b/src/UI/Timeline/LayerEffects/LayerEffectsSettings.gd
index 32230e239..324d8e257 100644
--- a/src/UI/Timeline/LayerEffects/LayerEffectsSettings.gd
+++ b/src/UI/Timeline/LayerEffects/LayerEffectsSettings.gd
@@ -4,6 +4,9 @@ const LAYER_EFFECT_BUTTON = preload("res://src/UI/Timeline/LayerEffects/LayerEff
const DELETE_TEXTURE := preload("res://assets/graphics/misc/close.svg")
var effects: Array[LayerEffect] = [
+ LayerEffect.new(
+ "Convolution Matrix", preload("res://src/Shaders/Effects/ConvolutionMatrix.gdshader")
+ ),
LayerEffect.new("Offset", preload("res://src/Shaders/Effects/OffsetPixels.gdshader")),
LayerEffect.new("Outline", preload("res://src/Shaders/Effects/OutlineInline.gdshader")),
LayerEffect.new("Drop Shadow", preload("res://src/Shaders/Effects/DropShadow.gdshader")),
From 743a80e154402de27e54c55bbbc9216acc00289e Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 16 Aug 2024 13:40:24 +0300
Subject: [PATCH 006/162] Update to Godot 4.3
---
.github/workflows/dev-desktop-builds.yml | 20 +-
.github/workflows/dev-web.yml | 12 +-
.github/workflows/release.yml | 37 +---
CHANGELOG.md | 2 +-
addons/dockable_container/icon.svg.import | 2 +-
assets/fonts/Roboto-Italic.ttf.import | 1 +
assets/fonts/Roboto-Regular.ttf.import | 1 +
export_presets.cfg | 246 +++++++++++++++++++---
project.godot | 246 +++++++++++-----------
9 files changed, 358 insertions(+), 209 deletions(-)
diff --git a/.github/workflows/dev-desktop-builds.yml b/.github/workflows/dev-desktop-builds.yml
index 48cee7b7f..9cc75240e 100644
--- a/.github/workflows/dev-desktop-builds.yml
+++ b/.github/workflows/dev-desktop-builds.yml
@@ -15,7 +15,7 @@ concurrency:
cancel-in-progress: true
env:
- GODOT_VERSION: 4.2.2
+ GODOT_VERSION: 4.3
EXPORT_NAME: Pixelorama
jobs:
@@ -23,18 +23,8 @@ jobs:
name: Windows Export 🗔
runs-on: ubuntu-latest
container:
- image: docker://barichello/godot-ci:4.2.2
+ image: docker://barichello/godot-ci:4.3
steps:
- - name: Setup WINE and rcedit 🍷
- run: |
- dpkg --add-architecture i386 && apt-get update && apt-get install -y wine-stable && apt-get install -y wine32
- chown root:root -R ~
- wget https://github.com/electron/rcedit/releases/download/v1.1.1/rcedit-x64.exe
- mkdir -v -p ~/.local/share/rcedit
- mv rcedit-x64.exe ~/.local/share/rcedit
- godot --headless --quit
- echo 'export/windows/wine = "/usr/bin/wine"' >> ~/.config/godot/editor_settings-4.tres
- echo 'export/windows/rcedit = "/github/home/.local/share/rcedit/rcedit-x64.exe"' >> ~/.config/godot/editor_settings-4.tres
- name: Checkout 🛎️
uses: actions/checkout@v4
with:
@@ -63,7 +53,7 @@ jobs:
name: Linux Export 🐧
runs-on: ubuntu-latest
container:
- image: docker://barichello/godot-ci:4.2.2
+ image: docker://barichello/godot-ci:4.3
steps:
- name: Checkout 🛎️
uses: actions/checkout@v4
@@ -78,8 +68,8 @@ jobs:
run: godot --headless -v --import
- name: Linux Build 🔧
run: |
- godot --headless -v --export-release "Linux/X11 64-bit" ./build/${EXPORT_NAME}-Linux-64bit/$EXPORT_NAME.x86_64
- godot --headless -v --export-release "Linux/X11 ARM64" ./build/${EXPORT_NAME}-Linux-ARM64/${EXPORT_NAME}.arm64
+ godot --headless -v --export-release "Linux 64-bit" ./build/${EXPORT_NAME}-Linux-64bit/$EXPORT_NAME.x86_64
+ godot --headless -v --export-release "Linux ARM64" ./build/${EXPORT_NAME}-Linux-ARM64/${EXPORT_NAME}.arm64
- name: Give execute permission ☑️
run: |
chmod +x ./build/${EXPORT_NAME}-Linux-64bit/$EXPORT_NAME.x86_64
diff --git a/.github/workflows/dev-web.yml b/.github/workflows/dev-web.yml
index cf6624b32..dcbfb35b0 100644
--- a/.github/workflows/dev-web.yml
+++ b/.github/workflows/dev-web.yml
@@ -9,7 +9,7 @@ concurrency:
cancel-in-progress: true
env:
- GODOT_VERSION: 4.2.2
+ GODOT_VERSION: 4.3
EXPORT_NAME: Pixelorama
jobs:
@@ -17,7 +17,7 @@ jobs:
name: Web Export 🌐
runs-on: ubuntu-latest
container:
- image: docker://barichello/godot-ci:4.2.2
+ image: docker://barichello/godot-ci:4.3
steps:
- name: Checkout 🛎️
uses: actions/checkout@v4
@@ -35,14 +35,6 @@ jobs:
- name: Install rsync 📚
run: |
apt-get update && apt-get install -y rsync
- # Workaround for SharedArrayBuffer support on GitHub Pages
- # See: https://github.com/godotengine/godot-docs/issues/7084
- - name: Enable SharedArrayBuffer for GitHub Pages
- run: |
- cd ./build/web
- apt-get install -y curl
- curl -fsSL https://github.com/gzuidhof/coi-serviceworker/raw/master/coi-serviceworker.js > coi-serviceworker.js
- sed -i 's#\( \)# \n\1#g' index.html
- name: Deploy 🚀
uses: JamesIves/github-pages-deploy-action@v4
with:
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index ef953889c..480bd35d3 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -5,7 +5,7 @@ on:
branches: [ release ]
env:
- GODOT_VERSION: 4.2.2
+ GODOT_VERSION: 4.3
EXPORT_NAME: Pixelorama
TAG: v1.0.1
BUTLER_API_KEY: ${{ secrets.BUTLER_API_KEY }}
@@ -15,18 +15,8 @@ jobs:
name: Windows Export 🗔
runs-on: ubuntu-latest
container:
- image: docker://barichello/godot-ci:4.2.2
+ image: docker://barichello/godot-ci:4.3
steps:
- - name: Setup WINE, rcedit and NSIS 🍷
- run: |
- dpkg --add-architecture i386 && apt-get update && apt-get install -y wine-stable && apt-get install -y wine32 && apt-get install -y nsis
- chown root:root -R ~
- wget https://github.com/electron/rcedit/releases/download/v1.1.1/rcedit-x64.exe
- mkdir -v -p ~/.local/share/rcedit
- mv rcedit-x64.exe ~/.local/share/rcedit
- godot --headless --quit
- echo 'export/windows/wine = "/usr/bin/wine"' >> ~/.config/godot/editor_settings-4.tres
- echo 'export/windows/rcedit = "/github/home/.local/share/rcedit/rcedit-x64.exe"' >> ~/.config/godot/editor_settings-4.tres
- name: Checkout 🛎️
uses: actions/checkout@v4
with:
@@ -55,6 +45,7 @@ jobs:
zip -r ${EXPORT_NAME}-Windows-32bit.zip ${EXPORT_NAME}-Windows-32bit
- name: Build installer 🔧
run: |
+ apt-get update && apt-get install -y python3 && apt-get install -y nsis
python3 ./installer/utils/po2nsi.py -i ./installer/pixelorama.nsi -o ./installer/pixelorama_loc.nsi -p ./installer/po -l "English" -v
makensis ./installer/pixelorama_loc.nsi
mkdir ./build/installer
@@ -77,7 +68,7 @@ jobs:
name: Linux Export 🐧
runs-on: ubuntu-latest
container:
- image: docker://barichello/godot-ci:4.2.2
+ image: docker://barichello/godot-ci:4.3
steps:
- name: Checkout 🛎️
uses: actions/checkout@v4
@@ -92,14 +83,14 @@ jobs:
run: godot --headless -v --import
- name: Linux Build 🔧
run: |
- godot --headless -v --export-release "Linux/X11 64-bit" ./build/${EXPORT_NAME}-Linux-64bit/${EXPORT_NAME}.x86_64
- godot --headless -v --export-release "Linux/X11 32-bit" ./build/${EXPORT_NAME}-Linux-32bit/${EXPORT_NAME}.x86
- godot --headless -v --export-release "Linux/X11 ARM64" ./build/${EXPORT_NAME}-Linux-ARM64/${EXPORT_NAME}.arm64
- godot --headless -v --export-release "Linux/X11 ARM32" ./build/${EXPORT_NAME}-Linux-ARM32/${EXPORT_NAME}.arm32
+ godot --headless -v --export-release "Linux 64-bit" ./build/${EXPORT_NAME}-Linux-64bit/${EXPORT_NAME}.x86_64
+ godot --headless -v --export-release "Linux 32-bit" ./build/${EXPORT_NAME}-Linux-32bit/${EXPORT_NAME}.x86_32
+ godot --headless -v --export-release "Linux ARM64" ./build/${EXPORT_NAME}-Linux-ARM64/${EXPORT_NAME}.arm64
+ godot --headless -v --export-release "Linux ARM32" ./build/${EXPORT_NAME}-Linux-ARM32/${EXPORT_NAME}.arm32
- name: Give execute permission ☑️
run: |
chmod +x ./build/${EXPORT_NAME}-Linux-64bit/${EXPORT_NAME}.x86_64
- chmod +x ./build/${EXPORT_NAME}-Linux-32bit/${EXPORT_NAME}.x86
+ chmod +x ./build/${EXPORT_NAME}-Linux-32bit/${EXPORT_NAME}.x86_32
chmod +x ./build/${EXPORT_NAME}-Linux-ARM64/${EXPORT_NAME}.arm64
chmod +x ./build/${EXPORT_NAME}-Linux-ARM32/${EXPORT_NAME}.arm32
- name: Copy pixelorama_data folder 📁
@@ -119,7 +110,7 @@ jobs:
- name: Upload Release Assets to itch.io 🎮
run: |
butler push ./build/${{env.EXPORT_NAME}}-Linux-64bit.tar.gz ${{ secrets.ITCHIO_USERNAME }}/${{ secrets.ITCHIO_GAME }}:linux-x86_64 --userversion ${{env.TAG}}
- butler push ./build/${{env.EXPORT_NAME}}-Linux-32bit.tar.gz ${{ secrets.ITCHIO_USERNAME }}/${{ secrets.ITCHIO_GAME }}:linux-x86 --userversion ${{env.TAG}}
+ butler push ./build/${{env.EXPORT_NAME}}-Linux-32bit.tar.gz ${{ secrets.ITCHIO_USERNAME }}/${{ secrets.ITCHIO_GAME }}:linux-x86_32 --userversion ${{env.TAG}}
butler push ./build/${{env.EXPORT_NAME}}-Linux-ARM64.tar.gz ${{ secrets.ITCHIO_USERNAME }}/${{ secrets.ITCHIO_GAME }}:linux-arm64 --userversion ${{env.TAG}}
butler push ./build/${{env.EXPORT_NAME}}-Linux-ARM32.tar.gz ${{ secrets.ITCHIO_USERNAME }}/${{ secrets.ITCHIO_GAME }}:linux-arm32 --userversion ${{env.TAG}}
- name: Upload Release Asset 🚀
@@ -217,14 +208,6 @@ jobs:
- name: Upload Release Assets to itch.io 🎮
run: |
butler push ./build/web ${{ secrets.ITCHIO_USERNAME }}/${{ secrets.ITCHIO_GAME }}:web --userversion ${{env.TAG}}
- # Workaround for SharedArrayBuffer support on GitHub Pages
- # See: https://github.com/godotengine/godot-docs/issues/7084
- - name: Enable SharedArrayBuffer for GitHub Pages
- run: |
- cd ./build/web
- apt-get install -y curl
- curl -fsSL https://github.com/gzuidhof/coi-serviceworker/raw/master/coi-serviceworker.js > coi-serviceworker.js
- sed -i 's#\( \)# \n\1#g' index.html
- name: Deploy 🚀
uses: JamesIves/github-pages-deploy-action@v4
with:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a5649c509..a990b7fde 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -8,7 +8,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
This update has been brought to you by the contributions of:
[kleonc](https://github.com/kleonc), [Hamster5295](https://github.com/Hamster5295)
-Built using Godot 4.2.2
+Built using Godot 4.3
### Added
- Added tolerance to the bucket tool's "similar area" mode and to the magic wand tool.
diff --git a/addons/dockable_container/icon.svg.import b/addons/dockable_container/icon.svg.import
index 0fab7ae49..595e57305 100644
--- a/addons/dockable_container/icon.svg.import
+++ b/addons/dockable_container/icon.svg.import
@@ -16,9 +16,9 @@ dest_files=["res://.godot/imported/icon.svg-35635e7bbda4487d4b2942da1d987df8.cte
[params]
compress/mode=0
+compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
-compress/bptc_ldr=0
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
diff --git a/assets/fonts/Roboto-Italic.ttf.import b/assets/fonts/Roboto-Italic.ttf.import
index 0e97040ef..d74ca4462 100644
--- a/assets/fonts/Roboto-Italic.ttf.import
+++ b/assets/fonts/Roboto-Italic.ttf.import
@@ -15,6 +15,7 @@ dest_files=["res://.godot/imported/Roboto-Italic.ttf-1459ab7510a4240cd642ef0fe9c
Rendering=null
antialiasing=1
generate_mipmaps=false
+disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
diff --git a/assets/fonts/Roboto-Regular.ttf.import b/assets/fonts/Roboto-Regular.ttf.import
index 5a7e24eaa..619a45c73 100644
--- a/assets/fonts/Roboto-Regular.ttf.import
+++ b/assets/fonts/Roboto-Regular.ttf.import
@@ -15,6 +15,7 @@ dest_files=["res://.godot/imported/Roboto-Regular.ttf-e67097a08cc051e6b179dbaab4
Rendering=null
antialiasing=1
generate_mipmaps=false
+disable_embedded_bitmaps=true
multichannel_signed_distance_field=false
msdf_pixel_range=8
msdf_size=48
diff --git a/export_presets.cfg b/export_presets.cfg
index f61a79cd0..f54c95675 100644
--- a/export_presets.cfg
+++ b/export_presets.cfg
@@ -1,8 +1,9 @@
[preset.0]
-name="Linux/X11 64-bit"
-platform="Linux/X11"
+name="Linux 64-bit"
+platform="Linux"
runnable=true
+advanced_options=false
dedicated_server=false
custom_features=""
export_filter="exclude"
@@ -14,6 +15,7 @@ encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
+script_export_mode=2
[preset.0.options]
@@ -21,10 +23,8 @@ custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
-texture_format/bptc=true
-texture_format/s3tc=true
-texture_format/etc=false
-texture_format/etc2=false
+texture_format/s3tc_bptc=true
+texture_format/etc2_astc=false
binary_format/architecture="x86_64"
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
@@ -38,6 +38,10 @@ unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""
+texture_format/bptc=true
+texture_format/s3tc=true
+texture_format/etc=false
+texture_format/etc2=false
binary_format/64_bits=true
texture_format/no_bptc_fallbacks=true
@@ -46,6 +50,7 @@ texture_format/no_bptc_fallbacks=true
name="Windows Desktop 64-bit"
platform="Windows Desktop"
runnable=true
+advanced_options=false
dedicated_server=false
custom_features=""
export_filter="exclude"
@@ -57,6 +62,7 @@ encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
+script_export_mode=2
[preset.1.options]
@@ -64,10 +70,8 @@ custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
-texture_format/bptc=true
-texture_format/s3tc=true
-texture_format/etc=false
-texture_format/etc2=false
+texture_format/s3tc_bptc=true
+texture_format/etc2_astc=false
binary_format/architecture="x86_64"
codesign/enable=false
codesign/timestamp=true
@@ -87,6 +91,8 @@ application/file_description="Pixelorama - Your free & open-source sprite editor
application/copyright="Orama Interactive and contributors 2019-present"
application/trademarks=""
application/export_angle=0
+application/export_d3d12=0
+application/d3d12_agility_sdk_multiarch=true
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
@@ -104,6 +110,10 @@ Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorActi
ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
Remove-Item -Recurse -Force '{temp_dir}'"
+texture_format/bptc=true
+texture_format/s3tc=true
+texture_format/etc=false
+texture_format/etc2=false
binary_format/64_bits=true
texture_format/no_bptc_fallbacks=true
@@ -112,6 +122,7 @@ texture_format/no_bptc_fallbacks=true
name="Web"
platform="Web"
runnable=true
+advanced_options=false
dedicated_server=false
custom_features=""
export_filter="exclude"
@@ -123,12 +134,14 @@ encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
+script_export_mode=2
[preset.2.options]
custom_template/debug=""
custom_template/release=""
variant/extensions_support=false
+variant/thread_support=false
vram_texture_compression/for_desktop=true
vram_texture_compression/for_mobile=false
html/export_icon=true
@@ -138,6 +151,7 @@ html/canvas_resize_policy=2
html/focus_canvas_on_start=true
html/experimental_virtual_keyboard=false
progressive_web_app/enabled=true
+progressive_web_app/ensure_cross_origin_isolation_headers=true
progressive_web_app/offline_page=""
progressive_web_app/display=1
progressive_web_app/orientation=0
@@ -151,6 +165,7 @@ progressive_web_app/background_color=Color(0, 0, 0, 1)
name="Windows Desktop 32-bit"
platform="Windows Desktop"
runnable=false
+advanced_options=false
dedicated_server=false
custom_features=""
export_filter="exclude"
@@ -162,6 +177,7 @@ encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
+script_export_mode=2
[preset.3.options]
@@ -169,10 +185,8 @@ custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
-texture_format/bptc=true
-texture_format/s3tc=true
-texture_format/etc=false
-texture_format/etc2=false
+texture_format/s3tc_bptc=true
+texture_format/etc2_astc=false
binary_format/architecture="x86_32"
codesign/enable=false
codesign/timestamp=true
@@ -192,6 +206,8 @@ application/file_description="Pixelorama - Your free & open-source sprite editor
application/copyright="Orama Interactive and contributors 2019-present"
application/trademarks=""
application/export_angle=0
+application/export_d3d12=0
+application/d3d12_agility_sdk_multiarch=true
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
@@ -209,14 +225,19 @@ Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorActi
ssh_remote_deploy/cleanup_script="Stop-ScheduledTask -TaskName godot_remote_debug -ErrorAction:SilentlyContinue
Unregister-ScheduledTask -TaskName godot_remote_debug -Confirm:$false -ErrorAction:SilentlyContinue
Remove-Item -Recurse -Force '{temp_dir}'"
+texture_format/bptc=true
+texture_format/s3tc=true
+texture_format/etc=false
+texture_format/etc2=false
binary_format/64_bits=false
texture_format/no_bptc_fallbacks=true
[preset.4]
-name="Linux/X11 32-bit"
-platform="Linux/X11"
+name="Linux 32-bit"
+platform="Linux"
runnable=false
+advanced_options=false
dedicated_server=false
custom_features=""
export_filter="exclude"
@@ -228,6 +249,7 @@ encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
+script_export_mode=2
[preset.4.options]
@@ -235,10 +257,8 @@ custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
-texture_format/bptc=true
-texture_format/s3tc=true
-texture_format/etc=false
-texture_format/etc2=false
+texture_format/s3tc_bptc=true
+texture_format/etc2_astc=false
binary_format/architecture="x86_32"
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
@@ -252,14 +272,19 @@ unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""
+texture_format/bptc=true
+texture_format/s3tc=true
+texture_format/etc=false
+texture_format/etc2=false
binary_format/64_bits=false
texture_format/no_bptc_fallbacks=true
[preset.5]
-name="Linux/X11 ARM64"
-platform="Linux/X11"
+name="Linux ARM64"
+platform="Linux"
runnable=false
+advanced_options=false
dedicated_server=false
custom_features=""
export_filter="exclude"
@@ -271,6 +296,7 @@ encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
+script_export_mode=2
[preset.5.options]
@@ -278,10 +304,8 @@ custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
-texture_format/bptc=true
-texture_format/s3tc=true
-texture_format/etc=false
-texture_format/etc2=false
+texture_format/s3tc_bptc=true
+texture_format/etc2_astc=false
binary_format/architecture="arm64"
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
@@ -295,14 +319,19 @@ unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""
+texture_format/bptc=true
+texture_format/s3tc=true
+texture_format/etc=false
+texture_format/etc2=false
binary_format/64_bits=false
texture_format/no_bptc_fallbacks=true
[preset.6]
-name="Linux/X11 ARM32"
-platform="Linux/X11"
+name="Linux ARM32"
+platform="Linux"
runnable=false
+advanced_options=false
dedicated_server=false
custom_features=""
export_filter="exclude"
@@ -314,6 +343,7 @@ encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
+script_export_mode=2
[preset.6.options]
@@ -321,10 +351,8 @@ custom_template/debug=""
custom_template/release=""
debug/export_console_wrapper=1
binary_format/embed_pck=false
-texture_format/bptc=true
-texture_format/s3tc=true
-texture_format/etc=false
-texture_format/etc2=false
+texture_format/s3tc_bptc=true
+texture_format/etc2_astc=false
binary_format/architecture="arm32"
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
@@ -338,12 +366,17 @@ unzip -o -q \"{temp_dir}/{archive_name}\" -d \"{temp_dir}\"
ssh_remote_deploy/cleanup_script="#!/usr/bin/env bash
kill $(pgrep -x -f \"{temp_dir}/{exe_name} {cmd_args}\")
rm -rf \"{temp_dir}\""
+texture_format/bptc=true
+texture_format/s3tc=true
+texture_format/etc=false
+texture_format/etc2=false
[preset.7]
name="macOS"
platform="macOS"
runnable=true
+advanced_options=false
dedicated_server=false
custom_features=""
export_filter="exclude"
@@ -355,6 +388,7 @@ encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
+script_export_mode=2
[preset.7.options]
@@ -375,6 +409,7 @@ application/copyright_localized={}
application/min_macos_version="10.12"
application/export_angle=0
display/high_res=true
+application/additional_plist_content=""
xcode/platform_build="14C18"
xcode/sdk_version="13.1"
xcode/sdk_build="22C55"
@@ -433,6 +468,148 @@ privacy/network_volumes_usage_description=""
privacy/network_volumes_usage_description_localized={}
privacy/removable_volumes_usage_description=""
privacy/removable_volumes_usage_description_localized={}
+privacy/tracking_enabled=false
+privacy/tracking_domains=PackedStringArray()
+privacy/collected_data/name/collected=false
+privacy/collected_data/name/linked_to_user=false
+privacy/collected_data/name/used_for_tracking=false
+privacy/collected_data/name/collection_purposes=0
+privacy/collected_data/email_address/collected=false
+privacy/collected_data/email_address/linked_to_user=false
+privacy/collected_data/email_address/used_for_tracking=false
+privacy/collected_data/email_address/collection_purposes=0
+privacy/collected_data/phone_number/collected=false
+privacy/collected_data/phone_number/linked_to_user=false
+privacy/collected_data/phone_number/used_for_tracking=false
+privacy/collected_data/phone_number/collection_purposes=0
+privacy/collected_data/physical_address/collected=false
+privacy/collected_data/physical_address/linked_to_user=false
+privacy/collected_data/physical_address/used_for_tracking=false
+privacy/collected_data/physical_address/collection_purposes=0
+privacy/collected_data/other_contact_info/collected=false
+privacy/collected_data/other_contact_info/linked_to_user=false
+privacy/collected_data/other_contact_info/used_for_tracking=false
+privacy/collected_data/other_contact_info/collection_purposes=0
+privacy/collected_data/health/collected=false
+privacy/collected_data/health/linked_to_user=false
+privacy/collected_data/health/used_for_tracking=false
+privacy/collected_data/health/collection_purposes=0
+privacy/collected_data/fitness/collected=false
+privacy/collected_data/fitness/linked_to_user=false
+privacy/collected_data/fitness/used_for_tracking=false
+privacy/collected_data/fitness/collection_purposes=0
+privacy/collected_data/payment_info/collected=false
+privacy/collected_data/payment_info/linked_to_user=false
+privacy/collected_data/payment_info/used_for_tracking=false
+privacy/collected_data/payment_info/collection_purposes=0
+privacy/collected_data/credit_info/collected=false
+privacy/collected_data/credit_info/linked_to_user=false
+privacy/collected_data/credit_info/used_for_tracking=false
+privacy/collected_data/credit_info/collection_purposes=0
+privacy/collected_data/other_financial_info/collected=false
+privacy/collected_data/other_financial_info/linked_to_user=false
+privacy/collected_data/other_financial_info/used_for_tracking=false
+privacy/collected_data/other_financial_info/collection_purposes=0
+privacy/collected_data/precise_location/collected=false
+privacy/collected_data/precise_location/linked_to_user=false
+privacy/collected_data/precise_location/used_for_tracking=false
+privacy/collected_data/precise_location/collection_purposes=0
+privacy/collected_data/coarse_location/collected=false
+privacy/collected_data/coarse_location/linked_to_user=false
+privacy/collected_data/coarse_location/used_for_tracking=false
+privacy/collected_data/coarse_location/collection_purposes=0
+privacy/collected_data/sensitive_info/collected=false
+privacy/collected_data/sensitive_info/linked_to_user=false
+privacy/collected_data/sensitive_info/used_for_tracking=false
+privacy/collected_data/sensitive_info/collection_purposes=0
+privacy/collected_data/contacts/collected=false
+privacy/collected_data/contacts/linked_to_user=false
+privacy/collected_data/contacts/used_for_tracking=false
+privacy/collected_data/contacts/collection_purposes=0
+privacy/collected_data/emails_or_text_messages/collected=false
+privacy/collected_data/emails_or_text_messages/linked_to_user=false
+privacy/collected_data/emails_or_text_messages/used_for_tracking=false
+privacy/collected_data/emails_or_text_messages/collection_purposes=0
+privacy/collected_data/photos_or_videos/collected=false
+privacy/collected_data/photos_or_videos/linked_to_user=false
+privacy/collected_data/photos_or_videos/used_for_tracking=false
+privacy/collected_data/photos_or_videos/collection_purposes=0
+privacy/collected_data/audio_data/collected=false
+privacy/collected_data/audio_data/linked_to_user=false
+privacy/collected_data/audio_data/used_for_tracking=false
+privacy/collected_data/audio_data/collection_purposes=0
+privacy/collected_data/gameplay_content/collected=false
+privacy/collected_data/gameplay_content/linked_to_user=false
+privacy/collected_data/gameplay_content/used_for_tracking=false
+privacy/collected_data/gameplay_content/collection_purposes=0
+privacy/collected_data/customer_support/collected=false
+privacy/collected_data/customer_support/linked_to_user=false
+privacy/collected_data/customer_support/used_for_tracking=false
+privacy/collected_data/customer_support/collection_purposes=0
+privacy/collected_data/other_user_content/collected=false
+privacy/collected_data/other_user_content/linked_to_user=false
+privacy/collected_data/other_user_content/used_for_tracking=false
+privacy/collected_data/other_user_content/collection_purposes=0
+privacy/collected_data/browsing_history/collected=false
+privacy/collected_data/browsing_history/linked_to_user=false
+privacy/collected_data/browsing_history/used_for_tracking=false
+privacy/collected_data/browsing_history/collection_purposes=0
+privacy/collected_data/search_hhistory/collected=false
+privacy/collected_data/search_hhistory/linked_to_user=false
+privacy/collected_data/search_hhistory/used_for_tracking=false
+privacy/collected_data/search_hhistory/collection_purposes=0
+privacy/collected_data/user_id/collected=false
+privacy/collected_data/user_id/linked_to_user=false
+privacy/collected_data/user_id/used_for_tracking=false
+privacy/collected_data/user_id/collection_purposes=0
+privacy/collected_data/device_id/collected=false
+privacy/collected_data/device_id/linked_to_user=false
+privacy/collected_data/device_id/used_for_tracking=false
+privacy/collected_data/device_id/collection_purposes=0
+privacy/collected_data/purchase_history/collected=false
+privacy/collected_data/purchase_history/linked_to_user=false
+privacy/collected_data/purchase_history/used_for_tracking=false
+privacy/collected_data/purchase_history/collection_purposes=0
+privacy/collected_data/product_interaction/collected=false
+privacy/collected_data/product_interaction/linked_to_user=false
+privacy/collected_data/product_interaction/used_for_tracking=false
+privacy/collected_data/product_interaction/collection_purposes=0
+privacy/collected_data/advertising_data/collected=false
+privacy/collected_data/advertising_data/linked_to_user=false
+privacy/collected_data/advertising_data/used_for_tracking=false
+privacy/collected_data/advertising_data/collection_purposes=0
+privacy/collected_data/other_usage_data/collected=false
+privacy/collected_data/other_usage_data/linked_to_user=false
+privacy/collected_data/other_usage_data/used_for_tracking=false
+privacy/collected_data/other_usage_data/collection_purposes=0
+privacy/collected_data/crash_data/collected=false
+privacy/collected_data/crash_data/linked_to_user=false
+privacy/collected_data/crash_data/used_for_tracking=false
+privacy/collected_data/crash_data/collection_purposes=0
+privacy/collected_data/performance_data/collected=false
+privacy/collected_data/performance_data/linked_to_user=false
+privacy/collected_data/performance_data/used_for_tracking=false
+privacy/collected_data/performance_data/collection_purposes=0
+privacy/collected_data/other_diagnostic_data/collected=false
+privacy/collected_data/other_diagnostic_data/linked_to_user=false
+privacy/collected_data/other_diagnostic_data/used_for_tracking=false
+privacy/collected_data/other_diagnostic_data/collection_purposes=0
+privacy/collected_data/environment_scanning/collected=false
+privacy/collected_data/environment_scanning/linked_to_user=false
+privacy/collected_data/environment_scanning/used_for_tracking=false
+privacy/collected_data/environment_scanning/collection_purposes=0
+privacy/collected_data/hands/collected=false
+privacy/collected_data/hands/linked_to_user=false
+privacy/collected_data/hands/used_for_tracking=false
+privacy/collected_data/hands/collection_purposes=0
+privacy/collected_data/head/collected=false
+privacy/collected_data/head/linked_to_user=false
+privacy/collected_data/head/used_for_tracking=false
+privacy/collected_data/head/collection_purposes=0
+privacy/collected_data/other_data_types/collected=false
+privacy/collected_data/other_data_types/linked_to_user=false
+privacy/collected_data/other_data_types/used_for_tracking=false
+privacy/collected_data/other_data_types/collection_purposes=0
ssh_remote_deploy/enabled=false
ssh_remote_deploy/host="user@host_ip"
ssh_remote_deploy/port="22"
@@ -450,6 +627,7 @@ rm -rf \"{temp_dir}\""
name="Android"
platform="Android"
runnable=true
+advanced_options=false
dedicated_server=false
custom_features=""
export_filter="exclude"
@@ -461,12 +639,16 @@ encryption_include_filters=""
encryption_exclude_filters=""
encrypt_pck=false
encrypt_directory=false
+script_export_mode=2
[preset.8.options]
custom_template/debug=""
custom_template/release=""
gradle_build/use_gradle_build=false
+gradle_build/gradle_build_directory=""
+gradle_build/android_source_template=""
+gradle_build/compress_native_libraries=false
gradle_build/export_format=0
gradle_build/min_sdk=""
gradle_build/target_sdk=""
diff --git a/project.godot b/project.godot
index 2d5e87c41..7a0defbff 100644
--- a/project.godot
+++ b/project.godot
@@ -16,7 +16,7 @@ config/version="v1.0.2-dev"
run/main_scene="res://src/Main.tscn"
config/use_custom_user_dir=true
config/custom_user_dir_name="pixelorama"
-config/features=PackedStringArray("4.2")
+config/features=PackedStringArray("4.3")
run/low_processor_mode=true
boot_splash/bg_color=Color(0.145098, 0.145098, 0.164706, 1)
boot_splash/image="res://assets/graphics/splash.png"
@@ -89,15 +89,15 @@ texture={
zoom_in={
"deadzone": 0.5,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":4,"canceled":false,"pressed":false,"double_click":false,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":61,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194437,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":61,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194437,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
zoom_out={
"deadzone": 0.5,
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"double_click":false,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":45,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194435,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":45,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194435,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
middle_mouse={
@@ -117,493 +117,493 @@ right_mouse={
}
left_pencil_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":80,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":80,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_pencil_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":80,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":80,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_eraser_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":69,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":69,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_eraser_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":69,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":69,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_fill_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":66,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":66,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_fill_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":66,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":66,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_rectangle_select_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":82,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":82,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_rectangle_select_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":82,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":82,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
copy={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":67,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":67,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
cut={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":88,"physical_keycode":88,"key_label":88,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":88,"physical_keycode":88,"key_label":88,"unicode":0,"location":0,"echo":false,"script":null)
]
}
paste={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":86,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":86,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
paste_in_place={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":true,"shift_pressed":false,"pressed":false,"keycode":86,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":true,"shift_pressed":false,"pressed":false,"keycode":86,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
delete={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194312,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194312,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_shading_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":85,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":85,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_shading_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":85,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":85,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
toggle_fullscreen={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194342,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194342,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_colorpicker_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":79,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":79,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_colorpicker_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":79,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":79,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
shift={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194325,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194325,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
ctrl={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194326,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194326,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
pan={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":32,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":3,"canceled":false,"pressed":false,"double_click":false,"script":null)
]
}
new_file={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":78,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":78,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
open_file={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":79,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":79,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
save_file={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
save_file_as={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":true,"pressed":false,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":true,"pressed":false,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
export_file={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":69,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":69,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
export_file_as={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":true,"pressed":false,"keycode":69,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":true,"pressed":false,"keycode":69,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
quit={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":81,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":81,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
undo={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":90,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":90,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
redo={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":89,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":true,"pressed":false,"keycode":90,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":89,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":true,"pressed":false,"keycode":90,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
show_grid={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":71,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":71,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
show_rulers={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":82,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":82,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
show_guides={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":70,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":70,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_zoom_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":90,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":90,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_zoom_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":90,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":90,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
switch_colors={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":88,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":88,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
go_to_first_frame={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":4194317,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":4194317,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
go_to_last_frame={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":4194318,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":4194318,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
go_to_previous_frame={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
go_to_next_frame={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":4194321,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":4194321,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
play_backwards={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194335,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194335,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
play_forward={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194336,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194336,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
zen_mode={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194341,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194341,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
open_docs={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194332,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194332,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
mirror_view={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":77,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":77,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_pan_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":77,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":77,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_pan_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":77,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":77,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
show_pixel_grid={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":72,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":72,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
clear_selection={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":68,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":68,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_rectangletool_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_rectangletool_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_ellipsetool_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":67,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":67,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_ellipsetool_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":67,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":67,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_move_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":84,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":84,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_move_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":84,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":84,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
select_all={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":65,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":65,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
invert_selection={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":73,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":73,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_color_select_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":87,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":87,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_color_select_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":87,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":87,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_magic_wand_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":81,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":81,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_magic_wand_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":81,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":81,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
transformation_confirm={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194310,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194309,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194310,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
transformation_cancel={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194305,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194305,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_linetool_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":76,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":76,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_linetool_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":76,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":76,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_ellipse_select_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":89,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":89,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_ellipse_select_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":89,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":89,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_lasso_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":70,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":70,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_lasso_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":70,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":70,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_polygon_select_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":75,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":75,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_polygon_select_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":75,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":75,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
new_brush={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":66,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":66,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
moveable_panels={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194340,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194340,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
change_tool_mode={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194326,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194326,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
draw_create_line={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194325,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194325,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
draw_snap_angle={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194326,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194326,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
shape_perfect={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194325,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194325,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
shape_center={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194326,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194326,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
shape_displace={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194328,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194328,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
selection_add={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194325,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194325,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
selection_subtract={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194326,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194326,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
selection_intersect={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194326,"physical_keycode":4194326,"key_label":4194326,"unicode":0,"echo":false,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":4194325,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194326,"physical_keycode":4194326,"key_label":4194326,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":4194325,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
transform_snap_axis={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194325,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194325,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
transform_snap_grid={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194326,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194326,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
transform_move_selection_only={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194328,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194328,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
transform_copy_selection_content={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":4194328,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
-, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":4194328,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":4194328,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":4194328,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
draw_color_picker={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194328,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194328,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
camera_left={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":2,"axis_value":-1.0,"script":null)
]
}
camera_right={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194321,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194321,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":2,"axis_value":1.0,"script":null)
]
}
camera_up={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194320,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194320,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":3,"axis_value":-1.0,"script":null)
]
}
camera_down={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194322,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194322,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":3,"axis_value":1.0,"script":null)
]
}
move_mouse_left={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194442,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194442,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":13,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":-1.0,"script":null)
]
}
move_mouse_right={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194444,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194444,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":14,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":0,"axis_value":1.0,"script":null)
]
}
move_mouse_up={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194446,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194446,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":11,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":-1.0,"script":null)
]
}
move_mouse_down={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194440,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194440,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":0,"button_index":12,"pressure":0.0,"pressed":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":0,"axis":1,"axis_value":1.0,"script":null)
]
@@ -622,7 +622,7 @@ activate_right_tool={
}
open_last_project={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":true,"pressed":false,"keycode":84,"physical_keycode":0,"key_label":0,"unicode":84,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":true,"pressed":false,"keycode":84,"physical_keycode":0,"key_label":0,"unicode":84,"location":0,"echo":false,"script":null)
]
}
preferences={
@@ -719,12 +719,12 @@ about_pixelorama={
}
left_paint_selection_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":73,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":73,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
right_paint_selection_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":73,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":73,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
brush_size_increment={
@@ -739,12 +739,12 @@ brush_size_decrement={
}
new_layer={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194311,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194311,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
remove_layer={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194312,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194312,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
move_layer_up={
@@ -757,7 +757,7 @@ move_layer_down={
}
clone_layer={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":4194311,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":4194311,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
merge_down_layer={
@@ -766,17 +766,17 @@ merge_down_layer={
}
add_frame={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194311,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194311,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
remove_frame={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194312,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194312,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
clone_frame={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":true,"pressed":false,"keycode":4194311,"physical_keycode":0,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":true,"pressed":false,"keycode":4194311,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
move_frame_left={
@@ -825,22 +825,22 @@ onion_skinning_settings={
}
reference_rotate={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194326,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194326,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
reference_scale={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194328,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194328,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
reference_quick_menu={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":82,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
cancel_reference_transform={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
project_properties={
@@ -857,22 +857,22 @@ pixelize={
}
go_to_previous_layer={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
go_to_next_layer={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
left_curvetool_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":74,"physical_keycode":0,"key_label":0,"unicode":106,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":74,"physical_keycode":0,"key_label":0,"unicode":106,"location":0,"echo":false,"script":null)
]
}
right_curvetool_tool={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":74,"physical_keycode":0,"key_label":0,"unicode":106,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":true,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":74,"physical_keycode":0,"key_label":0,"unicode":106,"location":0,"echo":false,"script":null)
]
}
alpha_lock={
@@ -881,7 +881,7 @@ alpha_lock={
}
change_layer_automatically={
"deadzone": 0.5,
-"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":true,"pressed":false,"keycode":0,"physical_keycode":4194328,"key_label":0,"unicode":0,"echo":false,"script":null)
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":true,"pressed":false,"keycode":0,"physical_keycode":4194328,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
From c1fb706a33873ff3ef14cf08f8bf910b23da561b Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 16 Aug 2024 13:57:51 +0300
Subject: [PATCH 007/162] Remove unnecessary variable from
`change_layer_automaticaly()`
---
src/Autoload/Tools.gd | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/Autoload/Tools.gd b/src/Autoload/Tools.gd
index 4c6b8c997..b40f6a14d 100644
--- a/src/Autoload/Tools.gd
+++ b/src/Autoload/Tools.gd
@@ -652,13 +652,12 @@ func change_layer_automatically(pos: Vector2i) -> void:
if pos.x > image.get_width() - 1 or pos.y > image.get_height() - 1:
return
- var color := Color(0, 0, 0, 0)
var curr_frame := project.frames[project.current_frame]
for layer in project.layers.size():
var layer_index := (project.layers.size() - 1) - layer
if project.layers[layer_index].is_visible_in_hierarchy():
image = curr_frame.cels[layer_index].get_image()
- color = image.get_pixelv(pos)
+ var color := image.get_pixelv(pos)
if not is_zero_approx(color.a):
# Change layer.
project.selected_cels.clear()
From 19574bca7d4458a110dc8b084ba5a052b4d02ab2 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 16 Aug 2024 13:59:14 +0300
Subject: [PATCH 008/162] Implement the ability to save with blended images
with native file dialogs
Fixes #1058
---
src/Main.gd | 15 ++++-----------
src/UI/Dialogs/SaveSprite.tscn | 2 ++
2 files changed, 6 insertions(+), 11 deletions(-)
diff --git a/src/Main.gd b/src/Main.gd
index 3fdcd4d2e..52baa12ad 100644
--- a/src/Main.gd
+++ b/src/Main.gd
@@ -183,16 +183,6 @@ func _ready() -> void:
save_sprite_dialog.current_dir = Global.config_cache.get_value(
"data", "current_dir", OS.get_system_dir(OS.SYSTEM_DIR_DESKTOP)
)
- var include_blended := CheckBox.new()
- include_blended.name = "IncludeBlended"
- include_blended.text = "Include blended images"
- include_blended.tooltip_text = """
-If enabled, the final blended images are also being stored in the pxo, for each frame.
-This makes the pxo file larger and is useful for importing by third-party software
-or CLI exporting. Loading pxo files in Pixelorama does not need this option to be enabled.
-"""
- include_blended.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
- save_sprite_dialog.get_vbox().add_child(include_blended)
_handle_cmdline_arguments()
get_tree().root.files_dropped.connect(_on_files_dropped)
if OS.get_name() == "Android":
@@ -467,7 +457,10 @@ func save_project(path: String) -> void:
path = "user://".path_join(file_name)
include_blended = save_sprite_html5.get_node("%IncludeBlended").button_pressed
else:
- include_blended = save_sprite_dialog.get_vbox().get_node("IncludeBlended").button_pressed
+ if save_sprite_dialog.get_selected_options().size() > 0:
+ include_blended = save_sprite_dialog.get_selected_options()[
+ save_sprite_dialog.get_option_name(0)
+ ]
var success := OpenSave.save_pxo_file(path, false, include_blended, project_to_save)
if success:
Global.open_sprites_dialog.current_dir = path.get_base_dir()
diff --git a/src/UI/Dialogs/SaveSprite.tscn b/src/UI/Dialogs/SaveSprite.tscn
index 7fffcb0db..ebea77fc5 100644
--- a/src/UI/Dialogs/SaveSprite.tscn
+++ b/src/UI/Dialogs/SaveSprite.tscn
@@ -5,3 +5,5 @@ size = Vector2i(675, 400)
ok_button_text = "Save"
access = 2
filters = PackedStringArray("*.pxo ; Pixelorama Project")
+option_count = 1
+option_0/name = "Include blended images"
From b0aabe4e8a40c5eb632f7b0ccaaf37f9910e1caf Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 16 Aug 2024 14:28:54 +0300
Subject: [PATCH 009/162] Add a preference to change max undo steps
---
Translations/Translations.pot | 4 ++++
src/Autoload/Global.gd | 10 +++++++++-
src/Classes/Project.gd | 1 +
src/Preferences/PreferencesDialog.gd | 1 +
src/Preferences/PreferencesDialog.tscn | 26 ++++++++++++++++++--------
5 files changed, 33 insertions(+), 9 deletions(-)
diff --git a/Translations/Translations.pot b/Translations/Translations.pot
index 522571def..75768947d 100644
--- a/Translations/Translations.pot
+++ b/Translations/Translations.pot
@@ -1650,6 +1650,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd
index 783d60e76..45aadc01e 100644
--- a/src/Autoload/Global.gd
+++ b/src/Autoload/Global.gd
@@ -466,13 +466,21 @@ var selection_border_color_2 := Color.BLACK:
## Found in Preferences. If [code]true[/code], Pixelorama pauses when unfocused to save cpu usage.
var pause_when_unfocused := true
-## Found in Preferences. The max fps, Pixelorama is allowed to use (does not limit fps if it is 0).
+## Found in Preferences. The maximum FPS value Pixelorama can reach. 0 means no limit.
var fps_limit := 0:
set(value):
if value == fps_limit:
return
fps_limit = value
Engine.max_fps = fps_limit
+## Found in Preferences. The maximum amount of undo steps projects can use. 0 means no limit.
+var max_undo_steps := 0:
+ set(value):
+ if value == max_undo_steps:
+ return
+ max_undo_steps = value
+ for project in projects:
+ project.undo_redo.max_steps = max_undo_steps
## Found in Preferences. Affects the per_pixel_transparency project setting.
## If [code]true[/code], it allows for the window to be transparent.
## This affects performance, so keep it [code]false[/code] if you don't need it.
diff --git a/src/Classes/Project.gd b/src/Classes/Project.gd
index 5103cb1b5..bb75514e3 100644
--- a/src/Classes/Project.gd
+++ b/src/Classes/Project.gd
@@ -93,6 +93,7 @@ func _init(_frames: Array[Frame] = [], _name := tr("untitled"), _size := Vector2
tiles = Tiles.new(size)
selection_map.copy_from(Image.create(size.x, size.y, false, Image.FORMAT_LA8))
Global.tabs.add_tab(name)
+ undo_redo.max_steps = Global.max_undo_steps
x_symmetry_point = size.x - 1
y_symmetry_point = size.y - 1
diff --git a/src/Preferences/PreferencesDialog.gd b/src/Preferences/PreferencesDialog.gd
index bea75ff3e..c2490a64f 100644
--- a/src/Preferences/PreferencesDialog.gd
+++ b/src/Preferences/PreferencesDialog.gd
@@ -169,6 +169,7 @@ var preferences: Array[Preference] = [
"selection_border_color_2", "Selection/SelectionOptions/BorderColor2", "color", Color.BLACK
),
Preference.new("fps_limit", "Performance/PerformanceContainer/SetFPSLimit", "value", 0),
+ Preference.new("max_undo_steps", "Performance/PerformanceContainer/MaxUndoSteps", "value", 0),
Preference.new(
"pause_when_unfocused",
"Performance/PerformanceContainer/PauseAppFocus",
diff --git a/src/Preferences/PreferencesDialog.tscn b/src/Preferences/PreferencesDialog.tscn
index 48bb579b3..8bf8cba7e 100644
--- a/src/Preferences/PreferencesDialog.tscn
+++ b/src/Preferences/PreferencesDialog.tscn
@@ -295,10 +295,9 @@ text = "Tool button size:"
layout_mode = 2
size_flags_horizontal = 3
mouse_default_cursor_shape = 2
-item_count = 2
selected = 0
+item_count = 2
popup/item_0/text = "Small"
-popup/item_0/id = 0
popup/item_1/text = "Big"
popup/item_1/id = 1
@@ -309,10 +308,9 @@ text = "Icon color from:"
[node name="IconColorOptionButton" type="OptionButton" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Interface/ButtonOptions"]
layout_mode = 2
mouse_default_cursor_shape = 2
-item_count = 2
selected = 0
+item_count = 2
popup/item_0/text = "Theme"
-popup/item_0/id = 0
popup/item_1/text = "Custom"
popup/item_1/id = 1
@@ -508,10 +506,9 @@ layout_mode = 2
size_flags_horizontal = 3
tooltip_text = "Sets the type of the grid between rectangular, isometric or both"
mouse_default_cursor_shape = 2
-item_count = 3
selected = 0
+item_count = 3
popup/item_0/text = "Rectangular"
-popup/item_0/id = 0
popup/item_1/text = "Isometric"
popup/item_1/id = 1
popup/item_2/text = "All"
@@ -803,10 +800,9 @@ text = "Background color from:"
layout_mode = 2
size_flags_horizontal = 3
mouse_default_cursor_shape = 2
-item_count = 2
selected = 0
+item_count = 2
popup/item_0/text = "Theme"
-popup/item_0/id = 0
popup/item_1/text = "Custom"
popup/item_1/id = 1
@@ -1043,6 +1039,20 @@ tooltip_text = "Sets the limit of the application's frames per second. The lower
mouse_default_cursor_shape = 2
max_value = 144.0
+[node name="MaxUndoStepsLabel" type="Label" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Performance/PerformanceContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
+mouse_filter = 0
+text = "Max undo steps:"
+
+[node name="MaxUndoSteps" type="SpinBox" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Performance/PerformanceContainer"]
+custom_minimum_size = Vector2(95, 0)
+layout_mode = 2
+size_flags_horizontal = 3
+mouse_default_cursor_shape = 2
+max_value = 1000.0
+allow_greater = true
+
[node name="PauseAppFocusLabel" type="Label" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Performance/PerformanceContainer"]
layout_mode = 2
tooltip_text = "If this is toggled on, when the application's window loses focus, it gets paused. This helps lower CPU usage when idle. The application gets unpaused when the mouse enters the application's window."
From c58ce49ec1fec576310d1e5e1f199b7ab664e54c Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 16 Aug 2024 14:29:02 +0300
Subject: [PATCH 010/162] Fix typo
---
src/Autoload/DrawingAlgos.gd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Autoload/DrawingAlgos.gd b/src/Autoload/DrawingAlgos.gd
index 4dda47d4b..3125afa8a 100644
--- a/src/Autoload/DrawingAlgos.gd
+++ b/src/Autoload/DrawingAlgos.gd
@@ -100,7 +100,7 @@ func set_layer_metadata_image(
if not include:
# Store a small red value as a way to indicate that this layer should be skipped
# Used for layers such as child layers of a group, so that the group layer itself can
- # sucessfuly be used as a clipping mask with the layer below it.
+ # sucessfully be used as a clipping mask with the layer below it.
image.set_pixel(index, 3, Color(0.2, 0.0, 0.0, 0.0))
From d531e9ace8409b72477939137fd7820b5aa7b6c7 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 16 Aug 2024 18:43:25 +0300
Subject: [PATCH 011/162] Create a new ShaderLoader class to move some code
away from Global
---
src/Autoload/DrawingAlgos.gd | 2 +-
src/Autoload/Global.gd | 312 -----------------
src/Classes/ShaderLoader.gd | 315 ++++++++++++++++++
src/UI/Dialogs/ImageEffects/ShaderEffect.gd | 2 +-
.../LayerEffects/LayerEffectsSettings.gd | 2 +-
5 files changed, 318 insertions(+), 315 deletions(-)
create mode 100644 src/Classes/ShaderLoader.gd
diff --git a/src/Autoload/DrawingAlgos.gd b/src/Autoload/DrawingAlgos.gd
index 3125afa8a..d3b89d733 100644
--- a/src/Autoload/DrawingAlgos.gd
+++ b/src/Autoload/DrawingAlgos.gd
@@ -100,7 +100,7 @@ func set_layer_metadata_image(
if not include:
# Store a small red value as a way to indicate that this layer should be skipped
# Used for layers such as child layers of a group, so that the group layer itself can
- # sucessfully be used as a clipping mask with the layer below it.
+ # successfully be used as a clipping mask with the layer below it.
image.set_pixel(index, 3, Color(0.2, 0.0, 0.0, 0.0))
diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd
index 45aadc01e..3e41fa9de 100644
--- a/src/Autoload/Global.gd
+++ b/src/Autoload/Global.gd
@@ -117,9 +117,6 @@ const HOME_SUBDIR_NAME := "pixelorama"
const CONFIG_SUBDIR_NAME := "pixelorama_data"
## The path of the directory where the UI layouts are being stored.
const LAYOUT_DIR := "user://layouts"
-const VALUE_SLIDER_V2_TSCN := preload("res://src/UI/Nodes/ValueSliderV2.tscn")
-const BASIS_SLIDERS_TSCN := preload("res://src/UI/Nodes/BasisSliders.tscn")
-const GRADIENT_EDIT_TSCN := preload("res://src/UI/Nodes/GradientEdit.tscn")
## It is path to the executable's base drectory.
var root_directory := "."
@@ -1088,312 +1085,3 @@ func _save_to_override_file() -> void:
file.store_line("[display]\n")
file.store_line("window/subwindows/embed_subwindows=%s" % single_window_mode)
file.store_line("window/per_pixel_transparency/allowed=%s" % window_transparency)
-
-
-func create_ui_for_shader_uniforms(
- shader: Shader,
- params: Dictionary,
- parent_node: Control,
- value_changed: Callable,
- file_selected: Callable
-) -> void:
- var code := shader.code.split("\n")
- var uniforms: PackedStringArray = []
- for line in code:
- if line.begins_with("uniform"):
- uniforms.append(line)
-
- for uniform in uniforms:
- # Example uniform:
- # uniform float parameter_name : hint_range(0, 255) = 100.0;
- var uniform_split := uniform.split("=")
- var u_value := ""
- if uniform_split.size() > 1:
- u_value = uniform_split[1].replace(";", "").strip_edges()
- else:
- uniform_split[0] = uniform_split[0].replace(";", "").strip_edges()
-
- var u_left_side := uniform_split[0].split(":")
- var u_hint := ""
- if u_left_side.size() > 1:
- u_hint = u_left_side[1].strip_edges()
- u_hint = u_hint.replace(";", "")
-
- var u_init := u_left_side[0].split(" ")
- var u_type := u_init[1]
- var u_name := u_init[2]
- var humanized_u_name := Keychain.humanize_snake_case(u_name) + ":"
-
- if u_type == "float" or u_type == "int":
- var label := Label.new()
- label.text = humanized_u_name
- label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- var slider := ValueSlider.new()
- slider.allow_greater = true
- slider.allow_lesser = true
- slider.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- var min_value := 0.0
- var max_value := 255.0
- var step := 1.0
- var range_values_array: PackedStringArray
- if "hint_range" in u_hint:
- var range_values: String = u_hint.replace("hint_range(", "")
- range_values = range_values.replace(")", "").strip_edges()
- range_values_array = range_values.split(",")
-
- if u_type == "float":
- if range_values_array.size() >= 1:
- min_value = float(range_values_array[0])
- else:
- min_value = 0.01
-
- if range_values_array.size() >= 2:
- max_value = float(range_values_array[1])
-
- if range_values_array.size() >= 3:
- step = float(range_values_array[2])
- else:
- step = 0.01
-
- if u_value != "":
- slider.value = float(u_value)
- else:
- if range_values_array.size() >= 1:
- min_value = int(range_values_array[0])
-
- if range_values_array.size() >= 2:
- max_value = int(range_values_array[1])
-
- if range_values_array.size() >= 3:
- step = int(range_values_array[2])
-
- if u_value != "":
- slider.value = int(u_value)
- if params.has(u_name):
- slider.value = params[u_name]
- else:
- params[u_name] = slider.value
- slider.min_value = min_value
- slider.max_value = max_value
- slider.step = step
- slider.value_changed.connect(value_changed.bind(u_name))
- slider.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
- var hbox := HBoxContainer.new()
- hbox.add_child(label)
- hbox.add_child(slider)
- parent_node.add_child(hbox)
- elif u_type == "vec2" or u_type == "ivec2" or u_type == "uvec2":
- var label := Label.new()
- label.text = humanized_u_name
- label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- var vector2 := _vec2str_to_vector2(u_value)
- var slider := VALUE_SLIDER_V2_TSCN.instantiate() as ValueSliderV2
- slider.show_ratio = true
- slider.allow_greater = true
- if u_type != "uvec2":
- slider.allow_lesser = true
- slider.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- slider.value = vector2
- if params.has(u_name):
- slider.value = params[u_name]
- else:
- params[u_name] = slider.value
- slider.value_changed.connect(value_changed.bind(u_name))
- var hbox := HBoxContainer.new()
- hbox.add_child(label)
- hbox.add_child(slider)
- parent_node.add_child(hbox)
- elif u_type == "vec4":
- if "source_color" in u_hint:
- var label := Label.new()
- label.text = humanized_u_name
- label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- var color := _vec4str_to_color(u_value)
- var color_button := ColorPickerButton.new()
- color_button.custom_minimum_size = Vector2(20, 20)
- color_button.color = color
- if params.has(u_name):
- color_button.color = params[u_name]
- else:
- params[u_name] = color_button.color
- color_button.color_changed.connect(value_changed.bind(u_name))
- color_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- color_button.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
- var hbox := HBoxContainer.new()
- hbox.add_child(label)
- hbox.add_child(color_button)
- parent_node.add_child(hbox)
- elif u_type == "mat3":
- var label := Label.new()
- label.text = humanized_u_name
- label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- var basis := _mat3str_to_basis(u_value)
- var sliders := BASIS_SLIDERS_TSCN.instantiate() as BasisSliders
- sliders.allow_greater = true
- sliders.allow_lesser = true
- sliders.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- sliders.value = basis
- if params.has(u_name):
- sliders.value = params[u_name]
- else:
- params[u_name] = sliders.value
- sliders.value_changed.connect(value_changed.bind(u_name))
- var hbox := HBoxContainer.new()
- hbox.add_child(label)
- hbox.add_child(sliders)
- parent_node.add_child(hbox)
- elif u_type == "sampler2D":
- if u_name == "selection":
- continue
- if u_name == "palette_texture":
- var palette := Palettes.current_palette
- var palette_texture := ImageTexture.create_from_image(palette.convert_to_image())
- value_changed.call(palette_texture, u_name)
- Palettes.palette_selected.connect(
- func(_name): _shader_change_palette(value_changed, u_name)
- )
- palette.data_changed.connect(
- func(): _shader_update_palette_texture(palette, value_changed, u_name)
- )
- continue
- var label := Label.new()
- label.text = humanized_u_name
- label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- var hbox := HBoxContainer.new()
- hbox.add_child(label)
- if u_name.begins_with("gradient_"):
- var gradient_edit := GRADIENT_EDIT_TSCN.instantiate() as GradientEditNode
- gradient_edit.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- if params.has(u_name) and params[u_name] is GradientTexture2D:
- gradient_edit.set_gradient_texture(params[u_name])
- else:
- params[u_name] = gradient_edit.texture
- # This needs to be call_deferred because GradientTexture2D gets updated next frame.
- # Without this, the texture is purple.
- value_changed.call_deferred(gradient_edit.texture, u_name)
- gradient_edit.updated.connect(
- func(_gradient, _cc): value_changed.call(gradient_edit.texture, u_name)
- )
- hbox.add_child(gradient_edit)
- else:
- var file_dialog := FileDialog.new()
- file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE
- file_dialog.access = FileDialog.ACCESS_FILESYSTEM
- file_dialog.size = Vector2(384, 281)
- file_dialog.file_selected.connect(file_selected.bind(u_name))
- file_dialog.use_native_dialog = use_native_file_dialogs
- var button := Button.new()
- button.text = "Load texture"
- button.pressed.connect(file_dialog.popup_centered)
- button.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- button.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
- hbox.add_child(button)
- parent_node.add_child(file_dialog)
- parent_node.add_child(hbox)
-
- elif u_type == "bool":
- var label := Label.new()
- label.text = humanized_u_name
- label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- var checkbox := CheckBox.new()
- checkbox.text = "On"
- if u_value == "true":
- checkbox.button_pressed = true
- if params.has(u_name):
- checkbox.button_pressed = params[u_name]
- else:
- params[u_name] = checkbox.button_pressed
- checkbox.toggled.connect(value_changed.bind(u_name))
- checkbox.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- checkbox.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
- var hbox := HBoxContainer.new()
- hbox.add_child(label)
- hbox.add_child(checkbox)
- parent_node.add_child(hbox)
-
-
-func _vec2str_to_vector2(vec2: String) -> Vector2:
- vec2 = vec2.replace("uvec2", "vec2")
- vec2 = vec2.replace("ivec2", "vec2")
- vec2 = vec2.replace("vec2(", "")
- vec2 = vec2.replace(")", "")
- var vec_values := vec2.split(",")
- if vec_values.size() == 0:
- return Vector2.ZERO
- var y := float(vec_values[0])
- if vec_values.size() == 2:
- y = float(vec_values[1])
- var vector2 := Vector2(float(vec_values[0]), y)
- return vector2
-
-
-func _vec3str_to_vector3(vec3: String) -> Vector3:
- vec3 = vec3.replace("uvec3", "vec3")
- vec3 = vec3.replace("ivec3", "vec3")
- vec3 = vec3.replace("vec3(", "")
- vec3 = vec3.replace(")", "")
- var vec_values := vec3.split(",")
- if vec_values.size() == 0:
- return Vector3.ZERO
- var y := float(vec_values[0])
- var z := float(vec_values[0])
- if vec_values.size() >= 2:
- y = float(vec_values[1])
- if vec_values.size() == 3:
- z = float(vec_values[2])
- var vector3 := Vector3(float(vec_values[0]), y, z)
- return vector3
-
-
-func _vec4str_to_color(vec4: String) -> Color:
- vec4 = vec4.replace("vec4(", "")
- vec4 = vec4.replace(")", "")
- var rgba_values := vec4.split(",")
- var red := float(rgba_values[0])
-
- var green := float(rgba_values[0])
- if rgba_values.size() >= 2:
- green = float(rgba_values[1])
-
- var blue := float(rgba_values[0])
- if rgba_values.size() >= 3:
- blue = float(rgba_values[2])
-
- var alpha := float(rgba_values[0])
- if rgba_values.size() == 4:
- alpha = float(rgba_values[3])
- var color := Color(red, green, blue, alpha)
- return color
-
-
-func _mat3str_to_basis(mat3: String) -> Basis:
- mat3 = mat3.replace("mat3(", "")
- mat3 = mat3.replace("))", ")")
- mat3 = mat3.replace("), ", ")")
- var vec3_values := mat3.split("vec3", false)
- var vec3_x := _vec3str_to_vector3(vec3_values[0])
-
- var vec3_y := _vec3str_to_vector3(vec3_values[0])
- if vec3_values.size() >= 2:
- vec3_y = _vec3str_to_vector3(vec3_values[1])
-
- var vec3_z := _vec3str_to_vector3(vec3_values[0])
- if vec3_values.size() == 3:
- vec3_z = _vec3str_to_vector3(vec3_values[2])
- var basis := Basis(vec3_x, vec3_y, vec3_z)
- return basis
-
-
-func _shader_change_palette(value_changed: Callable, parameter_name: String) -> void:
- var palette := Palettes.current_palette
- _shader_update_palette_texture(palette, value_changed, parameter_name)
- #if not palette.data_changed.is_connected(_shader_update_palette_texture):
- palette.data_changed.connect(
- func(): _shader_update_palette_texture(palette, value_changed, parameter_name)
- )
-
-
-func _shader_update_palette_texture(
- palette: Palette, value_changed: Callable, parameter_name: String
-) -> void:
- value_changed.call(ImageTexture.create_from_image(palette.convert_to_image()), parameter_name)
diff --git a/src/Classes/ShaderLoader.gd b/src/Classes/ShaderLoader.gd
new file mode 100644
index 000000000..85e9025c4
--- /dev/null
+++ b/src/Classes/ShaderLoader.gd
@@ -0,0 +1,315 @@
+class_name ShaderLoader
+extends RefCounted
+
+const VALUE_SLIDER_V2_TSCN := preload("res://src/UI/Nodes/ValueSliderV2.tscn")
+const BASIS_SLIDERS_TSCN := preload("res://src/UI/Nodes/BasisSliders.tscn")
+const GRADIENT_EDIT_TSCN := preload("res://src/UI/Nodes/GradientEdit.tscn")
+
+
+static func create_ui_for_shader_uniforms(
+ shader: Shader,
+ params: Dictionary,
+ parent_node: Control,
+ value_changed: Callable,
+ file_selected: Callable
+) -> void:
+ var code := shader.code.split("\n")
+ var uniforms: PackedStringArray = []
+ for line in code:
+ if line.begins_with("uniform"):
+ uniforms.append(line)
+
+ for uniform in uniforms:
+ # Example uniform:
+ # uniform float parameter_name : hint_range(0, 255) = 100.0;
+ var uniform_split := uniform.split("=")
+ var u_value := ""
+ if uniform_split.size() > 1:
+ u_value = uniform_split[1].replace(";", "").strip_edges()
+ else:
+ uniform_split[0] = uniform_split[0].replace(";", "").strip_edges()
+
+ var u_left_side := uniform_split[0].split(":")
+ var u_hint := ""
+ if u_left_side.size() > 1:
+ u_hint = u_left_side[1].strip_edges()
+ u_hint = u_hint.replace(";", "")
+
+ var u_init := u_left_side[0].split(" ")
+ var u_type := u_init[1]
+ var u_name := u_init[2]
+ var humanized_u_name := Keychain.humanize_snake_case(u_name) + ":"
+
+ if u_type == "float" or u_type == "int":
+ var label := Label.new()
+ label.text = humanized_u_name
+ label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ var slider := ValueSlider.new()
+ slider.allow_greater = true
+ slider.allow_lesser = true
+ slider.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ var min_value := 0.0
+ var max_value := 255.0
+ var step := 1.0
+ var range_values_array: PackedStringArray
+ if "hint_range" in u_hint:
+ var range_values: String = u_hint.replace("hint_range(", "")
+ range_values = range_values.replace(")", "").strip_edges()
+ range_values_array = range_values.split(",")
+
+ if u_type == "float":
+ if range_values_array.size() >= 1:
+ min_value = float(range_values_array[0])
+ else:
+ min_value = 0.01
+
+ if range_values_array.size() >= 2:
+ max_value = float(range_values_array[1])
+
+ if range_values_array.size() >= 3:
+ step = float(range_values_array[2])
+ else:
+ step = 0.01
+
+ if u_value != "":
+ slider.value = float(u_value)
+ else:
+ if range_values_array.size() >= 1:
+ min_value = int(range_values_array[0])
+
+ if range_values_array.size() >= 2:
+ max_value = int(range_values_array[1])
+
+ if range_values_array.size() >= 3:
+ step = int(range_values_array[2])
+
+ if u_value != "":
+ slider.value = int(u_value)
+ if params.has(u_name):
+ slider.value = params[u_name]
+ else:
+ params[u_name] = slider.value
+ slider.min_value = min_value
+ slider.max_value = max_value
+ slider.step = step
+ slider.value_changed.connect(value_changed.bind(u_name))
+ slider.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
+ var hbox := HBoxContainer.new()
+ hbox.add_child(label)
+ hbox.add_child(slider)
+ parent_node.add_child(hbox)
+ elif u_type == "vec2" or u_type == "ivec2" or u_type == "uvec2":
+ var label := Label.new()
+ label.text = humanized_u_name
+ label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ var vector2 := _vec2str_to_vector2(u_value)
+ var slider := VALUE_SLIDER_V2_TSCN.instantiate() as ValueSliderV2
+ slider.show_ratio = true
+ slider.allow_greater = true
+ if u_type != "uvec2":
+ slider.allow_lesser = true
+ slider.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ slider.value = vector2
+ if params.has(u_name):
+ slider.value = params[u_name]
+ else:
+ params[u_name] = slider.value
+ slider.value_changed.connect(value_changed.bind(u_name))
+ var hbox := HBoxContainer.new()
+ hbox.add_child(label)
+ hbox.add_child(slider)
+ parent_node.add_child(hbox)
+ elif u_type == "vec4":
+ if "source_color" in u_hint:
+ var label := Label.new()
+ label.text = humanized_u_name
+ label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ var color := _vec4str_to_color(u_value)
+ var color_button := ColorPickerButton.new()
+ color_button.custom_minimum_size = Vector2(20, 20)
+ color_button.color = color
+ if params.has(u_name):
+ color_button.color = params[u_name]
+ else:
+ params[u_name] = color_button.color
+ color_button.color_changed.connect(value_changed.bind(u_name))
+ color_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ color_button.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
+ var hbox := HBoxContainer.new()
+ hbox.add_child(label)
+ hbox.add_child(color_button)
+ parent_node.add_child(hbox)
+ elif u_type == "mat3":
+ var label := Label.new()
+ label.text = humanized_u_name
+ label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ var basis := _mat3str_to_basis(u_value)
+ var sliders := BASIS_SLIDERS_TSCN.instantiate() as BasisSliders
+ sliders.allow_greater = true
+ sliders.allow_lesser = true
+ sliders.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ sliders.value = basis
+ if params.has(u_name):
+ sliders.value = params[u_name]
+ else:
+ params[u_name] = sliders.value
+ sliders.value_changed.connect(value_changed.bind(u_name))
+ var hbox := HBoxContainer.new()
+ hbox.add_child(label)
+ hbox.add_child(sliders)
+ parent_node.add_child(hbox)
+ elif u_type == "sampler2D":
+ if u_name == "selection":
+ continue
+ if u_name == "palette_texture":
+ var palette := Palettes.current_palette
+ var palette_texture := ImageTexture.create_from_image(palette.convert_to_image())
+ value_changed.call(palette_texture, u_name)
+ Palettes.palette_selected.connect(
+ func(_name): _shader_change_palette(value_changed, u_name)
+ )
+ palette.data_changed.connect(
+ func(): _shader_update_palette_texture(palette, value_changed, u_name)
+ )
+ continue
+ var label := Label.new()
+ label.text = humanized_u_name
+ label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ var hbox := HBoxContainer.new()
+ hbox.add_child(label)
+ if u_name.begins_with("gradient_"):
+ var gradient_edit := GRADIENT_EDIT_TSCN.instantiate() as GradientEditNode
+ gradient_edit.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ if params.has(u_name) and params[u_name] is GradientTexture2D:
+ gradient_edit.set_gradient_texture(params[u_name])
+ else:
+ params[u_name] = gradient_edit.texture
+ # This needs to be call_deferred because GradientTexture2D gets updated next frame.
+ # Without this, the texture is purple.
+ value_changed.call_deferred(gradient_edit.texture, u_name)
+ gradient_edit.updated.connect(
+ func(_gradient, _cc): value_changed.call(gradient_edit.texture, u_name)
+ )
+ hbox.add_child(gradient_edit)
+ else:
+ var file_dialog := FileDialog.new()
+ file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE
+ file_dialog.access = FileDialog.ACCESS_FILESYSTEM
+ file_dialog.size = Vector2(384, 281)
+ file_dialog.file_selected.connect(file_selected.bind(u_name))
+ file_dialog.use_native_dialog = Global.use_native_file_dialogs
+ var button := Button.new()
+ button.text = "Load texture"
+ button.pressed.connect(file_dialog.popup_centered)
+ button.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ button.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
+ hbox.add_child(button)
+ parent_node.add_child(file_dialog)
+ parent_node.add_child(hbox)
+
+ elif u_type == "bool":
+ var label := Label.new()
+ label.text = humanized_u_name
+ label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ var checkbox := CheckBox.new()
+ checkbox.text = "On"
+ if u_value == "true":
+ checkbox.button_pressed = true
+ if params.has(u_name):
+ checkbox.button_pressed = params[u_name]
+ else:
+ params[u_name] = checkbox.button_pressed
+ checkbox.toggled.connect(value_changed.bind(u_name))
+ checkbox.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ checkbox.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
+ var hbox := HBoxContainer.new()
+ hbox.add_child(label)
+ hbox.add_child(checkbox)
+ parent_node.add_child(hbox)
+
+
+static func _vec2str_to_vector2(vec2: String) -> Vector2:
+ vec2 = vec2.replace("uvec2", "vec2")
+ vec2 = vec2.replace("ivec2", "vec2")
+ vec2 = vec2.replace("vec2(", "")
+ vec2 = vec2.replace(")", "")
+ var vec_values := vec2.split(",")
+ if vec_values.size() == 0:
+ return Vector2.ZERO
+ var y := float(vec_values[0])
+ if vec_values.size() == 2:
+ y = float(vec_values[1])
+ var vector2 := Vector2(float(vec_values[0]), y)
+ return vector2
+
+
+static func _vec3str_to_vector3(vec3: String) -> Vector3:
+ vec3 = vec3.replace("uvec3", "vec3")
+ vec3 = vec3.replace("ivec3", "vec3")
+ vec3 = vec3.replace("vec3(", "")
+ vec3 = vec3.replace(")", "")
+ var vec_values := vec3.split(",")
+ if vec_values.size() == 0:
+ return Vector3.ZERO
+ var y := float(vec_values[0])
+ var z := float(vec_values[0])
+ if vec_values.size() >= 2:
+ y = float(vec_values[1])
+ if vec_values.size() == 3:
+ z = float(vec_values[2])
+ var vector3 := Vector3(float(vec_values[0]), y, z)
+ return vector3
+
+
+static func _vec4str_to_color(vec4: String) -> Color:
+ vec4 = vec4.replace("vec4(", "")
+ vec4 = vec4.replace(")", "")
+ var rgba_values := vec4.split(",")
+ var red := float(rgba_values[0])
+
+ var green := float(rgba_values[0])
+ if rgba_values.size() >= 2:
+ green = float(rgba_values[1])
+
+ var blue := float(rgba_values[0])
+ if rgba_values.size() >= 3:
+ blue = float(rgba_values[2])
+
+ var alpha := float(rgba_values[0])
+ if rgba_values.size() == 4:
+ alpha = float(rgba_values[3])
+ var color := Color(red, green, blue, alpha)
+ return color
+
+
+static func _mat3str_to_basis(mat3: String) -> Basis:
+ mat3 = mat3.replace("mat3(", "")
+ mat3 = mat3.replace("))", ")")
+ mat3 = mat3.replace("), ", ")")
+ var vec3_values := mat3.split("vec3", false)
+ var vec3_x := _vec3str_to_vector3(vec3_values[0])
+
+ var vec3_y := _vec3str_to_vector3(vec3_values[0])
+ if vec3_values.size() >= 2:
+ vec3_y = _vec3str_to_vector3(vec3_values[1])
+
+ var vec3_z := _vec3str_to_vector3(vec3_values[0])
+ if vec3_values.size() == 3:
+ vec3_z = _vec3str_to_vector3(vec3_values[2])
+ var basis := Basis(vec3_x, vec3_y, vec3_z)
+ return basis
+
+
+static func _shader_change_palette(value_changed: Callable, parameter_name: String) -> void:
+ var palette := Palettes.current_palette
+ _shader_update_palette_texture(palette, value_changed, parameter_name)
+ #if not palette.data_changed.is_connected(_shader_update_palette_texture):
+ palette.data_changed.connect(
+ func(): _shader_update_palette_texture(palette, value_changed, parameter_name)
+ )
+
+
+static func _shader_update_palette_texture(
+ palette: Palette, value_changed: Callable, parameter_name: String
+) -> void:
+ value_changed.call(ImageTexture.create_from_image(palette.convert_to_image()), parameter_name)
diff --git a/src/UI/Dialogs/ImageEffects/ShaderEffect.gd b/src/UI/Dialogs/ImageEffects/ShaderEffect.gd
index 5b44531a1..bd6524942 100644
--- a/src/UI/Dialogs/ImageEffects/ShaderEffect.gd
+++ b/src/UI/Dialogs/ImageEffects/ShaderEffect.gd
@@ -51,7 +51,7 @@ func change_shader(shader_tmp: Shader, shader_name: String) -> void:
for child in shader_params.get_children():
child.queue_free()
- Global.create_ui_for_shader_uniforms(
+ ShaderLoader.create_ui_for_shader_uniforms(
shader_tmp, params, shader_params, _set_shader_parameter, _load_texture
)
diff --git a/src/UI/Timeline/LayerEffects/LayerEffectsSettings.gd b/src/UI/Timeline/LayerEffects/LayerEffectsSettings.gd
index 324d8e257..ef41fb278 100644
--- a/src/UI/Timeline/LayerEffects/LayerEffectsSettings.gd
+++ b/src/UI/Timeline/LayerEffects/LayerEffectsSettings.gd
@@ -98,7 +98,7 @@ func _create_effect_ui(layer: BaseLayer, effect: LayerEffect) -> void:
hbox.add_child(apply_button)
hbox.add_child(delete_button)
var parameter_vbox := CollapsibleContainer.new()
- Global.create_ui_for_shader_uniforms(
+ ShaderLoader.create_ui_for_shader_uniforms(
effect.shader,
effect.params,
parameter_vbox,
From 783a1387795e515ce5e17cfa15b4881685749959 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 16 Aug 2024 19:28:40 +0300
Subject: [PATCH 012/162] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index fbdc4e8f4..b7a174c80 100644
--- a/README.md
+++ b/README.md
@@ -62,7 +62,7 @@ You can find online Documentation for Pixelorama here: https://orama-interactive
It's still work in progress so there are some pages missing. If you want to contribute, you can do so in [Pixelorama-Docs' GitHub Repository](https://github.com/Orama-Interactive/Pixelorama-Docs).
## Cloning Instructions
-Pixelorama uses Godot 4.2, so you will need to have it in order to run the project. Older versions will not work.
+Pixelorama uses Godot 4.3, so you will need to have it in order to run the project. Older versions will not work.
As of right now, most of the code is written using GDScript, so the mono version of Godot is not required, but Pixelorama should also work with it.
## Features:
From 410f06435c1da979f826d677532829b60912de10 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 16 Aug 2024 19:29:32 +0300
Subject: [PATCH 013/162] Fix issue where color sliders wouldn't be visible
during startup, if the color options button was expanded
---
src/UI/ColorPickers/ColorPicker.gd | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/src/UI/ColorPickers/ColorPicker.gd b/src/UI/ColorPickers/ColorPicker.gd
index ba55f7e72..8f837f8ee 100644
--- a/src/UI/ColorPickers/ColorPicker.gd
+++ b/src/UI/ColorPickers/ColorPicker.gd
@@ -23,9 +23,6 @@ var color_sliders_vbox: VBoxContainer
func _ready() -> void:
Tools.color_changed.connect(update_color)
_average(left_color_rect.color, right_color_rect.color)
- expand_button.button_pressed = Global.config_cache.get_value(
- "color_picker", "is_expanded", false
- )
color_picker.color_mode = Global.config_cache.get_value(
"color_picker", "color_mode", ColorPicker.MODE_RGB
)
@@ -85,6 +82,10 @@ func _ready() -> void:
picker_vbox_container.add_child(expand_button)
picker_vbox_container.move_child(expand_button, 2)
+ expand_button.button_pressed = Global.config_cache.get_value(
+ "color_picker", "is_expanded", false
+ )
+
func _notification(what: int) -> void:
if what == NOTIFICATION_THEME_CHANGED and is_instance_valid(hsv_rectangle_control):
From 29f9601d8ab17bb5feadb2b8720f01500db5eaad Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Sat, 17 Aug 2024 00:59:48 +0300
Subject: [PATCH 014/162] Revert "Fix cursor blinking at the edge of canvas
(#1075)"
This reverts commit 77f6860f7a85c8a2238e8a428dec3138383e64c5.
---
src/UI/UI.tscn | 4 ++++
src/UI/ViewportContainer.gd | 33 ++++++++++++++-------------------
2 files changed, 18 insertions(+), 19 deletions(-)
diff --git a/src/UI/UI.tscn b/src/UI/UI.tscn
index 844ad29ef..33f01a452 100644
--- a/src/UI/UI.tscn
+++ b/src/UI/UI.tscn
@@ -420,3 +420,7 @@ layout_mode = 2
[connection signal="mouse_entered" from="DockableContainer/Main Canvas/HorizontalRuler" to="DockableContainer/Main Canvas/HorizontalRuler" method="_on_HorizontalRuler_mouse_entered"]
[connection signal="pressed" from="DockableContainer/Main Canvas/HorizontalRuler" to="DockableContainer/Main Canvas/HorizontalRuler" method="_on_HorizontalRuler_pressed"]
[connection signal="pressed" from="DockableContainer/Main Canvas/ViewportandVerticalRuler/VerticalRuler" to="DockableContainer/Main Canvas/ViewportandVerticalRuler/VerticalRuler" method="_on_VerticalRuler_pressed"]
+[connection signal="mouse_entered" from="DockableContainer/Main Canvas/ViewportandVerticalRuler/SubViewportContainer" to="DockableContainer/Main Canvas/ViewportandVerticalRuler/SubViewportContainer" method="_on_ViewportContainer_mouse_entered"]
+[connection signal="mouse_exited" from="DockableContainer/Main Canvas/ViewportandVerticalRuler/SubViewportContainer" to="DockableContainer/Main Canvas/ViewportandVerticalRuler/SubViewportContainer" method="_on_ViewportContainer_mouse_exited"]
+[connection signal="mouse_entered" from="DockableContainer/Second Canvas" to="DockableContainer/Second Canvas" method="_on_ViewportContainer_mouse_entered"]
+[connection signal="mouse_exited" from="DockableContainer/Second Canvas" to="DockableContainer/Second Canvas" method="_on_ViewportContainer_mouse_exited"]
diff --git a/src/UI/ViewportContainer.gd b/src/UI/ViewportContainer.gd
index 603a078fb..e0966199b 100644
--- a/src/UI/ViewportContainer.gd
+++ b/src/UI/ViewportContainer.gd
@@ -2,8 +2,6 @@ extends SubViewportContainer
@export var camera_path: NodePath
-var _mouse_inside = false
-
@onready var camera := get_node(camera_path) as CanvasCamera
@@ -12,20 +10,17 @@ func _ready() -> void:
material.blend_mode = CanvasItemMaterial.BLEND_MODE_PREMULT_ALPHA
-func _input(event):
- if event is InputEventMouseMotion:
- if get_global_rect().has_point(event.position):
- if !_mouse_inside:
- _mouse_inside = true
- camera.set_process_input(true)
- Global.control.left_cursor.visible = Global.show_left_tool_icon
- Global.control.right_cursor.visible = Global.show_right_tool_icon
- if Global.cross_cursor:
- Input.set_default_cursor_shape(Input.CURSOR_CROSS)
- else:
- if _mouse_inside:
- _mouse_inside = false
- camera.drag = false
- Global.control.left_cursor.visible = false
- Global.control.right_cursor.visible = false
- Input.set_default_cursor_shape(Input.CURSOR_ARROW)
+func _on_ViewportContainer_mouse_entered() -> void:
+ camera.set_process_input(true)
+ Global.control.left_cursor.visible = Global.show_left_tool_icon
+ Global.control.right_cursor.visible = Global.show_right_tool_icon
+ if Global.cross_cursor:
+ Input.set_default_cursor_shape(Input.CURSOR_CROSS)
+
+
+func _on_ViewportContainer_mouse_exited() -> void:
+ camera.set_process_input(false)
+ camera.drag = false
+ Global.control.left_cursor.visible = false
+ Global.control.right_cursor.visible = false
+ Input.set_default_cursor_shape(Input.CURSOR_ARROW)
From bdef545727065645ca162c46b214d6cf97f5b367 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Sat, 17 Aug 2024 02:38:27 +0300
Subject: [PATCH 015/162] Fix issue when merging two layers, where if the
bottom layer had layer/cel transparency, the transparency would be applied in
the content destructively
---
src/UI/Timeline/AnimationTimeline.gd | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/UI/Timeline/AnimationTimeline.gd b/src/UI/Timeline/AnimationTimeline.gd
index 12670d988..2d40b3813 100644
--- a/src/UI/Timeline/AnimationTimeline.gd
+++ b/src/UI/Timeline/AnimationTimeline.gd
@@ -1023,6 +1023,7 @@ func _on_MergeDownLayer_pressed() -> void:
textures.append(top_image)
var metadata_image := Image.create(2, 4, false, Image.FORMAT_R8)
DrawingAlgos.set_layer_metadata_image(bottom_layer, bottom_cel, metadata_image, 0)
+ metadata_image.set_pixel(0, 1, Color(1.0, 0.0, 0.0, 0.0))
DrawingAlgos.set_layer_metadata_image(top_layer, top_cel, metadata_image, 1)
var texture_array := Texture2DArray.new()
texture_array.create_from_images(textures)
From 81889ff5d0e3bbcc6e759bb859430bd39aba08f7 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Sun, 18 Aug 2024 16:49:39 +0300
Subject: [PATCH 016/162] [skip ci] Add context to some image effect strings
---
Translations/Translations.pot | 9 ++++++---
1 file changed, 6 insertions(+), 3 deletions(-)
diff --git a/Translations/Translations.pot b/Translations/Translations.pot
index 75768947d..d004d9de2 100644
--- a/Translations/Translations.pot
+++ b/Translations/Translations.pot
@@ -938,12 +938,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -1015,7 +1018,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1085,11 +1088,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
From 498274df341d871ab4371aaa6c01490fb0b322e0 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Mon, 19 Aug 2024 16:19:36 +0300
Subject: [PATCH 017/162] [skip ci] Update CHANGELOG.md
---
CHANGELOG.md | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a990b7fde..073eea939 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -11,8 +11,13 @@ This update has been brought to you by the contributions of:
Built using Godot 4.3
### Added
+- Group layer blending is now supported. To prevent a layer group from blending, you can set its blend mode to "Pass through". [#1077](https://github.com/Orama-Interactive/Pixelorama/pull/1077)
+- Added Control+Shift+Alt as a shortcut that automatically selects a layer directly from the canvas when using tools.
- Added tolerance to the bucket tool's "similar area" mode and to the magic wand tool.
- It is now possible to move all selected cels between different frames, but they all have to be on the same layer.
+- Added a convolution matrix layer effect, still work in progress.
+- Native file dialogs now have a checkbox that lets you save blended images inside .pxo files.
+- It is now possible to change the maximum undo steps from the Preferences.
- Cel properties of group and 3D cels can now be edited.
### Changed
@@ -26,8 +31,10 @@ Built using Godot 4.3
- Fixed crashes when attempting to export specific layers or tags that have been deleted.
- Fixed crashes when importing brushes and palettes.
- Fixed an issue with the bucket tool filling with the wrong color.
+- Fixed an issue when merging two layers, where if the bottom layer had layer/cel transparency, the transparency would be applied in the content destructively.
+- Fixed an issue where color sliders wouldn't be visible during startup, if the color options button was expanded.
- Fixed bug where some buttons on the interface were not affected by the custom icon color on startup.
-- Fixed issue with the cursor blinking at the edge of the canvas on some devices. [#1075](https://github.com/Orama-Interactive/Pixelorama/pull/1075)
+- Fixed an issue when loading a project, selecting a project brush and then switching tools. [#1078](https://github.com/Orama-Interactive/Pixelorama/pull/1078)
- Fixed wrong rendering of the isometric grid. [#1069](https://github.com/Orama-Interactive/Pixelorama/pull/1069)
From d2e783632d6ac67caaa6d03f1e4c04f4de5f4084 Mon Sep 17 00:00:00 2001
From: NintenHero <37460517+MichaelHinrichs@users.noreply.github.com>
Date: Wed, 21 Aug 2024 08:16:58 -0300
Subject: [PATCH 018/162] [skip ci] Fix awkward spaces between badges (#1082)
Remove empty hypertext from between badges.
---
README.md | 27 +++++++++------------------
1 file changed, 9 insertions(+), 18 deletions(-)
diff --git a/README.md b/README.md
index b7a174c80..3220655c1 100644
--- a/README.md
+++ b/README.md
@@ -6,34 +6,25 @@
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
-
-
+
[![Pixelorama's UI](https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/2779170/ss_54395040c25b243cb82a3bd68778e19e04b43ade.1920x1080.jpg?t=1719424898)](https://youtu.be/--ZcztkvWUQ)
From 88282ec848f95629ccca59a05a7c61196e949531 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Wed, 21 Aug 2024 14:17:17 +0300
Subject: [PATCH 019/162] New Crowdin updates (#1068)
---
Translations/af_ZA.po | 10 +-
Translations/ar_SA.po | 42 ++--
Translations/be_BY.po | 10 +-
Translations/bg_BG.po | 10 +-
Translations/ca_ES.po | 10 +-
Translations/cs_CZ.po | 10 +-
Translations/cy_GB.po | 10 +-
Translations/da_DK.po | 10 +-
Translations/de_DE.po | 12 +-
Translations/el_GR.po | 10 +-
Translations/en_PT.po | 10 +-
Translations/eo_UY.po | 10 +-
Translations/es_ES.po | 536 +++++++++++++++++++++--------------------
Translations/et_EE.po | 10 +-
Translations/fi_FI.po | 10 +-
Translations/fil_PH.po | 10 +-
Translations/fr_FR.po | 10 +-
Translations/ga_IE.po | 10 +-
Translations/grc.po | 18 +-
Translations/he_IL.po | 10 +-
Translations/hi_IN.po | 10 +-
Translations/hr_HR.po | 10 +-
Translations/hu_HU.po | 10 +-
Translations/id_ID.po | 14 +-
Translations/is_IS.po | 10 +-
Translations/it_IT.po | 10 +-
Translations/ja_JP.po | 10 +-
Translations/ko_KR.po | 10 +-
Translations/la_LA.po | 10 +-
Translations/lt_LT.po | 10 +-
Translations/lv_LV.po | 10 +-
Translations/mk_MK.po | 10 +-
Translations/ml_IN.po | 10 +-
Translations/mr_IN.po | 10 +-
Translations/ms_MY.po | 10 +-
Translations/nb_NO.po | 10 +-
Translations/nl_NL.po | 10 +-
Translations/pl_PL.po | 146 +++++------
Translations/pt_BR.po | 10 +-
Translations/pt_PT.po | 10 +-
Translations/ro_RO.po | 10 +-
Translations/ru_RU.po | 20 +-
Translations/si_LK.po | 10 +-
Translations/sk_SK.po | 10 +-
Translations/sl_SI.po | 10 +-
Translations/sq_AL.po | 10 +-
Translations/sr_SP.po | 10 +-
Translations/sv_SE.po | 10 +-
Translations/sw_KE.po | 10 +-
Translations/ta_IN.po | 10 +-
Translations/th_TH.po | 10 +-
Translations/tlh_AA.po | 10 +-
Translations/tr_TR.po | 10 +-
Translations/uk_UA.po | 10 +-
Translations/vi_VN.po | 10 +-
Translations/zh_CN.po | 32 ++-
Translations/zh_TW.po | 10 +-
installer/po/es-ES.po | 4 +-
58 files changed, 892 insertions(+), 422 deletions(-)
diff --git a/Translations/af_ZA.po b/Translations/af_ZA.po
index 35545616e..1d89eac87 100644
--- a/Translations/af_ZA.po
+++ b/Translations/af_ZA.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Afrikaans\n"
"Language: af_ZA\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "Goed"
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/ar_SA.po b/Translations/ar_SA.po
index 586d0071a..5ba1aacc0 100644
--- a/Translations/ar_SA.po
+++ b/Translations/ar_SA.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Arabic\n"
"Language: ar_SA\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-17 20:10\n"
msgid "OK"
msgstr "حسنا"
@@ -186,7 +186,7 @@ msgstr ""
#. Found in the Offset Image dialog. It's a checkbox that, if enabled, wraps around the image if pixels go out of canvas bounds.
msgid "Wrap around:"
-msgstr ""
+msgstr "لف حول:"
#. Found in the menu that appears when you right click a frame button. Center is a verb, it is used to place the content of the frame to the center of the canvas.
msgid "Center Frames"
@@ -274,13 +274,13 @@ msgid "Panels"
msgstr ""
msgid "Layouts"
-msgstr ""
+msgstr "المخططات"
msgid "Moveable Panels"
msgstr ""
msgid "Manage Layouts"
-msgstr ""
+msgstr "إدارة المخططات"
#. Noun, a preview of something
msgid "Preview"
@@ -667,7 +667,7 @@ msgstr "الملف:"
#. Found in "Open" and "Save" file dialogs. Searches all file types.
msgid "All Files"
-msgstr ""
+msgstr "جميع الملفات"
#. Found in the "Open" file dialog. Searches all file types supported by Pixelorama.
msgid "All Recognized"
@@ -679,7 +679,7 @@ msgstr ""
#. Found in the "Open" file dialog. Searches PNG files only. (Note that PNG is a file type and should remain untranslated)
msgid "PNG Image"
-msgstr ""
+msgstr "صورة PNG"
#. Found in the "Open" file dialog. Searches BMP files only. (Note that BMP is a file type and should remain untranslated)
msgid "BMP Image"
@@ -766,7 +766,7 @@ msgid "Timeline"
msgstr "الجدول الزمني"
msgid "Selection"
-msgstr ""
+msgstr "تحديد"
msgid "Shortcuts"
msgstr "اختصارات"
@@ -839,7 +839,7 @@ msgstr "مقياس العرض:"
#. Found in the preferences, under the interface section. Allows users to set the size of the font, ie the text.
msgid "Font size:"
-msgstr ""
+msgstr "حجم الخط:"
msgid "Dim interface on dialog popup"
msgstr ""
@@ -992,7 +992,7 @@ msgid "Shape:"
msgstr "الشكل:"
msgid "Linear"
-msgstr ""
+msgstr "خطي"
msgid "Radial"
msgstr ""
@@ -1042,7 +1042,7 @@ msgstr ""
#. Refers to the saturation of the colors of an image.
msgid "Saturation:"
-msgstr ""
+msgstr "التشبع:"
#. Refers to the value (as in HSV) of the colors of an image.
msgid "Value:"
@@ -1050,27 +1050,27 @@ msgstr "القيمة:"
#. An image effect. Adjusts the brightness and contrast of the colors of an image.
msgid "Adjust Brightness/Contrast"
-msgstr ""
+msgstr "ضبط السطوع/التباين"
#. Refers to the brightness of the colors of an image.
msgid "Brightness:"
-msgstr ""
+msgstr "السطوع:"
#. Refers to the contrast of the colors of an image.
msgid "Contrast:"
-msgstr ""
+msgstr "التباين:"
#. Refers to the red value of the colors of an image.
msgid "Red value:"
-msgstr ""
+msgstr "قيمة الأحمر:"
#. Refers to the green value of the colors of an image.
msgid "Green value:"
-msgstr ""
+msgstr "قيمة الأخضر:"
#. Refers to the blue value of the colors of an image.
msgid "Blue value:"
-msgstr ""
+msgstr "قيمة الأزرق:"
#. Refers to a color that tints an image.
msgid "Tint color:"
@@ -1477,7 +1477,7 @@ msgstr ""
#. Refers to color-related options such as sliders that set color channel values like R, G, B and A.
msgid "Color options"
-msgstr ""
+msgstr "إعدادات الألوان"
#. Tooltip of the button with three dots found under color options in the color picker panel that lets users change the mode of the color picker/sliders.
msgid "Select a picker mode."
@@ -1676,6 +1676,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "إيقاف مؤقت للتطبيق عند تغيير النوافذ"
@@ -2169,6 +2173,10 @@ msgstr ""
msgid "Blend mode:"
msgstr "وضع المزج:"
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr "عادي"
diff --git a/Translations/be_BY.po b/Translations/be_BY.po
index 5d5957ed5..c3c1bfdb3 100644
--- a/Translations/be_BY.po
+++ b/Translations/be_BY.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Belarusian\n"
"Language: be_BY\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "OK"
@@ -1671,6 +1671,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2164,6 +2168,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/bg_BG.po b/Translations/bg_BG.po
index f99874126..845f4abfe 100644
--- a/Translations/bg_BG.po
+++ b/Translations/bg_BG.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Bulgarian\n"
"Language: bg_BG\n"
-"PO-Revision-Date: 2024-08-03 00:15\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/ca_ES.po b/Translations/ca_ES.po
index 231473b53..88367af2c 100644
--- a/Translations/ca_ES.po
+++ b/Translations/ca_ES.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Catalan\n"
"Language: ca_ES\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "D'acord"
@@ -1709,6 +1709,10 @@ msgstr "Estableix el límit d'FPS de l'aplicació:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "Estableix el límit de fotogrames per segon de l'aplicació. Com més baix, menys càrrega rep la CPU, però l'aplicació s'alenteix i pot no respondre correctament. 0 vol dir que no hi ha cap límit."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "Pausa l'aplicació en perdre el focus"
@@ -2204,6 +2208,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/cs_CZ.po b/Translations/cs_CZ.po
index d4aaae61f..94d6a2f84 100644
--- a/Translations/cs_CZ.po
+++ b/Translations/cs_CZ.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Czech\n"
"Language: cs_CZ\n"
-"PO-Revision-Date: 2024-08-02 13:34\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "OK"
@@ -1721,6 +1721,10 @@ msgid "Sets the limit of the application's frames per second. The lower the numb
msgstr "Nastaví limit snímků za vteřinu aplikace. Čím nižší číslo, tím menší bude zatížení procesoru,\n"
"ale může dojít ke snížení odezvy a zasekávání aplikace. 0 značí žádný limit."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "Pozastavit aplikaci, když je okno v pozadí"
@@ -2217,6 +2221,10 @@ msgstr "Sloučit aktuální vrstvu s vrstvou níže"
msgid "Blend mode:"
msgstr "Režim prolnutí:"
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr "Normální"
diff --git a/Translations/cy_GB.po b/Translations/cy_GB.po
index a085d484d..016e751f7 100644
--- a/Translations/cy_GB.po
+++ b/Translations/cy_GB.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Welsh\n"
"Language: cy_GB\n"
-"PO-Revision-Date: 2024-08-03 00:15\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/da_DK.po b/Translations/da_DK.po
index ddee1eb7d..688e875d1 100644
--- a/Translations/da_DK.po
+++ b/Translations/da_DK.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Danish\n"
"Language: da_DK\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "OK"
@@ -1709,6 +1709,10 @@ msgstr "Indstil applikationens FPS-grænse:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2202,6 +2206,10 @@ msgstr "Sammenflet nuværende lag med det nedenfor"
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/de_DE.po b/Translations/de_DE.po
index b8edba373..a39a35d5e 100644
--- a/Translations/de_DE.po
+++ b/Translations/de_DE.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: German\n"
"Language: de_DE\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "OK"
@@ -1716,6 +1716,10 @@ msgstr "FPS Limit festlegen:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "Legt die Grenze der Frames pro Sekunde fest. Je niedriger die Anzahl, desto niedriger die CPU-Auslastung, aber die Anwendung wird langsamer und reagier langsamer. 0 bedeutet, dass es keine Grenze gibt."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "Anwendung pausieren, wenn der Fokus verloren geht"
@@ -2132,7 +2136,7 @@ msgid "Link Cels to"
msgstr "Cels verknüpfen mit"
msgid "Unlink Cels"
-msgstr "Cels entfernen"
+msgstr "Cels Verknüpfung entfernen"
msgid "Properties"
msgstr "Eigenschaften"
@@ -2212,6 +2216,10 @@ msgstr "Führe aktuelle Ebene mit der darunter zusammen"
msgid "Blend mode:"
msgstr "Mischmodus:"
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr "Normal"
diff --git a/Translations/el_GR.po b/Translations/el_GR.po
index cfb8f5927..eb112399c 100644
--- a/Translations/el_GR.po
+++ b/Translations/el_GR.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Greek\n"
"Language: el_GR\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 16:44\n"
msgid "OK"
msgstr "Εντάξει"
@@ -1722,6 +1722,10 @@ msgstr "Ορισμός ορίου FPS εφαρμογής:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "Ορίζει το όριο των καρέ της εφαρμογής ανά δευτερόλεπτο. Όσο μικρότερος είναι ο αριθμός, τόσο χαμηλότερη είναι η χρήση της CPU, αλλά η εφαρμογή γίνεται πιο αργή, ασταθής και λιγότερο ανταποκρινόμενη. 0 σημαίνει ότι δεν υπάρχει όριο."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr "Μέγιστα βήματα αναίρεσης:"
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "Παύση εφαρμογής όταν χάνει την εστίαση"
@@ -2218,6 +2222,10 @@ msgstr "Συγχώνευση της τρέχουσας στρώσης με τη
msgid "Blend mode:"
msgstr "Λειτουργία στρώσης:"
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr "Διέλευση"
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr "Κανονικό"
diff --git a/Translations/en_PT.po b/Translations/en_PT.po
index be11f9a28..8a756709a 100644
--- a/Translations/en_PT.po
+++ b/Translations/en_PT.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Pirate English\n"
"Language: en_PT\n"
-"PO-Revision-Date: 2024-08-03 01:17\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/eo_UY.po b/Translations/eo_UY.po
index 6f50d6378..8a7f8234b 100644
--- a/Translations/eo_UY.po
+++ b/Translations/eo_UY.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Esperanto\n"
"Language: eo_UY\n"
-"PO-Revision-Date: 2024-08-01 22:07\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "Bone"
@@ -1662,6 +1662,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "Agordas la kvoto de renoviĝoj de bildo po sekundo. Ju malpli estas la numero, des malpli multe da procesora tempo estas uzata, sed la programo iĝas malpli rapida kaj reagema. 0 signifas, ke ne ekzistas limo."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2155,6 +2159,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/es_ES.po b/Translations/es_ES.po
index 7ce5d10a2..a3465db82 100644
--- a/Translations/es_ES.po
+++ b/Translations/es_ES.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 13:17\n"
msgid "OK"
msgstr "OK"
@@ -25,13 +25,13 @@ msgid "Save"
msgstr "Guardar"
msgid "Please Confirm..."
-msgstr "Confirme, por favor..."
+msgstr "Confirma por favor..."
msgid "File Name:"
msgstr "Nombre del archivo:"
msgid "Project Name:"
-msgstr "Nombre de proyecto:"
+msgstr "Nombre del proyecto:"
msgid "Image Size"
msgstr "Tamaño de la imagen"
@@ -40,7 +40,7 @@ msgid "Canvas Size"
msgstr "Tamaño del lienzo"
msgid "Frame Size"
-msgstr "Tamaño de los Fotogramas"
+msgstr "Tamaño de los fotogramas"
msgid "Size:"
msgstr "Tamaño:"
@@ -61,7 +61,7 @@ msgid "Edit"
msgstr "Editar"
msgid "Select"
-msgstr "Selecciona"
+msgstr "Seleccionar"
msgid "View"
msgstr "Ver"
@@ -95,13 +95,13 @@ msgstr "Guardar como..."
#. Checkbox found in the Save project dialog. If enabled, the final blended images are being stored also in the pxo, for each frame.
msgid "Include blended images"
-msgstr ""
+msgstr "Incluir imágenes mezcladas"
#. Hint tooltip of the "Include blended images" checkbox found in the Save project dialog.
msgid "If enabled, the final blended images are also being stored in the pxo, for each frame.\n"
"This makes the pxo file larger and is useful for importing by third-party software\n"
"or CLI exporting. Loading pxo files in Pixelorama does not need this option to be enabled."
-msgstr ""
+msgstr "Si está habilitado, las imágenes mezcladas finales también se almacenarán en el pxo, por cada fotograma. Esto hace que el archivo pxo sea más grande, y es útil para la importación mediante software de terceros o la exportación CLI. No es necesario que esta opción esté habilitada para cargar archivos pxo en Pixelorama."
msgid "Import"
msgstr "Importar"
@@ -149,14 +149,14 @@ msgid "Delete"
msgstr "Borrar"
msgid "Delete Permanently"
-msgstr ""
+msgstr "Eliminar permanentemente"
#. Found when requesting to delete a palette or an extension. Refers to when you move something to recycle bin.
msgid "Move to Trash"
msgstr "Mover a la papelera"
msgid "New Brush"
-msgstr "Nuevo Pincel"
+msgstr "Nuevo pincel"
msgid "Scale Image"
msgstr "Escalar imagen"
@@ -186,7 +186,7 @@ msgstr "Desplazamiento:"
#. Found in the Offset Image dialog. It's a checkbox that, if enabled, wraps around the image if pixels go out of canvas bounds.
msgid "Wrap around:"
-msgstr "Enrollar:"
+msgstr "Envolver alrededor:"
#. Found in the menu that appears when you right click a frame button. Center is a verb, it is used to place the content of the frame to the center of the canvas.
msgid "Center Frames"
@@ -196,10 +196,10 @@ msgid "Rotate Image"
msgstr "Rotar Imagen"
msgid "Pivot x:"
-msgstr "Eje X:"
+msgstr "Pivote x:"
msgid "Pivot y:"
-msgstr "Eje Y:"
+msgstr "Pivote y:"
msgid "Smear options:"
msgstr "Opciones de Smear:"
@@ -217,58 +217,58 @@ msgid "Invert"
msgstr "Invertir"
msgid "Grayscale View"
-msgstr "Ver en Escala de Grises"
+msgstr "Ver en escala de grises"
msgid "Mirror Image"
msgstr "Voltear Imagen"
msgid "Flip Horizontal"
-msgstr "Voltear Horizontalmente"
+msgstr "Voltear horizontalmente"
msgid "Flip Vertical"
-msgstr "Voltear Verticalmente"
+msgstr "Voltear verticalmente"
msgid "Preferences"
msgstr "Preferencias"
msgid "Tile Mode"
-msgstr "Modo Mosaico"
+msgstr "Modo mosaico"
msgid "Tile Mode Offsets"
-msgstr "Desplazamiento del Modo Casilla"
+msgstr "Desplazamiento del modo mosaico"
msgid "X-basis x:"
-msgstr "X base x:"
+msgstr "X de la base X:"
msgid "X-basis y:"
-msgstr "x base y:"
+msgstr "Y de la base X:"
msgid "Y-basis x:"
-msgstr "Y base y:"
+msgstr "X de la base Y:"
msgid "Y-basis y:"
-msgstr "Y base y:"
+msgstr "Y de la base Y:"
msgid "Tile Mask"
-msgstr "Máscara de Casillas"
+msgstr "Máscara de mosaicos"
msgid "Reset"
msgstr "Reiniciar"
msgid "Use Current Frame"
-msgstr "Utilizar Fotograma actual"
+msgstr "Utilizar fotograma actual"
msgid "Reset Mask"
msgstr "Restablecer máscara"
msgid "Window Opacity"
-msgstr "Opacidad de Ventana"
+msgstr "Opacidad de ventana"
msgid "Window opacity does not work on fullscreen mode."
msgstr "La opacidad de la ventana no funciona en el modo pantalla completa."
msgid "Panel Layout"
-msgstr "Diseño del Panel"
+msgstr "Diseño del panel"
msgid "Panels"
msgstr "Paneles"
@@ -277,10 +277,10 @@ msgid "Layouts"
msgstr "Diseños"
msgid "Moveable Panels"
-msgstr "Paneles Móviles"
+msgstr "Paneles móviles"
msgid "Manage Layouts"
-msgstr "Gestionar Diseños"
+msgstr "Gestionar diseños"
#. Noun, a preview of something
msgid "Preview"
@@ -288,17 +288,17 @@ msgstr "Vista previa"
#. Found in the manage layouts dialog
msgid "This is a preview, changing this won't change the layout"
-msgstr "Esto es una vista previa, cambiar esto no cambiará la apariencia"
+msgstr "Esto es una vista previa, cambiar esto no cambiará el diseño"
#. Found in the manage layouts dialog
msgid "Double click to set as new startup layout"
-msgstr "Doble clic para establecer como nueva apariencia de inicio"
+msgstr "Doble clic para establecer como el nuevo diseño de inicio"
msgid "Add"
msgstr "Añadir"
msgid "Add Layout"
-msgstr "Añadir Vista"
+msgstr "Añadir diseño"
msgid "Copy from"
msgstr "Copiar desde"
@@ -307,23 +307,23 @@ msgid "Rename"
msgstr "Renombrar"
msgid "Rename Layout"
-msgstr ""
+msgstr "Renombrar diseño"
#. Refers to the current layout of the user interface.
msgid "Current layout"
-msgstr ""
+msgstr "Diseño actual"
msgid "Are you sure you want to delete this layout?"
-msgstr "¿Seguro que quieres eliminar esta vista?"
+msgstr "¿Estás seguro de que quieres eliminar este diseño?"
msgid "Auto"
-msgstr "Auto"
+msgstr "Automático"
msgid "Widescreen"
-msgstr "Widescreen"
+msgstr "Pantalla ancha"
msgid "Tallscreen"
-msgstr "Tallscreen"
+msgstr "Pantalla alta"
msgid "Mirror View"
msgstr "Vista de espejo"
@@ -335,7 +335,7 @@ msgid "Show Pixel Grid"
msgstr "Mostrar cuadrícula de píxeles"
msgid "Show Rulers"
-msgstr "Mostrar Reglas"
+msgstr "Mostrar reglas"
msgid "Show Guides"
msgstr "Mostrar guías"
@@ -346,7 +346,7 @@ msgstr "Mostrar guías de ratón"
#. Found under the View menu. When enabled, non-destructive layer effects will be visible on the canvas.
msgid "Display Layer Effects"
-msgstr ""
+msgstr "Mostrar efectos de capa"
#. Found under the View menu.
msgid "Snap To"
@@ -354,11 +354,11 @@ msgstr "Ajustar a"
#. Found under the View menu.
msgid "Snap to Rectangular Grid Boundary"
-msgstr ""
+msgstr "Ajustar a límite de cuadrícula rectangular"
#. Found under the View menu.
msgid "Snap to Rectangular Grid Center"
-msgstr ""
+msgstr "Ajustar a centro de cuadrícula rectangular"
#. Found under the View menu.
msgid "Snap to Guides"
@@ -369,7 +369,7 @@ msgid "Snap to Perspective Guides"
msgstr "Ajustar a las guías de perspectiva"
msgid "Show Animation Timeline"
-msgstr "Mostrar timeline de animación"
+msgstr "Mostrar línea de tiempo de animación"
msgid "Zen Mode"
msgstr "Modo zen"
@@ -404,7 +404,7 @@ msgstr "Nuevo proyecto"
#. Found in the preview image dialog, which appears when importing an image file.
msgid "Spritesheet (new project)"
-msgstr "Hoja de Sprites (Nuevo Proyecto)"
+msgstr "Hoja de sprites (nuevo proyecto)"
#. Found in the preview image dialog, which appears when importing an image file.
msgid "Spritesheet (new layer)"
@@ -440,27 +440,27 @@ msgstr "Fotogramas verticales:"
#. Found in the preview image dialog, which appears when importing an image file. This option appears when the image is being imported as a spritesheet. If it's enabled, the software will slice it into frames automatically.
msgid "Smart Slice"
-msgstr ""
+msgstr "Rebanado inteligente"
#. A value that is a threshold
msgid "Threshold:"
-msgstr ""
+msgstr "Umbral:"
#. Found in the preview image dialog, which appears when importing an image file. This option appears when the image is being imported as a spritesheet, if "smart slice" is enabled. Hint tooltip of the "Threshold" value slider.
msgid "Images that have any one side smaller than this value will cross the threshold"
-msgstr ""
+msgstr "Las imágenes que tienen un lado menor que este valor superarán el umbral"
#. Found in the preview image dialog, which appears when importing an image file. This option appears when the image is being imported as a spritesheet, if "smart slice" is enabled. Merge is an adjective, it refers to the distance where images get merged.
msgid "Merge distance:"
-msgstr ""
+msgstr "Distancia de fusión:"
#. Found in the preview image dialog, which appears when importing an image file. This option appears when the image is being imported as a spritesheet, if "smart slice" is enabled. Hint tooltip of the "Merge distance" value slider.
msgid "Images which crossed the threshold will get merged into a larger image, if they are within this distance"
-msgstr ""
+msgstr "Las imágenes que hayan cruzado el umbral se fusionarán en una imagen más grande, si se encuentran dentro de esta distancia"
#. A button that, when pressed, refreshes something. Used to apply certain settings again after they changed. Currently it's only used in the preview image dialog, which appears when importing an image file. This option appears when the image is being imported as a spritesheet, if "smart slice" is enabled.
msgid "Refresh"
-msgstr ""
+msgstr "Actualizar"
msgid "Start frame:"
msgstr "Fotograma inicial:"
@@ -481,32 +481,32 @@ msgid "File brush"
msgstr "Guardar como pincel"
msgid "Project brush"
-msgstr "Proyecto pincel"
+msgstr "Pincel del proyecto"
msgid "Random brush"
msgstr "Pincel al azar"
msgid "Save Sprite as .pxo"
-msgstr "Guardar Sprite como .pxo"
+msgstr "Guardar sprite como .pxo"
msgid "Export Sprite as .png"
-msgstr "Exportar Sprite como .png"
+msgstr "Exportar sprite como .png"
msgid "Export Sprite"
msgstr "Exportar Sprite"
msgid "File Exists, Overwrite?"
-msgstr "Archivo existente, ¿Sobrescribir?"
+msgstr "Si el archivo existe, ¿sobreescribirlo?"
msgid "The following files already exist. Do you wish to overwrite them?\n"
"%s"
msgstr "Los siguientes archivos ya existen. ¿Deseas sobreescribirlos? %s"
msgid "Directory path is not valid!"
-msgstr "¡Ruta de directorio no válida!"
+msgstr "¡La ruta del directorio no es válida!"
msgid "File name is not valid!"
-msgstr "¡Nombre de archivo no válido!"
+msgstr "¡El nombre del archivo no es válido!"
msgid "Directory path and file name are not valid!"
msgstr "¡La ruta del directorio y el nombre de archivo no son válidos!"
@@ -625,93 +625,93 @@ msgstr "Filas:"
#. Found in the export dialog, in the Spritesheet tab. An orientation option that splits the spritesheet by animation tags. Each tag creates a new column.
msgid "Tags by column"
-msgstr ""
+msgstr "Etiquetas por columna"
#. Found in the export dialog, in the Spritesheet tab. An orientation option that splits the spritesheet by animation tags. Each tag creates a new row.
msgid "Tags by row"
-msgstr ""
+msgstr "Etiquetas por fila"
#. Found in the export dialog. It is a label that says the dimensions (widthxheight) of the exported image(s).
msgid "Export dimensions:"
msgstr "Exportar dimensiones:"
msgid "Save a File"
-msgstr ""
+msgstr "Guardar un archivo"
msgid "Go to previous folder."
-msgstr ""
+msgstr "Ir a la carpeta anterior."
msgid "Go to next folder."
-msgstr ""
+msgstr "Ir a la carpeta siguiente."
msgid "Go to parent folder."
-msgstr ""
+msgstr "Ir a la carpeta superior."
msgid "Path:"
msgstr "Ruta:"
msgid "Refresh files."
-msgstr ""
+msgstr "Actualizar archivos."
msgid "Toggle the visibility of hidden files."
-msgstr ""
+msgstr "Alterna la visibilidad de los archivos ocultos."
msgid "Directories & Files:"
-msgstr "Directorios y Archivos:"
+msgstr "Directorios y archivos:"
msgid "Create Folder"
-msgstr "Crear Carpeta"
+msgstr "Crear carpeta"
msgid "File:"
msgstr "Archivo:"
#. Found in "Open" and "Save" file dialogs. Searches all file types.
msgid "All Files"
-msgstr ""
+msgstr "Todos los archivos"
#. Found in the "Open" file dialog. Searches all file types supported by Pixelorama.
msgid "All Recognized"
-msgstr ""
+msgstr "Todos los reconocidos"
#. Found in "Open" and "Save" file dialogs. Searches Pixelorama Project files only (.pxo).
msgid "Pixelorama Project"
-msgstr ""
+msgstr "Proyecto de Pixelorama"
#. Found in the "Open" file dialog. Searches PNG files only. (Note that PNG is a file type and should remain untranslated)
msgid "PNG Image"
-msgstr ""
+msgstr "Imagen PNG"
#. Found in the "Open" file dialog. Searches BMP files only. (Note that BMP is a file type and should remain untranslated)
msgid "BMP Image"
-msgstr ""
+msgstr "Imagen BMP"
#. Found in the "Open" file dialog. Searches "Radiance HDR" files only. (Note that "Radiance HDR" is a file type and is better untranslated)
msgid "Radiance HDR Image"
-msgstr ""
+msgstr "Imagen Radiance HDR"
#. Found in the "Open" file dialog. Searches JPEG files only. (Note that JPEG is a file type and should remain untranslated)
msgid "JPEG Image"
-msgstr ""
+msgstr "Imagen JPEG"
#. Found in the "Open" file dialog. Searches SVG files only. (Note that SVG is a file type and should remain untranslated)
msgid "SVG Image"
-msgstr ""
+msgstr "Imagen SVG"
#. Found in the "Open" file dialog. Searches TGA files only. (Note that TGA is a file type and should remain untranslated)
msgid "TGA Image"
-msgstr ""
+msgstr "Imagen TGA"
#. Found in the "Open" file dialog. Searches WebP files only. (Note that WebP is a file type and should remain untranslated)
msgid "WebP Image"
-msgstr ""
+msgstr "Imagen WebP"
#. Found in the "Open" file dialog. Searches Pixelorama palette files only (.json).
msgid "Pixelorama palette"
-msgstr ""
+msgstr "Paleta de Pixelorama"
#. Found in the "Open" file dialog. Searches GIMP palette files only (.gpl). (Note that GIMP is a software and should remain untranslated)
msgid "GIMP palette"
-msgstr ""
+msgstr "Paleta de GIMP"
#. Found in the export dialog. It is a button that when pressed, shows more options.
msgid "Advanced options"
@@ -737,11 +737,11 @@ msgstr "Constante"
#. Refers to https://en.wikipedia.org/wiki/Color_space
msgid "Color space:"
-msgstr ""
+msgstr "Espacio de color:"
#. A type of color space.
msgid "Linear sRGB"
-msgstr ""
+msgstr "SRGB lineal"
msgid "General"
msgstr "General"
@@ -810,11 +810,11 @@ msgstr "Añade una transición más suave cuando se acerca o aleja"
#. Found in the preferences, under Canvas.
msgid "Integer Zoom"
-msgstr ""
+msgstr "Zoom en enteros"
#. Found in the preferences, under Canvas. Hint tooltip of "Integer Zoom".
msgid "Restricts the value to be an integer multiple of 100%"
-msgstr ""
+msgstr "Restringe el valor para que sea un múltiplo entero de 100%"
msgid "Tablet pressure sensitivity:"
msgstr "Sensibilidad de la presión de la tableta:"
@@ -839,26 +839,26 @@ msgstr "Escala de la interfaz:"
#. Found in the preferences, under the interface section. Allows users to set the size of the font, ie the text.
msgid "Font size:"
-msgstr ""
+msgstr "Tamaño de la fuente:"
msgid "Dim interface on dialog popup"
msgstr "Atenuar interface al abrir ventana emergente"
#. Found in the preferences, under the interface section. When this setting is enabled, the native file dialogs of the operating system are being used, instead of Pixelorama's custom ones.
msgid "Use native file dialogs"
-msgstr ""
+msgstr "Utilizar diálogos de archivos nativos"
#. Found in the preferences, tooltip of the "Use native file dialogs" option.
msgid "When this setting is enabled, the native file dialogs of the operating system are being used, instead of Pixelorama's custom ones."
-msgstr ""
+msgstr "Cuando esta opción está activada, se utilizan los diálogos de archivos nativos del sistema operativo, en lugar de los personalizados de Pixelorama."
#. Found in the preferences, under the interface section. When this setting is enabled, Pixelorama's subwindows will be embedded in the main window, otherwise each dialog will be its own separate window.
msgid "Single window mode"
-msgstr ""
+msgstr "Modo de ventana única"
#. Found in the preferences, tooltip of the "Single window mode" option.
msgid "When this setting is enabled, Pixelorama's subwindows will be embedded in the main window, otherwise each dialog will be its own separate window."
-msgstr ""
+msgstr "Cuando esta opción está activada, las subventanas de Pixelorama serán embebidas en la ventana principal, de lo contrario cada diálogo será su propia ventana separada."
msgid "Dark"
msgstr "Oscuro"
@@ -870,7 +870,7 @@ msgid "Blue"
msgstr "Azul"
msgid "Caramel"
-msgstr "Caramel"
+msgstr "Caramelo"
msgid "Light"
msgstr "Claro"
@@ -880,7 +880,7 @@ msgstr "Morado"
#. A theme. Rose refers to the color rose.
msgid "Rose"
-msgstr ""
+msgstr "Rosa"
msgid "Theme"
msgstr "Tema"
@@ -937,19 +937,19 @@ msgid "All projects"
msgstr "Todos los proyectos"
msgid "Invert Colors"
-msgstr "Invertir Colores"
+msgstr "Invertir colores"
msgid "Modify Red Channel"
-msgstr "Modificar Canal Rojo"
+msgstr "Modificar canal rojo"
msgid "Modify Green Channel"
-msgstr "Modificar Canal Verde"
+msgstr "Modificar canal verde"
msgid "Modify Blue Channel"
-msgstr "Modificar Canal Azul"
+msgstr "Modificar canal azul"
msgid "Modify Alpha Channel"
-msgstr "Modificar Canal Alfa"
+msgstr "Modificar canal alfa"
msgid "Desaturation"
msgstr "Desaturación"
@@ -958,19 +958,19 @@ msgid "Outline"
msgstr "Silueta"
msgid "Drop Shadow"
-msgstr "Sombra Paralela"
+msgstr "Sombra paralela"
msgid "Offset X:"
-msgstr "Desplazamiento X:"
+msgstr "Desplazamiento en X:"
msgid "Offset Y:"
-msgstr "Desplazamiento Y:"
+msgstr "Desplazamiento en Y:"
msgid "Shadow color:"
msgstr "Color de la sombra:"
msgid "Gradient"
-msgstr "Gradiente"
+msgstr "Degradado"
msgid "Gradient Map"
msgstr "Mapa de degradado"
@@ -986,8 +986,8 @@ msgstr "Añadir punto al final"
msgid "If this is enabled, the last point gets added at the end of the gradient.\n"
"Disable this if you wish to convert the gradient to have constant interpolation, so that the last color will be taken into account."
-msgstr "Si está activado, el último punto se añade al final del gradiente.\n"
-"Desactiva esto si deseas convertir el gradiente para tener interpolación constante, para que el último color sea tomado en cuenta."
+msgstr "Si está activado, el último punto se añade al final del degradado.\n"
+"Desactiva esto si deseas convertir el degradado para que tenga interpolación constante, de forma que el último color sea tomado en cuenta."
msgid "Shape:"
msgstr "Forma:"
@@ -1021,7 +1021,7 @@ msgid "Center:"
msgstr "Centro:"
msgid "Dithering pattern:"
-msgstr "Patrón del degradado:"
+msgstr "Patrón del tramado:"
msgid "Type:"
msgstr "Tipo:"
@@ -1051,35 +1051,35 @@ msgstr "Valor:"
#. An image effect. Adjusts the brightness and contrast of the colors of an image.
msgid "Adjust Brightness/Contrast"
-msgstr ""
+msgstr "Ajustar brillo/contraste"
#. Refers to the brightness of the colors of an image.
msgid "Brightness:"
-msgstr ""
+msgstr "Brillo:"
#. Refers to the contrast of the colors of an image.
msgid "Contrast:"
-msgstr ""
+msgstr "Contraste:"
#. Refers to the red value of the colors of an image.
msgid "Red value:"
-msgstr ""
+msgstr "Valor rojo:"
#. Refers to the green value of the colors of an image.
msgid "Green value:"
-msgstr ""
+msgstr "Valor verde:"
#. Refers to the blue value of the colors of an image.
msgid "Blue value:"
-msgstr ""
+msgstr "Valor azul:"
#. Refers to a color that tints an image.
msgid "Tint color:"
-msgstr ""
+msgstr "Color de tinte:"
#. Refers to the factor (how much) a color tints an image.
msgid "Tint effect factor:"
-msgstr ""
+msgstr "Factor de efecto de tinte:"
msgid "Apply"
msgstr "Aplicar"
@@ -1101,11 +1101,11 @@ msgstr "Pasos:"
#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
msgid "Palettize"
-msgstr ""
+msgstr "Paletizar"
#. An image effect. It makes the input image pixelated.
msgid "Pixelize"
-msgstr ""
+msgstr "Pixelizar"
#. An image effect. For more details about what it does, you can refer to GIMP's documentation https://docs.gimp.org/2.8/en/gimp-tool-posterize.html
msgid "Posterize"
@@ -1130,7 +1130,7 @@ msgstr "Gestor de Problemas"
#. Found under the Help menu. When selected, it opens the folder where the application's data are being saved.
msgid "Open Editor Data Folder"
-msgstr ""
+msgstr "Abrir carpeta de datos del editor"
msgid "Changelog"
msgstr "Registro de cambios"
@@ -1140,7 +1140,7 @@ msgstr "Acerca de Pixelorama"
#. Found under the Help menu. When clicked, it opens the URL of Orama Interactive's patreon page.
msgid "Support Pixelorama's Development"
-msgstr ""
+msgstr "Apoya el desarrollo de Pixelorama"
msgid "Pixelorama - Pixelate your dreams!"
msgstr "Pixelorama - ¡Pixela tus sueños!"
@@ -1156,7 +1156,7 @@ msgstr "Sitio Web"
#. Found in the About dialog. A button that, when you click it, it opens the URL of Pixelorama's source code.
msgid "Source Code"
-msgstr ""
+msgstr "Código fuente"
msgid "Donate"
msgstr "Donar"
@@ -1268,7 +1268,7 @@ msgstr "Bielorruso"
#. Found in the About dialog.
msgid "Lead Developer"
-msgstr ""
+msgstr "Desarrollador principal"
#. Found in the About dialog.
msgid "UI Designer"
@@ -1276,7 +1276,7 @@ msgstr "Diseñador de IU"
#. Found in the About dialog. Refers to the people who have contributed code to the project.
msgid "Authors"
-msgstr ""
+msgstr "Autores"
msgid "Art by: %s"
msgstr "Arte por: %s"
@@ -1303,7 +1303,7 @@ msgid "Save before exiting?"
msgstr "¿Guardar antes de salir?"
msgid "Project %s has unsaved progress. How do you wish to proceed?"
-msgstr ""
+msgstr "El proyecto %s tiene progreso sin guardar. ¿Cómo deseas proceder?"
msgid "Save & Exit"
msgstr "Guardar y salir"
@@ -1314,16 +1314,16 @@ msgstr "Salir sin guardar"
msgid "Rectangular Selection\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
-msgstr "Cubo de pintura\n\n"
-"%s para el botón izquierdo del mouse\n"
-"%s para el botón derecho del mouse"
+msgstr "Selección rectangular\n\n"
+"%s para el botón izquierdo del ratón\n"
+"%s para el botón derecho del ratón"
msgid "Elliptical Selection\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
-msgstr "Cubo de pintura\n\n"
-"%s para el botón izquierdo del mouse\n"
-"%s para el botón derecho del mouse"
+msgstr "Selección elíptica\n\n"
+"%s para el botón izquierdo del ratón\n"
+"%s para el botón derecho del ratón"
msgid "Polygonal Selection\n\n"
"%s for left mouse button\n"
@@ -1332,54 +1332,56 @@ msgid "Polygonal Selection\n\n"
msgstr "Selección poligonal\n\n"
"%s para el botón izquierdo del ratón\n"
"%s para el botón derecho del ratón\n\n"
-"Haga doble clic para conectar el último punto al punto inicial"
+"Haz doble clic para conectar el último punto al punto inicial"
msgid "Select By Color\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
-msgstr "Seleccionar Por Color\n\n"
-"%s para el botón izquierdo del mouse\n"
-"%s para el botón derecho del mouse"
+msgstr "Seleccionar por color\n\n"
+"%s para el botón izquierdo del ratón\n"
+"%s para el botón derecho del ratón"
msgid "Magic Wand\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
msgstr "Varita mágica\n\n"
-"%s para el botón izquierdo del mouse\n"
-"%s para el botón derecho del mouse"
+"%s para el botón izquierdo del ratón\n"
+"%s para el botón derecho del ratón"
msgid "Lasso / Free Select Tool\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
msgstr "Lazo / Herramienta de Selección Libre\n\n"
-"%s para el botón izquierdo del mouse\n"
-"%s para el botón derecho del mouse"
+"%s para el botón izquierdo del ratón\n"
+"%s para el botón derecho del ratón"
msgid "Select by Drawing\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
-msgstr ""
+msgstr "Seleccionar por dibujo\n\n"
+"%s para el botón izquierdo del ratón\n"
+"%s para el botón derecho del ratón"
msgid "Move\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
msgstr "Mover\n\n"
-"%s para el botón izquierdo del mouse\n"
-"%s para el botón derecho del mouse"
+"%s para el botón izquierdo del ratón\n"
+"%s para el botón derecho del ratón"
msgid "Zoom\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
msgstr "Zoom\n\n"
-"%s para el botón izquierdo del mouse\n"
-"%s para el botón derecho del mouse"
+"%s para el botón izquierdo del ratón\n"
+"%s para el botón derecho del ratón"
msgid "Pan\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
msgstr "Vista\n\n"
-"%s para el botón izquierdo del mouse\n"
-"%s para el botón derecho del mouse"
+"%s para el botón izquierdo del ratón\n"
+"%s para el botón derecho del ratón"
msgid "Color Picker\n\n"
"%s for left mouse button\n"
@@ -1392,15 +1394,15 @@ msgstr "Selector de Color\n\n"
msgid "Crop\n\n"
"Resize the canvas"
-msgstr ""
+msgstr "Recortar y redimensionar el lienzo"
msgid "Pencil\n\n"
"%s for left mouse button\n"
"%s for right mouse button\n\n"
"Hold %s to make a line"
msgstr "Lápiz\n\n"
-"%s para el botón izquierdo del mouse\n"
-"%s para el botón derecho del mouse\n\n"
+"%s para el botón izquierdo del ratón\n"
+"%s para el botón derecho del ratón\n\n"
"Mantén pulsado %s para crear una línea"
msgid "Eraser\n\n"
@@ -1408,23 +1410,23 @@ msgid "Eraser\n\n"
"%s for right mouse button\n\n"
"Hold %s to make a line"
msgstr "Borrador\n\n"
-"%s para el botón izquierdo del mouse\n"
-"%s para el botón derecho del mouse\n\n"
+"%s para el botón izquierdo del ratón\n"
+"%s para el botón derecho del ratón\n\n"
"Mantén pulsado %s para crear una línea"
msgid "Bucket\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
msgstr "Cubo de pintura\n\n"
-"%s para el botón izquierdo del mouse\n"
-"%s para el botón derecho del mouse"
+"%s para botón izquierdo del ratón\n"
+"%s para botón derecho del ratón"
msgid "Shading Tool\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
msgstr "Herramienta de Sombreado\n\n"
-"%s para el botón izquierdo del mouse\n"
-"%s para el botón derecho del mouse"
+"%s para el botón izquierdo del ratón\n"
+"%s para el botón derecho del ratón"
msgid "Line Tool\n\n"
"%s for left mouse button\n"
@@ -1433,9 +1435,9 @@ msgid "Line Tool\n\n"
"Hold %s to center the shape on the click origin\n"
"Hold %s to displace the shape's origin"
msgstr "Herramienta de Línea\n\n"
-"%s para el botón izquierdo del mouse\n"
-"%s para el botón derecho del mouse\n\n"
-"Mantén %s para ajustar el ángulo de la línea\n"
+"%s para el botón izquierdo del ratón\n"
+"%s para el botón derecho del ratón\n\n"
+"Mantenga %s para ajustar el ángulo de la línea\n"
"Mantén %s para centrar la forma en el origen del clic\n"
"Mantén %s para desplazar el origen de la forma"
@@ -1446,7 +1448,13 @@ msgid "Curve Tool\n\n"
"Press %s/%s to add new points\n"
"Press and drag to control the curvature\n"
"Press %s to remove the last added point"
-msgstr ""
+msgstr "Herramienta de Curva\n\n"
+"%s para el botón izquierdo del ratón\n"
+"%s para el botón derecho del ratón\n\n"
+"Dibuja curvas de bezier\n"
+"Presiona %s/%s para añadir nuevos puntos\n"
+"Presiona y arrastra para controlar la curvatura\n"
+"Presiona %s para eliminar el último punto añadido"
msgid "Rectangle Tool\n\n"
"%s for left mouse button\n"
@@ -1455,8 +1463,8 @@ msgid "Rectangle Tool\n\n"
"Hold %s to center the shape on the click origin\n"
"Hold %s to displace the shape's origin"
msgstr "Herramienta Rectángulo\n\n"
-"%s para el botón izquierdo del mouse\n"
-"%s para el botón derecho del mouse\n\n"
+"%s para el botón izquierdo del ratón\n"
+"%s para el botón derecho del ratón\n\n"
"Mantén %s para crear una forma 1:1\n"
"Mantén %s para centrar la forma en el origen del clic\n"
"Mantén %s para desplazar el origen de la forma"
@@ -1468,8 +1476,8 @@ msgid "Ellipse Tool\n\n"
"Hold %s to center the shape on the click origin\n"
"Hold %s to displace the shape's origin"
msgstr "Herramienta Elipse\n\n"
-"%s para el botón izquierdo del mouse\n"
-"%s para el botón derecho del mouse\n\n"
+"%s para el botón izquierdo del ratón\n"
+"%s para el botón derecho del ratón\n\n"
"Mantén %s para crear una forma 1:1\n"
"Mantén %s para centrar la forma en el origen del clic\n"
"Mantén %s para desplazar el origen de la forma"
@@ -1488,46 +1496,46 @@ msgstr "Elegir un color para la herramienta derecha"
#. Tooltip of the switch colors button found in the color picker panel.
msgid "Switch left and right colors."
-msgstr ""
+msgstr "Cambia los colores izquierdo y derecho."
#. Tooltip of the average color button, found in the color picker panel. Shows the average color between the two selected.
msgid "Average Color:"
-msgstr ""
+msgstr "Color promedio:"
msgid "Reset the colors to their default state (black for left, white for right)"
msgstr "Restablecer los colores a su estado predeterminado (negro a la izquierda, blanco a la derecha)"
#. Tooltip of the screen color picker button found in the color picker panel.
msgid "Pick a color from the screen."
-msgstr ""
+msgstr "Elige un color de la pantalla."
#. Tooltip of the color text field found in the color picker panel that lets users change the color by hex code or english name ("red" cannot be translated).
msgid "Enter a hex code (\"#ff0000\") or named color (\"red\")."
-msgstr ""
+msgstr "Introduce un código hexadecimal (\"#ff0000\") o nombre de color en inglés (\"red\")."
#. Tooltip of the button found in the color picker panel that lets users change the shape of the color picker.
msgid "Select a picker shape."
-msgstr ""
+msgstr "Selecciona una forma de selector."
#. Refers to color-related options such as sliders that set color channel values like R, G, B and A.
msgid "Color options"
-msgstr ""
+msgstr "Opciones de color"
#. Tooltip of the button with three dots found under color options in the color picker panel that lets users change the mode of the color picker/sliders.
msgid "Select a picker mode."
-msgstr ""
+msgstr "Selecciona un modo de selector."
#. Checkbox found in the menu of the button with three dots found under color options in the color picker panel.
msgid "Colorized Sliders"
-msgstr ""
+msgstr "Controles deslizantes colorizados"
#. Shows saved colors in certain color picker menus.
msgid "Swatches"
-msgstr ""
+msgstr "Muestras"
#. Found under color options in the color picker panel.
msgid "Recent Colors"
-msgstr ""
+msgstr "Colores recientes"
msgid "Left tool"
msgstr "Herramienta izquierda"
@@ -1576,15 +1584,15 @@ msgstr "Un color de las guías de reglas que se muestran en el lienzo"
#. Found in the Preferences, in the Canvas tab. Refers to grid and guide snapping.
msgid "Snapping"
-msgstr "Ajustar"
+msgstr "Ajuste"
#. Found in the Preferences, in the Canvas tab. Refers to grid and guide snapping.
msgid "Snapping distance:"
-msgstr "Ajustar distancia:"
+msgstr "Distancia de ajuste:"
#. Found in the Preferences, in the Canvas tab. Refers to grid and guide snapping. Hint tooltip of the snapping distance slider.
msgid "This is the distance in screen pixels where guide and grid snapping gets activated."
-msgstr ""
+msgstr "Esta es la distancia en píxeles de la pantalla en la que se activa el ajuste de guía y cuadrícula."
msgid "Grid"
msgstr "Cuadrícula"
@@ -1710,6 +1718,10 @@ msgstr "Establecer el límite de FPS de la aplicación:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "Establece el límite de fotogramas por segundo de la aplicación. Cuanto menor sea el número, menor será el uso de la CPU, pero la aplicación se vuelve más lenta, entrecortada y sin respuesta. 0 significa que no hay límite."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "Pausar la aplicación cuando pierde el enfoque"
@@ -1720,19 +1732,19 @@ msgstr "Si se activa esta opción, cuando la ventana de la aplicación pierde el
#. An option found in the preferences, under the Performance section. Refers to the screen being updated (redrawn) continuously.
msgid "Update continuously"
-msgstr ""
+msgstr "Actualizar continuamente"
#. Found in the preferences, hint of the "Update continuously" option.
msgid "If this is toggled on, the application will redraw the screen continuously, even while it's not used. Turning this off helps lower CPU and GPU usage when idle."
-msgstr ""
+msgstr "Si se activa esta opción, la aplicación volverá a dibujar la pantalla continuamente, aunque no se utilice. Apagar esto ayuda a reducir el uso de CPU y GPU cuando está inactiva."
#. An option found in the preferences, under the Performance section.
msgid "Enable window transparency"
-msgstr ""
+msgstr "Habilitar transparencia de ventana"
#. Found in the preferences, hint of the "Enable window transparency" option.
msgid "If enabled, the application window can become transparent. This affects performance, so keep it off if you don't need it."
-msgstr ""
+msgstr "Si está activado, la ventana de la aplicación puede ser transparente. Esto afecta al rendimiento, así que mantenlo apagado si no lo necesitas."
#. Found in the Preferences, under Drivers. Specifies the renderer/video driver being used.
msgid "Renderer:"
@@ -1768,15 +1780,15 @@ msgstr "Abrir Carpeta"
#. Found in the Preferences, under Extensions. It is a button that, when clicked, opens up the extension explorer which allows users to download extensions from the Internet.
msgid "Explore Online"
-msgstr ""
+msgstr "Explorar en línea"
#. Found in the Preferences, under Extensions. This is the text of a confirmation dialog that appears when the user attempts to enable an extension.
msgid "Are you sure you want to enable this extension? Make sure to only enable extensions from sources that you trust."
-msgstr ""
+msgstr "¿Estás seguro de que deseas activar esta extensión? Asegúrate de activar sólo las extensiones de las fuentes en las que confíes."
#. Found in the Preferences, under Extensions. This is the text of a confirmation dialog that appears when the user attempts to delete an extension.
msgid "Are you sure you want to delete this extension?"
-msgstr ""
+msgstr "¿Estás seguro de que deseas eliminar esta extensión?"
#. Hint tooltip of a button in the Global Tool Settings. "Dynamics" let users affect certain brush parameters, such as their size and alpha, based on the pressure of the tablet pen, the velocity of the mouse or the pen, and more in the future.
msgid "Dynamics"
@@ -1784,7 +1796,7 @@ msgstr "Dinámicas"
#. Found in the Dynamics options menu. A stabilizer is a feature that, when enabled, helps artists create smooth lines as they draw.
msgid "Stabilizer"
-msgstr ""
+msgstr "Estabilizador"
#. Found in the Dynamics options menu. Pressure refers to tablet pen pressure.
msgid "Pressure"
@@ -1854,7 +1866,7 @@ msgstr "Pixel Perfect hace que las líneas sean suaves eliminando los píxeles s
#. A button found in the global tool options. When enabled, the alpha value of the pixels being drawn is locked, meaning that the user can only draw on non-transparent pixels.
msgid "Lock alpha"
-msgstr ""
+msgstr "Bloquear alfa"
msgid "Fill inside"
msgstr "Rellenar el interior"
@@ -1950,7 +1962,7 @@ msgid "Zoom out"
msgstr "Alejar"
msgid "Options"
-msgstr ""
+msgstr "Opciones"
msgid "Options:"
msgstr "Opciones:"
@@ -2002,25 +2014,25 @@ msgid "Current frame as spritesheet"
msgstr "Fotograma actual como hoja de sprites"
msgid "Jump to the first frame"
-msgstr ""
+msgstr "Saltar al primer fotograma"
msgid "Go to the previous frame"
-msgstr ""
+msgstr "Ir al fotograma anterior"
msgid "Play the animation backwards (from end to beginning)"
-msgstr ""
+msgstr "Reproduce la animación hacia atrás (desde el final hasta el principio)"
msgid "Play the animation forward (from beginning to end)"
-msgstr ""
+msgstr "Reproducir la animación hacia adelante (de principio a fin)"
msgid "Go to the next frame"
-msgstr ""
+msgstr "Ir al fotograma siguiente"
msgid "Jump to the last frame"
-msgstr ""
+msgstr "Saltar al último fotograma"
msgid "Timeline settings"
-msgstr ""
+msgstr "Configuración de la línea de tiempo"
msgid "Enable/disable Onion Skinning"
msgstr "Activar/desactivar Piel de Cebolla"
@@ -2077,12 +2089,12 @@ msgstr "Etiqueta %s (Fotogramas %s-%s)"
msgid "If it's selected, the animation plays only on the frames that have the same tag.\n"
"If it's not, the animation will play for all frames, ignoring tags."
-msgstr "Si se selecciona, la animación se reproduce sólo en los marcos que tienen la misma etiqueta.\n"
-"Si no es así, la animación se reproducirá para todos los marcos, ignorando etiquetas."
+msgstr "Si se selecciona, la animación se reproduce sólo en los fotogramas que tienen la misma etiqueta.\n"
+"Si no es así, la animación se reproducirá para todos los fotogramas, ignorando las etiquetas."
#. Found in the timeline, inside the timeline settings. It's a slider that sets the size of the cel buttons in the timeline.
msgid "Cel size:"
-msgstr ""
+msgstr "Tamaño de celda:"
#. Found in the timeline, inside the timeline settings. If this is enabled, the past and future frames will have appear tinted.
msgid "Color mode"
@@ -2128,30 +2140,30 @@ msgid "Unlink Cels"
msgstr "Desvincular celdas"
msgid "Properties"
-msgstr ""
+msgstr "Propiedades"
msgid "Project Properties"
-msgstr ""
+msgstr "Propiedades del proyecto"
msgid "Frame properties"
msgstr "Propiedades de los fotogramas"
msgid "Layer properties"
-msgstr ""
+msgstr "Propiedades de la capa"
msgid "Cel properties"
-msgstr ""
+msgstr "Propiedades de la celda"
msgid "Tag properties"
-msgstr ""
+msgstr "Propiedades de etiqueta"
#. Found on the popup menu that appears when a user right-clicks on a frame button. When clicked, a new frame tag is added.
msgid "New Tag"
-msgstr ""
+msgstr "Nueva etiqueta"
#. Found on the popup menu that appears when a user right-clicks on a frame button. When clicked, it allows users to paste/import tags from other opened projects.
msgid "Import Tag"
-msgstr ""
+msgstr "Importar etiqueta"
#. Found on the popup menu that appears when a user right-clicks on a frame button. When clicked, the order of the selected frames is being reversed.
msgid "Reverse Frames"
@@ -2168,7 +2180,7 @@ msgstr "Capas"
#. Found in the layer menu which appears when right clicking on a layer button in the timeline. When enabled, the layer becomes a clipping mask.
msgid "Clipping mask"
-msgstr ""
+msgstr "Máscara de recorte"
#. Hint tooltip of the create new layer button, found on the left side of the timeline.
msgid "Create a new layer"
@@ -2203,87 +2215,91 @@ msgstr "Combinar la capa actual con la de abajo"
#. Found in the layer's section of the timeline. Refers to layer blend modes, for more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Blend mode:"
-msgstr ""
+msgstr "Modo de fusión:"
+
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr "Pasar a través"
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
-msgstr ""
+msgstr "Normal"
#. Found in the layer's section of the timeline, as a blend mode option. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Multiply"
-msgstr ""
+msgstr "Multiplicar"
# .Found in the layer's section of the timeline, as a blend mode option. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Color burn"
-msgstr ""
+msgstr "Subexposición de color"
#. Found in the layer's section of the timeline, as a blend mode option. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Linear burn"
-msgstr ""
+msgstr "Subexposición lineal"
#. Found in the layer's section of the timeline, as a blend mode option. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Screen"
-msgstr ""
+msgstr "Pantalla"
#. Found in the layer's section of the timeline, as a blend mode option. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Color dodge"
-msgstr ""
+msgstr "Sobreexposición de color"
#. Found in the layer's section of the timeline, as category of blend modes. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Contrast"
-msgstr ""
+msgstr "Contraste"
#. Found in the layer's section of the timeline, as a blend mode option. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Overlay"
-msgstr ""
+msgstr "Superposición"
#. Found in the layer's section of the timeline, as a blend mode option. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Soft light"
-msgstr ""
+msgstr "Luz suave"
#. Found in the layer's section of the timeline, as a blend mode option. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Hard light"
-msgstr ""
+msgstr "Luz dura"
#. Found in the layer's section of the timeline, as a category of blend modes. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Inversion"
-msgstr ""
+msgstr "Inversión"
#. Found in the layer's section of the timeline, as a blend mode option. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Difference"
-msgstr ""
+msgstr "Diferencia"
#. Found in the layer's section of the timeline, as a blend mode option. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Exclusion"
-msgstr ""
+msgstr "Exclusión"
#. Found in the layer's section of the timeline, as a blend mode option. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Subtract"
-msgstr ""
+msgstr "Sustraer"
#. Found in the layer's section of the timeline, as a blend mode option. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Divide"
-msgstr ""
+msgstr "Dividir"
#. Found in the layer's section of the timeline, as a category of blend modes. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Component"
-msgstr ""
+msgstr "Componente"
#. Found in the layer's section of the timeline, as a blend mode option. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Hue"
-msgstr ""
+msgstr "Matiz"
#. Found in the layer's section of the timeline, as a blend mode option. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Saturation"
-msgstr ""
+msgstr "Saturación"
#. Found in the layer's section of the timeline, as a blend mode option. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Color"
-msgstr ""
+msgstr "Color"
#. Found in the layer's section of the timeline, as a blend mode option. For more info refer to: https://en.wikipedia.org/wiki/Blend_modes
msgid "Luminosity"
-msgstr ""
+msgstr "Luminosidad"
msgid "Opacity:"
msgstr "Opacidad:"
@@ -2424,7 +2440,7 @@ msgstr "No se pudo guardar el archivo. Código de error %s"
#. Appears when the user attempts to export a project as a video, but the process fails. FFMPEG is the external software used to export videos.
msgid "Video failed to export. Ensure that FFMPEG is installed correctly."
-msgstr ""
+msgstr "No se pudo exportar el vídeo. Asegúrate de que FFMPEG está instalado correctamente."
msgid "File(s) exported"
msgstr "Archivo(s) exportado(s)"
@@ -2580,7 +2596,7 @@ msgid "Line Tool"
msgstr "Herramienta de Línea"
msgid "Curve Tool"
-msgstr ""
+msgstr "Herramienta de curva"
msgid "Rectangle Tool"
msgstr "Herramienta de Rectángulo"
@@ -2638,7 +2654,7 @@ msgstr "Confirmación de salida"
#. Found in the preferences, under the startup section. Path is a noun and it refers to the location in the device where FFMPEG is located at. FFMPEG is a software name and it should not be translated. See https://en.wikipedia.org/wiki/Path_(computing)
msgid "FFMPEG path"
-msgstr ""
+msgstr "Ruta de FFMPEG"
msgid "Enable autosave"
msgstr "Activar guardado automático"
@@ -2651,11 +2667,11 @@ msgstr "minuto(s)"
#. A setting found in the export dialog. When enabled, a JSON file containing the project's data is also being exported. JSON refers to this https://en.wikipedia.org/wiki/JSON
msgid "Export JSON data"
-msgstr ""
+msgstr "Exportar datos JSON"
#. A setting found in the export dialog. When enabled, each layer is being exported as a different file, or as different frames if the target format is gif/apng/video.
msgid "Split layers"
-msgstr ""
+msgstr "Dividir capas"
#. Found in the export dialog.
msgid "Include frame tags in the file name"
@@ -2707,18 +2723,18 @@ msgid "and"
msgstr "y"
msgid "Move the selected frame to the left."
-msgstr "Mueve el marco seleccionado hacia la izquierda."
+msgstr "Mueve el fotograma seleccionado hacia la izquierda."
msgid "Move the selected frame to the right."
-msgstr "Mueve el marco seleccionado hacia la derecha."
+msgstr "Mueve el fotograma seleccionado hacia la derecha."
#. Refers to the duration of the frame. Found in the frame properties.
msgid "Frame duration:"
-msgstr ""
+msgstr "Duración de los fotogramas:"
#. Refers to custom user defined data for projects, frames, cels, tags and layers, found in their respective properties.
msgid "User data:"
-msgstr ""
+msgstr "Datos del usuario:"
msgid "Duration"
msgstr "Duración"
@@ -2758,39 +2774,39 @@ msgstr "Eliminar un color seleccionado"
#. Tooltip of the Sort button found in the palette panel.
msgid "Sort palette"
-msgstr ""
+msgstr "Ordenar paleta"
#. An option of the Sort palette button found in the palette panel. When selected, the colors of the palette get reversed.
msgid "Reverse colors"
-msgstr ""
+msgstr "Invertir colores"
#. An option of the Sort palette button found in the palette panel. When selected, the colors of the palette are being sorted based on their hue.
msgid "Sort by hue"
-msgstr ""
+msgstr "Ordenar por matiz"
#. An option of the Sort palette button found in the palette panel. When selected, the colors of the palette are being sorted based on their saturation.
msgid "Sort by saturation"
-msgstr ""
+msgstr "Ordenar por saturación"
#. An option of the Sort palette button found in the palette panel. When selected, the colors of the palette are being sorted based on their value.
msgid "Sort by value"
-msgstr ""
+msgstr "Ordenar por valor"
#. An option of the Sort palette button found in the palette panel. When selected, the colors of the palette are being sorted based on their red channel value.
msgid "Sort by red"
-msgstr ""
+msgstr "Ordenar por rojo"
#. An option of the Sort palette button found in the palette panel. When selected, the colors of the palette are being sorted based on their green channel value.
msgid "Sort by green"
-msgstr ""
+msgstr "Ordenar por verde"
#. An option of the Sort palette button found in the palette panel. When selected, the colors of the palette are being sorted based on their blue channel value.
msgid "Sort by blue"
-msgstr ""
+msgstr "Ordenar por azul"
#. An option of the Sort palette button found in the palette panel. When selected, the colors of the palette are being sorted based on their alpha channel value.
msgid "Sort by alpha"
-msgstr ""
+msgstr "Ordenar por alfa"
msgid "Palette with the same name and path already exists!"
msgstr "¡Ya existe una paleta con el mismo nombre y ruta!"
@@ -2800,7 +2816,8 @@ msgstr "¡El nombre de la paleta es requerido!"
msgid "Reducing palette size will reset positions of colors.\n"
"Colors that don't fit in new palette size will be lost!"
-msgstr ""
+msgstr "Reducir el tamaño de la paleta restablecerá las posiciones de los colores. \n"
+"¡Los colores que no quepan en el tamaño de la nueva paleta se perderán!"
msgid "Position:"
msgstr "Posición:"
@@ -3136,102 +3153,103 @@ msgstr "Sincronizar al final"
#. Found under certain image effects that support properties that can be animated. A type of interpolation.
msgid "Spring towards the end"
-msgstr ""
+msgstr "Movimiento súbito en el final"
#. Used to turn images into a singular color
msgid "Monochrome"
-msgstr ""
+msgstr "Monocromático"
#. Found in the Reference Images panel when no reference image has been imported.
msgid "When opening an image, it may be imported as a reference."
-msgstr ""
+msgstr "Al abrir una imagen, se puede importar como una referencia."
#. Found in the Reference Images panel after a reference image has been imported.
msgid "Select an image below to change its properties.\n"
"Note that you cannot draw while a reference image is selected."
-msgstr ""
+msgstr "Selecciona una imagen a continuación para cambiar sus propiedades.\n"
+"Ten en cuenta que no puedes dibujar mientras una imagen de referencia está seleccionada."
#. Removes the selected reference image.
msgid "Remove"
-msgstr ""
+msgstr "Eliminar"
#. A tooltip to tell users to hold the Shift key while clicking the remove button
msgid "Hold Shift while pressing to instantly remove."
-msgstr ""
+msgstr "Mantén pulsado Shift mientras presionas para eliminar al instante."
#. Shown in the confirmation dialog for removing a reference image.
msgid "Are you sure you want to remove this reference image? It will not be deleted from your file system."
-msgstr ""
+msgstr "¿Estás seguro de que deseas eliminar esta imagen de referencia? No será eliminada de tu sistema de archivos."
#. Moves the reference image up in the list
msgid "Move the selected reference image to the right"
-msgstr ""
+msgstr "Mover la imagen de referencia seleccionada a la derecha"
#. Moves the reference image down in the list
msgid "Move the selected reference image to the left"
-msgstr ""
+msgstr "Mover la imagen de referencia seleccionada a la izquierda"
#. Select a reference on the canvas
msgid "Selects a reference image on the canvas"
-msgstr ""
+msgstr "Selecciona una imagen de referencia en el lienzo"
#. Moves the reference on the canvas
msgid "Move the selected reference image"
-msgstr ""
+msgstr "Mover la imagen de referencia seleccionada"
#. Rotates the reference on the canvas
msgid "Rotate the selected reference image"
-msgstr ""
+msgstr "Rotar la imagen de referencia seleccionada"
#. Rotates the reference on the canvas
msgid "Scale the selected reference image"
-msgstr ""
+msgstr "Escalar la imagen de referencia seleccionada"
#. Button to select no reference images in the Reference Images panel.
msgid "none"
-msgstr ""
+msgstr "ninguna"
#. Resets the Transform of the selected reference image on the canvas.
msgid "Reset Transform"
-msgstr ""
+msgstr "Reestablecer transformación"
#. Position of the selected reference image on the canvas.
msgid "Position"
-msgstr ""
+msgstr "Posición"
#. Scale of the selected reference image on the canvas.
msgid "Scale"
-msgstr ""
+msgstr "Escala"
#. Rotation of the selected reference image on the canvas.
msgid "Rotation"
-msgstr ""
+msgstr "Rotación"
#. Toggle filter of the selected reference image on the canvas.
msgid "Filter"
-msgstr ""
+msgstr "Filtro"
#. Opacity of the selected reference image on the canvas.
msgid "Opacity"
-msgstr ""
+msgstr "Opacidad"
#. Color clamping of the selected reference image on the canvas.
msgid "Color Clamping"
-msgstr ""
+msgstr "Compresión de colores"
#. Used in checkbuttons (like on/off switches) that enable/disable something.
msgid "Enabled"
-msgstr ""
+msgstr "Habilitado"
#. Refers to non-destructive effects (such as outline, drop shadow etc) that are applied to layers. Found in the title of the layer effects dialog.
msgid "Layer effects"
-msgstr ""
+msgstr "Efectos de la capa"
#. A button that, when pressed, shows a list of effects to add. Found in the the layer effects dialog.
msgid "Add effect"
-msgstr ""
+msgstr "Añadir efecto"
#. Text from a confirmation dialog that appears when the user is attempting to drag and drop an image directly from the browser into Pixelorama.
msgid "Do you want to download the image from %s?"
-msgstr ""
+msgstr "¿Deseas descargar la imagen desde %s?"
diff --git a/Translations/et_EE.po b/Translations/et_EE.po
index ca1f121f4..c253cff38 100644
--- a/Translations/et_EE.po
+++ b/Translations/et_EE.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Estonian\n"
"Language: et_EE\n"
-"PO-Revision-Date: 2024-08-03 00:15\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/fi_FI.po b/Translations/fi_FI.po
index e095a69a5..89faa8a04 100644
--- a/Translations/fi_FI.po
+++ b/Translations/fi_FI.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Finnish\n"
"Language: fi_FI\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "OK"
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/fil_PH.po b/Translations/fil_PH.po
index 3ae4bdb98..3566813bf 100644
--- a/Translations/fil_PH.po
+++ b/Translations/fil_PH.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Filipino\n"
"Language: fil_PH\n"
-"PO-Revision-Date: 2024-08-03 00:15\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/fr_FR.po b/Translations/fr_FR.po
index f50c22d86..14722d17e 100644
--- a/Translations/fr_FR.po
+++ b/Translations/fr_FR.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: French\n"
"Language: fr_FR\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 13:17\n"
msgid "OK"
msgstr "OK"
@@ -1711,6 +1711,10 @@ msgstr "Définir la limite FPS de l'application :"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "Définit la limite d'images par seconde de l'application. Plus le nombre est bas, plus l'utilisation du processeur est faible, mais l'application devient plus lente, saccadée et non réactive. 0 signifie qu'il n'y a pas de limite."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "Met l'application en pause quand elle perd le focus"
@@ -2207,6 +2211,10 @@ msgstr "Fusionner le calque vers le bas"
msgid "Blend mode:"
msgstr "Mode de fusion :"
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr "Normal"
diff --git a/Translations/ga_IE.po b/Translations/ga_IE.po
index 4a26db08c..0e5d94c49 100644
--- a/Translations/ga_IE.po
+++ b/Translations/ga_IE.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Irish\n"
"Language: ga_IE\n"
-"PO-Revision-Date: 2024-08-03 00:15\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/grc.po b/Translations/grc.po
index b7658a0a2..375892d7a 100644
--- a/Translations/grc.po
+++ b/Translations/grc.po
@@ -10,22 +10,22 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Ancient Greek\n"
"Language: grc\n"
-"PO-Revision-Date: 2024-08-03 01:18\n"
+"PO-Revision-Date: 2024-08-16 13:19\n"
msgid "OK"
-msgstr ""
+msgstr "Ἐντάξει"
msgid "Cancel"
-msgstr ""
+msgstr "Ἀκύρωσον"
msgid "Open"
-msgstr ""
+msgstr "Ἀνοῖξον"
msgid "Save"
msgstr ""
msgid "Please Confirm..."
-msgstr ""
+msgstr "Παρακαλῶ ἐπιβεβαίωσον..."
msgid "File Name:"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/he_IL.po b/Translations/he_IL.po
index 6fb2bfbb2..ece76eae9 100644
--- a/Translations/he_IL.po
+++ b/Translations/he_IL.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Hebrew\n"
"Language: he_IL\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "אישור"
@@ -1665,6 +1665,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2159,6 +2163,10 @@ msgstr "איחוד השכבה הנוכחית עם השכבה מתחת"
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/hi_IN.po b/Translations/hi_IN.po
index 7eb47278e..c3a811fc9 100644
--- a/Translations/hi_IN.po
+++ b/Translations/hi_IN.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Hindi\n"
"Language: hi_IN\n"
-"PO-Revision-Date: 2024-08-01 22:07\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "ठीक है"
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/hr_HR.po b/Translations/hr_HR.po
index c0f1e2a9d..a1d515c03 100644
--- a/Translations/hr_HR.po
+++ b/Translations/hr_HR.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Croatian\n"
"Language: hr_HR\n"
-"PO-Revision-Date: 2024-08-03 00:15\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/hu_HU.po b/Translations/hu_HU.po
index 2d5e34cc3..4aa3a7ca6 100644
--- a/Translations/hu_HU.po
+++ b/Translations/hu_HU.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Hungarian\n"
"Language: hu_HU\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "Ok"
@@ -1671,6 +1671,10 @@ msgstr "Applikáció FPS limitjének beállítása:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2166,6 +2170,10 @@ msgstr "Aktuális réteg egyesítése az alatta lévővel"
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/id_ID.po b/Translations/id_ID.po
index 96cf95923..f5d42a09f 100644
--- a/Translations/id_ID.po
+++ b/Translations/id_ID.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Indonesian\n"
"Language: id_ID\n"
-"PO-Revision-Date: 2024-08-05 03:40\n"
+"PO-Revision-Date: 2024-08-16 17:44\n"
msgid "OK"
msgstr "Oke"
@@ -1100,7 +1100,7 @@ msgid "Colors:"
msgstr "Warna:"
msgid "Steps:"
-msgstr "Langkah:"
+msgstr "Step:"
#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
msgid "Palettize"
@@ -1722,6 +1722,10 @@ msgstr "Batas FPS aplikasi:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "Menetapkan batas laju bingkai tiap detik pada aplikasi. Semakin rendah angkanya, penggunaan CPU juga berkurang; tapi aplikasi akan lambat, patah-patah dan kurang tanggap. 0 berarti tidak ada batas."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr "Maks. urung step:"
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "Jedakan aplikasi saat hilang fokus"
@@ -2218,6 +2222,10 @@ msgstr "Leburkan lapisan ini dengan yang di bawah"
msgid "Blend mode:"
msgstr "Mode campuran:"
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr "Pass through"
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr "Normal"
@@ -3042,7 +3050,7 @@ msgstr "Ukuran piksel:"
#. Found in the tool options of the 3D Shape Edit tool, under the Mesh category if a Text object is selected. Step (in pixels) used to approximate Bézier curves.
msgid "Curve step:"
-msgstr "Curve step:"
+msgstr "Step lengkung:"
msgid "Horizontal alignment:"
msgstr "Penjajaran mendatar:"
diff --git a/Translations/is_IS.po b/Translations/is_IS.po
index 166a18072..01de5f687 100644
--- a/Translations/is_IS.po
+++ b/Translations/is_IS.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Icelandic\n"
"Language: is_IS\n"
-"PO-Revision-Date: 2024-08-03 00:15\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/it_IT.po b/Translations/it_IT.po
index 84a716b18..fa74b7cc6 100644
--- a/Translations/it_IT.po
+++ b/Translations/it_IT.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Italian\n"
"Language: it_IT\n"
-"PO-Revision-Date: 2024-08-01 23:06\n"
+"PO-Revision-Date: 2024-08-16 15:20\n"
msgid "OK"
msgstr "OK"
@@ -1722,6 +1722,10 @@ msgstr "Imposta limite FPS dell'applicazione:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "Imposta il limite dei quadri dell'applicazione al secondo. Più basso è il numero, minore è l'uso della CPU, ma l'applicazione diventa più lenta, choppier e non reattiva. 0 significa che non c'è limite."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr "Passaggio massimo annullamenti:"
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "Pausa applicazione quando perde il fuoco"
@@ -2218,6 +2222,10 @@ msgstr "Unisci il livello corrente con quello sottostante"
msgid "Blend mode:"
msgstr "Metodo di fusione:"
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr "Pass through"
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr "Normale"
diff --git a/Translations/ja_JP.po b/Translations/ja_JP.po
index df6a9f44a..309642861 100644
--- a/Translations/ja_JP.po
+++ b/Translations/ja_JP.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Japanese\n"
"Language: ja_JP\n"
-"PO-Revision-Date: 2024-08-02 00:18\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "OK"
@@ -1722,6 +1722,10 @@ msgstr "アプリのFPS上限を設定:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "アプリケーションのフレーム/秒の制限を設定します。 数値が低いほどCPU使用率が低くなりますが、アプリケーションが遅く、粗く、応答がなくなります。0は制限がないことを意味します。"
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr "元に戻すの最大ステップ数:"
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "フォーカスを失ったときにアプリケーションを一時停止する"
@@ -2218,6 +2222,10 @@ msgstr "現在のレイヤーと下のレイヤーを結合"
msgid "Blend mode:"
msgstr "ブレンドモード:"
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr "パススルー"
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr "通常"
diff --git a/Translations/ko_KR.po b/Translations/ko_KR.po
index 3a43654a6..4ff5901b3 100644
--- a/Translations/ko_KR.po
+++ b/Translations/ko_KR.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Korean\n"
"Language: ko_KR\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "예"
@@ -1707,6 +1707,10 @@ msgstr "창 FPS 제한 설정"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "프로그램의 FPS를 제한합니다. 숫자가 낮을수록, CPU 사용량은 낮아지지만 프로그램의 속도가 느려지고, 거칠어지고 응답하지 않습니다. 0은 제한이 없음을 의미합니다"
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "관심 없는 창 정지"
@@ -2203,6 +2207,10 @@ msgstr "현재 레이어와 그 아래 레이어를 병합"
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/la_LA.po b/Translations/la_LA.po
index 572a21757..5f7500441 100644
--- a/Translations/la_LA.po
+++ b/Translations/la_LA.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Latin\n"
"Language: la_LA\n"
-"PO-Revision-Date: 2024-08-03 01:17\n"
+"PO-Revision-Date: 2024-08-16 13:19\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/lt_LT.po b/Translations/lt_LT.po
index 5a792c7d3..01fa3b43f 100644
--- a/Translations/lt_LT.po
+++ b/Translations/lt_LT.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Lithuanian\n"
"Language: lt_LT\n"
-"PO-Revision-Date: 2024-08-03 00:15\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/lv_LV.po b/Translations/lv_LV.po
index 48ddd694e..77d53a7c9 100644
--- a/Translations/lv_LV.po
+++ b/Translations/lv_LV.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Latvian\n"
"Language: lv_LV\n"
-"PO-Revision-Date: 2024-08-01 22:07\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "Labi"
@@ -1669,6 +1669,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2163,6 +2167,10 @@ msgstr "Apvienot aktuālo slāni ar apakšējo slāni"
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/mk_MK.po b/Translations/mk_MK.po
index e24c29a37..b07d4cf04 100644
--- a/Translations/mk_MK.po
+++ b/Translations/mk_MK.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Macedonian\n"
"Language: mk_MK\n"
-"PO-Revision-Date: 2024-08-03 00:15\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/ml_IN.po b/Translations/ml_IN.po
index b3574641d..194315520 100644
--- a/Translations/ml_IN.po
+++ b/Translations/ml_IN.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Malayalam\n"
"Language: ml_IN\n"
-"PO-Revision-Date: 2024-08-01 22:07\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "ഓക്കേ"
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/mr_IN.po b/Translations/mr_IN.po
index 98a205fc4..e6f8db932 100644
--- a/Translations/mr_IN.po
+++ b/Translations/mr_IN.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Marathi\n"
"Language: mr_IN\n"
-"PO-Revision-Date: 2024-08-03 00:15\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/ms_MY.po b/Translations/ms_MY.po
index 6256e3ba8..1741ad18d 100644
--- a/Translations/ms_MY.po
+++ b/Translations/ms_MY.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Malay\n"
"Language: ms_MY\n"
-"PO-Revision-Date: 2024-08-03 00:15\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/nb_NO.po b/Translations/nb_NO.po
index ca8ed7fa0..b378c7238 100644
--- a/Translations/nb_NO.po
+++ b/Translations/nb_NO.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Norwegian Bokmal\n"
"Language: nb_NO\n"
-"PO-Revision-Date: 2024-08-01 22:07\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "OK"
@@ -1706,6 +1706,10 @@ msgstr "Sett prorgammets grense for Bilder Per Sekund, BPS:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "Setter grensen for hvor mange bilder per sekund programmet kan ha. Lavere tall bruker mindre prosessorkraft, men programmet går saktere, mer hakkete og kan slutte å svare. 0 betyr at det ikke er noen grense."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "Sett programmet på pause når det mister fokus"
@@ -2202,6 +2206,10 @@ msgstr "Slå sammen dette laget med laget nedenfor"
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/nl_NL.po b/Translations/nl_NL.po
index def22b7d1..af18bc92a 100644
--- a/Translations/nl_NL.po
+++ b/Translations/nl_NL.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "Oké"
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/pl_PL.po b/Translations/pl_PL.po
index 48cc7cb60..66117e91d 100644
--- a/Translations/pl_PL.po
+++ b/Translations/pl_PL.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Polish\n"
"Language: pl_PL\n"
-"PO-Revision-Date: 2024-08-02 18:31\n"
+"PO-Revision-Date: 2024-08-17 07:21\n"
msgid "OK"
msgstr "OK"
@@ -656,7 +656,7 @@ msgid "Refresh files."
msgstr "Odśwież pliki."
msgid "Toggle the visibility of hidden files."
-msgstr ""
+msgstr "Przełącz widoczność ukrytych plików."
msgid "Directories & Files:"
msgstr "Pliki oraz katalogi:"
@@ -669,51 +669,51 @@ msgstr "Plik:"
#. Found in "Open" and "Save" file dialogs. Searches all file types.
msgid "All Files"
-msgstr ""
+msgstr "Wszystkie pliki"
#. Found in the "Open" file dialog. Searches all file types supported by Pixelorama.
msgid "All Recognized"
-msgstr ""
+msgstr "Wszystkie rozpoznane"
#. Found in "Open" and "Save" file dialogs. Searches Pixelorama Project files only (.pxo).
msgid "Pixelorama Project"
-msgstr ""
+msgstr "Projekt Pixelorama"
#. Found in the "Open" file dialog. Searches PNG files only. (Note that PNG is a file type and should remain untranslated)
msgid "PNG Image"
-msgstr ""
+msgstr "Obraz PNG"
#. Found in the "Open" file dialog. Searches BMP files only. (Note that BMP is a file type and should remain untranslated)
msgid "BMP Image"
-msgstr ""
+msgstr "Obraz BMP"
#. Found in the "Open" file dialog. Searches "Radiance HDR" files only. (Note that "Radiance HDR" is a file type and is better untranslated)
msgid "Radiance HDR Image"
-msgstr ""
+msgstr "Obraz Radiance HDR"
#. Found in the "Open" file dialog. Searches JPEG files only. (Note that JPEG is a file type and should remain untranslated)
msgid "JPEG Image"
-msgstr ""
+msgstr "Obraz JPEG"
#. Found in the "Open" file dialog. Searches SVG files only. (Note that SVG is a file type and should remain untranslated)
msgid "SVG Image"
-msgstr ""
+msgstr "Obraz SVG"
#. Found in the "Open" file dialog. Searches TGA files only. (Note that TGA is a file type and should remain untranslated)
msgid "TGA Image"
-msgstr ""
+msgstr "Obraz TGA"
#. Found in the "Open" file dialog. Searches WebP files only. (Note that WebP is a file type and should remain untranslated)
msgid "WebP Image"
-msgstr ""
+msgstr "Obraz WebP"
#. Found in the "Open" file dialog. Searches Pixelorama palette files only (.json).
msgid "Pixelorama palette"
-msgstr ""
+msgstr "Paleta typu Pixelorama"
#. Found in the "Open" file dialog. Searches GIMP palette files only (.gpl). (Note that GIMP is a software and should remain untranslated)
msgid "GIMP palette"
-msgstr ""
+msgstr "Paleta typu GIMP"
#. Found in the export dialog. It is a button that when pressed, shows more options.
msgid "Advanced options"
@@ -957,7 +957,7 @@ msgid "Desaturation"
msgstr "Desaturacja (zmniejsz nasycenie)"
msgid "Outline"
-msgstr "Krawędź"
+msgstr "Obrys"
msgid "Drop Shadow"
msgstr "Cień"
@@ -1317,15 +1317,15 @@ msgid "Rectangular Selection\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
msgstr "Okrągłe zaznaczanie\n\n"
-"%s na lewy przycisk myszy\n"
-"%s na prawy przycisk myszy"
+"%s dla lewego przycisku myszy\n"
+"%s dla prawego przycisku myszy"
msgid "Elliptical Selection\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
msgstr "Zaznaczenie eliptyczne \n\n"
-"%s na lewy przycisk myszy\n"
-"%s na prawy przycisk myszy"
+"%s dla lewego przycisku myszy\n"
+"%s dla prawego przycisku myszy"
msgid "Polygonal Selection\n\n"
"%s for left mouse button\n"
@@ -1340,34 +1340,36 @@ msgid "Select By Color\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
msgstr "Zaznacz poprzez kolor\n\n"
-"%s na lewy przycisk myszy\n"
-"%s na prawy przycisk myszy"
+"%s dla lewego przycisku myszy\n"
+"%s dla prawego przycisku myszy"
msgid "Magic Wand\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
msgstr "Magiczna różczka\n\n"
-"%s na lewy przycisk myszy\n"
-"%s na prawy przycisk myszy"
+"%s dla lewego przycisku myszy\n"
+"%s dla prawego przycisku myszy"
msgid "Lasso / Free Select Tool\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
msgstr "Lasso / narzędzie swobodnego zaznaczania\n\n"
-"%s na lewy przycisk myszy\n"
-"%s na prawy przycisk myszy"
+"%s dla lewego przycisku myszy\n"
+"%s dla prawego przycisku myszy"
msgid "Select by Drawing\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
-msgstr ""
+msgstr "Zaznacz rysując\n\n"
+"%s dla lewego przycisku myszy\n"
+"%s dla prawego przycisku myszy"
msgid "Move\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
msgstr "Przenieś \n\n"
-"%s na lewy przycisk myszy\n"
-"%s na prawy przycisk myszy"
+"%s dla lewego przycisku myszy\n"
+"%s dla prawego przycisku myszy"
msgid "Zoom\n\n"
"%s for left mouse button\n"
@@ -1394,7 +1396,8 @@ msgstr "Wybór koloru\n\n"
msgid "Crop\n\n"
"Resize the canvas"
-msgstr ""
+msgstr "Przytnij\n\n"
+"Zmień rozmiar płótna"
msgid "Pencil\n\n"
"%s for left mouse button\n"
@@ -1410,23 +1413,23 @@ msgid "Eraser\n\n"
"%s for right mouse button\n\n"
"Hold %s to make a line"
msgstr "Gumka\n\n"
-"%s na lewy przycisk myszy\n"
-"%s na prawy przycisk myszy\n\n"
+"%s dla lewego przycisku myszy\n"
+"%s dla prawego przycisku myszy\n\n"
"Przytrzymaj %s aby użyć w linii prostej"
msgid "Bucket\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
msgstr "Wiaderko\n\n"
-"%s na lewy przycisk myszy\n"
-"%s na prawy przycisk myszy"
+"%s dla lewego przycisku myszy\n"
+"%s dla prawego przycisku myszy"
msgid "Shading Tool\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
msgstr "Narzędzie cieniowania\n\n"
-"%s na lewy przycisk myszy\n"
-"%s na prawy przycisk myszy"
+"%s dla lewego przycisku myszy\n"
+"%s dla prawego przycisku myszy"
msgid "Line Tool\n\n"
"%s for left mouse button\n"
@@ -1462,8 +1465,8 @@ msgid "Rectangle Tool\n\n"
"Hold %s to center the shape on the click origin\n"
"Hold %s to displace the shape's origin"
msgstr "Prostokąt\n\n"
-"%s na lewy przycisk myszy\n"
-"%s na prawy przycisk myszy\n\n"
+"%s dla lewego przycisku myszy\n"
+"%s dla prawego przycisku myszy\n\n"
"Przytrzymaj %s aby stworzyć kształt 1:1\n"
"Przytrzymaj %s aby wyśrodkować kształt na miejscu kliknięcia\n"
"Przytrzymaj %s aby przemieścić pozycję źródłową kształtu"
@@ -1475,8 +1478,8 @@ msgid "Ellipse Tool\n\n"
"Hold %s to center the shape on the click origin\n"
"Hold %s to displace the shape's origin"
msgstr "Elipsa\n\n"
-"%s na lewy przycisk myszy\n"
-"%s na prawy przycisk myszy\n\n"
+"%s dla lewego przycisku myszy\n"
+"%s dla prawego przycisku myszy\n\n"
"Przytrzymaj %s aby stworzyć kształt 1:1\n"
"Przytrzymaj %s aby wyśrodkować kształt na miejscu kliknięcia\n"
"Przytrzymaj %s aby przemieścić pozycję źródłową kształtu"
@@ -1499,7 +1502,7 @@ msgstr "Podmień lewy kolor z prawym kolorem."
#. Tooltip of the average color button, found in the color picker panel. Shows the average color between the two selected.
msgid "Average Color:"
-msgstr ""
+msgstr "Średnia kolorów:"
msgid "Reset the colors to their default state (black for left, white for right)"
msgstr "Resetuje kolory do stanu domyślnego (czarny po lewej, biały po prawej)"
@@ -1510,7 +1513,7 @@ msgstr "Wybierz kolor z ekranu."
#. Tooltip of the color text field found in the color picker panel that lets users change the color by hex code or english name ("red" cannot be translated).
msgid "Enter a hex code (\"#ff0000\") or named color (\"red\")."
-msgstr ""
+msgstr "Wpisz kod hex (\"#ff0000\") lub angielską nazwę koloru (\"red\")."
#. Tooltip of the button found in the color picker panel that lets users change the shape of the color picker.
msgid "Select a picker shape."
@@ -1522,19 +1525,19 @@ msgstr "Opcje kolorów"
#. Tooltip of the button with three dots found under color options in the color picker panel that lets users change the mode of the color picker/sliders.
msgid "Select a picker mode."
-msgstr ""
+msgstr "Wybierz tryb próbnika."
#. Checkbox found in the menu of the button with three dots found under color options in the color picker panel.
msgid "Colorized Sliders"
-msgstr ""
+msgstr "Kolorowe suwaki"
#. Shows saved colors in certain color picker menus.
msgid "Swatches"
-msgstr ""
+msgstr "Próbki"
#. Found under color options in the color picker panel.
msgid "Recent Colors"
-msgstr ""
+msgstr "Ostatnie kolory"
msgid "Left tool"
msgstr "Lewe narzędzie"
@@ -1717,6 +1720,10 @@ msgstr "Ustaw limit FPS dla aplikacji:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "Ustawia limit klatek aplikacji na sekundę. Im niższa liczba, tym niższe zużycie procesora, ale aplikacja staje się wolniejsza. 0 oznacza, że nie ma limitu."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr "Maksymalna liczba cofnięć zmian:"
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "Zapauzuj aplikację, gdy straci skupienie"
@@ -1727,7 +1734,7 @@ msgstr "Jeśli ta opcja jest włączona i okno aplikacji traci skupienie, to pro
#. An option found in the preferences, under the Performance section. Refers to the screen being updated (redrawn) continuously.
msgid "Update continuously"
-msgstr ""
+msgstr "Odświeżaj bezustannie"
#. Found in the preferences, hint of the "Update continuously" option.
msgid "If this is toggled on, the application will redraw the screen continuously, even while it's not used. Turning this off helps lower CPU and GPU usage when idle."
@@ -2010,22 +2017,22 @@ msgid "Current frame as spritesheet"
msgstr "Obecna klatka jako spritesheet"
msgid "Jump to the first frame"
-msgstr ""
+msgstr "Skocz do pierwszej klatki"
msgid "Go to the previous frame"
-msgstr ""
+msgstr "Idć do poprzedniej klatki"
msgid "Play the animation backwards (from end to beginning)"
-msgstr ""
+msgstr "Odtwórz animację wstecz"
msgid "Play the animation forward (from beginning to end)"
-msgstr ""
+msgstr "Odtwórz animację do przodu"
msgid "Go to the next frame"
-msgstr ""
+msgstr "Idź do następnej klatki"
msgid "Jump to the last frame"
-msgstr ""
+msgstr "Skocz do ostatniej klatki"
msgid "Timeline settings"
msgstr "Ustawienia osi czasu"
@@ -2090,7 +2097,7 @@ msgstr "Jeśli jest zaznaczone, animacja odtwarza się tylko na klatkach z tym s
#. Found in the timeline, inside the timeline settings. It's a slider that sets the size of the cel buttons in the timeline.
msgid "Cel size:"
-msgstr "Rozmiar komórki:"
+msgstr "Rozmiar kalki:"
#. Found in the timeline, inside the timeline settings. If this is enabled, the past and future frames will have appear tinted.
msgid "Color mode"
@@ -2148,7 +2155,7 @@ msgid "Layer properties"
msgstr "Właściwości warstwy"
msgid "Cel properties"
-msgstr "Właściwości komórki"
+msgstr "Właściwości kalki"
msgid "Tag properties"
msgstr "Właściwości tagu"
@@ -2213,6 +2220,10 @@ msgstr "Połącz obecną warstwę z warstwą powyżej"
msgid "Blend mode:"
msgstr "Rodzaj mieszania:"
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr "Normalny"
@@ -3153,24 +3164,25 @@ msgstr "Monochromatyczny"
#. Found in the Reference Images panel when no reference image has been imported.
msgid "When opening an image, it may be imported as a reference."
-msgstr ""
+msgstr "Otwierając obraz, można go zaimportować jako obraz odniesienia."
#. Found in the Reference Images panel after a reference image has been imported.
msgid "Select an image below to change its properties.\n"
"Note that you cannot draw while a reference image is selected."
-msgstr ""
+msgstr "Wybierz obraz poniżej, aby zmienić jego proporcje.\n"
+"Uwaga: nie możesz rysować, podczas gdy obraz odniesienia jest wybrany."
#. Removes the selected reference image.
msgid "Remove"
-msgstr ""
+msgstr "Usuń"
#. A tooltip to tell users to hold the Shift key while clicking the remove button
msgid "Hold Shift while pressing to instantly remove."
-msgstr ""
+msgstr "Przytrzymaj Shift przy kliknięciu, aby usunąć natychmiastowo."
#. Shown in the confirmation dialog for removing a reference image.
msgid "Are you sure you want to remove this reference image? It will not be deleted from your file system."
-msgstr ""
+msgstr "Czy jesteś pewny usunięcia tego obrazu odniesienia? Nie zostanie on usunięty z twojego systemu."
#. Moves the reference image up in the list
msgid "Move the selected reference image to the right"
@@ -3198,35 +3210,35 @@ msgstr "Skaluj wybrany obraz referencyjny"
#. Button to select no reference images in the Reference Images panel.
msgid "none"
-msgstr ""
+msgstr "brak"
#. Resets the Transform of the selected reference image on the canvas.
msgid "Reset Transform"
-msgstr ""
+msgstr "Reset przekształceń"
#. Position of the selected reference image on the canvas.
msgid "Position"
-msgstr ""
+msgstr "Pozycja"
#. Scale of the selected reference image on the canvas.
msgid "Scale"
-msgstr ""
+msgstr "Skala"
#. Rotation of the selected reference image on the canvas.
msgid "Rotation"
-msgstr ""
+msgstr "Obrót"
#. Toggle filter of the selected reference image on the canvas.
msgid "Filter"
-msgstr ""
+msgstr "Filtr"
#. Opacity of the selected reference image on the canvas.
msgid "Opacity"
-msgstr ""
+msgstr "Przezroczystość"
#. Color clamping of the selected reference image on the canvas.
msgid "Color Clamping"
-msgstr ""
+msgstr "Ograniczanie koloru"
#. Used in checkbuttons (like on/off switches) that enable/disable something.
msgid "Enabled"
diff --git a/Translations/pt_BR.po b/Translations/pt_BR.po
index 7ad0218b9..dcbe9f62c 100644
--- a/Translations/pt_BR.po
+++ b/Translations/pt_BR.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt_BR\n"
-"PO-Revision-Date: 2024-08-03 01:17\n"
+"PO-Revision-Date: 2024-08-16 13:17\n"
msgid "OK"
msgstr "OK"
@@ -1722,6 +1722,10 @@ msgstr "Definir o limite de FPS do aplicativo:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "Define o limite de FPS (quadros por segundo) do aplicativo. Quanto menor o número, menor o uso da CPU, mas o aplicativo fica mais lento, com qualidade ruim e sem resposta. 0 significa que não há limite."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "Pausar aplicativo quando perder o foco"
@@ -2218,6 +2222,10 @@ msgstr "Combinar camada atual com a de baixo"
msgid "Blend mode:"
msgstr "Modo de mesclagem:"
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr "Passar através"
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr "Normal"
diff --git a/Translations/pt_PT.po b/Translations/pt_PT.po
index 8aa4ca52d..d93dfd0e7 100644
--- a/Translations/pt_PT.po
+++ b/Translations/pt_PT.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Portuguese\n"
"Language: pt_PT\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "OK"
@@ -1702,6 +1702,10 @@ msgstr "Define o limite de FPS da aplicação:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "Define o limite de fotogramas por segundo da aplicação. Quanto mais baixo, mais baixo o uso do processador, no entanto, a aplicação fica mais lenta, com cortes, e pouco responsiva. 0 significa que não tem limite."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "Pausar a aplicação quando perder o foco"
@@ -2197,6 +2201,10 @@ msgstr "Fundir a camada atual com a de baixo"
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/ro_RO.po b/Translations/ro_RO.po
index dfa1ea9a7..2b6ba88bd 100644
--- a/Translations/ro_RO.po
+++ b/Translations/ro_RO.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Romanian\n"
"Language: ro_RO\n"
-"PO-Revision-Date: 2024-08-05 08:51\n"
+"PO-Revision-Date: 2024-08-16 15:20\n"
msgid "OK"
msgstr "OK"
@@ -1720,6 +1720,10 @@ msgstr "Setare limită de cadre pe secundă pentru aplicație:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "Setează limita de cadre pe secundă a aplicației. Cu cât numărul este mai mic, cu atât utilizarea procesorului este mai redusă, însă aplicația devine mai lentă, variabilă și nereceptivă. 0 înseamnă că nu există limite."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr "Pași max. de anulare:"
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "Întrerupe aplicația atunci când pierde focalizarea"
@@ -2216,6 +2220,10 @@ msgstr "Îmbină stratul actual cu cel de mai jos"
msgid "Blend mode:"
msgstr "Mod amestecare:"
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr "Trecere"
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr "Normal"
diff --git a/Translations/ru_RU.po b/Translations/ru_RU.po
index 1b497651b..1b5e663e8 100644
--- a/Translations/ru_RU.po
+++ b/Translations/ru_RU.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "OK"
@@ -637,7 +637,7 @@ msgid "Export dimensions:"
msgstr "Размер для экспорта:"
msgid "Save a File"
-msgstr ""
+msgstr "Сохранить файл"
msgid "Go to previous folder."
msgstr ""
@@ -668,7 +668,7 @@ msgstr "Файл:"
#. Found in "Open" and "Save" file dialogs. Searches all file types.
msgid "All Files"
-msgstr ""
+msgstr "Все файлы"
#. Found in the "Open" file dialog. Searches all file types supported by Pixelorama.
msgid "All Recognized"
@@ -1715,6 +1715,10 @@ msgstr "Ограничение кадров в секунду:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "Устанавливает лимит на количество кадров в секунду для программы. Чем ниже это число, тем меньше используется процессор, но приложение становится медленнее, дольше реагирует на действия, а движения будут менее плавными. 0 значит отсутствие лимита."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "Приостановить приложение при потере фокуса"
@@ -2211,6 +2215,10 @@ msgstr "Объединить слой ниже с текущим"
msgid "Blend mode:"
msgstr "Режим смешивания:"
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr "Нормальный"
@@ -3207,11 +3215,11 @@ msgstr ""
#. Scale of the selected reference image on the canvas.
msgid "Scale"
-msgstr ""
+msgstr "Масштаб"
#. Rotation of the selected reference image on the canvas.
msgid "Rotation"
-msgstr ""
+msgstr "Поворот"
#. Toggle filter of the selected reference image on the canvas.
msgid "Filter"
@@ -3219,7 +3227,7 @@ msgstr ""
#. Opacity of the selected reference image on the canvas.
msgid "Opacity"
-msgstr ""
+msgstr "Непрозрачность"
#. Color clamping of the selected reference image on the canvas.
msgid "Color Clamping"
diff --git a/Translations/si_LK.po b/Translations/si_LK.po
index 0a9716f8b..ac8432839 100644
--- a/Translations/si_LK.po
+++ b/Translations/si_LK.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Sinhala\n"
"Language: si_LK\n"
-"PO-Revision-Date: 2024-08-01 22:07\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "හරි"
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/sk_SK.po b/Translations/sk_SK.po
index 7ae663596..04cea609f 100644
--- a/Translations/sk_SK.po
+++ b/Translations/sk_SK.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Slovak\n"
"Language: sk_SK\n"
-"PO-Revision-Date: 2024-08-03 00:15\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/sl_SI.po b/Translations/sl_SI.po
index b3671aefa..1990d1b72 100644
--- a/Translations/sl_SI.po
+++ b/Translations/sl_SI.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Slovenian\n"
"Language: sl_SI\n"
-"PO-Revision-Date: 2024-08-03 00:15\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/sq_AL.po b/Translations/sq_AL.po
index 7cfcef81d..d65c97db5 100644
--- a/Translations/sq_AL.po
+++ b/Translations/sq_AL.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Albanian\n"
"Language: sq_AL\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "Ne rregull"
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/sr_SP.po b/Translations/sr_SP.po
index 781381c2c..d0dabd6f0 100644
--- a/Translations/sr_SP.po
+++ b/Translations/sr_SP.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Serbian (Cyrillic)\n"
"Language: sr_SP\n"
-"PO-Revision-Date: 2024-08-01 22:06\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "ОК"
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/sv_SE.po b/Translations/sv_SE.po
index add5c6404..32bf6083a 100644
--- a/Translations/sv_SE.po
+++ b/Translations/sv_SE.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Swedish\n"
"Language: sv_SE\n"
-"PO-Revision-Date: 2024-08-01 22:07\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "Okej"
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/sw_KE.po b/Translations/sw_KE.po
index 56134b6b6..16f78efe1 100644
--- a/Translations/sw_KE.po
+++ b/Translations/sw_KE.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Swahili\n"
"Language: sw_KE\n"
-"PO-Revision-Date: 2024-08-03 00:15\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/ta_IN.po b/Translations/ta_IN.po
index 6722db854..a74853986 100644
--- a/Translations/ta_IN.po
+++ b/Translations/ta_IN.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Tamil\n"
"Language: ta_IN\n"
-"PO-Revision-Date: 2024-08-03 00:15\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/th_TH.po b/Translations/th_TH.po
index d41f3e3dc..538d7d5ac 100644
--- a/Translations/th_TH.po
+++ b/Translations/th_TH.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Thai\n"
"Language: th_TH\n"
-"PO-Revision-Date: 2024-08-03 00:15\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/tlh_AA.po b/Translations/tlh_AA.po
index c96ac168e..87ed68a48 100644
--- a/Translations/tlh_AA.po
+++ b/Translations/tlh_AA.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Klingon\n"
"Language: tlh_AA\n"
-"PO-Revision-Date: 2024-08-03 01:17\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr ""
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/tr_TR.po b/Translations/tr_TR.po
index 7e3863d9d..aacd268cc 100644
--- a/Translations/tr_TR.po
+++ b/Translations/tr_TR.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
-"PO-Revision-Date: 2024-08-02 13:34\n"
+"PO-Revision-Date: 2024-08-17 21:08\n"
msgid "OK"
msgstr "Tamam"
@@ -1722,6 +1722,10 @@ msgstr "Uygulama FPS sınırını ayarla:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "Uygulamanın saniyedeki kare sınırını ayarlar. Rakam ne kadar düşük olursa CPU kullanımı o kadar düşük olur, ancak uygulama daha yavaş, kesikli ve tepkisiz hale gelir. 0, sınır olmadığı anlamına gelir."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr "Azami geri alma adımı:"
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "Odağı kaybettiğinde uygulamayı duraklat"
@@ -2218,6 +2222,10 @@ msgstr "Aktif katmanı alttaki katmanla birleştir"
msgid "Blend mode:"
msgstr "Harmanlama kipi:"
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr "Doğrudan geçiş"
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr "Normal"
diff --git a/Translations/uk_UA.po b/Translations/uk_UA.po
index 9e3365fda..6662ac090 100644
--- a/Translations/uk_UA.po
+++ b/Translations/uk_UA.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Ukrainian\n"
"Language: uk_UA\n"
-"PO-Revision-Date: 2024-08-01 22:07\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "Гаразд"
@@ -1713,6 +1713,10 @@ msgstr "Встановити обмеження FPS додатку:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "Встановлює обмеження кадрів в секунду. Чим нижче значення, ти менше додаток використовує CPU, але програма починає працювати повільніше, стає менш стабільною і може не реагувати. 0 означає, що немає ніяких обмежень."
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "Призупиняти програму, коли вона не має фокусу"
@@ -2209,6 +2213,10 @@ msgstr "Об’єднати поточний шар з шаром під ним"
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/vi_VN.po b/Translations/vi_VN.po
index 63ecedb6c..72b5869af 100644
--- a/Translations/vi_VN.po
+++ b/Translations/vi_VN.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Vietnamese\n"
"Language: vi_VN\n"
-"PO-Revision-Date: 2024-08-01 22:07\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "OK"
@@ -1660,6 +1660,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2153,6 +2157,10 @@ msgstr ""
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/Translations/zh_CN.po b/Translations/zh_CN.po
index 790d6e6c7..784c38f64 100644
--- a/Translations/zh_CN.po
+++ b/Translations/zh_CN.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
-"PO-Revision-Date: 2024-08-01 22:07\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "确定"
@@ -1054,35 +1054,35 @@ msgstr "值:"
#. An image effect. Adjusts the brightness and contrast of the colors of an image.
msgid "Adjust Brightness/Contrast"
-msgstr ""
+msgstr "调整亮度/对比度"
#. Refers to the brightness of the colors of an image.
msgid "Brightness:"
-msgstr ""
+msgstr "亮度:"
#. Refers to the contrast of the colors of an image.
msgid "Contrast:"
-msgstr ""
+msgstr "对比度:"
#. Refers to the red value of the colors of an image.
msgid "Red value:"
-msgstr ""
+msgstr "红色值:"
#. Refers to the green value of the colors of an image.
msgid "Green value:"
-msgstr ""
+msgstr "绿色值:"
#. Refers to the blue value of the colors of an image.
msgid "Blue value:"
-msgstr ""
+msgstr "蓝色值:"
#. Refers to a color that tints an image.
msgid "Tint color:"
-msgstr ""
+msgstr "色调颜色:"
#. Refers to the factor (how much) a color tints an image.
msgid "Tint effect factor:"
-msgstr ""
+msgstr "色调影响因素:"
msgid "Apply"
msgstr "应用"
@@ -1721,6 +1721,10 @@ msgstr "设置应用程序 FPS 限制:"
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr "设置应用程序帧每秒的限制。 数字越低,CPU 使用率越低,但应用程序变慢,限制且反应不灵。0 表示没有限制。"
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr "失去焦点时暂停应用程序"
@@ -1731,11 +1735,11 @@ msgstr "如果打开此选项,当应用程序的窗口失去焦点时,它会
#. An option found in the preferences, under the Performance section. Refers to the screen being updated (redrawn) continuously.
msgid "Update continuously"
-msgstr ""
+msgstr "持续更新"
#. Found in the preferences, hint of the "Update continuously" option.
msgid "If this is toggled on, the application will redraw the screen continuously, even while it's not used. Turning this off helps lower CPU and GPU usage when idle."
-msgstr ""
+msgstr "如果启用此功能,应用程序将不断重绘屏幕,即使不使用屏幕也是如此。关闭此功能有助于降低空闲时的 CPU 和 GPU 使用率。"
#. An option found in the preferences, under the Performance section.
msgid "Enable window transparency"
@@ -2163,7 +2167,7 @@ msgstr "新建标签"
#. Found on the popup menu that appears when a user right-clicks on a frame button. When clicked, it allows users to paste/import tags from other opened projects.
msgid "Import Tag"
-msgstr ""
+msgstr "导入标签"
#. Found on the popup menu that appears when a user right-clicks on a frame button. When clicked, the order of the selected frames is being reversed.
msgid "Reverse Frames"
@@ -2217,6 +2221,10 @@ msgstr "当前图层与下面图层合并"
msgid "Blend mode:"
msgstr "混合模式:"
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr "Normal"
diff --git a/Translations/zh_TW.po b/Translations/zh_TW.po
index 6a35be7d4..038caba78 100644
--- a/Translations/zh_TW.po
+++ b/Translations/zh_TW.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Chinese Traditional\n"
"Language: zh_TW\n"
-"PO-Revision-Date: 2024-08-01 22:07\n"
+"PO-Revision-Date: 2024-08-16 13:18\n"
msgid "OK"
msgstr "確定"
@@ -1670,6 +1670,10 @@ msgstr ""
msgid "Sets the limit of the application's frames per second. The lower the number, the lower the CPU usage, but the application gets slower, choppier and unresponsive. 0 means that there is no limit."
msgstr ""
+#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
+msgid "Max undo steps:"
+msgstr ""
+
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
msgstr ""
@@ -2164,6 +2168,10 @@ msgstr "合併此圖層與下面的圖層"
msgid "Blend mode:"
msgstr ""
+#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
+msgid "Pass through"
+msgstr ""
+
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
msgstr ""
diff --git a/installer/po/es-ES.po b/installer/po/es-ES.po
index 82074735c..4b4565177 100644
--- a/installer/po/es-ES.po
+++ b/installer/po/es-ES.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: pixelorama\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-05-07 04:44\n"
-"PO-Revision-Date: 2021-05-21 17:41\n"
+"PO-Revision-Date: 2024-08-10 16:40\n"
"Last-Translator: \n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
@@ -40,7 +40,7 @@ msgstr "Desinstalar ${APPNAME} ${APPVERSION}"
#. un.SecConfig
#: ..\pixelorama.nsi:88
msgid "Remove configuration files (optional)"
-msgstr "Remover archivos de configuración (opcional)"
+msgstr "Eliminar archivos de configuración (opcional)"
#. DESC_SecInstall
#: ..\pixelorama.nsi:200
From 9be3ba290c40316bcc14b601323f18a0e65f645f Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Wed, 21 Aug 2024 14:30:47 +0300
Subject: [PATCH 020/162] Update AboutDialog.gd
---
src/UI/Dialogs/AboutDialog.gd | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/UI/Dialogs/AboutDialog.gd b/src/UI/Dialogs/AboutDialog.gd
index 9e04874ac..d07974ec2 100644
--- a/src/UI/Dialogs/AboutDialog.gd
+++ b/src/UI/Dialogs/AboutDialog.gd
@@ -5,6 +5,7 @@ const AUTHORS: PackedStringArray = [
"Aaron Franke (aaronfranke)",
"AbhinavKDev (abhinav3967)",
"Álex Román Núñez (EIREXE)",
+ "alikin12",
"AlphinAlbukhari",
"Anaminus",
"Andreev Andrei",
@@ -23,6 +24,7 @@ const AUTHORS: PackedStringArray = [
"Gamespleasure",
"GrantMoyer",
"gschwind",
+ "Hamster5295",
"Haoyu Qiu (timothyqiu)",
"Hugo Locurcio (Calinou)",
"huskee",
@@ -80,6 +82,7 @@ const TRANSLATORS_DICTIONARY := {
"Martin Zabinski (Martin1991zab)": ["German"],
"Manuel (DrMoebyus)": ["German"],
"Dominik K. (mezotv)": ["German"],
+ "alikin12": ["German"],
"Dawid Niedźwiedzki (tiritto)": ["Polish"],
"Serhiy Dmytryshyn (dies)": ["Polish"],
"Igor Santarek (jegor377)": ["Polish"],
@@ -147,6 +150,7 @@ const TRANSLATORS_DICTIONARY := {
"Quetzalcoutl (QuetzalcoutlDev)": ["Spanish"],
"Santiago (Zhamty)": ["Spanish"],
"Jesus Lavado (jess_lav)": ["Spanish"],
+ "Alejandro Moctezuma (AlejandroMoc)": ["Spanish"],
"Seifer23": ["Catalan"],
"Joel García Cascalló (jocsencat)": ["Catalan"],
"Agnis Aldiņš (NeZvers)": ["Latvian"],
From 9c0d71572dc8f40187d4e88ba1696b1b5452102a Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Wed, 21 Aug 2024 16:09:34 +0300
Subject: [PATCH 021/162] [skip ci] Update CHANGELOG.md
---
CHANGELOG.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 073eea939..40f57944a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,7 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [v1.0.2] - Unreleased
This update has been brought to you by the contributions of:
-[kleonc](https://github.com/kleonc), [Hamster5295](https://github.com/Hamster5295)
+[kleonc](https://github.com/kleonc), [Hamster5295](https://github.com/Hamster5295), [alikin12](https://github.com/alikin12)
Built using Godot 4.3
@@ -25,6 +25,7 @@ Built using Godot 4.3
- It is now possible to change the blend modes of multiple selected layers from the timeline's option button.
### Fixed
+- The Web version no longer requires SharedArrayBuffer, so compatibility with certain browsers should be better now.
- Scaling with cleanEdge and OmniScale is now working again. [#1074](https://github.com/Orama-Interactive/Pixelorama/issues/1074)
- Layer effects are now being applied when exporting single layers.
- Exporting group layers now takes blending modes and layer effects into account.
From d70ddd72dbf448c7be0703a704346d574082ffdb Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Wed, 21 Aug 2024 16:11:38 +0300
Subject: [PATCH 022/162] Release v1.0.2
---
.github/workflows/release.yml | 2 +-
CHANGELOG.md | 2 +-
Misc/Linux/com.orama_interactive.Pixelorama.appdata.xml | 1 +
installer/pixelorama.nsi | 2 +-
project.godot | 2 +-
src/UI/TopMenuContainer/TopMenuContainer.gd | 2 +-
6 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 480bd35d3..286a83edb 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -7,7 +7,7 @@ on:
env:
GODOT_VERSION: 4.3
EXPORT_NAME: Pixelorama
- TAG: v1.0.1
+ TAG: v1.0.2
BUTLER_API_KEY: ${{ secrets.BUTLER_API_KEY }}
jobs:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 40f57944a..34c582eca 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). All the dates are in YYYY-MM-DD format.
-## [v1.0.2] - Unreleased
+## [v1.0.2] - 2024-08-21
This update has been brought to you by the contributions of:
[kleonc](https://github.com/kleonc), [Hamster5295](https://github.com/Hamster5295), [alikin12](https://github.com/alikin12)
diff --git a/Misc/Linux/com.orama_interactive.Pixelorama.appdata.xml b/Misc/Linux/com.orama_interactive.Pixelorama.appdata.xml
index e2386d456..5d04ebec5 100644
--- a/Misc/Linux/com.orama_interactive.Pixelorama.appdata.xml
+++ b/Misc/Linux/com.orama_interactive.Pixelorama.appdata.xml
@@ -44,6 +44,7 @@
+
diff --git a/installer/pixelorama.nsi b/installer/pixelorama.nsi
index df1d9f8d3..566e908a2 100644
--- a/installer/pixelorama.nsi
+++ b/installer/pixelorama.nsi
@@ -6,7 +6,7 @@
; Helper variables so that we don't change 20 instances of the version for every update
!define APPNAME "Pixelorama"
- !define APPVERSION "v1.0.1"
+ !define APPVERSION "v1.0.2"
!define COMPANYNAME "Orama Interactive"
diff --git a/project.godot b/project.godot
index 7a0defbff..353d3f655 100644
--- a/project.godot
+++ b/project.godot
@@ -12,7 +12,7 @@ config_version=5
config/name="Pixelorama"
config/description="Unleash your creativity with Pixelorama, a powerful and accessible open-source pixel art multitool. Whether you want to create sprites, tiles, animations, or just express yourself in the language of pixel art, this software will realize your pixel-perfect dreams with a vast toolbox of features."
-config/version="v1.0.2-dev"
+config/version="v1.0.2-stable"
run/main_scene="res://src/Main.tscn"
config/use_custom_user_dir=true
config/custom_user_dir_name="pixelorama"
diff --git a/src/UI/TopMenuContainer/TopMenuContainer.gd b/src/UI/TopMenuContainer/TopMenuContainer.gd
index 42113e54b..106050118 100644
--- a/src/UI/TopMenuContainer/TopMenuContainer.gd
+++ b/src/UI/TopMenuContainer/TopMenuContainer.gd
@@ -4,7 +4,7 @@ const DOCS_URL := "https://www.oramainteractive.com/Pixelorama-Docs/"
const ISSUES_URL := "https://github.com/Orama-Interactive/Pixelorama/issues"
const SUPPORT_URL := "https://www.patreon.com/OramaInteractive"
# gdlint: ignore=max-line-length
-const CHANGELOG_URL := "https://github.com/Orama-Interactive/Pixelorama/blob/master/CHANGELOG.md#v101---2024-08-05"
+const CHANGELOG_URL := "https://github.com/Orama-Interactive/Pixelorama/blob/master/CHANGELOG.md#v102---2024-08-21"
const EXTERNAL_LINK_ICON := preload("res://assets/graphics/misc/external_link.svg")
const PIXELORAMA_ICON := preload("res://assets/graphics/icons/icon_16x16.png")
const HEART_ICON := preload("res://assets/graphics/misc/heart.svg")
From ff2a5f8b332ba24c15b42474864635c1bacf074a Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Wed, 21 Aug 2024 16:33:22 +0300
Subject: [PATCH 023/162] Fix web release workflow
---
.github/workflows/release.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 286a83edb..377160584 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -187,7 +187,7 @@ jobs:
name: Web Export 🌐
runs-on: ubuntu-latest
container:
- image: docker://barichello/godot-ci:4.2.2
+ image: docker://barichello/godot-ci:4.3
steps:
- name: Checkout 🛎️
uses: actions/checkout@v4
From cef4a5a943872481dd9eb373b62257ab4e88fc15 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 23 Aug 2024 17:30:30 +0300
Subject: [PATCH 024/162] Fix WINE & rcedit for Windows builds
Should probably be removed once https://github.com/abarichello/godot-ci/pull/149 is merged.
---
.github/workflows/dev-desktop-builds.yml | 6 ++++++
.github/workflows/release.yml | 6 ++++++
2 files changed, 12 insertions(+)
diff --git a/.github/workflows/dev-desktop-builds.yml b/.github/workflows/dev-desktop-builds.yml
index 9cc75240e..ee19177d2 100644
--- a/.github/workflows/dev-desktop-builds.yml
+++ b/.github/workflows/dev-desktop-builds.yml
@@ -25,6 +25,12 @@ jobs:
container:
image: docker://barichello/godot-ci:4.3
steps:
+ - name: Setup WINE and rcedit 🍷
+ run: |
+ chown root:root -R ~
+ godot --headless --quit
+ echo 'export/windows/wine = "/usr/bin/wine64-stable"' >> ~/.config/godot/editor_settings-4.3.tres
+ echo 'export/windows/rcedit = "/opt/rcedit.exe"' >> ~/.config/godot/editor_settings-4.3.tres
- name: Checkout 🛎️
uses: actions/checkout@v4
with:
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 377160584..152c617e1 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -17,6 +17,12 @@ jobs:
container:
image: docker://barichello/godot-ci:4.3
steps:
+ - name: Setup WINE and rcedit 🍷
+ run: |
+ chown root:root -R ~
+ godot --headless --quit
+ echo 'export/windows/wine = "/usr/bin/wine64-stable"' >> ~/.config/godot/editor_settings-4.3.tres
+ echo 'export/windows/rcedit = "/opt/rcedit.exe"' >> ~/.config/godot/editor_settings-4.3.tres
- name: Checkout 🛎️
uses: actions/checkout@v4
with:
From 6dde03ed31a1a9c4f14ee617bf953efadb4e94e5 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Sun, 25 Aug 2024 23:10:31 +0300
Subject: [PATCH 025/162] Bump version to v1.0.3-dev
---
export_presets.cfg | 12 ++++++------
project.godot | 2 +-
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/export_presets.cfg b/export_presets.cfg
index f54c95675..32b513202 100644
--- a/export_presets.cfg
+++ b/export_presets.cfg
@@ -83,8 +83,8 @@ application/modify_resources=true
application/icon="res://assets/graphics/icons/icon.ico"
application/console_wrapper_icon=""
application/icon_interpolation=4
-application/file_version="1.0.2.0"
-application/product_version="1.0.2.0"
+application/file_version="1.0.3.0"
+application/product_version="1.0.3.0"
application/company_name="Orama Interactive"
application/product_name="Pixelorama"
application/file_description="Pixelorama - Your free & open-source sprite editor"
@@ -198,8 +198,8 @@ application/modify_resources=true
application/icon="res://assets/graphics/icons/icon.ico"
application/console_wrapper_icon=""
application/icon_interpolation=4
-application/file_version="1.0.2.0"
-application/product_version="1.0.2.0"
+application/file_version="1.0.3.0"
+application/product_version="1.0.3.0"
application/company_name="Orama Interactive"
application/product_name="Pixelorama"
application/file_description="Pixelorama - Your free & open-source sprite editor"
@@ -402,8 +402,8 @@ application/icon_interpolation=4
application/bundle_identifier="com.orama-interactive.pixelorama"
application/signature=""
application/app_category="Graphics-design"
-application/short_version="1.0.2"
-application/version="1.0.2"
+application/short_version="1.0.3"
+application/version="1.0.3"
application/copyright="Orama Interactive and contributors 2019-present"
application/copyright_localized={}
application/min_macos_version="10.12"
diff --git a/project.godot b/project.godot
index 353d3f655..264a7b517 100644
--- a/project.godot
+++ b/project.godot
@@ -12,7 +12,7 @@ config_version=5
config/name="Pixelorama"
config/description="Unleash your creativity with Pixelorama, a powerful and accessible open-source pixel art multitool. Whether you want to create sprites, tiles, animations, or just express yourself in the language of pixel art, this software will realize your pixel-perfect dreams with a vast toolbox of features."
-config/version="v1.0.2-stable"
+config/version="v1.0.3-dev"
run/main_scene="res://src/Main.tscn"
config/use_custom_user_dir=true
config/custom_user_dir_name="pixelorama"
From 987366fa8f6a003e3c447fc0dc7e92f48a86e39c Mon Sep 17 00:00:00 2001
From: alikin12 <12932510+alikin12@users.noreply.github.com>
Date: Wed, 28 Aug 2024 01:53:05 +0200
Subject: [PATCH 026/162] Add global layer buttons (#1085)
---
src/UI/Timeline/AnimationTimeline.gd | 59 +++++++++++++++++
src/UI/Timeline/AnimationTimeline.tscn | 89 ++++++++++++++++++++++++--
src/UI/Timeline/LayerButton.gd | 1 +
3 files changed, 142 insertions(+), 7 deletions(-)
diff --git a/src/UI/Timeline/AnimationTimeline.gd b/src/UI/Timeline/AnimationTimeline.gd
index 2d40b3813..24c847c42 100644
--- a/src/UI/Timeline/AnimationTimeline.gd
+++ b/src/UI/Timeline/AnimationTimeline.gd
@@ -24,6 +24,9 @@ var layer_effect_settings: AcceptDialog:
layer_effect_settings = load(LAYER_FX_SCENE_PATH).instantiate()
add_child(layer_effect_settings)
return layer_effect_settings
+var global_layer_visibility := true
+var global_layer_lock := false
+var global_layer_expand := true
@onready var old_scroll := 0 ## The previous scroll state of $ScrollContainer
@onready var tag_spacer := %TagSpacer as Control
@@ -1229,12 +1232,14 @@ func project_layer_added(layer: int) -> void:
Global.layer_vbox.move_child(layer_button, count - 1 - layer)
Global.cel_vbox.add_child(cel_hbox)
Global.cel_vbox.move_child(cel_hbox, count - 1 - layer)
+ update_global_layer_buttons()
func project_layer_removed(layer: int) -> void:
var count := Global.layer_vbox.get_child_count()
Global.layer_vbox.get_child(count - 1 - layer).free()
Global.cel_vbox.get_child(count - 1 - layer).free()
+ update_global_layer_buttons()
func project_cel_added(frame: int, layer: int) -> void:
@@ -1259,3 +1264,57 @@ func _on_layer_fx_pressed() -> void:
func _on_cel_size_slider_value_changed(value: float) -> void:
cel_size = value
+
+
+func _on_global_visibility_button_pressed() -> void:
+ var visible = !global_layer_visibility
+ for layer_button: LayerButton in Global.layer_vbox.get_children():
+ var layer: BaseLayer = Global.current_project.layers[layer_button.layer_index]
+ if layer.parent == null and layer.visible != visible:
+ layer_button.visibility_button.pressed.emit()
+
+
+func _on_global_lock_button_pressed() -> void:
+ var locked = !global_layer_lock
+ for layer_button: LayerButton in Global.layer_vbox.get_children():
+ var layer: BaseLayer = Global.current_project.layers[layer_button.layer_index]
+ if layer.parent == null and layer.locked != locked:
+ layer_button.lock_button.pressed.emit()
+
+
+func _on_global_expand_button_pressed() -> void:
+ var expand = !global_layer_expand
+ for layer_button: LayerButton in Global.layer_vbox.get_children():
+ var layer: BaseLayer = Global.current_project.layers[layer_button.layer_index]
+ if layer.parent == null and layer is GroupLayer and layer.expanded != expand:
+ layer_button.expand_button.pressed.emit()
+
+
+func update_global_layer_buttons() -> void:
+ global_layer_visibility = false
+ global_layer_lock = true
+ global_layer_expand = true
+ for layer: BaseLayer in Global.current_project.layers:
+ if layer.parent == null:
+ if layer.visible:
+ global_layer_visibility = true
+ if not layer.locked:
+ global_layer_lock = false
+ if layer is GroupLayer and not layer.expanded:
+ global_layer_expand = false
+ if global_layer_visibility and not global_layer_lock and not global_layer_expand:
+ break
+ if global_layer_visibility:
+ Global.change_button_texturerect(%GlobalVisibilityButton.get_child(0), "layer_visible.png")
+ else:
+ Global.change_button_texturerect(
+ %GlobalVisibilityButton.get_child(0), "layer_invisible.png"
+ )
+ if global_layer_lock:
+ Global.change_button_texturerect(%GlobalLockButton.get_child(0), "lock.png")
+ else:
+ Global.change_button_texturerect(%GlobalLockButton.get_child(0), "unlock.png")
+ if global_layer_expand:
+ Global.change_button_texturerect(%GlobalExpandButton.get_child(0), "group_expanded.png")
+ else:
+ Global.change_button_texturerect(%GlobalExpandButton.get_child(0), "group_collapsed.png")
diff --git a/src/UI/Timeline/AnimationTimeline.tscn b/src/UI/Timeline/AnimationTimeline.tscn
index 57daca63c..1bebacf92 100644
--- a/src/UI/Timeline/AnimationTimeline.tscn
+++ b/src/UI/Timeline/AnimationTimeline.tscn
@@ -1,4 +1,4 @@
-[gd_scene load_steps=73 format=3 uid="uid://dbr6mulku2qju"]
+[gd_scene load_steps=76 format=3 uid="uid://dbr6mulku2qju"]
[ext_resource type="Script" path="res://src/UI/Timeline/AnimationTimeline.gd" id="1"]
[ext_resource type="Texture2D" uid="uid://d36mlbmq06q4e" path="res://assets/graphics/layers/new.png" id="2"]
@@ -18,10 +18,13 @@
[ext_resource type="Texture2D" uid="uid://c7smxwfa8826j" path="res://assets/graphics/timeline/play.png" id="22"]
[ext_resource type="Texture2D" uid="uid://cw7nn7360atot" path="res://assets/graphics/timeline/previous_frame.png" id="23"]
[ext_resource type="Texture2D" uid="uid://esistdjfbrc4" path="res://assets/graphics/timeline/play_backwards.png" id="24"]
+[ext_resource type="Texture2D" uid="uid://c2b3htff5yox8" path="res://assets/graphics/layers/layer_visible.png" id="24_6ikqj"]
[ext_resource type="Texture2D" uid="uid://l4jj86y1hukm" path="res://assets/graphics/timeline/go_to_last_frame.png" id="25"]
+[ext_resource type="Texture2D" uid="uid://dhc0pnnqojd2m" path="res://assets/graphics/layers/unlock.png" id="25_7x5su"]
[ext_resource type="Texture2D" uid="uid://b2ndrc0cvy1m5" path="res://assets/graphics/timeline/next_frame.png" id="26"]
[ext_resource type="Script" path="res://src/UI/Nodes/ValueSlider.gd" id="26_tfw1u"]
[ext_resource type="Texture2D" uid="uid://cerkv5yx4cqeh" path="res://assets/graphics/timeline/copy_frame.png" id="27"]
+[ext_resource type="Texture2D" uid="uid://dndlglvqc7v6a" path="res://assets/graphics/layers/group_expanded.png" id="27_lrc8y"]
[ext_resource type="Texture2D" uid="uid://dukip7mvotxsp" path="res://assets/graphics/timeline/onion_skinning_off.png" id="29"]
[ext_resource type="Texture2D" uid="uid://dinubfua8gqhw" path="res://assets/graphics/timeline/expandable.png" id="30"]
[ext_resource type="Texture2D" uid="uid://fbwld5ofmocm" path="res://assets/graphics/timeline/loop.png" id="31"]
@@ -238,7 +241,6 @@ offset_bottom = 10.0
mouse_default_cursor_shape = 2
item_count = 3
popup/item_0/text = "Add Pixel Layer"
-popup/item_0/id = 0
popup/item_1/text = "Add Group Layer"
popup/item_1/id = 1
popup/item_2/text = "Add 3D Layer"
@@ -808,14 +810,86 @@ unique_name_in_owner = true
layout_mode = 2
theme_override_constants/separation = 1
-[node name="MarginContainer" type="MarginContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer"]
+[node name="HBoxContainer" type="HBoxContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer"]
+custom_minimum_size = Vector2(84, 0)
layout_mode = 2
+theme_override_constants/separation = 0
+
+[node name="GlobalVisibilityButton" type="Button" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer" groups=["UIButtons"]]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(28, 22)
+layout_mode = 2
+tooltip_text = "Toggle layer's visibility"
+focus_mode = 0
+mouse_default_cursor_shape = 2
+
+[node name="TextureRect" type="TextureRect" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer/GlobalVisibilityButton"]
+layout_mode = 0
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -11.0
+offset_top = -11.0
+offset_right = 11.0
+offset_bottom = 11.0
+size_flags_horizontal = 0
+size_flags_vertical = 0
+texture = ExtResource("24_6ikqj")
+
+[node name="GlobalLockButton" type="Button" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer" groups=["UIButtons"]]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(28, 22)
+layout_mode = 2
+tooltip_text = "Lock/unlock layer"
+focus_mode = 0
+mouse_default_cursor_shape = 2
+
+[node name="TextureRect" type="TextureRect" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer/GlobalLockButton"]
+layout_mode = 0
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -11.0
+offset_top = -11.0
+offset_right = 11.0
+offset_bottom = 11.0
+size_flags_horizontal = 0
+size_flags_vertical = 0
+texture = ExtResource("25_7x5su")
+
+[node name="GlobalExpandButton" type="Button" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer" groups=["UIButtons"]]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(28, 22)
+layout_mode = 2
+tooltip_text = "Expand/collapse group"
+focus_mode = 0
+mouse_default_cursor_shape = 2
+
+[node name="TextureRect" type="TextureRect" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer/GlobalExpandButton"]
+layout_mode = 0
+anchor_left = 0.5
+anchor_top = 0.5
+anchor_right = 0.5
+anchor_bottom = 0.5
+offset_left = -11.0
+offset_top = -11.0
+offset_right = 11.0
+offset_bottom = 11.0
+size_flags_horizontal = 0
+size_flags_vertical = 0
+texture = ExtResource("27_lrc8y")
+
+[node name="MarginContainer" type="MarginContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer"]
+layout_mode = 2
+size_flags_horizontal = 3
theme_override_constants/margin_left = 0
theme_override_constants/margin_top = 2
theme_override_constants/margin_right = 1
theme_override_constants/margin_bottom = 0
-[node name="OpacitySlider" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/MarginContainer" instance=ExtResource("9")]
+[node name="OpacitySlider" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer/MarginContainer" instance=ExtResource("9")]
unique_name_in_owner = true
custom_minimum_size = Vector2(0, 29)
layout_mode = 2
@@ -976,7 +1050,6 @@ size_flags_horizontal = 3
mouse_default_cursor_shape = 2
item_count = 2
popup/item_0/text = "Above canvas"
-popup/item_0/id = 0
popup/item_1/text = "Below canvas"
popup/item_1/id = 1
@@ -990,7 +1063,6 @@ layout_mode = 2
mouse_default_cursor_shape = 2
item_count = 2
popup/item_0/text = "Above canvas"
-popup/item_0/id = 0
popup/item_1/text = "Below canvas"
popup/item_1/id = 1
@@ -1034,7 +1106,10 @@ color = Color(0, 0.741176, 1, 0.501961)
[connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/LoopButtons/LoopAnim" to="." method="_on_LoopAnim_pressed"]
[connection signal="value_changed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/LoopButtons/FPSValue" to="." method="_on_FPSValue_value_changed"]
[connection signal="gui_input" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit" to="." method="_on_LayerFrameSplitContainer_gui_input"]
-[connection signal="value_changed" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/MarginContainer/OpacitySlider" to="." method="_on_opacity_slider_value_changed"]
+[connection signal="pressed" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer/GlobalVisibilityButton" to="." method="_on_global_visibility_button_pressed"]
+[connection signal="pressed" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer/GlobalLockButton" to="." method="_on_global_lock_button_pressed"]
+[connection signal="pressed" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer/GlobalExpandButton" to="." method="_on_global_expand_button_pressed"]
+[connection signal="value_changed" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer/MarginContainer/OpacitySlider" to="." method="_on_opacity_slider_value_changed"]
[connection signal="resized" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/LayerVBox" to="." method="_on_LayerVBox_resized"]
[connection signal="timeout" from="AnimationTimer" to="." method="_on_AnimationTimer_timeout"]
[connection signal="close_requested" from="TimelineSettings" to="." method="_on_timeline_settings_close_requested"]
diff --git a/src/UI/Timeline/LayerButton.gd b/src/UI/Timeline/LayerButton.gd
index cbb4dcfdb..800fea1e7 100644
--- a/src/UI/Timeline/LayerButton.gd
+++ b/src/UI/Timeline/LayerButton.gd
@@ -99,6 +99,7 @@ func _update_buttons_all_layers() -> void:
var expanded := layer.is_expanded_in_hierarchy()
layer_button.visible = expanded
Global.cel_vbox.get_child(layer_button.get_index()).visible = expanded
+ Global.animation_timeline.update_global_layer_buttons()
func _input(event: InputEvent) -> void:
From ab6c54ecb126dfbd6c9f08c42523337d33cdeeef Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Wed, 28 Aug 2024 17:40:48 +0300
Subject: [PATCH 027/162] If a palette fails to save, show an error popup with
an error code and message
Instead of just a notification, which can easily be missed and it doesn't explain the cause of the error
---
src/Autoload/Palettes.gd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/Autoload/Palettes.gd b/src/Autoload/Palettes.gd
index d7209aebd..236fde980 100644
--- a/src/Autoload/Palettes.gd
+++ b/src/Autoload/Palettes.gd
@@ -69,7 +69,7 @@ func save_palette(palette: Palette = current_palette) -> void:
palette.path = save_path
var err := palette.save_to_file()
if err != OK:
- Global.notification_label("Failed to save palette")
+ Global.popup_error("Failed to save palette. Error code %s (%s)" % [err, error_string(err)])
func copy_palette() -> void:
From 702197c639ef5239ecf56a2025586dc91291e8ec Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Wed, 28 Aug 2024 18:17:30 +0300
Subject: [PATCH 028/162] Fix issue where the '\n` escape character got
inserted inside the palette name, causing it to fail to be saved
---
src/Autoload/Palettes.gd | 4 ++--
src/Palette/Palette.gd | 4 +++-
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/src/Autoload/Palettes.gd b/src/Autoload/Palettes.gd
index 236fde980..aee7ff6b2 100644
--- a/src/Autoload/Palettes.gd
+++ b/src/Autoload/Palettes.gd
@@ -463,9 +463,9 @@ func _import_gpl(path: String, text: String) -> Palette:
comments += line.trim_prefix("#") + "\n"
# Some programs output palette name in a comment for old format
if line.begins_with("#Palette Name: "):
- palette_name = line.replace("#Palette Name: ", "")
+ palette_name = line.replace("#Palette Name: ", "").strip_edges()
elif line.begins_with("Name: "):
- palette_name = line.replace("Name: ", "")
+ palette_name = line.replace("Name: ", "").strip_edges()
elif line.begins_with("Columns: "):
# The width of the palette.
line = line.trim_prefix("Columns: ").strip_edges()
diff --git a/src/Palette/Palette.gd b/src/Palette/Palette.gd
index 5d4a969d7..80c97880c 100644
--- a/src/Palette/Palette.gd
+++ b/src/Palette/Palette.gd
@@ -7,7 +7,9 @@ const DEFAULT_WIDTH := 8
const DEFAULT_HEIGHT := 8
# Metadata
-var name := "Custom Palette"
+var name := "Custom Palette":
+ set(value):
+ name = value.strip_edges()
var comment := ""
var path := ""
From 613dd5d7f630735ed9b658cc44665024c3d0f20d Mon Sep 17 00:00:00 2001
From: Vaibhav Kubre
Date: Thu, 29 Aug 2024 21:37:48 +0530
Subject: [PATCH 029/162] feat: Added option to trim sprites empty area while
exporting (#1088)
* feat: Added trim sprite option works like charm
* fix: format issue
* ran working gdformat
---
src/Autoload/Export.gd | 3 +++
src/UI/Dialogs/ExportDialog.gd | 6 ++++++
src/UI/Dialogs/ExportDialog.tscn | 7 +++++++
3 files changed, 16 insertions(+)
diff --git a/src/Autoload/Export.gd b/src/Autoload/Export.gd
index 10a6bfadc..4521ac5c9 100644
--- a/src/Autoload/Export.gd
+++ b/src/Autoload/Export.gd
@@ -48,6 +48,7 @@ var current_tab := ExportTab.IMAGE
var processed_images: Array[ProcessedImage] = []
var export_json := false
var split_layers := false
+var trim_sprite := false
# Spritesheet options
var orientation := Orientation.COLUMNS
@@ -270,6 +271,8 @@ func process_animation(project := Global.current_project) -> void:
else:
var image := Image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8)
_blend_layers(image, frame)
+ if trim_sprite:
+ image = image.get_region(image.get_used_rect())
var duration := frame.duration * (1.0 / project.fps)
processed_images.append(ProcessedImage.new(image, project.frames.find(frame), duration))
diff --git a/src/UI/Dialogs/ExportDialog.gd b/src/UI/Dialogs/ExportDialog.gd
index 0e0ad5047..07f45b42f 100644
--- a/src/UI/Dialogs/ExportDialog.gd
+++ b/src/UI/Dialogs/ExportDialog.gd
@@ -448,6 +448,12 @@ func _on_MultipleAnimationsDirectories_toggled(button_pressed: bool) -> void:
Export.new_dir_for_each_frame_tag = button_pressed
+func _on_TrimSprite_toggled(toggled_on: bool) -> void:
+ Export.trim_sprite = toggled_on
+ Export.process_data()
+ set_preview()
+
+
func _on_Frames_item_selected(id: int) -> void:
Export.frame_current_tag = id
Export.process_data()
diff --git a/src/UI/Dialogs/ExportDialog.tscn b/src/UI/Dialogs/ExportDialog.tscn
index 16458fcfe..909b02812 100644
--- a/src/UI/Dialogs/ExportDialog.tscn
+++ b/src/UI/Dialogs/ExportDialog.tscn
@@ -301,6 +301,12 @@ tooltip_text = "Creates multiple files but every file is stored in different fol
mouse_default_cursor_shape = 2
text = "Create new folder for each frame tag"
+[node name="TrimSprite" type="CheckBox" parent="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer" groups=["ExportImageOptions", "ExportMultipleFilesOptions"]]
+layout_mode = 2
+tooltip_text = "Trims sprite to visible portion of the spirte, considering each pixel with a non-zero alpha channel as visible."
+mouse_default_cursor_shape = 2
+text = "Trim Sprite"
+
[node name="PathDialog" type="FileDialog" parent="." groups=["FileDialogs"]]
mode = 2
title = "Open a Directory"
@@ -354,6 +360,7 @@ size_flags_horizontal = 3
[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/SplitLayers" to="." method="_on_split_layers_toggled"]
[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/IncludeTagsInFilename" to="." method="_on_IncludeTagsInFilename_toggled"]
[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/MultipleAnimationsDirectories" to="." method="_on_MultipleAnimationsDirectories_toggled"]
+[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/TrimSprite" to="." method="_on_TrimSprite_toggled"]
[connection signal="canceled" from="PathDialog" to="." method="_on_path_dialog_canceled"]
[connection signal="dir_selected" from="PathDialog" to="." method="_on_path_dialog_dir_selected"]
[connection signal="confirmed" from="FileExistsAlert" to="." method="_on_FileExistsAlert_confirmed"]
From 4fa89815903a69a8043c58289820702f03e2e344 Mon Sep 17 00:00:00 2001
From: Donte <134863321+donte5405@users.noreply.github.com>
Date: Sat, 31 Aug 2024 02:58:28 +0700
Subject: [PATCH 030/162] Add onion skinning opacity adjustment (#1091)
Co-authored-by: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
---
src/UI/Canvas/Canvas.tscn | 4 ++--
src/UI/Canvas/OnionSkinning.gd | 3 ++-
src/UI/Timeline/AnimationTimeline.gd | 8 ++++++++
src/UI/Timeline/AnimationTimeline.tscn | 10 ++++++++++
4 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/src/UI/Canvas/Canvas.tscn b/src/UI/Canvas/Canvas.tscn
index 1f7f66329..9078617b4 100644
--- a/src/UI/Canvas/Canvas.tscn
+++ b/src/UI/Canvas/Canvas.tscn
@@ -87,10 +87,10 @@ script = ExtResource("7")
material = SubResource("3")
centered = false
-[node name="OnionPast" type="Node2D" parent="."]
+[node name="OnionPast" type="Node2D" parent="." groups=["canvas_onion_skinning"]]
script = ExtResource("12")
-[node name="OnionFuture" type="Node2D" parent="."]
+[node name="OnionFuture" type="Node2D" parent="." groups=["canvas_onion_skinning"]]
script = ExtResource("12")
[node name="MouseGuideContainer" parent="." instance=ExtResource("11")]
diff --git a/src/UI/Canvas/OnionSkinning.gd b/src/UI/Canvas/OnionSkinning.gd
index c03a8de4f..2f2409fa1 100644
--- a/src/UI/Canvas/OnionSkinning.gd
+++ b/src/UI/Canvas/OnionSkinning.gd
@@ -3,6 +3,7 @@ extends Node2D
enum { PAST, FUTURE }
var type := PAST
+var opacity := 0.6
var blue_red_color := Color.BLUE
var rate := Global.onion_skinning_past_rate
@@ -33,7 +34,7 @@ func _draw() -> void:
if layer.is_visible_in_hierarchy():
# Ignore layer if it has the "_io" suffix in its name (case in-sensitive)
if not (layer.name.to_lower().ends_with("_io")):
- color.a = 0.6 / i
+ color.a = opacity / i
if [change, layer_i] in project.selected_cels:
draw_texture(
cel.image_texture, Global.canvas.move_preview_location, color
diff --git a/src/UI/Timeline/AnimationTimeline.gd b/src/UI/Timeline/AnimationTimeline.gd
index 24c847c42..19580d054 100644
--- a/src/UI/Timeline/AnimationTimeline.gd
+++ b/src/UI/Timeline/AnimationTimeline.gd
@@ -98,6 +98,8 @@ func _ready() -> void:
Global.cel_switched.connect(_cel_switched)
# Makes sure that the frame and tag scroll bars are in the right place:
Global.layer_vbox.emit_signal.call_deferred("resized")
+ # Set the default opacity for the onion skinning
+ get_node("%OnionSkinningOpacity").value = 60
func _notification(what: int) -> void:
@@ -1266,6 +1268,12 @@ func _on_cel_size_slider_value_changed(value: float) -> void:
cel_size = value
+func _on_onion_skinning_opacity_value_changed(value: float) -> void:
+ for onion_skinning_node: Node2D in get_tree().get_nodes_in_group("canvas_onion_skinning"):
+ onion_skinning_node.opacity = value / 100
+ onion_skinning_node.queue_redraw()
+
+
func _on_global_visibility_button_pressed() -> void:
var visible = !global_layer_visibility
for layer_button: LayerButton in Global.layer_vbox.get_children():
diff --git a/src/UI/Timeline/AnimationTimeline.tscn b/src/UI/Timeline/AnimationTimeline.tscn
index 1bebacf92..d07d380e2 100644
--- a/src/UI/Timeline/AnimationTimeline.tscn
+++ b/src/UI/Timeline/AnimationTimeline.tscn
@@ -1066,6 +1066,15 @@ popup/item_0/text = "Above canvas"
popup/item_1/text = "Below canvas"
popup/item_1/id = 1
+[node name="OnionSkinningOpacityLabel" type="Label" parent="TimelineSettings/MarginContainer/VBoxContainer/OnionSkinningOptionsContainer"]
+layout_mode = 2
+text = "Opacity"
+
+[node name="OnionSkinningOpacity" parent="TimelineSettings/MarginContainer/VBoxContainer/OnionSkinningOptionsContainer" instance=ExtResource("9")]
+unique_name_in_owner = true
+layout_mode = 2
+suffix = "%"
+
[node name="BlueRedMode" type="CheckBox" parent="TimelineSettings/MarginContainer/VBoxContainer"]
unique_name_in_owner = true
layout_mode = 2
@@ -1120,4 +1129,5 @@ color = Color(0, 0.741176, 1, 0.501961)
[connection signal="value_changed" from="TimelineSettings/MarginContainer/VBoxContainer/OnionSkinningOptionsContainer/FutureOnionSkinning" to="." method="_on_FutureOnionSkinning_value_changed"]
[connection signal="item_selected" from="TimelineSettings/MarginContainer/VBoxContainer/OnionSkinningOptionsContainer/PastPlacement" to="." method="_on_PastPlacement_item_selected"]
[connection signal="item_selected" from="TimelineSettings/MarginContainer/VBoxContainer/OnionSkinningOptionsContainer/FuturePlacement" to="." method="_on_FuturePlacement_item_selected"]
+[connection signal="value_changed" from="TimelineSettings/MarginContainer/VBoxContainer/OnionSkinningOptionsContainer/OnionSkinningOpacity" to="." method="_on_onion_skinning_opacity_value_changed"]
[connection signal="toggled" from="TimelineSettings/MarginContainer/VBoxContainer/BlueRedMode" to="." method="_on_BlueRedMode_toggled"]
From a7f1486ec35b076fe5ba2371db7d608ec8cec3ed Mon Sep 17 00:00:00 2001
From: Variable <77773850+Variable-ind@users.noreply.github.com>
Date: Sat, 31 Aug 2024 04:53:27 +0500
Subject: [PATCH 031/162] Index Map (#1093)
* Index Map
* Formatting
* improve description a bit.
---
src/Classes/ShaderLoader.gd | 21 +++++++++++++++++++
src/Shaders/Effects/IndexMap.gdshader | 18 ++++++++++++++++
.../LayerEffects/LayerEffectsSettings.gd | 1 +
3 files changed, 40 insertions(+)
create mode 100644 src/Shaders/Effects/IndexMap.gdshader
diff --git a/src/Classes/ShaderLoader.gd b/src/Classes/ShaderLoader.gd
index 85e9025c4..d8bf8aa97 100644
--- a/src/Classes/ShaderLoader.gd
+++ b/src/Classes/ShaderLoader.gd
@@ -15,10 +15,31 @@ static func create_ui_for_shader_uniforms(
) -> void:
var code := shader.code.split("\n")
var uniforms: PackedStringArray = []
+ var description: String = ""
+ var descriprion_began := false
for line in code:
+ ## Management of "end" tags
+ if line.begins_with("// (end DESCRIPTION)"):
+ descriprion_began = false
+ if descriprion_began:
+ description += "\n" + line.strip_edges()
+
+ ## Detection of uniforms
if line.begins_with("uniform"):
uniforms.append(line)
+ ## Management of "begin" tags
+ elif line.begins_with("// (begin DESCRIPTION)"):
+ descriprion_began = true
+ ## Validation of begin/end tags
+ if descriprion_began == true: ## Description started but never ended. treat it as an error
+ print("Shader description started but never finished. Assuming empty description")
+ description = ""
+ if not description.is_empty():
+ parent_node.tooltip_text = str(
+ "Description:\n", description.replace("//", "").strip_edges()
+ )
+
for uniform in uniforms:
# Example uniform:
# uniform float parameter_name : hint_range(0, 255) = 100.0;
diff --git a/src/Shaders/Effects/IndexMap.gdshader b/src/Shaders/Effects/IndexMap.gdshader
new file mode 100644
index 000000000..b834b1772
--- /dev/null
+++ b/src/Shaders/Effects/IndexMap.gdshader
@@ -0,0 +1,18 @@
+// Authored by Variable (6 May 2022)
+shader_type canvas_item;
+render_mode unshaded;
+
+uniform sampler2D map_texture : filter_nearest; // The map texture
+
+// (begin DESCRIPTION)
+// The Red and Green values (0-255) of tool color will be treated as an x and y position
+// respectively instead of color components.
+// When you draw, color will be taken from the x-y position in the "Map Texture".
+// (end DESCRIPTION)
+void fragment(){
+ vec4 col = texture(TEXTURE, UV);
+ vec2 map_size = vec2(textureSize(map_texture, 0));
+ vec2 lookup_uv = vec2(round(col.x * 255.0)/(map_size.x), round(col.y * 255.0)/(map_size.y));
+ vec4 index_color = texture(map_texture, lookup_uv);
+ COLOR = index_color;
+}
diff --git a/src/UI/Timeline/LayerEffects/LayerEffectsSettings.gd b/src/UI/Timeline/LayerEffects/LayerEffectsSettings.gd
index ef41fb278..3985dc75b 100644
--- a/src/UI/Timeline/LayerEffects/LayerEffectsSettings.gd
+++ b/src/UI/Timeline/LayerEffects/LayerEffectsSettings.gd
@@ -23,6 +23,7 @@ var effects: Array[LayerEffect] = [
LayerEffect.new("Pixelize", preload("res://src/Shaders/Effects/Pixelize.gdshader")),
LayerEffect.new("Posterize", preload("res://src/Shaders/Effects/Posterize.gdshader")),
LayerEffect.new("Gradient Map", preload("res://src/Shaders/Effects/GradientMap.gdshader")),
+ LayerEffect.new("Index Map", preload("res://src/Shaders/Effects/IndexMap.gdshader")),
]
@onready var enabled_button: CheckButton = $VBoxContainer/HBoxContainer/EnabledButton
From e2d18d8cebd8e2315b2bf3eaae3ed06c57b3e58e Mon Sep 17 00:00:00 2001
From: CJMAXiK
Date: Sun, 1 Sep 2024 01:38:06 +0300
Subject: [PATCH 032/162] [skip ci] Update README.md to add WinGet as an
installation variant (#1094)
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 3220655c1..edaa49a45 100644
--- a/README.md
+++ b/README.md
@@ -43,6 +43,7 @@ Stable versions:
- [GitHub Pages (Web)](https://orama-interactive.github.io/Pixelorama/)
- [Flathub (Linux)](https://flathub.org/apps/details/com.orama_interactive.Pixelorama)
- [Snap Store (Linux)](https://snapcraft.io/pixelorama)
+- WinGet (Windows) - `winget install pixelorama`
You can also find early access builds in the [GitHub Actions page](https://github.com/Orama-Interactive/Pixelorama/actions). There's also a [Web version available](https://orama-interactive.github.io/Pixelorama/early_access/).
Keep in mind that these versions will have bugs and are unstable. Unless you're interested in testing the main branch of Pixelorama, it's recommended that you stick to a stable version.
From 1460ba2e8928e8fb547b54fed4450119a935b25d Mon Sep 17 00:00:00 2001
From: alikin12 <12932510+alikin12@users.noreply.github.com>
Date: Sun, 1 Sep 2024 01:30:36 +0200
Subject: [PATCH 033/162] Set timeline layer and frame header to be fixed on
top (#1095)
---
src/UI/Timeline/AnimationTimeline.gd | 12 +++
src/UI/Timeline/AnimationTimeline.tscn | 125 ++++++++++++++++---------
2 files changed, 92 insertions(+), 45 deletions(-)
diff --git a/src/UI/Timeline/AnimationTimeline.gd b/src/UI/Timeline/AnimationTimeline.gd
index 19580d054..c885cb4f7 100644
--- a/src/UI/Timeline/AnimationTimeline.gd
+++ b/src/UI/Timeline/AnimationTimeline.gd
@@ -32,6 +32,7 @@ var global_layer_expand := true
@onready var tag_spacer := %TagSpacer as Control
@onready var layer_settings_container := %LayerSettingsContainer as VBoxContainer
@onready var layer_container := %LayerContainer as VBoxContainer
+@onready var layer_header_container := %LayerHeaderContainer as HBoxContainer
@onready var add_layer_list := %AddLayerList as MenuButton
@onready var remove_layer := %RemoveLayer as Button
@onready var move_up_layer := %MoveUpLayer as Button
@@ -43,6 +44,7 @@ var global_layer_expand := true
@onready var frame_scroll_bar := %FrameScrollBar as HScrollBar
@onready var tag_scroll_container := %TagScroll as ScrollContainer
@onready var layer_frame_h_split := %LayerFrameHSplit as HSplitContainer
+@onready var layer_frame_header_h_split := %LayerFrameHeaderHSplit as HSplitContainer
@onready var delete_frame := %DeleteFrame as Button
@onready var move_frame_left := %MoveFrameLeft as Button
@onready var move_frame_right := %MoveFrameRight as Button
@@ -60,6 +62,7 @@ func _ready() -> void:
Global.control.find_child("LayerProperties").layer_property_changed.connect(_update_layer_ui)
min_cel_size = get_tree().current_scene.theme.default_font_size + 24
layer_container.custom_minimum_size.x = layer_settings_container.size.x + 12
+ layer_header_container.custom_minimum_size.x = layer_container.custom_minimum_size.x
cel_size = min_cel_size
cel_size_slider.min_value = min_cel_size
cel_size_slider.max_value = max_cel_size
@@ -71,6 +74,7 @@ func _ready() -> void:
_fill_blend_modes_option_button()
# Config loading
layer_frame_h_split.split_offset = Global.config_cache.get_value("timeline", "layer_size", 0)
+ layer_frame_header_h_split.split_offset = layer_frame_h_split.split_offset
cel_size = Global.config_cache.get_value("timeline", "cel_size", cel_size) # Call setter
var past_rate = Global.config_cache.get_value(
"timeline", "past_rate", Global.onion_skinning_past_rate
@@ -109,6 +113,7 @@ func _notification(what: int) -> void:
await get_tree().process_frame
if is_instance_valid(layer_settings_container):
layer_container.custom_minimum_size.x = layer_settings_container.size.x + 12
+ layer_header_container.custom_minimum_size.x = layer_container.custom_minimum_size.x
func _input(event: InputEvent) -> void:
@@ -1326,3 +1331,10 @@ func update_global_layer_buttons() -> void:
Global.change_button_texturerect(%GlobalExpandButton.get_child(0), "group_expanded.png")
else:
Global.change_button_texturerect(%GlobalExpandButton.get_child(0), "group_collapsed.png")
+
+
+func _on_layer_frame_h_split_dragged(offset: int) -> void:
+ if layer_frame_header_h_split.split_offset != offset:
+ layer_frame_header_h_split.split_offset = offset
+ if layer_frame_h_split.split_offset != offset:
+ layer_frame_h_split.split_offset = offset
diff --git a/src/UI/Timeline/AnimationTimeline.tscn b/src/UI/Timeline/AnimationTimeline.tscn
index d07d380e2..ba10b0341 100644
--- a/src/UI/Timeline/AnimationTimeline.tscn
+++ b/src/UI/Timeline/AnimationTimeline.tscn
@@ -786,36 +786,32 @@ mouse_filter = 1
[node name="MainBodyVBoxContainer" type="VBoxContainer" parent="TimelineContainer/MainBodyPanel"]
layout_mode = 2
size_flags_horizontal = 3
+theme_override_constants/separation = 0
-[node name="TimelineScroll" type="ScrollContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer"]
-layout_mode = 2
-size_flags_vertical = 3
-
-[node name="MarginContainer" type="MarginContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll"]
+[node name="MarginContainer" type="MarginContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer"]
+clip_contents = true
+custom_minimum_size = Vector2(0, 38)
layout_mode = 2
size_flags_horizontal = 3
-size_flags_vertical = 3
+theme_override_constants/margin_bottom = 0
-[node name="LayerFrameHSplit" type="HSplitContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer"]
+[node name="LayerFrameHeaderHSplit" type="HSplitContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
size_flags_vertical = 3
-theme_override_constants/separation = 0
+theme_override_constants/separation = 6
theme_override_constants/minimum_grab_thickness = 12
theme_override_icons/grabber = SubResource("ImageTexture_ku1qg")
-[node name="LayerContainer" type="VBoxContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit"]
+[node name="LayerHeaderContainer" type="HBoxContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit"]
unique_name_in_owner = true
-layout_mode = 2
-theme_override_constants/separation = 1
-
-[node name="HBoxContainer" type="HBoxContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer"]
custom_minimum_size = Vector2(84, 0)
layout_mode = 2
+size_flags_vertical = 0
theme_override_constants/separation = 0
-[node name="GlobalVisibilityButton" type="Button" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer" groups=["UIButtons"]]
+[node name="GlobalVisibilityButton" type="Button" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit/LayerHeaderContainer" groups=["UIButtons"]]
unique_name_in_owner = true
custom_minimum_size = Vector2(28, 22)
layout_mode = 2
@@ -823,7 +819,7 @@ tooltip_text = "Toggle layer's visibility"
focus_mode = 0
mouse_default_cursor_shape = 2
-[node name="TextureRect" type="TextureRect" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer/GlobalVisibilityButton"]
+[node name="TextureRect" type="TextureRect" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit/LayerHeaderContainer/GlobalVisibilityButton"]
layout_mode = 0
anchor_left = 0.5
anchor_top = 0.5
@@ -837,7 +833,7 @@ size_flags_horizontal = 0
size_flags_vertical = 0
texture = ExtResource("24_6ikqj")
-[node name="GlobalLockButton" type="Button" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer" groups=["UIButtons"]]
+[node name="GlobalLockButton" type="Button" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit/LayerHeaderContainer" groups=["UIButtons"]]
unique_name_in_owner = true
custom_minimum_size = Vector2(28, 22)
layout_mode = 2
@@ -845,7 +841,7 @@ tooltip_text = "Lock/unlock layer"
focus_mode = 0
mouse_default_cursor_shape = 2
-[node name="TextureRect" type="TextureRect" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer/GlobalLockButton"]
+[node name="TextureRect" type="TextureRect" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit/LayerHeaderContainer/GlobalLockButton"]
layout_mode = 0
anchor_left = 0.5
anchor_top = 0.5
@@ -859,7 +855,7 @@ size_flags_horizontal = 0
size_flags_vertical = 0
texture = ExtResource("25_7x5su")
-[node name="GlobalExpandButton" type="Button" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer" groups=["UIButtons"]]
+[node name="GlobalExpandButton" type="Button" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit/LayerHeaderContainer" groups=["UIButtons"]]
unique_name_in_owner = true
custom_minimum_size = Vector2(28, 22)
layout_mode = 2
@@ -867,7 +863,7 @@ tooltip_text = "Expand/collapse group"
focus_mode = 0
mouse_default_cursor_shape = 2
-[node name="TextureRect" type="TextureRect" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer/GlobalExpandButton"]
+[node name="TextureRect" type="TextureRect" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit/LayerHeaderContainer/GlobalExpandButton"]
layout_mode = 0
anchor_left = 0.5
anchor_top = 0.5
@@ -881,7 +877,7 @@ size_flags_horizontal = 0
size_flags_vertical = 0
texture = ExtResource("27_lrc8y")
-[node name="MarginContainer" type="MarginContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer"]
+[node name="MarginContainer" type="MarginContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit/LayerHeaderContainer"]
layout_mode = 2
size_flags_horizontal = 3
theme_override_constants/margin_left = 0
@@ -889,7 +885,7 @@ theme_override_constants/margin_top = 2
theme_override_constants/margin_right = 1
theme_override_constants/margin_bottom = 0
-[node name="OpacitySlider" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer/MarginContainer" instance=ExtResource("9")]
+[node name="OpacitySlider" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit/LayerHeaderContainer/MarginContainer" instance=ExtResource("9")]
unique_name_in_owner = true
custom_minimum_size = Vector2(0, 29)
layout_mode = 2
@@ -897,6 +893,56 @@ size_flags_vertical = 0
value = 100.0
prefix = "Opacity:"
+[node name="MarginContainer" type="MarginContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit"]
+layout_mode = 2
+theme_override_constants/margin_left = -2
+theme_override_constants/margin_top = 0
+theme_override_constants/margin_right = 0
+theme_override_constants/margin_bottom = 0
+
+[node name="FrameScrollHeaderContainer" type="Container" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit/MarginContainer" node_paths=PackedStringArray("h_scroll_bar")]
+clip_contents = true
+layout_mode = 2
+script = ExtResource("11")
+h_scroll_bar = NodePath("../../../../FrameScrollBar")
+
+[node name="MarginContainer" type="MarginContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit/MarginContainer/FrameScrollHeaderContainer"]
+layout_mode = 2
+theme_override_constants/margin_left = 1
+theme_override_constants/margin_top = 2
+theme_override_constants/margin_right = 0
+theme_override_constants/margin_bottom = 0
+
+[node name="FrameHBox" type="HBoxContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit/MarginContainer/FrameScrollHeaderContainer/MarginContainer"]
+custom_minimum_size = Vector2(0, 30)
+layout_mode = 2
+theme_override_constants/separation = 0
+
+[node name="TimelineScroll" type="ScrollContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer"]
+layout_mode = 2
+size_flags_vertical = 3
+vertical_scroll_mode = 2
+
+[node name="MarginContainer" type="MarginContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll"]
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+theme_override_constants/margin_right = 0
+
+[node name="LayerFrameHSplit" type="HSplitContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+size_flags_vertical = 3
+theme_override_constants/separation = 6
+theme_override_constants/minimum_grab_thickness = 12
+theme_override_icons/grabber = SubResource("ImageTexture_ku1qg")
+
+[node name="LayerContainer" type="VBoxContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit"]
+unique_name_in_owner = true
+layout_mode = 2
+theme_override_constants/separation = 1
+
[node name="LayerVBox" type="VBoxContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer"]
layout_mode = 2
size_flags_horizontal = 3
@@ -905,7 +951,7 @@ theme_override_constants/separation = 0
[node name="MarginContainer" type="MarginContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit"]
layout_mode = 2
theme_override_constants/margin_left = -2
-theme_override_constants/margin_top = 0
+theme_override_constants/margin_top = -2
theme_override_constants/margin_right = 0
theme_override_constants/margin_bottom = 0
@@ -914,7 +960,7 @@ unique_name_in_owner = true
clip_contents = true
layout_mode = 2
script = ExtResource("11")
-h_scroll_bar = NodePath("../../../../../BreakFreeFromContainer/FrameScrollBar")
+h_scroll_bar = NodePath("../../../../../FrameScrollBar")
[node name="MarginContainer" type="MarginContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/MarginContainer/FrameScrollContainer"]
layout_mode = 2
@@ -923,28 +969,14 @@ theme_override_constants/margin_top = 2
theme_override_constants/margin_right = 0
theme_override_constants/margin_bottom = 0
-[node name="FrameAndCelBox" type="VBoxContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/MarginContainer/FrameScrollContainer/MarginContainer"]
+[node name="CelVBox" type="VBoxContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/MarginContainer/FrameScrollContainer/MarginContainer"]
layout_mode = 2
theme_override_constants/separation = 0
-[node name="FrameHBox" type="HBoxContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/MarginContainer/FrameScrollContainer/MarginContainer/FrameAndCelBox"]
-custom_minimum_size = Vector2(0, 30)
-layout_mode = 2
-theme_override_constants/separation = 0
-
-[node name="CelVBox" type="VBoxContainer" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/MarginContainer/FrameScrollContainer/MarginContainer/FrameAndCelBox"]
-layout_mode = 2
-theme_override_constants/separation = 0
-
-[node name="BreakFreeFromContainer" type="Control" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer"]
-layout_mode = 2
-
-[node name="FrameScrollBar" type="HScrollBar" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/BreakFreeFromContainer"]
+[node name="FrameScrollBar" type="HScrollBar" parent="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer"]
unique_name_in_owner = true
-layout_mode = 0
-anchor_right = 1.0
-offset_left = 41.0
-offset_top = -12.0
+z_index = 2
+layout_mode = 2
size_flags_horizontal = 3
[node name="AnimationTimer" type="Timer" parent="."]
@@ -1114,11 +1146,14 @@ color = Color(0, 0.741176, 1, 0.501961)
[connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/LoopButtons/OnionSkinning" to="." method="_on_OnionSkinning_pressed"]
[connection signal="pressed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/LoopButtons/LoopAnim" to="." method="_on_LoopAnim_pressed"]
[connection signal="value_changed" from="TimelineContainer/TimelineButtons/VBoxContainer/AnimationToolsScrollContainer/AnimationTools/AnimationButtons/LoopButtons/FPSValue" to="." method="_on_FPSValue_value_changed"]
+[connection signal="dragged" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit" to="." method="_on_layer_frame_h_split_dragged"]
+[connection signal="gui_input" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit" to="." method="_on_LayerFrameSplitContainer_gui_input"]
+[connection signal="pressed" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit/LayerHeaderContainer/GlobalVisibilityButton" to="." method="_on_global_visibility_button_pressed"]
+[connection signal="pressed" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit/LayerHeaderContainer/GlobalLockButton" to="." method="_on_global_lock_button_pressed"]
+[connection signal="pressed" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit/LayerHeaderContainer/GlobalExpandButton" to="." method="_on_global_expand_button_pressed"]
+[connection signal="value_changed" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/MarginContainer/LayerFrameHeaderHSplit/LayerHeaderContainer/MarginContainer/OpacitySlider" to="." method="_on_opacity_slider_value_changed"]
+[connection signal="dragged" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit" to="." method="_on_layer_frame_h_split_dragged"]
[connection signal="gui_input" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit" to="." method="_on_LayerFrameSplitContainer_gui_input"]
-[connection signal="pressed" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer/GlobalVisibilityButton" to="." method="_on_global_visibility_button_pressed"]
-[connection signal="pressed" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer/GlobalLockButton" to="." method="_on_global_lock_button_pressed"]
-[connection signal="pressed" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer/GlobalExpandButton" to="." method="_on_global_expand_button_pressed"]
-[connection signal="value_changed" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/HBoxContainer/MarginContainer/OpacitySlider" to="." method="_on_opacity_slider_value_changed"]
[connection signal="resized" from="TimelineContainer/MainBodyPanel/MainBodyVBoxContainer/TimelineScroll/MarginContainer/LayerFrameHSplit/LayerContainer/LayerVBox" to="." method="_on_LayerVBox_resized"]
[connection signal="timeout" from="AnimationTimer" to="." method="_on_AnimationTimer_timeout"]
[connection signal="close_requested" from="TimelineSettings" to="." method="_on_timeline_settings_close_requested"]
From 69ce932f1cfcb72af3095d182af6598edccc82bb Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Sun, 1 Sep 2024 02:49:13 +0300
Subject: [PATCH 034/162] Add a quality slider to the export dialog when
exporting jpeg files
---
Translations/Translations.pot | 4 ++++
src/UI/Dialogs/ExportDialog.gd | 8 ++++++++
src/UI/Dialogs/ExportDialog.tscn | 34 ++++++++++++++++++++++++--------
3 files changed, 38 insertions(+), 8 deletions(-)
diff --git a/Translations/Translations.pot b/Translations/Translations.pot
index d004d9de2..67fe10234 100644
--- a/Translations/Translations.pot
+++ b/Translations/Translations.pot
@@ -544,6 +544,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
diff --git a/src/UI/Dialogs/ExportDialog.gd b/src/UI/Dialogs/ExportDialog.gd
index 07f45b42f..8924584e3 100644
--- a/src/UI/Dialogs/ExportDialog.gd
+++ b/src/UI/Dialogs/ExportDialog.gd
@@ -344,6 +344,10 @@ func _on_Resize_value_changed(value: float) -> void:
update_dimensions_label()
+func _on_quality_value_changed(value: float) -> void:
+ Export.save_quality = value / 100.0
+
+
func _on_Interpolation_item_selected(id: Image.Interpolation) -> void:
Export.interpolation = id
@@ -392,6 +396,10 @@ func _on_FileFormat_item_selected(idx: int) -> void:
else:
get_tree().set_group("ExportMultipleFilesOptions", "disabled", true)
get_tree().set_group("ExportMultipleFilesEditableOptions", "editable", false)
+
+ var show_quality := id == Export.FileFormat.JPEG
+ %QualityLabel.visible = show_quality
+ %Quality.visible = show_quality
set_preview()
diff --git a/src/UI/Dialogs/ExportDialog.tscn b/src/UI/Dialogs/ExportDialog.tscn
index 909b02812..b61e2446e 100644
--- a/src/UI/Dialogs/ExportDialog.tscn
+++ b/src/UI/Dialogs/ExportDialog.tscn
@@ -79,12 +79,11 @@ unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
mouse_default_cursor_shape = 2
-item_count = 4
selected = 0
+item_count = 4
popup/item_0/text = "Columns"
popup/item_0/id = 1
popup/item_1/text = "Rows"
-popup/item_1/id = 0
popup/item_2/text = "Tags by column"
popup/item_2/id = 2
popup/item_3/text = "Tags by row"
@@ -116,7 +115,6 @@ size_flags_horizontal = 3
mouse_default_cursor_shape = 2
item_count = 2
popup/item_0/text = "All frames"
-popup/item_0/id = 0
popup/item_1/text = "Selected frames"
popup/item_1/id = 1
@@ -130,7 +128,6 @@ layout_mode = 2
mouse_default_cursor_shape = 2
item_count = 2
popup/item_0/text = "Visible layers"
-popup/item_0/id = 0
popup/item_1/text = "Selected layers"
popup/item_1/id = 1
@@ -143,10 +140,9 @@ custom_minimum_size = Vector2(100, 0)
layout_mode = 2
size_flags_horizontal = 3
mouse_default_cursor_shape = 2
-item_count = 3
selected = 0
+item_count = 3
popup/item_0/text = "Forward"
-popup/item_0/id = 0
popup/item_1/text = "Backwards"
popup/item_1/id = 1
popup/item_2/text = "Ping-Pong"
@@ -176,6 +172,28 @@ script = ExtResource("4")
suffix = "%"
snap_step = 100.0
+[node name="QualityLabel" type="Label" parent="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer"]
+unique_name_in_owner = true
+visible = false
+custom_minimum_size = Vector2(30, 0)
+layout_mode = 2
+text = "Quality:"
+
+[node name="Quality" type="TextureProgressBar" parent="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer"]
+unique_name_in_owner = true
+visible = false
+layout_mode = 2
+focus_mode = 2
+mouse_default_cursor_shape = 2
+theme_type_variation = &"ValueSlider"
+value = 75.0
+nine_patch_stretch = true
+stretch_margin_left = 3
+stretch_margin_top = 3
+stretch_margin_right = 3
+stretch_margin_bottom = 3
+script = ExtResource("4")
+
[node name="DimensionLabelText" type="Label" parent="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer"]
layout_mode = 2
size_flags_horizontal = 3
@@ -255,10 +273,9 @@ unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
mouse_default_cursor_shape = 2
-item_count = 5
selected = 0
+item_count = 5
popup/item_0/text = "Nearest"
-popup/item_0/id = 0
popup/item_1/text = "Bilinear"
popup/item_1/id = 1
popup/item_2/text = "Cubic"
@@ -350,6 +367,7 @@ size_flags_horizontal = 3
[connection signal="item_selected" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/Layers" to="." method="_on_Layers_item_selected"]
[connection signal="item_selected" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/Direction" to="." method="_on_Direction_item_selected"]
[connection signal="value_changed" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/Resize" to="." method="_on_Resize_value_changed"]
+[connection signal="value_changed" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/Quality" to="." method="_on_quality_value_changed"]
[connection signal="text_changed" from="VBoxContainer/VSplitContainer/VBoxContainer/FilePath/PathLineEdit" to="." method="_on_PathLineEdit_text_changed"]
[connection signal="pressed" from="VBoxContainer/VSplitContainer/VBoxContainer/FilePath/PathButton" to="." method="_on_PathButton_pressed"]
[connection signal="text_changed" from="VBoxContainer/VSplitContainer/VBoxContainer/FilePath/FileLineEdit" to="." method="_on_FileLineEdit_text_changed"]
From 46b0b124f4d33660ccdfd6692eb2f6f848398d60 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Sun, 1 Sep 2024 03:25:26 +0300
Subject: [PATCH 035/162] I forgot to include Export.gd in the previous commit
Oops
---
src/Autoload/Export.gd | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/Autoload/Export.gd b/src/Autoload/Export.gd
index 4521ac5c9..89ec8c49e 100644
--- a/src/Autoload/Export.gd
+++ b/src/Autoload/Export.gd
@@ -60,6 +60,7 @@ var export_layers := 0
var number_of_frames := 1
var direction := AnimationDirection.FORWARD
var resize := 100
+var save_quality := 0.75 ## Used when saving jpg and webp images. Goes from 0 to 1.
var interpolation := Image.INTERPOLATE_NEAREST
var include_tag_in_filename := false
var new_dir_for_each_frame_tag := false ## We don't need to store this after export
@@ -441,7 +442,7 @@ func export_processed_images(
)
elif project.file_format == FileFormat.JPEG:
JavaScriptBridge.download_buffer(
- processed_images[i].image.save_jpg_to_buffer(),
+ processed_images[i].image.save_jpg_to_buffer(save_quality),
export_paths[i].get_file(),
"image/jpeg"
)
@@ -453,7 +454,7 @@ func export_processed_images(
elif project.file_format == FileFormat.WEBP:
err = processed_images[i].image.save_webp(export_paths[i])
elif project.file_format == FileFormat.JPEG:
- err = processed_images[i].image.save_jpg(export_paths[i])
+ err = processed_images[i].image.save_jpg(export_paths[i], save_quality)
if err != OK:
Global.popup_error(
tr("File failed to save. Error code %s (%s)") % [err, error_string(err)]
From 167b0d863c09035c728a63403be675a5ba72416b Mon Sep 17 00:00:00 2001
From: Variable <77773850+Variable-ind@users.noreply.github.com>
Date: Mon, 2 Sep 2024 04:03:39 +0500
Subject: [PATCH 036/162] fix wrong stretch mode in cel preview (#1097)
---
src/UI/Timeline/CelButton.tscn | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/UI/Timeline/CelButton.tscn b/src/UI/Timeline/CelButton.tscn
index 77f56cc0d..5861f2f92 100644
--- a/src/UI/Timeline/CelButton.tscn
+++ b/src/UI/Timeline/CelButton.tscn
@@ -59,7 +59,7 @@ grow_vertical = 2
size_flags_horizontal = 0
size_flags_vertical = 0
expand_mode = 1
-stretch_mode = 6
+stretch_mode = 5
[node name="TransparentChecker" parent="CelTexture" instance=ExtResource("2_mi8wp")]
show_behind_parent = true
From 9cac98c94199e92bb9ef1975322e334123b730cb Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Mon, 2 Sep 2024 02:21:48 +0300
Subject: [PATCH 037/162] Add an alpha uniform to the IndexMap shader
In case users don't want the effect to affect the alpha channel
---
src/Shaders/Effects/IndexMap.gdshader | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/Shaders/Effects/IndexMap.gdshader b/src/Shaders/Effects/IndexMap.gdshader
index b834b1772..dc4c026dd 100644
--- a/src/Shaders/Effects/IndexMap.gdshader
+++ b/src/Shaders/Effects/IndexMap.gdshader
@@ -3,6 +3,7 @@ shader_type canvas_item;
render_mode unshaded;
uniform sampler2D map_texture : filter_nearest; // The map texture
+uniform bool alpha = false;
// (begin DESCRIPTION)
// The Red and Green values (0-255) of tool color will be treated as an x and y position
@@ -14,5 +15,8 @@ void fragment(){
vec2 map_size = vec2(textureSize(map_texture, 0));
vec2 lookup_uv = vec2(round(col.x * 255.0)/(map_size.x), round(col.y * 255.0)/(map_size.y));
vec4 index_color = texture(map_texture, lookup_uv);
- COLOR = index_color;
+ COLOR.rgb = index_color.rgb;
+ if (alpha) {
+ COLOR.a = index_color.a;
+ }
}
From fa9536ce4ab02fcc88e0011d8164fd8d7e6bf06b Mon Sep 17 00:00:00 2001
From: Variable <77773850+Variable-ind@users.noreply.github.com>
Date: Tue, 3 Sep 2024 02:20:50 +0500
Subject: [PATCH 038/162] Fix typos and stuff (#1099)
---
src/Autoload/ExtensionsApi.gd | 59 +++++++++++++++++++----------------
1 file changed, 32 insertions(+), 27 deletions(-)
diff --git a/src/Autoload/ExtensionsApi.gd b/src/Autoload/ExtensionsApi.gd
index 3c987f25e..6c4259e63 100644
--- a/src/Autoload/ExtensionsApi.gd
+++ b/src/Autoload/ExtensionsApi.gd
@@ -162,14 +162,17 @@ class GeneralAPI:
func get_canvas() -> Canvas:
return Global.canvas
+ ## Returns a new ValueSlider. Useful for editing floating values
func create_value_slider() -> ValueSlider:
return ValueSlider.new()
+ ## Returns a new ValueSliderV2. Useful for editing 2D vectors.
func create_value_slider_v2() -> ValueSliderV2:
- return ValueSliderV2.new()
+ return preload("res://src/UI/Nodes/ValueSliderV2.tscn").instantiate()
+ ## Returns a new ValueSliderV3. Useful for editing 3D vectors.
func create_value_slider_v3() -> ValueSliderV3:
- return ValueSliderV3.new()
+ return preload("res://src/UI/Nodes/ValueSliderV3.tscn").instantiate()
## Gives ability to add/remove items from menus in the top bar.
@@ -238,7 +241,7 @@ class DialogAPI:
func get_dialogs_parent_node() -> Node:
return Global.control.get_node("Dialogs")
- ## Tells pixelorama that some dialog is about to open or close.
+ ## Informs Pixelorama that some dialog is about to open or close.
func dialog_open(open: bool) -> void:
Global.dialog_open(open)
@@ -255,7 +258,7 @@ class PanelAPI:
return dockable.tabs_visible
## Adds the [param node] as a tab. Initially it's placed on the same panel as the tools tab,
- ## but can be changed through adding custom layouts.
+ ## but it's position can be changed through editing a layout.
func add_node_as_tab(node: Node) -> void:
var dockable := _get_dockable_container_ui()
var top_menu_container := Global.top_menu_container
@@ -401,7 +404,7 @@ class ThemeAPI:
push_error("No theme found at index: ", idx)
return false
- ## Remove the [param theme] from preferences.
+ ## Removes the [param theme] from preferences.
func remove_theme(theme: Theme) -> void:
Themes.remove_theme(theme)
ExtensionsApi.remove_action("ThemeAPI", "add_theme")
@@ -417,9 +420,9 @@ class ToolAPI:
## on [param layer_types] defined by [constant LayerTypes],
## [param extra_hint] (text that appears when mouse havers tool icon), primary shortcut
## name [param shortcut] and any extra shortcuts [param extra_shortcuts].
- ## [br][br]At the moment extensions can't make their own shortcuts so you can ignore
- ## [param shortcut] and [param extra_shortcuts].
- ## [br] to determine the position of tool in tool list, use [param insert_point]
+ ## [br][br]At the moment extensions can't make their own shortcuts so you can leave
+ ## [param shortcut] and [param extra_shortcuts] as [code][][/code].
+ ## [br] To determine the position of tool in tool list, use [param insert_point]
## (if you leave it empty then the added tool will be placed at bottom)
func add_tool(
tool_name: String,
@@ -472,7 +475,7 @@ class SelectionAPI:
## Moves a selection to [param destination],
## with content if [param with_content] is [code]true[/code].
## If [param transform_standby] is [code]true[/code] then the transformation will not be
- ## applied immediatelyunless [kbd]Enter[/kbd] is pressed.
+ ## applied immediately unless [kbd]Enter[/kbd] is pressed.
func move_selection(
destination: Vector2i, with_content := true, transform_standby := false
) -> void:
@@ -527,14 +530,14 @@ class SelectionAPI:
func paste(in_place := false) -> void:
Global.canvas.selection.paste(in_place)
- ## Deletes the drawing on current cel enclosed within the selection's area.
+ ## Erases the drawing on current cel enclosed within the selection's area.
func delete_content(selected_cels := true) -> void:
Global.canvas.selection.delete(selected_cels)
## Gives access to basic project manipulation functions.
class ProjectAPI:
- ## The project currently in focus
+ ## The project currently in focus.
var current_project: Project:
set(value):
Global.tabs.current_tab = Global.projects.find(value)
@@ -575,9 +578,9 @@ class ProjectAPI:
func get_project_info(project: Project) -> Dictionary:
return project.serialize()
- ## Selects the cels and makes the last entry of [param selected_array] as the current cel
- ## [param selected_array] is an [Array] of [Arrays] of 2 integers (frame & layer).[br]
- ## Frames are counted from left to right, layers are counted from bottom to top.
+ ## Selects the cels and makes the last entry of [param selected_array] as the current cel.
+ ## [param selected_array] is an [Array] of [Arrays] of 2 integers (frame & layer respectively).
+ ## [br]Frames are counted from left to right, layers are counted from bottom to top.
## Frames/layers start at "0" and end at [param project.frames.size() - 1] and
## [param project.layers.size() - 1] respectively.
func select_cels(selected_array := [[0, 0]]) -> void:
@@ -664,7 +667,8 @@ class ExportAPI:
## (Note: [code]processed_images[/code] is an array of ProcessedImage resource which further
## has parameters [param image] and [param duration])[br]
## If the value of [param tab] is not in [constant ExportTab] then the format will be added to
- ## both tabs. Returns the index of exporter, which can be used to remove exporter later.
+ ## both tabs.
+ ## [br]Returns the index of exporter, which can be used to remove exporter later.
func add_export_option(
format_info: Dictionary,
exporter_generator: Object,
@@ -704,17 +708,17 @@ class ExportAPI:
## Gives access to adding custom import options.
class ImportAPI:
## [param import_scene] is a scene preload that will be instanced and added to "import options"
- ## section of pixelorama's import dialogs and will appears whenever [param import_name] is
+ ## section of pixelorama's import dialogs and will appear whenever [param import_name] is
## chosen from import menu.
## [br]
- ## [param import_scene] must have a a script containing:[br]
+ ## [param import_scene] must have a script containing:[br]
## 1. An optional variable named [code]import_preview_dialog[/code] of type [ConfirmationDialog],
## If present, it will automatically be assigned a reference to the relevant import dialog's
## [code]ImportPreviewDialog[/code] class so that you can easily access variables and
## methods of that class. (This variable is meant to be read-only)[br]
- ## 2. The method [method initiate_import] which takes 2 arguments: [code]path[/code],
- ## [code]image[/code], which are automatically passed to [method initiate_import] at
- ## time of import.
+ ## 2. The method [method initiate_import], which takes 2 arguments: [code]path[/code],
+ ## [code]image[/code]. Values will automatically be passed to these arguments at the
+ ## time of import.[br]Returns the id of the importer.
func add_import_option(import_name: StringName, import_scene_preload: PackedScene) -> int:
var id := OpenSave.add_import_option(import_name, import_scene_preload)
ExtensionsApi.add_action("ImportAPI", "add_import_option")
@@ -728,11 +732,11 @@ class ImportAPI:
ExtensionsApi.remove_action("ImportAPI", "add_import_option")
-## Gives access to palettes.
+## Gives access to palette related stuff.
class PaletteAPI:
- ## Creates and adds a new [Palette] with name [param palette_name] with [param data]
- ## in the form of a [Dictionary].
- ## An example of [code]data[/code] dictionary will be:[codeblock]
+ ## Creates and adds a new [Palette] with name [param palette_name] containing [param data].
+ ## [param data] is a [Dictionary] containing the palette information.
+ ## An example of [code]data[/code] will be:[codeblock]
## {
## "colors": [
## {
@@ -811,7 +815,8 @@ class SignalsAPI:
# PROJECT RELATED SIGNALS
## Connects/disconnects a signal to [param callable], that emits
## whenever a new project is created.[br]
- ## [b]Binds: [/b]It has one bind of type [code]Project[/code] which is the newly created project
+ ## [b]Binds: [/b]It has one bind of type [code]Project[/code] which is the newly
+ ## created project.
func signal_project_created(callable: Callable, is_disconnecting := false) -> void:
_connect_disconnect(Global.project_created, callable, is_disconnecting)
@@ -867,7 +872,7 @@ class SignalsAPI:
## Connects/disconnects a signal to [param callable], that emits
## whenever preview is about to be drawn.[br]
## [b]Binds: [/b]It has one bind of type [Dictionary] with keys: [code]exporter_id[/code],
- ## [code]export_tab[/code], [code]preview_images[/code], [code]durations[/code]
- ## [br] Use this if you plan on changing preview of export
+ ## [code]export_tab[/code], [code]preview_images[/code], [code]durations[/code].[br]
+ ## Use this if you plan on changing preview of export.
func signal_export_about_to_preview(callable: Callable, is_disconnecting := false) -> void:
_connect_disconnect(Global.export_dialog.about_to_preview, callable, is_disconnecting)
From 4a7f7cbde5f6a67331cd137a7ba18c7c0c36d4aa Mon Sep 17 00:00:00 2001
From: Variable <77773850+Variable-ind@users.noreply.github.com>
Date: Tue, 3 Sep 2024 05:38:56 +0500
Subject: [PATCH 039/162] Added a way to modify shader textures (#1096)
* experimental support for texture changes
* fix some typos
* formatting + some improvements
* Some final touches, i think it's ready now
* moved a function to the shaderloader
* formatting
* add a void
---
src/Autoload/Global.gd | 13 ++++-
src/Classes/ResourceProject.gd | 8 +++
src/Classes/ShaderLoader.gd | 54 ++++++++++++++++++++-
src/UI/TopMenuContainer/TopMenuContainer.gd | 6 +++
4 files changed, 79 insertions(+), 2 deletions(-)
create mode 100644 src/Classes/ResourceProject.gd
diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd
index 3e41fa9de..766ee428c 100644
--- a/src/Autoload/Global.gd
+++ b/src/Autoload/Global.gd
@@ -132,7 +132,18 @@ var config_cache := ConfigFile.new()
var loaded_locales: PackedStringArray = LANGUAGES_DICT.keys()
var projects: Array[Project] = [] ## Array of currently open projects.
-var current_project: Project ## The project that currently in focus.
+var current_project: Project: ## The project that currently in focus.
+ set(value):
+ current_project = value
+ if top_menu_container.file_menu:
+ if current_project is ResourceProject:
+ top_menu_container.file_menu.set_item_disabled(FileMenu.SAVE_AS, true)
+ top_menu_container.file_menu.set_item_disabled(FileMenu.EXPORT, true)
+ top_menu_container.file_menu.set_item_disabled(FileMenu.EXPORT_AS, true)
+ else:
+ top_menu_container.file_menu.set_item_disabled(FileMenu.SAVE_AS, false)
+ top_menu_container.file_menu.set_item_disabled(FileMenu.EXPORT, false)
+ top_menu_container.file_menu.set_item_disabled(FileMenu.EXPORT_AS, false)
## The index of project that is currently in focus.
var current_project_index := 0:
set(value):
diff --git a/src/Classes/ResourceProject.gd b/src/Classes/ResourceProject.gd
new file mode 100644
index 000000000..cedb7d155
--- /dev/null
+++ b/src/Classes/ResourceProject.gd
@@ -0,0 +1,8 @@
+class_name ResourceProject
+extends Project
+
+signal resource_updated
+
+
+func _init(_frames: Array[Frame] = [], _name := tr("untitled"), _size := Vector2i(64, 64)) -> void:
+ super._init(_frames, _name + " (Virtual Resource)", _size)
diff --git a/src/Classes/ShaderLoader.gd b/src/Classes/ShaderLoader.gd
index d8bf8aa97..8a0f6f31e 100644
--- a/src/Classes/ShaderLoader.gd
+++ b/src/Classes/ShaderLoader.gd
@@ -212,7 +212,7 @@ static func create_ui_for_shader_uniforms(
func(_gradient, _cc): value_changed.call(gradient_edit.texture, u_name)
)
hbox.add_child(gradient_edit)
- else:
+ else: ## Simple texture
var file_dialog := FileDialog.new()
file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE
file_dialog.access = FileDialog.ACCESS_FILESYSTEM
@@ -224,7 +224,19 @@ static func create_ui_for_shader_uniforms(
button.pressed.connect(file_dialog.popup_centered)
button.size_flags_horizontal = Control.SIZE_EXPAND_FILL
button.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
+ var mod_button := Button.new()
+ mod_button.text = "Modify"
+ mod_button.pressed.connect(
+ func(): _modify_texture_resource(
+ _get_loaded_texture(params, u_name),
+ u_name,
+ _shader_update_texture.bind(value_changed, u_name)
+ )
+ )
+ mod_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ mod_button.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
hbox.add_child(button)
+ hbox.add_child(mod_button)
parent_node.add_child(file_dialog)
parent_node.add_child(hbox)
@@ -334,3 +346,43 @@ static func _shader_update_palette_texture(
palette: Palette, value_changed: Callable, parameter_name: String
) -> void:
value_changed.call(ImageTexture.create_from_image(palette.convert_to_image()), parameter_name)
+
+
+static func _get_loaded_texture(params: Dictionary, parameter_name: String) -> Image:
+ if parameter_name in params:
+ if params[parameter_name] is ImageTexture:
+ return params[parameter_name].get_image()
+ var image = Image.create_empty(64, 64, false, Image.FORMAT_RGBA8)
+ return image
+
+
+static func _shader_update_texture(
+ resource_proj: ResourceProject, value_changed: Callable, parameter_name: String
+) -> void:
+ var warnings = ""
+ if resource_proj.frames.size() > 1:
+ warnings += "This resource is intended to have 1 frame only. Extra frames will be ignored."
+ if resource_proj.layers.size() > 1:
+ warnings += "\nThis resource is intended to have 1 layer only. layers will be blended."
+
+ var updated_image = Image.create_empty(
+ resource_proj.size.x, resource_proj.size.y, false, Image.FORMAT_RGBA8
+ )
+ var frame = resource_proj.frames[0]
+ DrawingAlgos.blend_layers(updated_image, frame, Vector2i.ZERO, resource_proj)
+ value_changed.call(ImageTexture.create_from_image(updated_image), parameter_name)
+ if not warnings.is_empty():
+ Global.popup_error(warnings)
+
+
+static func _modify_texture_resource(
+ image: Image, resource_name: StringName, update_callable: Callable
+) -> void:
+ var resource_proj = ResourceProject.new([], resource_name, image.get_size())
+ resource_proj.layers.append(PixelLayer.new(resource_proj))
+ resource_proj.frames.append(resource_proj.new_empty_frame())
+ resource_proj.frames[0].cels[0].set_content(image)
+ resource_proj.resource_updated.connect(update_callable)
+ Global.projects.append(resource_proj)
+ Global.tabs.current_tab = Global.tabs.get_tab_count() - 1
+ Global.canvas.camera_zoom()
diff --git a/src/UI/TopMenuContainer/TopMenuContainer.gd b/src/UI/TopMenuContainer/TopMenuContainer.gd
index 106050118..66215ec35 100644
--- a/src/UI/TopMenuContainer/TopMenuContainer.gd
+++ b/src/UI/TopMenuContainer/TopMenuContainer.gd
@@ -545,6 +545,12 @@ func _on_open_last_project_file_menu_option_pressed() -> void:
func _save_project_file() -> void:
+ if Global.current_project is ResourceProject:
+ Global.current_project.resource_updated.emit(Global.current_project)
+ if Global.current_project.has_changed:
+ Global.current_project.has_changed = false
+ Global.notification_label("Resource Updated")
+ return
var path: String = Global.current_project.save_path
if path == "":
Global.control.show_save_dialog()
From 1e9c8487ba6a7aa19c3a591b2f2a2a7a619e1203 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 5 Sep 2024 03:34:30 +0300
Subject: [PATCH 040/162] Optimize the lasso & polygon select tools by making
them check fewer pixels
The time they take to complete now depends on the size of the selection, rather than checking all of the pixels of the entire canvas.
---
src/Tools/SelectionTools/Lasso.gd | 12 ++++++------
src/Tools/SelectionTools/PolygonSelect.gd | 12 ++++++------
2 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/src/Tools/SelectionTools/Lasso.gd b/src/Tools/SelectionTools/Lasso.gd
index 32132a0de..a03dd4c72 100644
--- a/src/Tools/SelectionTools/Lasso.gd
+++ b/src/Tools/SelectionTools/Lasso.gd
@@ -111,11 +111,12 @@ func apply_selection(_position) -> void:
func lasso_selection(
selection_map: SelectionMap, previous_selection_map: SelectionMap, points: Array[Vector2i]
) -> void:
- var project := Global.current_project
var selection_size := selection_map.get_size()
+ var bounding_rect := Rect2i(points[0], Vector2i.ZERO)
for point in points:
if point.x < 0 or point.y < 0 or point.x >= selection_size.x or point.y >= selection_size.y:
continue
+ bounding_rect = bounding_rect.expand(point)
if _intersect:
if previous_selection_map.is_pixel_selected(point):
selection_map.select_pixel(point, true)
@@ -123,11 +124,10 @@ func lasso_selection(
selection_map.select_pixel(point, !_subtract)
var v := Vector2i()
- var image_size := project.size
- for x in image_size.x:
- v.x = x
- for y in image_size.y:
- v.y = y
+ for x in bounding_rect.size.x:
+ v.x = x + bounding_rect.position.x
+ for y in bounding_rect.size.y:
+ v.y = y + bounding_rect.position.y
if Geometry2D.is_point_in_polygon(v, points):
if _intersect:
if previous_selection_map.is_pixel_selected(v):
diff --git a/src/Tools/SelectionTools/PolygonSelect.gd b/src/Tools/SelectionTools/PolygonSelect.gd
index fda95d42e..291a8cfd9 100644
--- a/src/Tools/SelectionTools/PolygonSelect.gd
+++ b/src/Tools/SelectionTools/PolygonSelect.gd
@@ -154,11 +154,12 @@ func _clear() -> void:
func lasso_selection(
selection_map: SelectionMap, previous_selection_map: SelectionMap, points: Array[Vector2i]
) -> void:
- var project := Global.current_project
var selection_size := selection_map.get_size()
+ var bounding_rect := Rect2i(points[0], Vector2i.ZERO)
for point in points:
if point.x < 0 or point.y < 0 or point.x >= selection_size.x or point.y >= selection_size.y:
continue
+ bounding_rect = bounding_rect.expand(point)
if _intersect:
if previous_selection_map.is_pixel_selected(point):
selection_map.select_pixel(point, true)
@@ -166,11 +167,10 @@ func lasso_selection(
selection_map.select_pixel(point, !_subtract)
var v := Vector2i()
- var image_size := project.size
- for x in image_size.x:
- v.x = x
- for y in image_size.y:
- v.y = y
+ for x in bounding_rect.size.x:
+ v.x = x + bounding_rect.position.x
+ for y in bounding_rect.size.y:
+ v.y = y + bounding_rect.position.y
if Geometry2D.is_point_in_polygon(v, points):
if _intersect:
if previous_selection_map.is_pixel_selected(v):
From 9650dae67802c6681989a4031b0a8bf84953a99b Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 5 Sep 2024 03:50:37 +0300
Subject: [PATCH 041/162] Optimize the pencil & curve's fill inside option by
making them check fewer pixels
Same logic as the previous commit
---
src/Tools/DesignTools/CurveTool.gd | 13 ++++++++-----
src/Tools/DesignTools/Pencil.gd | 13 ++++++++-----
2 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/src/Tools/DesignTools/CurveTool.gd b/src/Tools/DesignTools/CurveTool.gd
index e00958689..80a1d3b81 100644
--- a/src/Tools/DesignTools/CurveTool.gd
+++ b/src/Tools/DesignTools/CurveTool.gd
@@ -3,6 +3,7 @@ extends "res://src/Tools/BaseDraw.gd"
var _curve := Curve2D.new() ## The [Curve2D] responsible for the shape of the curve being drawn.
var _drawing := false ## Set to true when a curve is being drawn.
var _fill := false ## When true, the inside area of the curve gets filled.
+var _fill_inside_rect := Rect2i() ## The bounding box that surrounds the area that gets filled.
var _editing_bezier := false ## Needed to determine when to show the control points preview line.
var _editing_out_control_point := false ## True when controlling the out control point only.
var _thickness := 1 ## The thickness of the curve.
@@ -96,6 +97,7 @@ func draw_start(pos: Vector2i) -> void:
if !_drawing:
_drawing = true
_curve.add_point(pos)
+ _fill_inside_rect = Rect2i(pos, Vector2i.ZERO)
func draw_move(pos: Vector2i) -> void:
@@ -183,15 +185,15 @@ func _draw_shape() -> void:
for point in points:
# Reset drawer every time because pixel perfect sometimes breaks the tool
_drawer.reset()
+ _fill_inside_rect = _fill_inside_rect.expand(point)
# Draw each point offsetted based on the shape's thickness
_draw_pixel(point, images)
if _fill:
var v := Vector2i()
- var image_size := Global.current_project.size
- for x in image_size.x:
- v.x = x
- for y in image_size.y:
- v.y = y
+ for x in _fill_inside_rect.size.x:
+ v.x = x + _fill_inside_rect.position.x
+ for y in _fill_inside_rect.size.y:
+ v.y = y + _fill_inside_rect.position.y
if Geometry2D.is_point_in_polygon(v, points):
_draw_pixel(v, images)
_clear()
@@ -206,6 +208,7 @@ func _draw_pixel(point: Vector2i, images: Array[Image]) -> void:
func _clear() -> void:
_curve.clear_points()
+ _fill_inside_rect = Rect2i()
_drawing = false
_editing_out_control_point = false
Global.canvas.previews.queue_redraw()
diff --git a/src/Tools/DesignTools/Pencil.gd b/src/Tools/DesignTools/Pencil.gd
index 145720671..5e80f654a 100644
--- a/src/Tools/DesignTools/Pencil.gd
+++ b/src/Tools/DesignTools/Pencil.gd
@@ -5,6 +5,7 @@ var _last_position := Vector2i(Vector2.INF)
var _changed := false
var _overwrite := false
var _fill_inside := false
+var _fill_inside_rect := Rect2i() ## The bounding box that surrounds the area that gets filled.
var _draw_points := PackedVector2Array()
var _old_spacing_mode := false ## Needed to reset spacing mode in case we change it
@@ -125,6 +126,7 @@ func draw_start(pos: Vector2i) -> void:
else:
if _fill_inside:
_draw_points.append(pos)
+ _fill_inside_rect = Rect2i(pos, Vector2i.ZERO)
draw_tool(pos)
_last_position = pos
Global.canvas.sprite_changed_this_frame = true
@@ -156,6 +158,7 @@ func draw_move(pos_i: Vector2i) -> void:
Global.canvas.sprite_changed_this_frame = true
if _fill_inside:
_draw_points.append(pos)
+ _fill_inside_rect = _fill_inside_rect.expand(pos)
func draw_end(pos: Vector2i) -> void:
@@ -178,11 +181,10 @@ func draw_end(pos: Vector2i) -> void:
_draw_points.append(pos)
if _draw_points.size() > 3:
var v := Vector2i()
- var image_size := Global.current_project.size
- for x in image_size.x:
- v.x = x
- for y in image_size.y:
- v.y = y
+ for x in _fill_inside_rect.size.x:
+ v.x = x + _fill_inside_rect.position.x
+ for y in _fill_inside_rect.size.y:
+ v.y = y + _fill_inside_rect.position.y
if Geometry2D.is_point_in_polygon(v, _draw_points):
if _spacing_mode:
# use of get_spacing_position() in Pencil.gd is a rare case
@@ -190,6 +192,7 @@ func draw_end(pos: Vector2i) -> void:
v = get_spacing_position(v)
draw_tool(v)
+ _fill_inside_rect = Rect2i()
commit_undo()
cursor_text = ""
update_random_image()
From a0c7dd452761a077ff2f07cd4489248c3ae4e752 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 5 Sep 2024 04:50:36 +0300
Subject: [PATCH 042/162] Optimize the export dialog by caching all of the
blended frames
No more slowness when changing the export settings. The only setting that causes the frames to be blended again is changing the layers.
---
src/Autoload/Export.gd | 18 ++++++++++++++++--
src/UI/Dialogs/ExportDialog.gd | 2 ++
src/UI/Dialogs/ExportDialog.tscn | 2 +-
3 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/src/Autoload/Export.gd b/src/Autoload/Export.gd
index 89ec8c49e..bb10a3f1c 100644
--- a/src/Autoload/Export.gd
+++ b/src/Autoload/Export.gd
@@ -46,6 +46,9 @@ var custom_exporter_generators := {}
var current_tab := ExportTab.IMAGE
## All frames and their layers processed/blended into images
var processed_images: Array[ProcessedImage] = []
+## Dictionary of [Frame] and [Image] that contains all of the blended frames.
+## Changes when [method cache_blended_frames] is called.
+var blended_frames := {}
var export_json := false
var split_layers := false
var trim_sprite := false
@@ -137,6 +140,7 @@ func remove_custom_file_format(id: int) -> void:
func external_export(project := Global.current_project) -> void:
+ cache_blended_frames(project)
process_data(project)
export_processed_images(true, Global.export_dialog, project)
@@ -149,6 +153,15 @@ func process_data(project := Global.current_project) -> void:
process_spritesheet(project)
+func cache_blended_frames(project := Global.current_project) -> void:
+ blended_frames.clear()
+ var frames := _calculate_frames(project)
+ for frame in frames:
+ var image := Image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8)
+ _blend_layers(image, frame)
+ blended_frames[frame] = image
+
+
func process_spritesheet(project := Global.current_project) -> void:
processed_images.clear()
# Range of frames determined by tags
@@ -252,7 +265,8 @@ func process_spritesheet(project := Global.current_project) -> void:
origin.y = project.size.y * tag_origins[0]
origin.x = 0
tag_origins[0] += 1
- _blend_layers(whole_image, frame, origin)
+ whole_image.blend_rect(blended_frames[frame], Rect2i(Vector2i.ZERO, project.size), origin)
+ #_blend_layers(whole_image, frame, origin)
processed_images.append(ProcessedImage.new(whole_image, 0))
@@ -271,7 +285,7 @@ func process_animation(project := Global.current_project) -> void:
)
else:
var image := Image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8)
- _blend_layers(image, frame)
+ image.copy_from(blended_frames[frame])
if trim_sprite:
image = image.get_region(image.get_used_rect())
var duration := frame.duration * (1.0 / project.fps)
diff --git a/src/UI/Dialogs/ExportDialog.gd b/src/UI/Dialogs/ExportDialog.gd
index 8924584e3..5683294f6 100644
--- a/src/UI/Dialogs/ExportDialog.gd
+++ b/src/UI/Dialogs/ExportDialog.gd
@@ -290,6 +290,7 @@ func _on_ExportDialog_about_to_show() -> void:
path_dialog_popup.current_dir = project.export_directory_path
file_line_edit.text = project.file_name
file_format_options.selected = project.file_format
+ Export.cache_blended_frames()
show_tab()
# Set the size of the preview checker
@@ -472,6 +473,7 @@ func _on_Frames_item_selected(id: int) -> void:
func _on_Layers_item_selected(id: int) -> void:
Export.export_layers = id
+ Export.cache_blended_frames()
Export.process_data()
set_preview()
diff --git a/src/UI/Dialogs/ExportDialog.tscn b/src/UI/Dialogs/ExportDialog.tscn
index b61e2446e..925094e25 100644
--- a/src/UI/Dialogs/ExportDialog.tscn
+++ b/src/UI/Dialogs/ExportDialog.tscn
@@ -82,8 +82,8 @@ mouse_default_cursor_shape = 2
selected = 0
item_count = 4
popup/item_0/text = "Columns"
-popup/item_0/id = 1
popup/item_1/text = "Rows"
+popup/item_1/id = 1
popup/item_2/text = "Tags by column"
popup/item_2/id = 2
popup/item_3/text = "Tags by row"
From a1a2fb3f008b0a597c87231e424e6ae05cc51c28 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 6 Sep 2024 00:17:43 +0300
Subject: [PATCH 043/162] [skip ci] Update CHANGELOG.md
---
CHANGELOG.md | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 34c582eca..e3026f983 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,28 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). All the dates are in YYYY-MM-DD format.
+## [v1.0.3] - Unreleased
+This update has been brought to you by the contributions of:
+Fayez Akhtar ([@Variable-ind](https://github.com/Variable-ind)), [alikin12](https://github.com/alikin12), Vaibhav Kubre ([@kubre](https://github.com/kubre)), Donte ([@donte5405](https://github.com/donte5405))
+
+Built using Godot 4.3
+
+### Added
+- Added new global layer buttons that change visibility, lock or expand all layers on the first level. [#1085](https://github.com/Orama-Interactive/Pixelorama/pull/1085)
+- A new Index Map layer effect has been added. [#1093](https://github.com/Orama-Interactive/Pixelorama/pull/1093)
+- Is it now possible to adjust the opacity of onion skinning. [#1091](https://github.com/Orama-Interactive/Pixelorama/pull/1091)
+- Added option to trim sprites empty area while exporting. [#1088](https://github.com/Orama-Interactive/Pixelorama/pull/1088)
+- A quality slider has been added to the export dialog, when exporting jpg files.
+
+### Changed
+- The layer opacity and frame buttons are now fixed on top, always visible regardless of the vertical scroll position. [#1095](https://github.com/Orama-Interactive/Pixelorama/pull/1095)
+
+### Fixed
+- Fixed an issue where the '\n` escape character got inserted inside the palette name, causing the palette to fail to be saved.
+- The export dialog has been optimized by caching all of the blended frames. Changing export options, besides the layers, no longer cause slowness by re-blending all of the frames.
+- Optimized the lasso and polygon select tools, as well as the fill options of the pencil and curve tools. The time they take to complete now depends on the size of the selection, rather than checking all of the pixels of the entire canvas.
+- Fixed wrong stretch mode in the cel button previews. [#1097](https://github.com/Orama-Interactive/Pixelorama/pull/1097)
+
## [v1.0.2] - 2024-08-21
This update has been brought to you by the contributions of:
[kleonc](https://github.com/kleonc), [Hamster5295](https://github.com/Hamster5295), [alikin12](https://github.com/alikin12)
@@ -38,7 +60,6 @@ Built using Godot 4.3
- Fixed an issue when loading a project, selecting a project brush and then switching tools. [#1078](https://github.com/Orama-Interactive/Pixelorama/pull/1078)
- Fixed wrong rendering of the isometric grid. [#1069](https://github.com/Orama-Interactive/Pixelorama/pull/1069)
-
## [v1.0.1] - 2024-08-05
This update has been brought to you by the contributions of:
Fayez Akhtar ([@Variable-ind](https://github.com/Variable-ind)), [Kiisu_Master](https://github.com/Kiisu-Master).
From f162f12fbf001c02b6c5e591b669f3763a840abc Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Sat, 7 Sep 2024 03:59:19 +0300
Subject: [PATCH 044/162] Save the onion skinning opacity in the config file
---
src/UI/Timeline/AnimationTimeline.gd | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/src/UI/Timeline/AnimationTimeline.gd b/src/UI/Timeline/AnimationTimeline.gd
index c885cb4f7..162b79c30 100644
--- a/src/UI/Timeline/AnimationTimeline.gd
+++ b/src/UI/Timeline/AnimationTimeline.gd
@@ -91,6 +91,10 @@ func _ready() -> void:
var future_above = Global.config_cache.get_value(
"timeline", "future_above_canvas", future_above_canvas
)
+ var onion_skinning_opacity = Global.config_cache.get_value(
+ "timeline", "onion_skinning_opacity", 0.6
+ )
+ get_node("%OnionSkinningOpacity").value = onion_skinning_opacity * 100.0
%PastOnionSkinning.value = past_rate
%FutureOnionSkinning.value = future_rate
%BlueRedMode.button_pressed = blue_red
@@ -102,8 +106,6 @@ func _ready() -> void:
Global.cel_switched.connect(_cel_switched)
# Makes sure that the frame and tag scroll bars are in the right place:
Global.layer_vbox.emit_signal.call_deferred("resized")
- # Set the default opacity for the onion skinning
- get_node("%OnionSkinningOpacity").value = 60
func _notification(what: int) -> void:
@@ -1274,21 +1276,23 @@ func _on_cel_size_slider_value_changed(value: float) -> void:
func _on_onion_skinning_opacity_value_changed(value: float) -> void:
+ var onion_skinning_opacity := value / 100.0
+ Global.config_cache.set_value("timeline", "onion_skinning_opacity", onion_skinning_opacity)
for onion_skinning_node: Node2D in get_tree().get_nodes_in_group("canvas_onion_skinning"):
- onion_skinning_node.opacity = value / 100
+ onion_skinning_node.opacity = onion_skinning_opacity
onion_skinning_node.queue_redraw()
func _on_global_visibility_button_pressed() -> void:
- var visible = !global_layer_visibility
+ var layer_visible := !global_layer_visibility
for layer_button: LayerButton in Global.layer_vbox.get_children():
var layer: BaseLayer = Global.current_project.layers[layer_button.layer_index]
- if layer.parent == null and layer.visible != visible:
+ if layer.parent == null and layer.visible != layer_visible:
layer_button.visibility_button.pressed.emit()
func _on_global_lock_button_pressed() -> void:
- var locked = !global_layer_lock
+ var locked := !global_layer_lock
for layer_button: LayerButton in Global.layer_vbox.get_children():
var layer: BaseLayer = Global.current_project.layers[layer_button.layer_index]
if layer.parent == null and layer.locked != locked:
@@ -1296,7 +1300,7 @@ func _on_global_lock_button_pressed() -> void:
func _on_global_expand_button_pressed() -> void:
- var expand = !global_layer_expand
+ var expand := !global_layer_expand
for layer_button: LayerButton in Global.layer_vbox.get_children():
var layer: BaseLayer = Global.current_project.layers[layer_button.layer_index]
if layer.parent == null and layer is GroupLayer and layer.expanded != expand:
From 28e143e03323ce82b7174f0579995f9da1fb081a Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Sat, 7 Sep 2024 17:19:42 +0300
Subject: [PATCH 045/162] Make the color picker popup in GradientEdit moveable
---
src/UI/Nodes/GradientEdit.tscn | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/UI/Nodes/GradientEdit.tscn b/src/UI/Nodes/GradientEdit.tscn
index 1373646b1..c1bde37f0 100644
--- a/src/UI/Nodes/GradientEdit.tscn
+++ b/src/UI/Nodes/GradientEdit.tscn
@@ -26,6 +26,8 @@ offset_right = 20.0
offset_bottom = 7.0
[node name="Popup" type="PopupPanel" parent="."]
+unresizable = false
+borderless = false
[node name="ColorPicker" type="ColorPicker" parent="Popup"]
offset_left = 4.0
@@ -46,10 +48,9 @@ unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
mouse_default_cursor_shape = 2
-item_count = 3
selected = 0
+item_count = 3
popup/item_0/text = "Linear"
-popup/item_0/id = 0
popup/item_1/text = "Constant"
popup/item_1/id = 1
popup/item_2/text = "Cubic"
@@ -68,10 +69,9 @@ unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
mouse_default_cursor_shape = 2
-item_count = 3
selected = 0
+item_count = 3
popup/item_0/text = "sRGB"
-popup/item_0/id = 0
popup/item_1/text = "Linear sRGB"
popup/item_1/id = 1
popup/item_2/text = "Oklab"
From b3021ceb671f477a168791674e5255fc71fe9cde Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Sun, 8 Sep 2024 02:40:28 +0300
Subject: [PATCH 046/162] Add a gaussian blur layer effect
---
src/Classes/ShaderLoader.gd | 172 +++++++++++-------
src/Shaders/Effects/GaussianBlur.gdshader | 134 ++++++++++++++
.../LayerEffects/LayerEffectsSettings.gd | 1 +
3 files changed, 241 insertions(+), 66 deletions(-)
create mode 100644 src/Shaders/Effects/GaussianBlur.gdshader
diff --git a/src/Classes/ShaderLoader.gd b/src/Classes/ShaderLoader.gd
index 8a0f6f31e..1db9d732f 100644
--- a/src/Classes/ShaderLoader.gd
+++ b/src/Classes/ShaderLoader.gd
@@ -15,24 +15,27 @@ static func create_ui_for_shader_uniforms(
) -> void:
var code := shader.code.split("\n")
var uniforms: PackedStringArray = []
+ var uniform_data: PackedStringArray = []
var description: String = ""
- var descriprion_began := false
+ var description_began := false
for line in code:
- ## Management of "end" tags
+ # Management of "end" tags
if line.begins_with("// (end DESCRIPTION)"):
- descriprion_began = false
- if descriprion_began:
+ description_began = false
+ if description_began:
description += "\n" + line.strip_edges()
- ## Detection of uniforms
+ # Detection of uniforms
if line.begins_with("uniform"):
uniforms.append(line)
+ if line.begins_with("// uniform_data"):
+ uniform_data.append(line)
- ## Management of "begin" tags
+ # Management of "begin" tags
elif line.begins_with("// (begin DESCRIPTION)"):
- descriprion_began = true
- ## Validation of begin/end tags
- if descriprion_began == true: ## Description started but never ended. treat it as an error
+ description_began = true
+ # Validation of begin/end tags
+ if description_began == true: # Description started but never ended. treat it as an error
print("Shader description started but never finished. Assuming empty description")
description = ""
if not description.is_empty():
@@ -59,65 +62,102 @@ static func create_ui_for_shader_uniforms(
var u_init := u_left_side[0].split(" ")
var u_type := u_init[1]
var u_name := u_init[2]
+ # Find custom data of the uniform, if any exists
+ # Right now it only checks if a uniform should have another type of node
+ # Such as integers having OptionButtons
+ # But in the future it could be expanded to include custom names or descriptions.
+ var custom_data: PackedStringArray = []
+ var type_override := ""
+ for data in uniform_data:
+ if u_name in data:
+ var line_to_examine := data.split(" ")
+ if line_to_examine[3] == "type::":
+ var temp_splitter := data.split("::")
+ if temp_splitter.size() > 1:
+ type_override = temp_splitter[1].strip_edges()
+
+ custom_data.append(data)
var humanized_u_name := Keychain.humanize_snake_case(u_name) + ":"
if u_type == "float" or u_type == "int":
+ var hbox := HBoxContainer.new()
var label := Label.new()
label.text = humanized_u_name
label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- var slider := ValueSlider.new()
- slider.allow_greater = true
- slider.allow_lesser = true
- slider.size_flags_horizontal = Control.SIZE_EXPAND_FILL
- var min_value := 0.0
- var max_value := 255.0
- var step := 1.0
- var range_values_array: PackedStringArray
- if "hint_range" in u_hint:
- var range_values: String = u_hint.replace("hint_range(", "")
- range_values = range_values.replace(")", "").strip_edges()
- range_values_array = range_values.split(",")
-
- if u_type == "float":
- if range_values_array.size() >= 1:
- min_value = float(range_values_array[0])
- else:
- min_value = 0.01
-
- if range_values_array.size() >= 2:
- max_value = float(range_values_array[1])
-
- if range_values_array.size() >= 3:
- step = float(range_values_array[2])
- else:
- step = 0.01
-
- if u_value != "":
- slider.value = float(u_value)
- else:
- if range_values_array.size() >= 1:
- min_value = int(range_values_array[0])
-
- if range_values_array.size() >= 2:
- max_value = int(range_values_array[1])
-
- if range_values_array.size() >= 3:
- step = int(range_values_array[2])
-
- if u_value != "":
- slider.value = int(u_value)
- if params.has(u_name):
- slider.value = params[u_name]
- else:
- params[u_name] = slider.value
- slider.min_value = min_value
- slider.max_value = max_value
- slider.step = step
- slider.value_changed.connect(value_changed.bind(u_name))
- slider.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
- var hbox := HBoxContainer.new()
hbox.add_child(label)
- hbox.add_child(slider)
+ if type_override.begins_with("OptionButton"):
+ var option_button := OptionButton.new()
+ option_button.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ option_button.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
+ option_button.item_selected.connect(value_changed.bind(u_name))
+ var items := (
+ type_override
+ . replace("OptionButton ", "")
+ . replace("[", "")
+ . replace("]", "")
+ . split("||")
+ )
+ for item in items:
+ option_button.add_item(item)
+ if u_value != "":
+ option_button.select(int(u_value))
+ if params.has(u_name):
+ option_button.select(params[u_name])
+ else:
+ params[u_name] = option_button.selected
+ hbox.add_child(option_button)
+ else:
+ var slider := ValueSlider.new()
+ slider.allow_greater = true
+ slider.allow_lesser = true
+ slider.size_flags_horizontal = Control.SIZE_EXPAND_FILL
+ var min_value := 0.0
+ var max_value := 255.0
+ var step := 1.0
+ var range_values_array: PackedStringArray
+ if "hint_range" in u_hint:
+ var range_values: String = u_hint.replace("hint_range(", "")
+ range_values = range_values.replace(")", "").strip_edges()
+ range_values_array = range_values.split(",")
+
+ if u_type == "float":
+ if range_values_array.size() >= 1:
+ min_value = float(range_values_array[0])
+ else:
+ min_value = 0.01
+
+ if range_values_array.size() >= 2:
+ max_value = float(range_values_array[1])
+
+ if range_values_array.size() >= 3:
+ step = float(range_values_array[2])
+ else:
+ step = 0.01
+
+ if u_value != "":
+ slider.value = float(u_value)
+ else:
+ if range_values_array.size() >= 1:
+ min_value = int(range_values_array[0])
+
+ if range_values_array.size() >= 2:
+ max_value = int(range_values_array[1])
+
+ if range_values_array.size() >= 3:
+ step = int(range_values_array[2])
+
+ if u_value != "":
+ slider.value = int(u_value)
+ if params.has(u_name):
+ slider.value = params[u_name]
+ else:
+ params[u_name] = slider.value
+ slider.min_value = min_value
+ slider.max_value = max_value
+ slider.step = step
+ slider.value_changed.connect(value_changed.bind(u_name))
+ slider.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
+ hbox.add_child(slider)
parent_node.add_child(hbox)
elif u_type == "vec2" or u_type == "ivec2" or u_type == "uvec2":
var label := Label.new()
@@ -352,23 +392,23 @@ static func _get_loaded_texture(params: Dictionary, parameter_name: String) -> I
if parameter_name in params:
if params[parameter_name] is ImageTexture:
return params[parameter_name].get_image()
- var image = Image.create_empty(64, 64, false, Image.FORMAT_RGBA8)
+ var image := Image.create_empty(64, 64, false, Image.FORMAT_RGBA8)
return image
static func _shader_update_texture(
resource_proj: ResourceProject, value_changed: Callable, parameter_name: String
) -> void:
- var warnings = ""
+ var warnings := ""
if resource_proj.frames.size() > 1:
warnings += "This resource is intended to have 1 frame only. Extra frames will be ignored."
if resource_proj.layers.size() > 1:
warnings += "\nThis resource is intended to have 1 layer only. layers will be blended."
- var updated_image = Image.create_empty(
+ var updated_image := Image.create_empty(
resource_proj.size.x, resource_proj.size.y, false, Image.FORMAT_RGBA8
)
- var frame = resource_proj.frames[0]
+ var frame := resource_proj.frames[0]
DrawingAlgos.blend_layers(updated_image, frame, Vector2i.ZERO, resource_proj)
value_changed.call(ImageTexture.create_from_image(updated_image), parameter_name)
if not warnings.is_empty():
@@ -378,7 +418,7 @@ static func _shader_update_texture(
static func _modify_texture_resource(
image: Image, resource_name: StringName, update_callable: Callable
) -> void:
- var resource_proj = ResourceProject.new([], resource_name, image.get_size())
+ var resource_proj := ResourceProject.new([], resource_name, image.get_size())
resource_proj.layers.append(PixelLayer.new(resource_proj))
resource_proj.frames.append(resource_proj.new_empty_frame())
resource_proj.frames[0].cels[0].set_content(image)
diff --git a/src/Shaders/Effects/GaussianBlur.gdshader b/src/Shaders/Effects/GaussianBlur.gdshader
new file mode 100644
index 000000000..85581dcd9
--- /dev/null
+++ b/src/Shaders/Effects/GaussianBlur.gdshader
@@ -0,0 +1,134 @@
+// https://godotshaders.com/shader/gaussian-blur-functions-for-gles2/
+// Licensed under MIT.
+shader_type canvas_item;
+
+// uniform_data blur_type type:: OptionButton [Xor's Gaussian Blur||Monk's Multi-Pass Gaussian Blur||NoDev's Single-Pass Gaussian Blur||NoDev's Multi-Pass Gaussian Blur]
+uniform int blur_type : hint_range(0, 3, 1) = 0;
+uniform int blur_amount = 16;
+uniform float blur_radius = 1.0;
+uniform vec2 blur_direction = vec2(1, 1);
+
+// Xor's gaussian blur function
+// Link: https://xorshaders.weebly.com/tutorials/blur-shaders-5-part-2
+// Defaults from: https://www.shadertoy.com/view/Xltfzj
+//
+// BLUR BLURRINESS (Default 8.0)
+// BLUR ITERATIONS (Default 16.0 - More is better but slower)
+// BLUR QUALITY (Default 4.0 - More is better but slower)
+//
+// Desc.: Don't have the best performance but will run on almost
+// anything, although, if developing for mobile, is better to use
+// 'texture_nodevgaussian(...) instead'.
+vec4 texture_xorgaussian(sampler2D tex, vec2 uv, vec2 pixel_size, float blurriness, int iterations, int quality) {
+ vec2 radius = blurriness / (1.0 / pixel_size).xy;
+ vec4 blurred_tex = texture(tex, uv);
+
+ for(float d = 0.0; d < TAU; d += TAU / float(iterations)) {
+ for(float i = 1.0 / float(quality); i <= 1.0; i += 1.0 / float(quality)) {
+ vec2 directions = uv + vec2(cos(d), sin(d)) * radius * i;
+ blurred_tex += texture(tex, directions);
+ }
+ }
+ blurred_tex /= float(quality) * float(iterations) + 1.0;
+
+ return blurred_tex;
+}
+
+// Experience-Monks' fast gaussian blur function
+// Link: https://github.com/Experience-Monks/glsl-fast-gaussian-blur/
+//
+// BLUR ITERATIONS (Default 16.0 - More is better but slower)
+// BLUR DIRECTION (Direction in which the blur is applied, use vec2(1, 0) for first pass and vec2(0, 1) for second pass)
+//
+// Desc.: ACTUALLY PRETTY SLOW but still pretty good for custom cinematic
+// bloom effects, since this needs render 2 passes
+vec4 texture_monksgaussian_multipass(sampler2D tex, vec2 uv, vec2 pixel_size, int iterations, vec2 direction) {
+ vec4 blurred_tex = vec4(0.0);
+ vec2 resolution = 1.0 / pixel_size;
+
+ for (int i = 0; i < iterations; i++ ) {
+ float size = float(iterations - i);
+
+ vec2 off1 = vec2(1.3846153846) * (direction * size);
+ vec2 off2 = vec2(3.2307692308) * (direction * size);
+
+ blurred_tex += texture(tex, uv) * 0.2270270270;
+ blurred_tex += texture(tex, uv + (off1 / resolution)) * 0.3162162162;
+ blurred_tex += texture(tex, uv - (off1 / resolution)) * 0.3162162162;
+ blurred_tex += texture(tex, uv + (off2 / resolution)) * 0.0702702703;
+ blurred_tex += texture(tex, uv - (off2 / resolution)) * 0.0702702703;
+ }
+
+ blurred_tex /= float(iterations) + 1.0;
+
+ return blurred_tex;
+}
+
+// u/_NoDev_'s gaussian blur function
+// Discussion Link: https://www.reddit.com/r/godot/comments/klgfo9/help_with_shaders_in_gles2/
+// Code Link: https://postimg.cc/7JDJw80d
+//
+// BLUR BLURRINESS (Default 8.0 - More is better but slower)
+// BLUR RADIUS (Default 1.5)
+// BLUR DIRECTION (Direction in which the blur is applied, use vec2(1, 0) for first pass and vec2(0, 1) for second pass)
+//
+// Desc.: Really fast and GOOD FOR MOST CASES, but might NOT RUN IN THE WEB!
+// use 'texture_xorgaussian' instead if you found any issues.
+vec4 texture_nodevgaussian_singlepass(sampler2D tex, vec2 uv, vec2 pixel_size, float blurriness, float radius) {
+ float n = 0.0015;
+ vec4 blurred_tex = vec4(0);
+ float weight;
+
+ for (float i = -blurriness; i <= blurriness; i++) {
+ float d = i / PI;
+ vec2 anchor = vec2(cos(d), sin(d)) * radius * i;
+ vec2 directions = uv + pixel_size * anchor;
+ blurred_tex += texture(tex, directions) * n;
+ if (i <= 0.0) {n += 0.0015; }
+ if (i > 0.0) {n -= 0.0015; }
+ weight += n;
+ }
+
+ float norm = 1.0 / weight;
+ blurred_tex *= norm;
+ return blurred_tex;
+}
+vec4 texture_nodevgaussian_multipass(sampler2D tex, vec2 uv, vec2 pixel_size, float blurriness, vec2 direction) {
+ float n = 0.0015;
+ vec4 blurred_tex = vec4(0);
+ float weight;
+
+ for (float i = -blurriness; i <= blurriness; i++) {
+ vec2 directions = uv + pixel_size * (direction * i);
+ blurred_tex += texture(tex, directions) * n;
+ if (i <= 0.0) {n += 0.0015; }
+ if (i > 0.0) {n -= 0.0015; }
+ weight += n;
+ }
+
+ float norm = 1.0 / weight;
+ blurred_tex *= norm;
+ return blurred_tex;
+}
+
+void fragment() {
+ if (blur_type == 0) {
+ vec4 xorgaussian = texture_xorgaussian(TEXTURE, UV, TEXTURE_PIXEL_SIZE, float(blur_amount), 16, 4);
+ COLOR = xorgaussian;
+ }
+ else if (blur_type == 1) {
+ vec4 monksgaussian_multipass = texture_monksgaussian_multipass(TEXTURE, UV, TEXTURE_PIXEL_SIZE, blur_amount, blur_direction);
+ COLOR = monksgaussian_multipass;
+ }
+ else if (blur_type == 2) {
+ vec4 nodevgaussian_singlepass = texture_nodevgaussian_singlepass(TEXTURE, UV, TEXTURE_PIXEL_SIZE, float(blur_amount), blur_radius);
+ COLOR = nodevgaussian_singlepass;
+ }
+ else if (blur_type == 3) {
+ vec4 nodevgaussian_multipass = texture_nodevgaussian_multipass(TEXTURE, UV, TEXTURE_PIXEL_SIZE, float(blur_amount), blur_direction);
+ COLOR = nodevgaussian_multipass;
+ }
+ else {
+ COLOR = texture(TEXTURE, UV);
+ }
+}
diff --git a/src/UI/Timeline/LayerEffects/LayerEffectsSettings.gd b/src/UI/Timeline/LayerEffects/LayerEffectsSettings.gd
index 3985dc75b..3e035037b 100644
--- a/src/UI/Timeline/LayerEffects/LayerEffectsSettings.gd
+++ b/src/UI/Timeline/LayerEffects/LayerEffectsSettings.gd
@@ -7,6 +7,7 @@ var effects: Array[LayerEffect] = [
LayerEffect.new(
"Convolution Matrix", preload("res://src/Shaders/Effects/ConvolutionMatrix.gdshader")
),
+ LayerEffect.new("Gaussian Blur", preload("res://src/Shaders/Effects/GaussianBlur.gdshader")),
LayerEffect.new("Offset", preload("res://src/Shaders/Effects/OffsetPixels.gdshader")),
LayerEffect.new("Outline", preload("res://src/Shaders/Effects/OutlineInline.gdshader")),
LayerEffect.new("Drop Shadow", preload("res://src/Shaders/Effects/DropShadow.gdshader")),
From c2ce4a4a691f546a04a06f47bbaa1998738be1fa Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Sun, 8 Sep 2024 02:40:55 +0300
Subject: [PATCH 047/162] Change the pattern parameter node of the outline
layer effect to an OptionButton
Consistent with the image effect
---
src/Shaders/Effects/OutlineInline.gdshader | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/Shaders/Effects/OutlineInline.gdshader b/src/Shaders/Effects/OutlineInline.gdshader
index f19b0ccac..0eaa038a3 100644
--- a/src/Shaders/Effects/OutlineInline.gdshader
+++ b/src/Shaders/Effects/OutlineInline.gdshader
@@ -4,7 +4,8 @@ render_mode unshaded;
uniform vec4 color : source_color = vec4(1.0);
uniform float width : hint_range(0, 10, 1) = 1.0;
-uniform int pattern : hint_range(0, 2) = 0; // diamond, circle, square
+// uniform_data pattern type:: OptionButton [Diamond||Circle||Square]
+uniform int pattern : hint_range(0, 2) = 0;
uniform bool inside = false;
uniform sampler2D selection : filter_nearest;
From 321102e8fe871e6cc8e3b6f2d86f0b0be554ca09 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Sun, 8 Sep 2024 03:13:55 +0300
Subject: [PATCH 048/162] Add Gaussian Blur as an image effect
---
Translations/Translations.pot | 20 ++++
project.godot | 4 +
src/Autoload/Global.gd | 2 +
src/Shaders/Effects/GaussianBlur.gdshader | 17 +++-
src/UI/Dialogs/ImageEffects/GaussianBlur.gd | 55 +++++++++++
src/UI/Dialogs/ImageEffects/GaussianBlur.tscn | 91 +++++++++++++++++++
src/UI/TopMenuContainer/TopMenuContainer.gd | 4 +
7 files changed, 188 insertions(+), 5 deletions(-)
create mode 100644 src/UI/Dialogs/ImageEffects/GaussianBlur.gd
create mode 100644 src/UI/Dialogs/ImageEffects/GaussianBlur.tscn
diff --git a/Translations/Translations.pot b/Translations/Translations.pot
index 67fe10234..6a479eb3b 100644
--- a/Translations/Translations.pot
+++ b/Translations/Translations.pot
@@ -963,6 +963,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
diff --git a/project.godot b/project.godot
index 264a7b517..a1ea06ec0 100644
--- a/project.godot
+++ b/project.godot
@@ -884,6 +884,10 @@ change_layer_automatically={
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"command_or_control_autoremap":true,"alt_pressed":false,"shift_pressed":true,"pressed":false,"keycode":0,"physical_keycode":4194328,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
]
}
+gaussian_blur={
+"deadzone": 0.5,
+"events": []
+}
[input_devices]
diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd
index 766ee428c..28fc249c8 100644
--- a/src/Autoload/Global.gd
+++ b/src/Autoload/Global.gd
@@ -63,6 +63,7 @@ enum EffectsMenu {
PALETTIZE,
PIXELIZE,
POSTERIZE,
+ GAUSSIAN_BLUR,
GRADIENT,
GRADIENT_MAP,
SHADER
@@ -762,6 +763,7 @@ func _initialize_keychain() -> void:
&"drop_shadow": Keychain.InputAction.new("", "Effects menu", true),
&"adjust_hsv": Keychain.InputAction.new("", "Effects menu", true),
&"adjust_brightness_contrast": Keychain.InputAction.new("", "Effects menu", true),
+ &"gaussian_blur": Keychain.InputAction.new("", "Effects menu", true),
&"gradient": Keychain.InputAction.new("", "Effects menu", true),
&"gradient_map": Keychain.InputAction.new("", "Effects menu", true),
&"palettize": Keychain.InputAction.new("", "Effects menu", true),
diff --git a/src/Shaders/Effects/GaussianBlur.gdshader b/src/Shaders/Effects/GaussianBlur.gdshader
index 85581dcd9..7e26bead3 100644
--- a/src/Shaders/Effects/GaussianBlur.gdshader
+++ b/src/Shaders/Effects/GaussianBlur.gdshader
@@ -7,6 +7,7 @@ uniform int blur_type : hint_range(0, 3, 1) = 0;
uniform int blur_amount = 16;
uniform float blur_radius = 1.0;
uniform vec2 blur_direction = vec2(1, 1);
+uniform sampler2D selection : filter_nearest;
// Xor's gaussian blur function
// Link: https://xorshaders.weebly.com/tutorials/blur-shaders-5-part-2
@@ -93,6 +94,7 @@ vec4 texture_nodevgaussian_singlepass(sampler2D tex, vec2 uv, vec2 pixel_size, f
blurred_tex *= norm;
return blurred_tex;
}
+
vec4 texture_nodevgaussian_multipass(sampler2D tex, vec2 uv, vec2 pixel_size, float blurriness, vec2 direction) {
float n = 0.0015;
vec4 blurred_tex = vec4(0);
@@ -112,23 +114,28 @@ vec4 texture_nodevgaussian_multipass(sampler2D tex, vec2 uv, vec2 pixel_size, fl
}
void fragment() {
+ vec4 original_color = texture(TEXTURE, UV);
+ vec4 selection_color = texture(selection, UV);
+ vec4 col = original_color;
if (blur_type == 0) {
vec4 xorgaussian = texture_xorgaussian(TEXTURE, UV, TEXTURE_PIXEL_SIZE, float(blur_amount), 16, 4);
- COLOR = xorgaussian;
+ col = xorgaussian;
}
else if (blur_type == 1) {
vec4 monksgaussian_multipass = texture_monksgaussian_multipass(TEXTURE, UV, TEXTURE_PIXEL_SIZE, blur_amount, blur_direction);
- COLOR = monksgaussian_multipass;
+ col = monksgaussian_multipass;
}
else if (blur_type == 2) {
vec4 nodevgaussian_singlepass = texture_nodevgaussian_singlepass(TEXTURE, UV, TEXTURE_PIXEL_SIZE, float(blur_amount), blur_radius);
- COLOR = nodevgaussian_singlepass;
+ col = nodevgaussian_singlepass;
}
else if (blur_type == 3) {
vec4 nodevgaussian_multipass = texture_nodevgaussian_multipass(TEXTURE, UV, TEXTURE_PIXEL_SIZE, float(blur_amount), blur_direction);
- COLOR = nodevgaussian_multipass;
+ col = nodevgaussian_multipass;
}
else {
- COLOR = texture(TEXTURE, UV);
+ col = texture(TEXTURE, UV);
}
+ vec4 output = mix(original_color.rgba, col, selection_color.a);
+ COLOR = output;
}
diff --git a/src/UI/Dialogs/ImageEffects/GaussianBlur.gd b/src/UI/Dialogs/ImageEffects/GaussianBlur.gd
new file mode 100644
index 000000000..d30a5485f
--- /dev/null
+++ b/src/UI/Dialogs/ImageEffects/GaussianBlur.gd
@@ -0,0 +1,55 @@
+extends ImageEffect
+
+var blur_type := 0
+var blur_amount := 16
+var blur_radius := 1.0
+var blur_direction := Vector2.ONE
+var shader := preload("res://src/Shaders/Effects/GaussianBlur.gdshader")
+
+
+func _ready() -> void:
+ super._ready()
+ var sm := ShaderMaterial.new()
+ sm.shader = shader
+ preview.set_material(sm)
+
+
+func commit_action(cel: Image, project := Global.current_project) -> void:
+ var selection_tex: ImageTexture
+ if selection_checkbox.button_pressed and project.has_selection:
+ var selection := project.selection_map.return_cropped_copy(project.size)
+ selection_tex = ImageTexture.create_from_image(selection)
+
+ var params := {
+ "blur_type": blur_type,
+ "blur_amount": blur_amount,
+ "blur_radius": blur_radius,
+ "blur_direction": blur_direction,
+ "selection": selection_tex
+ }
+ if !has_been_confirmed:
+ for param in params:
+ preview.material.set_shader_parameter(param, params[param])
+ else:
+ var gen := ShaderImageEffect.new()
+ gen.generate_image(cel, shader, params, project.size)
+
+
+func _on_blur_type_item_selected(index: int) -> void:
+ blur_type = index
+ update_preview()
+
+
+func _on_blur_amount_value_changed(value: float) -> void:
+ blur_amount = value
+ update_preview()
+
+
+func _on_blur_radius_value_changed(value: float) -> void:
+ blur_radius = value
+ update_preview()
+
+
+func _on_blur_direction_value_changed(value: Vector2) -> void:
+ blur_direction = value
+ update_preview()
diff --git a/src/UI/Dialogs/ImageEffects/GaussianBlur.tscn b/src/UI/Dialogs/ImageEffects/GaussianBlur.tscn
new file mode 100644
index 000000000..7c5b5c885
--- /dev/null
+++ b/src/UI/Dialogs/ImageEffects/GaussianBlur.tscn
@@ -0,0 +1,91 @@
+[gd_scene load_steps=5 format=3 uid="uid://beile55gp1bc"]
+
+[ext_resource type="PackedScene" uid="uid://bybqhhayl5ay5" path="res://src/UI/Dialogs/ImageEffects/ImageEffectParent.tscn" id="1_cuu40"]
+[ext_resource type="Script" path="res://src/UI/Dialogs/ImageEffects/GaussianBlur.gd" id="2_37xhl"]
+[ext_resource type="Script" path="res://src/UI/Nodes/ValueSlider.gd" id="3_237k2"]
+[ext_resource type="PackedScene" path="res://src/UI/Nodes/ValueSliderV2.tscn" id="4_yprgi"]
+
+[node name="GaussianBlur" instance=ExtResource("1_cuu40")]
+title = "Gaussian Blur"
+size = Vector2i(427, 437)
+visible = true
+script = ExtResource("2_37xhl")
+
+[node name="VBoxContainer" parent="." index="3"]
+offset_right = 419.0
+offset_bottom = 388.0
+
+[node name="ShowAnimate" parent="VBoxContainer" index="0"]
+visible = false
+
+[node name="BlurOptions" type="GridContainer" parent="VBoxContainer" index="2"]
+layout_mode = 2
+columns = 2
+
+[node name="BlurTypeLabel" type="Label" parent="VBoxContainer/BlurOptions" index="0"]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Blur type:"
+
+[node name="BlurType" type="OptionButton" parent="VBoxContainer/BlurOptions" index="1"]
+layout_mode = 2
+size_flags_horizontal = 3
+selected = 0
+item_count = 4
+popup/item_0/text = "Xor's Gaussian Blur"
+popup/item_1/text = "Monk's Multi-Pass Gaussian Blur"
+popup/item_1/id = 1
+popup/item_2/text = "NoDev's Single-Pass Gaussian Blur"
+popup/item_2/id = 2
+popup/item_3/text = "NoDev's Multi-Pass Gaussian Blur"
+popup/item_3/id = 3
+
+[node name="BlurAmountLabel" type="Label" parent="VBoxContainer/BlurOptions" index="2"]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Blur amount:"
+
+[node name="BlurAmount" type="TextureProgressBar" parent="VBoxContainer/BlurOptions" index="3"]
+layout_mode = 2
+focus_mode = 2
+mouse_default_cursor_shape = 2
+theme_type_variation = &"ValueSlider"
+value = 16.0
+nine_patch_stretch = true
+stretch_margin_left = 3
+stretch_margin_top = 3
+stretch_margin_right = 3
+stretch_margin_bottom = 3
+script = ExtResource("3_237k2")
+
+[node name="BlurRadiusLabel" type="Label" parent="VBoxContainer/BlurOptions" index="4"]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Blur radius:"
+
+[node name="BlurRadius" type="TextureProgressBar" parent="VBoxContainer/BlurOptions" index="5"]
+layout_mode = 2
+focus_mode = 2
+mouse_default_cursor_shape = 2
+theme_type_variation = &"ValueSlider"
+value = 1.0
+nine_patch_stretch = true
+stretch_margin_left = 3
+stretch_margin_top = 3
+stretch_margin_right = 3
+stretch_margin_bottom = 3
+script = ExtResource("3_237k2")
+
+[node name="BlurDirectionLabel" type="Label" parent="VBoxContainer/BlurOptions" index="6"]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Blur direction:"
+
+[node name="BlurDirection" parent="VBoxContainer/BlurOptions" index="7" instance=ExtResource("4_yprgi")]
+layout_mode = 2
+value = Vector2(1, 1)
+
+[connection signal="item_selected" from="VBoxContainer/BlurOptions/BlurType" to="." method="_on_blur_type_item_selected"]
+[connection signal="value_changed" from="VBoxContainer/BlurOptions/BlurAmount" to="." method="_on_blur_amount_value_changed"]
+[connection signal="value_changed" from="VBoxContainer/BlurOptions/BlurRadius" to="." method="_on_blur_radius_value_changed"]
+[connection signal="value_changed" from="VBoxContainer/BlurOptions/BlurDirection" to="." method="_on_blur_direction_value_changed"]
diff --git a/src/UI/TopMenuContainer/TopMenuContainer.gd b/src/UI/TopMenuContainer/TopMenuContainer.gd
index 66215ec35..b3feece4d 100644
--- a/src/UI/TopMenuContainer/TopMenuContainer.gd
+++ b/src/UI/TopMenuContainer/TopMenuContainer.gd
@@ -30,6 +30,7 @@ var hsv_dialog := Dialog.new("res://src/UI/Dialogs/ImageEffects/HSVDialog.tscn")
var adjust_brightness_saturation_dialog := Dialog.new(
"res://src/UI/Dialogs/ImageEffects/BrightnessContrastDialog.tscn"
)
+var gaussian_blur_dialog := Dialog.new("res://src/UI/Dialogs/ImageEffects/GaussianBlur.tscn")
var gradient_dialog := Dialog.new("res://src/UI/Dialogs/ImageEffects/GradientDialog.tscn")
var gradient_map_dialog := Dialog.new("res://src/UI/Dialogs/ImageEffects/GradientMapDialog.tscn")
var palettize_dialog := Dialog.new("res://src/UI/Dialogs/ImageEffects/PalettizeDialog.tscn")
@@ -405,6 +406,7 @@ func _setup_effects_menu() -> void:
"Palettize": "palettize",
"Pixelize": "pixelize",
"Posterize": "posterize",
+ "Gaussian Blur": "gaussian_blur",
"Gradient": "gradient",
"Gradient Map": "gradient_map",
# "Shader": ""
@@ -817,6 +819,8 @@ func effects_menu_id_pressed(id: int) -> void:
hsv_dialog.popup()
Global.EffectsMenu.BRIGHTNESS_SATURATION:
adjust_brightness_saturation_dialog.popup()
+ Global.EffectsMenu.GAUSSIAN_BLUR:
+ gaussian_blur_dialog.popup()
Global.EffectsMenu.GRADIENT:
gradient_dialog.popup()
Global.EffectsMenu.GRADIENT_MAP:
From f9dd09dc2c3281967eddd62ff4f0bffdba9794a8 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Mon, 9 Sep 2024 00:52:20 +0300
Subject: [PATCH 049/162] Update AboutDialog.gd
---
src/UI/Dialogs/AboutDialog.gd | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/UI/Dialogs/AboutDialog.gd b/src/UI/Dialogs/AboutDialog.gd
index d07974ec2..e610bbbb3 100644
--- a/src/UI/Dialogs/AboutDialog.gd
+++ b/src/UI/Dialogs/AboutDialog.gd
@@ -20,6 +20,7 @@ const AUTHORS: PackedStringArray = [
"Darshan Phaldesai (luiq54)",
"dasimonde",
"Dávid Gábor BODOR (dragonfi)",
+ "donte5405",
"Fayez Akhtar (Variable)",
"Gamespleasure",
"GrantMoyer",
@@ -58,6 +59,7 @@ const AUTHORS: PackedStringArray = [
"Subhang Nanduri (SbNanduri)",
"TheLsbt",
"THWLF",
+ "Vaibhav Kubre (kubre)",
"Vriska Weaver (henlo-birb)",
]
@@ -134,6 +136,7 @@ const TRANSLATORS_DICTIONARY := {
"Marco Galli (Gaarco)": ["Italian"],
"StarFang208": ["Italian"],
"Damiano Guida (damiano.guida22)": ["Italian"],
+ "albano battistella (albanobattistella)": ["Italian"],
"Azagaya VJ (azagaya.games)": ["Spanish"],
"Lilly And (KatieAnd)": ["Spanish"],
"UncleFangs": ["Spanish"],
From a5efb97d58dd72ec79a4c1e9a0ea2ff066e9776b Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Tue, 10 Sep 2024 02:03:07 +0300
Subject: [PATCH 050/162] Set the group layer's default blend mode to Pass
through
Mostly for performance reasons, but also to make it consistent with Photoshop and Photopea
---
src/Classes/Layers/GroupLayer.gd | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/Classes/Layers/GroupLayer.gd b/src/Classes/Layers/GroupLayer.gd
index d31c49ead..49d2b7928 100644
--- a/src/Classes/Layers/GroupLayer.gd
+++ b/src/Classes/Layers/GroupLayer.gd
@@ -8,6 +8,7 @@ var expanded := true
func _init(_project: Project, _name := "") -> void:
project = _project
name = _name
+ blend_mode = BlendModes.PASS_THROUGH
## Blends all of the images of children layer of the group layer into a single image.
From a5a74e99a336aeb621fb0f5701178fe1c41f764b Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Wed, 11 Sep 2024 16:18:19 +0300
Subject: [PATCH 051/162] Fix crash when re-arranging palette swatches while
holding Shift
---
src/Palette/Palette.gd | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Palette/Palette.gd b/src/Palette/Palette.gd
index 80c97880c..3fda63a60 100644
--- a/src/Palette/Palette.gd
+++ b/src/Palette/Palette.gd
@@ -216,7 +216,7 @@ func insert_color(index: int, new_color: Color) -> void:
var c := PaletteColor.new(new_color, index)
# If insert happens on non empty swatch recursively move the original color
# and every other color to its right one swatch to right
- if colors[index] != null:
+ if colors.has(index):
_move_right(index)
colors[index] = c
data_changed.emit()
@@ -231,7 +231,7 @@ func _move_right(index: int) -> void:
colors_max = width * height
# If swatch to right to this color is not empty move that color right too
- if colors[index + 1] != null:
+ if colors.has(index + 1):
_move_right(index + 1)
colors[index + 1] = colors[index]
From 54068895bc6940d3c5ada616d3dc9c86eed2d304 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Wed, 11 Sep 2024 16:45:16 +0300
Subject: [PATCH 052/162] Rename "trim sprite" to "trim images" and add the
related strings to Translations.pot
"Trim images" should be a more fitting name for this option, as it's quite common to export multiple images and the use of plural makes it more clear that this option applies to all exported images.
---
Translations/Translations.pot | 8 ++++++++
src/UI/Dialogs/ExportDialog.gd | 4 ++--
src/UI/Dialogs/ExportDialog.tscn | 8 ++++----
3 files changed, 14 insertions(+), 6 deletions(-)
diff --git a/Translations/Translations.pot b/Translations/Translations.pot
index 6a479eb3b..9dd0492ae 100644
--- a/Translations/Translations.pot
+++ b/Translations/Translations.pot
@@ -2649,6 +2649,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/src/UI/Dialogs/ExportDialog.gd b/src/UI/Dialogs/ExportDialog.gd
index 5683294f6..5c6f72548 100644
--- a/src/UI/Dialogs/ExportDialog.gd
+++ b/src/UI/Dialogs/ExportDialog.gd
@@ -457,8 +457,8 @@ func _on_MultipleAnimationsDirectories_toggled(button_pressed: bool) -> void:
Export.new_dir_for_each_frame_tag = button_pressed
-func _on_TrimSprite_toggled(toggled_on: bool) -> void:
- Export.trim_sprite = toggled_on
+func _on_trim_images_toggled(toggled_on: bool) -> void:
+ Export.trim_images = toggled_on
Export.process_data()
set_preview()
diff --git a/src/UI/Dialogs/ExportDialog.tscn b/src/UI/Dialogs/ExportDialog.tscn
index 925094e25..dd0eed671 100644
--- a/src/UI/Dialogs/ExportDialog.tscn
+++ b/src/UI/Dialogs/ExportDialog.tscn
@@ -318,11 +318,11 @@ tooltip_text = "Creates multiple files but every file is stored in different fol
mouse_default_cursor_shape = 2
text = "Create new folder for each frame tag"
-[node name="TrimSprite" type="CheckBox" parent="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer" groups=["ExportImageOptions", "ExportMultipleFilesOptions"]]
+[node name="TrimImages" type="CheckBox" parent="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer" groups=["ExportImageOptions", "ExportMultipleFilesOptions"]]
layout_mode = 2
-tooltip_text = "Trims sprite to visible portion of the spirte, considering each pixel with a non-zero alpha channel as visible."
+tooltip_text = "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
mouse_default_cursor_shape = 2
-text = "Trim Sprite"
+text = "Trim images"
[node name="PathDialog" type="FileDialog" parent="." groups=["FileDialogs"]]
mode = 2
@@ -378,7 +378,7 @@ size_flags_horizontal = 3
[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/SplitLayers" to="." method="_on_split_layers_toggled"]
[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/IncludeTagsInFilename" to="." method="_on_IncludeTagsInFilename_toggled"]
[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/MultipleAnimationsDirectories" to="." method="_on_MultipleAnimationsDirectories_toggled"]
-[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/TrimSprite" to="." method="_on_TrimSprite_toggled"]
+[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/TrimImages" to="." method="_on_trim_images_toggled"]
[connection signal="canceled" from="PathDialog" to="." method="_on_path_dialog_canceled"]
[connection signal="dir_selected" from="PathDialog" to="." method="_on_path_dialog_dir_selected"]
[connection signal="confirmed" from="FileExistsAlert" to="." method="_on_FileExistsAlert_confirmed"]
From b962b315681de7b2ea65ac47717271d03acc11fc Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Wed, 11 Sep 2024 16:59:53 +0300
Subject: [PATCH 053/162] Make some method names in ExportDialog lowercase
They were named this way due to the naming conventions of Godot 3, but Godot 4 automatically makes these method names be all lowercase. Eventually we should replace all methods in the codebase to be all lowercase.
---
src/UI/Dialogs/ExportDialog.gd | 42 ++++++++++++++++----------------
src/UI/Dialogs/ExportDialog.tscn | 40 +++++++++++++++---------------
2 files changed, 41 insertions(+), 41 deletions(-)
diff --git a/src/UI/Dialogs/ExportDialog.gd b/src/UI/Dialogs/ExportDialog.gd
index 5c6f72548..ff09416ad 100644
--- a/src/UI/Dialogs/ExportDialog.gd
+++ b/src/UI/Dialogs/ExportDialog.gd
@@ -269,7 +269,7 @@ func set_export_progress_bar(value: float) -> void:
export_progress_bar.value = value
-func _on_ExportDialog_about_to_show() -> void:
+func _on_about_to_popup() -> void:
get_ok_button().text = "Export"
Global.canvas.selection.transform_content_confirm()
var project := Global.current_project
@@ -297,12 +297,12 @@ func _on_ExportDialog_about_to_show() -> void:
checker.size = checker.get_parent().size
-func _on_Tabs_tab_clicked(tab: Export.ExportTab) -> void:
+func _on_tab_bar_tab_clicked(tab: Export.ExportTab) -> void:
Export.current_tab = tab
show_tab()
-func _on_Orientation_item_selected(id: Export.Orientation) -> void:
+func _on_orientation_item_selected(id: Export.Orientation) -> void:
Export.orientation = id
_handle_orientation_ui()
spritesheet_lines_count.value = Export.frames_divided_by_spritesheet_lines()
@@ -325,14 +325,14 @@ func _handle_orientation_ui() -> void:
spritesheet_lines_count.visible = false
-func _on_LinesCount_value_changed(value: float) -> void:
+func _on_lines_count_value_changed(value: float) -> void:
Export.lines_count = value
Export.process_spritesheet()
update_dimensions_label()
set_preview()
-func _on_Direction_item_selected(id: Export.AnimationDirection) -> void:
+func _on_direction_item_selected(id: Export.AnimationDirection) -> void:
Export.direction = id
preview_current_frame = 0
Export.process_data()
@@ -340,7 +340,7 @@ func _on_Direction_item_selected(id: Export.AnimationDirection) -> void:
update_dimensions_label()
-func _on_Resize_value_changed(value: float) -> void:
+func _on_resize_value_changed(value: float) -> void:
Export.resize = value
update_dimensions_label()
@@ -349,25 +349,25 @@ func _on_quality_value_changed(value: float) -> void:
Export.save_quality = value / 100.0
-func _on_Interpolation_item_selected(id: Image.Interpolation) -> void:
+func _on_interpolation_item_selected(id: Image.Interpolation) -> void:
Export.interpolation = id
-func _on_ExportDialog_confirmed() -> void:
+func _on_confirmed() -> void:
Global.current_project.export_overwrite = false
if await Export.export_processed_images(false, self, Global.current_project):
hide()
-func _on_PathButton_pressed() -> void:
+func _on_path_button_pressed() -> void:
path_dialog_popup.popup_centered()
-func _on_PathLineEdit_text_changed(new_text: String) -> void:
+func _on_path_line_edit_text_changed(new_text: String) -> void:
Global.current_project.export_directory_path = new_text
-func _on_FileLineEdit_text_changed(new_text: String) -> void:
+func _on_file_line_edit_text_changed(new_text: String) -> void:
Global.current_project.file_name = new_text
@@ -387,7 +387,7 @@ func _on_path_dialog_canceled() -> void:
show()
-func _on_FileFormat_item_selected(idx: int) -> void:
+func _on_file_format_item_selected(idx: int) -> void:
var id := file_format_options.get_item_id(idx) as Export.FileFormat
Global.current_project.file_format = id
if not Export.is_single_file_format():
@@ -405,14 +405,14 @@ func _on_FileFormat_item_selected(idx: int) -> void:
## Overwrite existing file
-func _on_FileExistsAlert_confirmed() -> void:
+func _on_file_exists_alert_confirmed() -> void:
file_exists_alert_popup.dialog_text = Export.file_exists_alert
Export.stop_export = false
resume_export_function.emit()
-func _on_FileExistsAlert_custom_action(action: String) -> void:
- if action == "cancel":
+func _on_file_exists_alert_custom_action(action: StringName) -> void:
+ if action == &"cancel":
# Cancel export
file_exists_alert_popup.dialog_text = Export.file_exists_alert
Export.stop_export = true
@@ -420,7 +420,7 @@ func _on_FileExistsAlert_custom_action(action: String) -> void:
file_exists_alert_popup.hide()
-func _on_FrameTimer_timeout() -> void:
+func _on_frame_timer_timeout() -> void:
var preview_texture_rect: TextureRect = previews.get_node("PreviewContainer/Preview")
if not preview_texture_rect:
return
@@ -449,11 +449,11 @@ func _on_split_layers_toggled(toggled_on: bool) -> void:
set_preview()
-func _on_IncludeTagsInFilename_toggled(button_pressed: bool) -> void:
+func _on_include_tags_in_filename_toggled(button_pressed: bool) -> void:
Export.include_tag_in_filename = button_pressed
-func _on_MultipleAnimationsDirectories_toggled(button_pressed: bool) -> void:
+func _on_multiple_animations_directories_toggled(button_pressed: bool) -> void:
Export.new_dir_for_each_frame_tag = button_pressed
@@ -463,7 +463,7 @@ func _on_trim_images_toggled(toggled_on: bool) -> void:
set_preview()
-func _on_Frames_item_selected(id: int) -> void:
+func _on_frames_item_selected(id: int) -> void:
Export.frame_current_tag = id
Export.process_data()
set_preview()
@@ -471,12 +471,12 @@ func _on_Frames_item_selected(id: int) -> void:
spritesheet_lines_count.value = Export.lines_count
-func _on_Layers_item_selected(id: int) -> void:
+func _on_layers_item_selected(id: int) -> void:
Export.export_layers = id
Export.cache_blended_frames()
Export.process_data()
set_preview()
-func _on_SeparatorCharacter_text_changed(new_text: String) -> void:
+func _on_separator_character_text_changed(new_text: String) -> void:
Export.separator_character = new_text
diff --git a/src/UI/Dialogs/ExportDialog.tscn b/src/UI/Dialogs/ExportDialog.tscn
index dd0eed671..e98b6de23 100644
--- a/src/UI/Dialogs/ExportDialog.tscn
+++ b/src/UI/Dialogs/ExportDialog.tscn
@@ -358,29 +358,29 @@ size_flags_horizontal = 3
[node name="FrameTimer" type="Timer" parent="."]
-[connection signal="about_to_popup" from="." to="." method="_on_ExportDialog_about_to_show"]
-[connection signal="confirmed" from="." to="." method="_on_ExportDialog_confirmed"]
-[connection signal="tab_clicked" from="VBoxContainer/TabBar" to="." method="_on_Tabs_tab_clicked"]
-[connection signal="item_selected" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/Orientation" to="." method="_on_Orientation_item_selected"]
-[connection signal="value_changed" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/LinesCount" to="." method="_on_LinesCount_value_changed"]
-[connection signal="item_selected" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/Frames" to="." method="_on_Frames_item_selected"]
-[connection signal="item_selected" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/Layers" to="." method="_on_Layers_item_selected"]
-[connection signal="item_selected" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/Direction" to="." method="_on_Direction_item_selected"]
-[connection signal="value_changed" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/Resize" to="." method="_on_Resize_value_changed"]
+[connection signal="about_to_popup" from="." to="." method="_on_about_to_popup"]
+[connection signal="confirmed" from="." to="." method="_on_confirmed"]
+[connection signal="tab_clicked" from="VBoxContainer/TabBar" to="." method="_on_tab_bar_tab_clicked"]
+[connection signal="item_selected" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/Orientation" to="." method="_on_orientation_item_selected"]
+[connection signal="value_changed" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/LinesCount" to="." method="_on_lines_count_value_changed"]
+[connection signal="item_selected" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/Frames" to="." method="_on_frames_item_selected"]
+[connection signal="item_selected" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/Layers" to="." method="_on_layers_item_selected"]
+[connection signal="item_selected" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/Direction" to="." method="_on_direction_item_selected"]
+[connection signal="value_changed" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/Resize" to="." method="_on_resize_value_changed"]
[connection signal="value_changed" from="VBoxContainer/VSplitContainer/VBoxContainer/GridContainer/Quality" to="." method="_on_quality_value_changed"]
-[connection signal="text_changed" from="VBoxContainer/VSplitContainer/VBoxContainer/FilePath/PathLineEdit" to="." method="_on_PathLineEdit_text_changed"]
-[connection signal="pressed" from="VBoxContainer/VSplitContainer/VBoxContainer/FilePath/PathButton" to="." method="_on_PathButton_pressed"]
-[connection signal="text_changed" from="VBoxContainer/VSplitContainer/VBoxContainer/FilePath/FileLineEdit" to="." method="_on_FileLineEdit_text_changed"]
-[connection signal="item_selected" from="VBoxContainer/VSplitContainer/VBoxContainer/FilePath/FileFormat" to="." method="_on_FileFormat_item_selected"]
-[connection signal="item_selected" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/Interpolation" to="." method="_on_Interpolation_item_selected"]
-[connection signal="text_changed" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/SeparatorCharacter" to="." method="_on_SeparatorCharacter_text_changed"]
+[connection signal="text_changed" from="VBoxContainer/VSplitContainer/VBoxContainer/FilePath/PathLineEdit" to="." method="_on_path_line_edit_text_changed"]
+[connection signal="pressed" from="VBoxContainer/VSplitContainer/VBoxContainer/FilePath/PathButton" to="." method="_on_path_button_pressed"]
+[connection signal="text_changed" from="VBoxContainer/VSplitContainer/VBoxContainer/FilePath/FileLineEdit" to="." method="_on_file_line_edit_text_changed"]
+[connection signal="item_selected" from="VBoxContainer/VSplitContainer/VBoxContainer/FilePath/FileFormat" to="." method="_on_file_format_item_selected"]
+[connection signal="item_selected" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/Interpolation" to="." method="_on_interpolation_item_selected"]
+[connection signal="text_changed" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/SeparatorCharacter" to="." method="_on_separator_character_text_changed"]
[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/ExportJSON" to="." method="_on_export_json_toggled"]
[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/SplitLayers" to="." method="_on_split_layers_toggled"]
-[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/IncludeTagsInFilename" to="." method="_on_IncludeTagsInFilename_toggled"]
-[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/MultipleAnimationsDirectories" to="." method="_on_MultipleAnimationsDirectories_toggled"]
+[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/IncludeTagsInFilename" to="." method="_on_include_tags_in_filename_toggled"]
+[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/MultipleAnimationsDirectories" to="." method="_on_multiple_animations_directories_toggled"]
[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/TrimImages" to="." method="_on_trim_images_toggled"]
[connection signal="canceled" from="PathDialog" to="." method="_on_path_dialog_canceled"]
[connection signal="dir_selected" from="PathDialog" to="." method="_on_path_dialog_dir_selected"]
-[connection signal="confirmed" from="FileExistsAlert" to="." method="_on_FileExistsAlert_confirmed"]
-[connection signal="custom_action" from="FileExistsAlert" to="." method="_on_FileExistsAlert_custom_action"]
-[connection signal="timeout" from="FrameTimer" to="." method="_on_FrameTimer_timeout"]
+[connection signal="confirmed" from="FileExistsAlert" to="." method="_on_file_exists_alert_confirmed"]
+[connection signal="custom_action" from="FileExistsAlert" to="." method="_on_file_exists_alert_custom_action"]
+[connection signal="timeout" from="FrameTimer" to="." method="_on_frame_timer_timeout"]
From 504313483d251320ad8c272cddaa963a473a030a Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Wed, 11 Sep 2024 17:00:23 +0300
Subject: [PATCH 054/162] Change `trim_sprite` to `trim_images` variable name
in Export
---
src/Autoload/Export.gd | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/src/Autoload/Export.gd b/src/Autoload/Export.gd
index bb10a3f1c..e16788331 100644
--- a/src/Autoload/Export.gd
+++ b/src/Autoload/Export.gd
@@ -51,7 +51,7 @@ var processed_images: Array[ProcessedImage] = []
var blended_frames := {}
var export_json := false
var split_layers := false
-var trim_sprite := false
+var trim_images := false
# Spritesheet options
var orientation := Orientation.COLUMNS
@@ -266,7 +266,6 @@ func process_spritesheet(project := Global.current_project) -> void:
origin.x = 0
tag_origins[0] += 1
whole_image.blend_rect(blended_frames[frame], Rect2i(Vector2i.ZERO, project.size), origin)
- #_blend_layers(whole_image, frame, origin)
processed_images.append(ProcessedImage.new(whole_image, 0))
@@ -286,7 +285,7 @@ func process_animation(project := Global.current_project) -> void:
else:
var image := Image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8)
image.copy_from(blended_frames[frame])
- if trim_sprite:
+ if trim_images:
image = image.get_region(image.get_used_rect())
var duration := frame.duration * (1.0 / project.fps)
processed_images.append(ProcessedImage.new(image, project.frames.find(frame), duration))
From 62d573ae01b5793453af9983ebebbe779e581539 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Wed, 11 Sep 2024 17:01:03 +0300
Subject: [PATCH 055/162] Fix issue when exporting and the user has specific
frames selected, then changes the layers and then changes the frames again
---
src/Autoload/Export.gd | 3 +++
1 file changed, 3 insertions(+)
diff --git a/src/Autoload/Export.gd b/src/Autoload/Export.gd
index e16788331..f20c95ab2 100644
--- a/src/Autoload/Export.gd
+++ b/src/Autoload/Export.gd
@@ -146,6 +146,9 @@ func external_export(project := Global.current_project) -> void:
func process_data(project := Global.current_project) -> void:
+ var frames := _calculate_frames(project)
+ if frames.size() > blended_frames.size():
+ cache_blended_frames(project)
match current_tab:
ExportTab.IMAGE:
process_animation(project)
From 8f6eba3f8494a0379ae30c58f743cc259e40a130 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Wed, 11 Sep 2024 17:01:25 +0300
Subject: [PATCH 056/162] Make the Gaussian blur dialog invisible
---
src/UI/Dialogs/ImageEffects/GaussianBlur.tscn | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/UI/Dialogs/ImageEffects/GaussianBlur.tscn b/src/UI/Dialogs/ImageEffects/GaussianBlur.tscn
index 7c5b5c885..e199e41fe 100644
--- a/src/UI/Dialogs/ImageEffects/GaussianBlur.tscn
+++ b/src/UI/Dialogs/ImageEffects/GaussianBlur.tscn
@@ -8,7 +8,6 @@
[node name="GaussianBlur" instance=ExtResource("1_cuu40")]
title = "Gaussian Blur"
size = Vector2i(427, 437)
-visible = true
script = ExtResource("2_37xhl")
[node name="VBoxContainer" parent="." index="3"]
From 3bd7e94a5951be5f0d3a3bc93fa2e099d1cf7e41 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Wed, 11 Sep 2024 17:01:44 +0300
Subject: [PATCH 057/162] Minor cleanups to some shader code
---
src/Shaders/Effects/GaussianBlur.gdshader | 32 +++++++++++------------
src/Shaders/Effects/IndexMap.gdshader | 2 +-
2 files changed, 17 insertions(+), 17 deletions(-)
diff --git a/src/Shaders/Effects/GaussianBlur.gdshader b/src/Shaders/Effects/GaussianBlur.gdshader
index 7e26bead3..8cf9939f4 100644
--- a/src/Shaders/Effects/GaussianBlur.gdshader
+++ b/src/Shaders/Effects/GaussianBlur.gdshader
@@ -9,7 +9,7 @@ uniform float blur_radius = 1.0;
uniform vec2 blur_direction = vec2(1, 1);
uniform sampler2D selection : filter_nearest;
-// Xor's gaussian blur function
+// Xor's gaussian blur function
// Link: https://xorshaders.weebly.com/tutorials/blur-shaders-5-part-2
// Defaults from: https://www.shadertoy.com/view/Xltfzj
//
@@ -18,12 +18,12 @@ uniform sampler2D selection : filter_nearest;
// BLUR QUALITY (Default 4.0 - More is better but slower)
//
// Desc.: Don't have the best performance but will run on almost
-// anything, although, if developing for mobile, is better to use
+// anything, although, if developing for mobile, is better to use
// 'texture_nodevgaussian(...) instead'.
vec4 texture_xorgaussian(sampler2D tex, vec2 uv, vec2 pixel_size, float blurriness, int iterations, int quality) {
vec2 radius = blurriness / (1.0 / pixel_size).xy;
vec4 blurred_tex = texture(tex, uv);
-
+
for(float d = 0.0; d < TAU; d += TAU / float(iterations)) {
for(float i = 1.0 / float(quality); i <= 1.0; i += 1.0 / float(quality)) {
vec2 directions = uv + vec2(cos(d), sin(d)) * radius * i;
@@ -31,7 +31,7 @@ vec4 texture_xorgaussian(sampler2D tex, vec2 uv, vec2 pixel_size, float blurrine
}
}
blurred_tex /= float(quality) * float(iterations) + 1.0;
-
+
return blurred_tex;
}
@@ -42,14 +42,14 @@ vec4 texture_xorgaussian(sampler2D tex, vec2 uv, vec2 pixel_size, float blurrine
// BLUR DIRECTION (Direction in which the blur is applied, use vec2(1, 0) for first pass and vec2(0, 1) for second pass)
//
// Desc.: ACTUALLY PRETTY SLOW but still pretty good for custom cinematic
-// bloom effects, since this needs render 2 passes
+// bloom effects, since this needs render 2 passes
vec4 texture_monksgaussian_multipass(sampler2D tex, vec2 uv, vec2 pixel_size, int iterations, vec2 direction) {
vec4 blurred_tex = vec4(0.0);
vec2 resolution = 1.0 / pixel_size;
-
+
for (int i = 0; i < iterations; i++ ) {
float size = float(iterations - i);
-
+
vec2 off1 = vec2(1.3846153846) * (direction * size);
vec2 off2 = vec2(3.2307692308) * (direction * size);
@@ -59,9 +59,9 @@ vec4 texture_monksgaussian_multipass(sampler2D tex, vec2 uv, vec2 pixel_size, in
blurred_tex += texture(tex, uv + (off2 / resolution)) * 0.0702702703;
blurred_tex += texture(tex, uv - (off2 / resolution)) * 0.0702702703;
}
-
+
blurred_tex /= float(iterations) + 1.0;
-
+
return blurred_tex;
}
@@ -89,7 +89,7 @@ vec4 texture_nodevgaussian_singlepass(sampler2D tex, vec2 uv, vec2 pixel_size, f
if (i > 0.0) {n -= 0.0015; }
weight += n;
}
-
+
float norm = 1.0 / weight;
blurred_tex *= norm;
return blurred_tex;
@@ -99,7 +99,7 @@ vec4 texture_nodevgaussian_multipass(sampler2D tex, vec2 uv, vec2 pixel_size, fl
float n = 0.0015;
vec4 blurred_tex = vec4(0);
float weight;
-
+
for (float i = -blurriness; i <= blurriness; i++) {
vec2 directions = uv + pixel_size * (direction * i);
blurred_tex += texture(tex, directions) * n;
@@ -107,7 +107,7 @@ vec4 texture_nodevgaussian_multipass(sampler2D tex, vec2 uv, vec2 pixel_size, fl
if (i > 0.0) {n -= 0.0015; }
weight += n;
}
-
+
float norm = 1.0 / weight;
blurred_tex *= norm;
return blurred_tex;
@@ -120,19 +120,19 @@ void fragment() {
if (blur_type == 0) {
vec4 xorgaussian = texture_xorgaussian(TEXTURE, UV, TEXTURE_PIXEL_SIZE, float(blur_amount), 16, 4);
col = xorgaussian;
- }
+ }
else if (blur_type == 1) {
vec4 monksgaussian_multipass = texture_monksgaussian_multipass(TEXTURE, UV, TEXTURE_PIXEL_SIZE, blur_amount, blur_direction);
col = monksgaussian_multipass;
- }
+ }
else if (blur_type == 2) {
vec4 nodevgaussian_singlepass = texture_nodevgaussian_singlepass(TEXTURE, UV, TEXTURE_PIXEL_SIZE, float(blur_amount), blur_radius);
col = nodevgaussian_singlepass;
- }
+ }
else if (blur_type == 3) {
vec4 nodevgaussian_multipass = texture_nodevgaussian_multipass(TEXTURE, UV, TEXTURE_PIXEL_SIZE, float(blur_amount), blur_direction);
col = nodevgaussian_multipass;
- }
+ }
else {
col = texture(TEXTURE, UV);
}
diff --git a/src/Shaders/Effects/IndexMap.gdshader b/src/Shaders/Effects/IndexMap.gdshader
index dc4c026dd..46fecda00 100644
--- a/src/Shaders/Effects/IndexMap.gdshader
+++ b/src/Shaders/Effects/IndexMap.gdshader
@@ -10,7 +10,7 @@ uniform bool alpha = false;
// respectively instead of color components.
// When you draw, color will be taken from the x-y position in the "Map Texture".
// (end DESCRIPTION)
-void fragment(){
+void fragment() {
vec4 col = texture(TEXTURE, UV);
vec2 map_size = vec2(textureSize(map_texture, 0));
vec2 lookup_uv = vec2(round(col.x * 255.0)/(map_size.x), round(col.y * 255.0)/(map_size.y));
From f62770ece97b2bb09818b273aeb1cb5a65a49606 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 12 Sep 2024 17:43:47 +0300
Subject: [PATCH 058/162] [skip ci] Update CHANGELOG.md
---
CHANGELOG.md | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e3026f983..dd048ef3d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,18 +12,22 @@ Built using Godot 4.3
### Added
- Added new global layer buttons that change visibility, lock or expand all layers on the first level. [#1085](https://github.com/Orama-Interactive/Pixelorama/pull/1085)
+- Added a new Gaussian blur image and layer effect.
- A new Index Map layer effect has been added. [#1093](https://github.com/Orama-Interactive/Pixelorama/pull/1093)
- Is it now possible to adjust the opacity of onion skinning. [#1091](https://github.com/Orama-Interactive/Pixelorama/pull/1091)
-- Added option to trim sprites empty area while exporting. [#1088](https://github.com/Orama-Interactive/Pixelorama/pull/1088)
+- Added option to trim the empty area of the exported images. [#1088](https://github.com/Orama-Interactive/Pixelorama/pull/1088)
- A quality slider has been added to the export dialog, when exporting jpg files.
### Changed
- The layer opacity and frame buttons are now fixed on top, always visible regardless of the vertical scroll position. [#1095](https://github.com/Orama-Interactive/Pixelorama/pull/1095)
+- The default blend mode of layer groups is now pass-through.
+- The color picker popup when editing gradients is now moveable.
### Fixed
- Fixed an issue where the '\n` escape character got inserted inside the palette name, causing the palette to fail to be saved.
- The export dialog has been optimized by caching all of the blended frames. Changing export options, besides the layers, no longer cause slowness by re-blending all of the frames.
- Optimized the lasso and polygon select tools, as well as the fill options of the pencil and curve tools. The time they take to complete now depends on the size of the selection, rather than checking all of the pixels of the entire canvas.
+- Fixed a crash when re-arranging palette swatches while holding Shift.
- Fixed wrong stretch mode in the cel button previews. [#1097](https://github.com/Orama-Interactive/Pixelorama/pull/1097)
## [v1.0.2] - 2024-08-21
From 1b48eac843a9cc6b4071e51c0b616dc52efec96a Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 12 Sep 2024 18:26:42 +0300
Subject: [PATCH 059/162] Fix crash when using the move tool snapped to the
grid
---
src/Tools/UtilityTools/Move.gd | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/src/Tools/UtilityTools/Move.gd b/src/Tools/UtilityTools/Move.gd
index 4918e90f3..dcca36e9f 100644
--- a/src/Tools/UtilityTools/Move.gd
+++ b/src/Tools/UtilityTools/Move.gd
@@ -18,16 +18,18 @@ func _input(event: InputEvent) -> void:
_snap_to_grid = true
_offset = _offset.snapped(Global.grid_size)
if Global.current_project.has_selection and selection_node.is_moving_content:
- var prev_pos: Vector2 = selection_node.big_bounding_rectangle.position
- selection_node.big_bounding_rectangle.position = prev_pos.snapped(Global.grid_size)
+ var prev_pos: Vector2i = selection_node.big_bounding_rectangle.position
+ selection_node.big_bounding_rectangle.position = Vector2i(
+ prev_pos.snapped(Global.grid_size)
+ )
# The first time transform_snap_grid is enabled then _snap_position() is not called
# and the selection had wrong offset, so do selection offsetting here
- var grid_offset := Global.grid_offset
- grid_offset = Vector2(
- fmod(grid_offset.x, Global.grid_size.x), fmod(grid_offset.y, Global.grid_size.y)
+ var grid_offset := Vector2i(
+ fmod(Global.grid_offset.x, Global.grid_size.x),
+ fmod(Global.grid_offset.y, Global.grid_size.y)
)
selection_node.big_bounding_rectangle.position += grid_offset
- selection_node.marching_ants_outline.offset += (
+ selection_node.marching_ants_outline.offset += Vector2(
selection_node.big_bounding_rectangle.position - prev_pos
)
elif event.is_action_released("transform_snap_grid"):
From 462a95a5ae193f84acc95d081cc7424eda9b6a13 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 12 Sep 2024 20:23:18 +0300
Subject: [PATCH 060/162] Fix visual bug with the preview of the resize canvas
dialog
---
src/UI/Dialogs/ImageEffects/ResizeCanvas.gd | 21 ++-------------------
1 file changed, 2 insertions(+), 19 deletions(-)
diff --git a/src/UI/Dialogs/ImageEffects/ResizeCanvas.gd b/src/UI/Dialogs/ImageEffects/ResizeCanvas.gd
index 6b56dbd0c..3fcff4c67 100644
--- a/src/UI/Dialogs/ImageEffects/ResizeCanvas.gd
+++ b/src/UI/Dialogs/ImageEffects/ResizeCanvas.gd
@@ -17,25 +17,8 @@ var image := Image.create(1, 1, false, Image.FORMAT_RGBA8)
func _on_ResizeCanvas_about_to_show() -> void:
Global.canvas.selection.transform_content_confirm()
image.resize(Global.current_project.size.x, Global.current_project.size.y)
-
- var layer_i := 0
- for cel in Global.current_project.frames[Global.current_project.current_frame].cels:
- var layer := Global.current_project.layers[layer_i]
- if cel is PixelCel and layer.is_visible_in_hierarchy():
- var cel_image := Image.new()
- cel_image.copy_from(cel.get_image())
- var opacity := cel.get_final_opacity(layer)
- if opacity < 1.0: # If we have cel transparency
- for xx in cel_image.get_size().x:
- for yy in cel_image.get_size().y:
- var pixel_color := cel_image.get_pixel(xx, yy)
- pixel_color.a *= cel.opacity
- cel_image.set_pixel(xx, yy, pixel_color)
- image.blend_rect(
- cel_image, Rect2i(Vector2i.ZERO, Global.current_project.size), Vector2i.ZERO
- )
- layer_i += 1
-
+ var frame := Global.current_project.frames[Global.current_project.current_frame]
+ DrawingAlgos.blend_layers(image, frame)
width_spinbox.value = Global.current_project.size.x
height_spinbox.value = Global.current_project.size.y
update_preview()
From 6ad23f84859622a8497504b790a359df0177cd8e Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 12 Sep 2024 21:08:32 +0300
Subject: [PATCH 061/162] Second attempt to fix a visual bug with resize
canvas' dialog preview
---
src/UI/Dialogs/ImageEffects/ResizeCanvas.gd | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/UI/Dialogs/ImageEffects/ResizeCanvas.gd b/src/UI/Dialogs/ImageEffects/ResizeCanvas.gd
index 3fcff4c67..d3805dee3 100644
--- a/src/UI/Dialogs/ImageEffects/ResizeCanvas.gd
+++ b/src/UI/Dialogs/ImageEffects/ResizeCanvas.gd
@@ -17,6 +17,7 @@ var image := Image.create(1, 1, false, Image.FORMAT_RGBA8)
func _on_ResizeCanvas_about_to_show() -> void:
Global.canvas.selection.transform_content_confirm()
image.resize(Global.current_project.size.x, Global.current_project.size.y)
+ image.fill(Color(0.0, 0.0, 0.0, 0.0))
var frame := Global.current_project.frames[Global.current_project.current_frame]
DrawingAlgos.blend_layers(image, frame)
width_spinbox.value = Global.current_project.size.x
From 501a7d3c02222d12ff28b397773da8c893ecba8b Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 13 Sep 2024 00:03:53 +0300
Subject: [PATCH 062/162] [skip ci] Update CHANGELOG.md
---
CHANGELOG.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index dd048ef3d..14a985809 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -28,6 +28,8 @@ Built using Godot 4.3
- The export dialog has been optimized by caching all of the blended frames. Changing export options, besides the layers, no longer cause slowness by re-blending all of the frames.
- Optimized the lasso and polygon select tools, as well as the fill options of the pencil and curve tools. The time they take to complete now depends on the size of the selection, rather than checking all of the pixels of the entire canvas.
- Fixed a crash when re-arranging palette swatches while holding Shift.
+- Fixed a crash when using the move tool snapped to the grid.
+- Fixed a visual bug with the preview of the resize canvas dialog.
- Fixed wrong stretch mode in the cel button previews. [#1097](https://github.com/Orama-Interactive/Pixelorama/pull/1097)
## [v1.0.2] - 2024-08-21
From 1e2e5dc4317a9151f093e0bb3112f024e5629015 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 13 Sep 2024 01:02:48 +0300
Subject: [PATCH 063/162] Fix wrong preview in the gradient dialog when editing
the gradient and dithering is enabled
---
src/UI/Dialogs/ImageEffects/GradientDialog.gd | 11 +++++++----
src/UI/Dialogs/ImageEffects/GradientDialog.tscn | 9 +++------
2 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/src/UI/Dialogs/ImageEffects/GradientDialog.gd b/src/UI/Dialogs/ImageEffects/GradientDialog.gd
index 316d870f0..49b022073 100644
--- a/src/UI/Dialogs/ImageEffects/GradientDialog.gd
+++ b/src/UI/Dialogs/ImageEffects/GradientDialog.gd
@@ -63,17 +63,20 @@ func commit_action(cel: Image, project := Global.current_project) -> void:
var dither_texture := selected_dither_matrix.texture
var gradient := gradient_edit.gradient
- var n_of_colors := gradient.offsets.size()
+ var offsets := gradient.offsets
+ offsets.sort()
+ var n_of_colors := offsets.size()
# Pass the gradient offsets as an array to the shader
- # ...but since Godot 3.x doesn't support uniform arrays, instead we construct
+ # ...but we can't provide arrays with variable sizes as uniforms, instead we construct
# a nx1 grayscale texture with each offset stored in each pixel, and pass it to the shader
var offsets_image := Image.create(n_of_colors, 1, false, Image.FORMAT_L8)
# Construct an image that contains the selected colors of the gradient without interpolation
var gradient_image := Image.create(n_of_colors, 1, false, Image.FORMAT_RGBA8)
for i in n_of_colors:
- var c := gradient.offsets[i]
+ var c := offsets[i]
offsets_image.set_pixel(i, 0, Color(c, c, c, c))
- gradient_image.set_pixel(i, 0, gradient.colors[i])
+ var actual_index := gradient.offsets.find(offsets[i])
+ gradient_image.set_pixel(i, 0, gradient.colors[actual_index])
var offsets_tex := ImageTexture.create_from_image(offsets_image)
var gradient_tex: Texture2D
if shader == shader_linear:
diff --git a/src/UI/Dialogs/ImageEffects/GradientDialog.tscn b/src/UI/Dialogs/ImageEffects/GradientDialog.tscn
index 004eea72b..f1c59b593 100644
--- a/src/UI/Dialogs/ImageEffects/GradientDialog.tscn
+++ b/src/UI/Dialogs/ImageEffects/GradientDialog.tscn
@@ -32,10 +32,9 @@ unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
mouse_default_cursor_shape = 2
-item_count = 2
selected = 0
+item_count = 2
popup/item_0/text = "Linear"
-popup/item_0/id = 0
popup/item_1/text = "Radial"
popup/item_1/id = 1
@@ -47,10 +46,9 @@ text = "Dithering pattern:"
unique_name_in_owner = true
layout_mode = 2
mouse_default_cursor_shape = 2
-item_count = 1
selected = 0
+item_count = 1
popup/item_0/text = "None"
-popup/item_0/id = 0
[node name="RepeatLabel" type="Label" parent="VBoxContainer/GradientOptions" index="4" groups=["gradient_common"]]
layout_mode = 2
@@ -60,10 +58,9 @@ text = "Repeat:"
unique_name_in_owner = true
layout_mode = 2
mouse_default_cursor_shape = 2
-item_count = 4
selected = 0
+item_count = 4
popup/item_0/text = "None"
-popup/item_0/id = 0
popup/item_1/text = "Repeat"
popup/item_1/id = 1
popup/item_2/text = "Mirror"
From 8c7594a1c8573b55b7a00507d7599b918e72914a Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 13 Sep 2024 01:05:53 +0300
Subject: [PATCH 064/162] Add a failsafe to the previous commit's solution
---
src/UI/Dialogs/ImageEffects/GradientDialog.gd | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/UI/Dialogs/ImageEffects/GradientDialog.gd b/src/UI/Dialogs/ImageEffects/GradientDialog.gd
index 49b022073..a49dcc29b 100644
--- a/src/UI/Dialogs/ImageEffects/GradientDialog.gd
+++ b/src/UI/Dialogs/ImageEffects/GradientDialog.gd
@@ -76,6 +76,8 @@ func commit_action(cel: Image, project := Global.current_project) -> void:
var c := offsets[i]
offsets_image.set_pixel(i, 0, Color(c, c, c, c))
var actual_index := gradient.offsets.find(offsets[i])
+ if actual_index == -1:
+ actual_index = i
gradient_image.set_pixel(i, 0, gradient.colors[actual_index])
var offsets_tex := ImageTexture.create_from_image(offsets_image)
var gradient_tex: Texture2D
From 21a035b269bda845b07c7edab3ea2cc5d542ecd3 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 13 Sep 2024 13:46:48 +0300
Subject: [PATCH 065/162] New Crowdin updates (#1083)
---
Translations/af_ZA.po | 43 ++++++++++-
Translations/ar_SA.po | 43 ++++++++++-
Translations/be_BY.po | 43 ++++++++++-
Translations/bg_BG.po | 43 ++++++++++-
Translations/ca_ES.po | 43 ++++++++++-
Translations/cs_CZ.po | 43 ++++++++++-
Translations/cy_GB.po | 43 ++++++++++-
Translations/da_DK.po | 43 ++++++++++-
Translations/de_DE.po | 167 +++++++++++++++++++++++++----------------
Translations/el_GR.po | 43 ++++++++++-
Translations/en_PT.po | 43 ++++++++++-
Translations/eo_UY.po | 43 ++++++++++-
Translations/es_ES.po | 45 +++++++++--
Translations/et_EE.po | 43 ++++++++++-
Translations/fi_FI.po | 43 ++++++++++-
Translations/fil_PH.po | 43 ++++++++++-
Translations/fr_FR.po | 43 ++++++++++-
Translations/ga_IE.po | 43 ++++++++++-
Translations/grc.po | 53 ++++++++++---
Translations/he_IL.po | 43 ++++++++++-
Translations/hi_IN.po | 43 ++++++++++-
Translations/hr_HR.po | 43 ++++++++++-
Translations/hu_HU.po | 43 ++++++++++-
Translations/id_ID.po | 83 ++++++++++++++------
Translations/is_IS.po | 43 ++++++++++-
Translations/it_IT.po | 45 +++++++++--
Translations/ja_JP.po | 43 ++++++++++-
Translations/ko_KR.po | 43 ++++++++++-
Translations/la_LA.po | 43 ++++++++++-
Translations/lt_LT.po | 43 ++++++++++-
Translations/lv_LV.po | 43 ++++++++++-
Translations/mk_MK.po | 43 ++++++++++-
Translations/ml_IN.po | 43 ++++++++++-
Translations/mr_IN.po | 43 ++++++++++-
Translations/ms_MY.po | 43 ++++++++++-
Translations/nb_NO.po | 43 ++++++++++-
Translations/nl_NL.po | 43 ++++++++++-
Translations/pl_PL.po | 43 ++++++++++-
Translations/pt_BR.po | 45 +++++++++--
Translations/pt_PT.po | 43 ++++++++++-
Translations/ro_RO.po | 43 ++++++++++-
Translations/ru_RU.po | 133 ++++++++++++++++++++------------
Translations/si_LK.po | 43 ++++++++++-
Translations/sk_SK.po | 43 ++++++++++-
Translations/sl_SI.po | 43 ++++++++++-
Translations/sq_AL.po | 43 ++++++++++-
Translations/sr_SP.po | 43 ++++++++++-
Translations/sv_SE.po | 43 ++++++++++-
Translations/sw_KE.po | 43 ++++++++++-
Translations/ta_IN.po | 43 ++++++++++-
Translations/th_TH.po | 43 ++++++++++-
Translations/tlh_AA.po | 43 ++++++++++-
Translations/tr_TR.po | 43 ++++++++++-
Translations/uk_UA.po | 43 ++++++++++-
Translations/vi_VN.po | 43 ++++++++++-
Translations/zh_CN.po | 47 ++++++++++--
Translations/zh_TW.po | 43 ++++++++++-
57 files changed, 2364 insertions(+), 361 deletions(-)
diff --git a/Translations/af_ZA.po b/Translations/af_ZA.po
index 1d89eac87..318c0f2cb 100644
--- a/Translations/af_ZA.po
+++ b/Translations/af_ZA.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Afrikaans\n"
"Language: af_ZA\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "Goed"
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/ar_SA.po b/Translations/ar_SA.po
index 5ba1aacc0..c3f6c24b6 100644
--- a/Translations/ar_SA.po
+++ b/Translations/ar_SA.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Arabic\n"
"Language: ar_SA\n"
-"PO-Revision-Date: 2024-08-17 20:10\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "حسنا"
@@ -557,6 +557,10 @@ msgstr "تصفّح"
msgid "Resize:"
msgstr "تغيير الحجم:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "إلغاء التصدير"
@@ -951,12 +955,15 @@ msgstr "تعديل القناة الزرقاء"
msgid "Modify Alpha Channel"
msgstr "تعديل قناة الشفافية"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "تحديد خارجي"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "ظل خلفي"
@@ -969,6 +976,26 @@ msgstr ""
msgid "Shadow color:"
msgstr "لون الظل:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1028,7 +1055,7 @@ msgstr "النوع:"
msgid "Angle:"
msgstr "الزاوية:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1098,11 +1125,11 @@ msgstr "الألوان:"
msgid "Steps:"
msgstr "الخطوات:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2648,6 +2675,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "إغلاق"
diff --git a/Translations/be_BY.po b/Translations/be_BY.po
index c3c1bfdb3..016deec5f 100644
--- a/Translations/be_BY.po
+++ b/Translations/be_BY.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Belarusian\n"
"Language: be_BY\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "OK"
@@ -556,6 +556,10 @@ msgstr "Агляд"
msgid "Resize:"
msgstr "Змена памеру:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "Скасаваць экспарт"
@@ -950,12 +954,15 @@ msgstr "Мяняць сіні канал"
msgid "Modify Alpha Channel"
msgstr "Мяняць альфа-канал"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "Цень"
@@ -968,6 +975,26 @@ msgstr "Зрух па Y:"
msgid "Shadow color:"
msgstr "Колер цені:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "Градыент"
@@ -1027,7 +1054,7 @@ msgstr "Тып:"
msgid "Angle:"
msgstr "Кут:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1097,11 +1124,11 @@ msgstr "Колеры:"
msgid "Steps:"
msgstr "Крокі:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2643,6 +2670,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/bg_BG.po b/Translations/bg_BG.po
index 845f4abfe..fedff4db7 100644
--- a/Translations/bg_BG.po
+++ b/Translations/bg_BG.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Bulgarian\n"
"Language: bg_BG\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/ca_ES.po b/Translations/ca_ES.po
index 88367af2c..2c36d8787 100644
--- a/Translations/ca_ES.po
+++ b/Translations/ca_ES.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Catalan\n"
"Language: ca_ES\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "D'acord"
@@ -557,6 +557,10 @@ msgstr "Navegar"
msgid "Resize:"
msgstr "Redimensionar:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "Cancel·lar exportació"
@@ -951,12 +955,15 @@ msgstr "Modifica el canal blau"
msgid "Modify Alpha Channel"
msgstr "Modifica el canal alfa"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Desaturació"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Contorn"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -969,6 +976,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "Degradat"
@@ -1028,7 +1055,7 @@ msgstr "Tipus:"
msgid "Angle:"
msgstr "Angle:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Ajusta la Tonalitat/Saturació/Lluminositat"
@@ -1098,11 +1125,11 @@ msgstr "Colors:"
msgid "Steps:"
msgstr "Passos:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2683,6 +2710,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "Tancar"
diff --git a/Translations/cs_CZ.po b/Translations/cs_CZ.po
index 94d6a2f84..863e16968 100644
--- a/Translations/cs_CZ.po
+++ b/Translations/cs_CZ.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Czech\n"
"Language: cs_CZ\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "OK"
@@ -558,6 +558,10 @@ msgstr "Procházet"
msgid "Resize:"
msgstr "Změnit velikost:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "Zrušit export"
@@ -952,12 +956,15 @@ msgstr "Upravit modrý kanál"
msgid "Modify Alpha Channel"
msgstr "Upravit alfa kanál"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Odstíny šedi"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Obrys"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "Vrhnout stín"
@@ -970,6 +977,26 @@ msgstr "Odsazení Y:"
msgid "Shadow color:"
msgstr "Barva stínu:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "Gradient"
@@ -1029,7 +1056,7 @@ msgstr "Typ:"
msgid "Angle:"
msgstr "Úhel:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Upravit odstín, sytost a hodnotu"
@@ -1099,11 +1126,11 @@ msgstr "Barvy:"
msgid "Steps:"
msgstr "Kroky:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr "Paletizovat"
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr "Pixelizace"
@@ -2697,6 +2724,14 @@ msgstr "Oddělovací znak(y):"
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "Zavřít"
diff --git a/Translations/cy_GB.po b/Translations/cy_GB.po
index 016e751f7..013c3b49f 100644
--- a/Translations/cy_GB.po
+++ b/Translations/cy_GB.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Welsh\n"
"Language: cy_GB\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:45\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/da_DK.po b/Translations/da_DK.po
index 688e875d1..52a13a61c 100644
--- a/Translations/da_DK.po
+++ b/Translations/da_DK.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Danish\n"
"Language: da_DK\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "OK"
@@ -557,6 +557,10 @@ msgstr "Browse"
msgid "Resize:"
msgstr "Tilpas størrelse:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "Annullér Eksport"
@@ -951,12 +955,15 @@ msgstr "Ændr Blå Kanal"
msgid "Modify Alpha Channel"
msgstr "Ændr Alpha Kanal"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Desaturation"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Kontur"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "Skyggeeffekt"
@@ -969,6 +976,26 @@ msgstr "Forskydning Y:"
msgid "Shadow color:"
msgstr "Skyggefarve:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "Gradient"
@@ -1028,7 +1055,7 @@ msgstr "Type:"
msgid "Angle:"
msgstr "Vinkel:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Justér Nuance/Mætning/Værdi"
@@ -1098,11 +1125,11 @@ msgstr "Farver:"
msgid "Steps:"
msgstr "Trin:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2681,6 +2708,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "Luk"
diff --git a/Translations/de_DE.po b/Translations/de_DE.po
index a39a35d5e..089272df7 100644
--- a/Translations/de_DE.po
+++ b/Translations/de_DE.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: German\n"
"Language: de_DE\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "OK"
@@ -101,7 +101,9 @@ msgstr "Gemischte Bilder einbeziehen"
msgid "If enabled, the final blended images are also being stored in the pxo, for each frame.\n"
"This makes the pxo file larger and is useful for importing by third-party software\n"
"or CLI exporting. Loading pxo files in Pixelorama does not need this option to be enabled."
-msgstr ""
+msgstr "Wenn aktiviert, werden die letzten überlagerten Bilder für jeden Frame auch in der pxo gespeichert.\n"
+"Dies macht die pxo-Datei größer und ist nützlich für den Import durch Software von Drittanbietern\n"
+"oder den CLI-Export. Beim Laden von pxo-Dateien in Pixelorama muss diese Option nicht aktiviert sein."
msgid "Import"
msgstr "Importieren"
@@ -557,6 +559,10 @@ msgstr "Durchsuchen"
msgid "Resize:"
msgstr "Größe verändern"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr "Qualität:"
+
msgid "Cancel Export"
msgstr "Export abbrechen"
@@ -636,25 +642,25 @@ msgid "Export dimensions:"
msgstr "Export-Größen:"
msgid "Save a File"
-msgstr ""
+msgstr "Datei speichern"
msgid "Go to previous folder."
-msgstr ""
+msgstr "Gehe zum vorherigen Ordner."
msgid "Go to next folder."
-msgstr ""
+msgstr "Gehe zum nächsten Ordner."
msgid "Go to parent folder."
-msgstr ""
+msgstr "Gehe zum übergeordneten Ordner."
msgid "Path:"
msgstr "Pfad:"
msgid "Refresh files."
-msgstr ""
+msgstr "Dateien aktualisieren."
msgid "Toggle the visibility of hidden files."
-msgstr ""
+msgstr "Schalten Sie die Sichtbarkeit von versteckten Dateien um."
msgid "Directories & Files:"
msgstr "Verzeichnisse & Dateien:"
@@ -667,51 +673,51 @@ msgstr "Datei:"
#. Found in "Open" and "Save" file dialogs. Searches all file types.
msgid "All Files"
-msgstr ""
+msgstr "Alle Dateien"
#. Found in the "Open" file dialog. Searches all file types supported by Pixelorama.
msgid "All Recognized"
-msgstr ""
+msgstr "Alle erkannt"
#. Found in "Open" and "Save" file dialogs. Searches Pixelorama Project files only (.pxo).
msgid "Pixelorama Project"
-msgstr ""
+msgstr "Pixelorama-Projekt"
#. Found in the "Open" file dialog. Searches PNG files only. (Note that PNG is a file type and should remain untranslated)
msgid "PNG Image"
-msgstr ""
+msgstr "PNG-Bild"
#. Found in the "Open" file dialog. Searches BMP files only. (Note that BMP is a file type and should remain untranslated)
msgid "BMP Image"
-msgstr ""
+msgstr "BMP-Bild"
#. Found in the "Open" file dialog. Searches "Radiance HDR" files only. (Note that "Radiance HDR" is a file type and is better untranslated)
msgid "Radiance HDR Image"
-msgstr ""
+msgstr "Radiance HDR-Bild"
#. Found in the "Open" file dialog. Searches JPEG files only. (Note that JPEG is a file type and should remain untranslated)
msgid "JPEG Image"
-msgstr ""
+msgstr "JPEG Bild"
#. Found in the "Open" file dialog. Searches SVG files only. (Note that SVG is a file type and should remain untranslated)
msgid "SVG Image"
-msgstr ""
+msgstr "SVG-Bild"
#. Found in the "Open" file dialog. Searches TGA files only. (Note that TGA is a file type and should remain untranslated)
msgid "TGA Image"
-msgstr ""
+msgstr "TGA-Bild"
#. Found in the "Open" file dialog. Searches WebP files only. (Note that WebP is a file type and should remain untranslated)
msgid "WebP Image"
-msgstr ""
+msgstr "WebP Bild"
#. Found in the "Open" file dialog. Searches Pixelorama palette files only (.json).
msgid "Pixelorama palette"
-msgstr ""
+msgstr "Pixelorama-Palette"
#. Found in the "Open" file dialog. Searches GIMP palette files only (.gpl). (Note that GIMP is a software and should remain untranslated)
msgid "GIMP palette"
-msgstr ""
+msgstr "GIMP palette"
#. Found in the export dialog. It is a button that when pressed, shows more options.
msgid "Advanced options"
@@ -951,12 +957,15 @@ msgstr "Blau-Kanal ändern"
msgid "Modify Alpha Channel"
msgstr "Alpha-Kanal ändern"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Entsättigung"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Umriss"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "Schlagschatten"
@@ -969,6 +978,26 @@ msgstr "Offset Y:"
msgid "Shadow color:"
msgstr "Schattenfarbe:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr "Gaußsche Unschärfe"
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr "Unschärfe-Typ:"
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr "Unschärfebetrag:"
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr "Unschärferadius:"
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr "Unschärfe-Richtung:"
+
msgid "Gradient"
msgstr "Gradient"
@@ -1029,7 +1058,7 @@ msgstr "Typ:"
msgid "Angle:"
msgstr "Winkel:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Farbton/Sättigung/Wert anpassen"
@@ -1051,35 +1080,35 @@ msgstr "Wert:"
#. An image effect. Adjusts the brightness and contrast of the colors of an image.
msgid "Adjust Brightness/Contrast"
-msgstr ""
+msgstr "Helligkeit/Kontrast anpassen"
#. Refers to the brightness of the colors of an image.
msgid "Brightness:"
-msgstr ""
+msgstr "Helligkeit:"
#. Refers to the contrast of the colors of an image.
msgid "Contrast:"
-msgstr ""
+msgstr "Kontrast:"
#. Refers to the red value of the colors of an image.
msgid "Red value:"
-msgstr ""
+msgstr "Rot-Wert:"
#. Refers to the green value of the colors of an image.
msgid "Green value:"
-msgstr ""
+msgstr "Grün-Wert:"
#. Refers to the blue value of the colors of an image.
msgid "Blue value:"
-msgstr ""
+msgstr "Blau-Wert:"
#. Refers to a color that tints an image.
msgid "Tint color:"
-msgstr ""
+msgstr "Farbton:"
#. Refers to the factor (how much) a color tints an image.
msgid "Tint effect factor:"
-msgstr ""
+msgstr "Farbeffekt-Faktor:"
msgid "Apply"
msgstr "Übernehmen"
@@ -1099,11 +1128,11 @@ msgstr "Farben:"
msgid "Steps:"
msgstr "Schritte:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr "Palettieren"
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr "Pixelieren"
@@ -1358,7 +1387,9 @@ msgstr "Lasso- / Freies Auswahl-Werkzeug\n\n"
msgid "Select by Drawing\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
-msgstr ""
+msgstr "Auswählen durchs Zeichnen\n\n"
+"%s für die linke Maustaste\n"
+"%s für die rechte Maustaste"
msgid "Move\n\n"
"%s for left mouse button\n"
@@ -1392,7 +1423,8 @@ msgstr "Farbauswahl\n\n"
msgid "Crop\n\n"
"Resize the canvas"
-msgstr ""
+msgstr "Zuschneiden\n\n"
+"Größe der Leinwand"
msgid "Pencil\n\n"
"%s for left mouse button\n"
@@ -1498,7 +1530,7 @@ msgstr "Wechsle die linke und rechte Farben."
#. Tooltip of the average color button, found in the color picker panel. Shows the average color between the two selected.
msgid "Average Color:"
-msgstr ""
+msgstr "Mittelwerts-Farbe:"
msgid "Reset the colors to their default state (black for left, white for right)"
msgstr "Setzt die Farben auf den Standardzustand zurück (schwarz für links, weiß für rechts)"
@@ -1509,7 +1541,7 @@ msgstr "Wähle eine Farbe des Bildschirms aus."
#. Tooltip of the color text field found in the color picker panel that lets users change the color by hex code or english name ("red" cannot be translated).
msgid "Enter a hex code (\"#ff0000\") or named color (\"red\")."
-msgstr ""
+msgstr "Geben Sie einen Hex-Code (\"#ff0000\") oder eine Farbe mit Namen (\"red\") ein."
#. Tooltip of the button found in the color picker panel that lets users change the shape of the color picker.
msgid "Select a picker shape."
@@ -1521,19 +1553,19 @@ msgstr "Farboptionen"
#. Tooltip of the button with three dots found under color options in the color picker panel that lets users change the mode of the color picker/sliders.
msgid "Select a picker mode."
-msgstr ""
+msgstr "Wählen Sie einen Picker-Modus."
#. Checkbox found in the menu of the button with three dots found under color options in the color picker panel.
msgid "Colorized Sliders"
-msgstr ""
+msgstr "Farbige Schieberegler"
#. Shows saved colors in certain color picker menus.
msgid "Swatches"
-msgstr ""
+msgstr "Swatches"
#. Found under color options in the color picker panel.
msgid "Recent Colors"
-msgstr ""
+msgstr "Letzte Farben"
msgid "Left tool"
msgstr "Linkes Werkzeug"
@@ -1718,7 +1750,7 @@ msgstr "Legt die Grenze der Frames pro Sekunde fest. Je niedriger die Anzahl, de
#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
msgid "Max undo steps:"
-msgstr ""
+msgstr "Max. Rückgängig-Schritte:"
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
@@ -1730,11 +1762,11 @@ msgstr "Wenn dies eingeschaltet ist und das Fenster der Anwendung den Fokus verl
#. An option found in the preferences, under the Performance section. Refers to the screen being updated (redrawn) continuously.
msgid "Update continuously"
-msgstr ""
+msgstr "Kontinuierlich aktualisieren"
#. Found in the preferences, hint of the "Update continuously" option.
msgid "If this is toggled on, the application will redraw the screen continuously, even while it's not used. Turning this off helps lower CPU and GPU usage when idle."
-msgstr ""
+msgstr "Wenn dies eingeschaltet ist, wird die Anwendung den Bildschirm kontinuierlich neu zeichnen, auch wenn er nicht verwendet wird. Das Ausschalten hilft, die CPU- und GPU-Nutzung zu senken, wenn die Applikation im Moment nicht verwendet wird."
#. An option found in the preferences, under the Performance section.
msgid "Enable window transparency"
@@ -2013,22 +2045,22 @@ msgid "Current frame as spritesheet"
msgstr "Aktueller Frame als Spritesheet"
msgid "Jump to the first frame"
-msgstr ""
+msgstr "Zum ersten Frame springen"
msgid "Go to the previous frame"
-msgstr ""
+msgstr "Zum vorherigen Frame gehen"
msgid "Play the animation backwards (from end to beginning)"
-msgstr ""
+msgstr "Spiele die Animation rückwärts ab (vom Ende bis zum Anfang)"
msgid "Play the animation forward (from beginning to end)"
-msgstr ""
+msgstr "Spiele die Animation vorwärts ab (vom Anfang bis zum Ende)"
msgid "Go to the next frame"
-msgstr ""
+msgstr "Gehe zum nächsten Frame"
msgid "Jump to the last frame"
-msgstr ""
+msgstr "Springe zum letzten Frame"
msgid "Timeline settings"
msgstr "Timeline-Einstellungen"
@@ -2162,7 +2194,7 @@ msgstr "Neuer Tag"
#. Found on the popup menu that appears when a user right-clicks on a frame button. When clicked, it allows users to paste/import tags from other opened projects.
msgid "Import Tag"
-msgstr ""
+msgstr "Tag importieren"
#. Found on the popup menu that appears when a user right-clicks on a frame button. When clicked, the order of the selected frames is being reversed.
msgid "Reverse Frames"
@@ -2218,7 +2250,7 @@ msgstr "Mischmodus:"
#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
msgid "Pass through"
-msgstr ""
+msgstr "Pass-through"
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
@@ -2692,6 +2724,14 @@ msgstr "Trennzeichen(n):"
msgid "The character(s) that separate the file name and the frame number"
msgstr "Die Zeichen, die den Dateinamen und die Frame-Nummer trennen"
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "Schließen"
@@ -3159,24 +3199,25 @@ msgstr "Monochrom"
#. Found in the Reference Images panel when no reference image has been imported.
msgid "When opening an image, it may be imported as a reference."
-msgstr ""
+msgstr "Beim Öffnen eines Bildes kann es als Referenz importiert werden."
#. Found in the Reference Images panel after a reference image has been imported.
msgid "Select an image below to change its properties.\n"
"Note that you cannot draw while a reference image is selected."
-msgstr ""
+msgstr "Wählen Sie ein Bild unten, um seine Eigenschaften zu ändern.\n"
+"Beachten Sie, dass Sie nicht zeichnen können, während ein Referenzbild ausgewählt ist."
#. Removes the selected reference image.
msgid "Remove"
-msgstr ""
+msgstr "Entfernen"
#. A tooltip to tell users to hold the Shift key while clicking the remove button
msgid "Hold Shift while pressing to instantly remove."
-msgstr ""
+msgstr "Halten Sie Shift während des Benutzens gedrückt für sofortige Entfernung."
#. Shown in the confirmation dialog for removing a reference image.
msgid "Are you sure you want to remove this reference image? It will not be deleted from your file system."
-msgstr ""
+msgstr "Sind Sie sicher, dass Sie dieses Referenzbild entfernen möchten? Es wird nicht aus Ihrem Dateisystem gelöscht."
#. Moves the reference image up in the list
msgid "Move the selected reference image to the right"
@@ -3204,35 +3245,35 @@ msgstr "Ausgewähltes Referenzbild skalieren"
#. Button to select no reference images in the Reference Images panel.
msgid "none"
-msgstr ""
+msgstr "keine"
#. Resets the Transform of the selected reference image on the canvas.
msgid "Reset Transform"
-msgstr ""
+msgstr "Transformation zurücksetzen"
#. Position of the selected reference image on the canvas.
msgid "Position"
-msgstr ""
+msgstr "Position"
#. Scale of the selected reference image on the canvas.
msgid "Scale"
-msgstr ""
+msgstr "Skalierung"
#. Rotation of the selected reference image on the canvas.
msgid "Rotation"
-msgstr ""
+msgstr "Rotation"
#. Toggle filter of the selected reference image on the canvas.
msgid "Filter"
-msgstr ""
+msgstr "Filter"
#. Opacity of the selected reference image on the canvas.
msgid "Opacity"
-msgstr ""
+msgstr "Transparenz"
#. Color clamping of the selected reference image on the canvas.
msgid "Color Clamping"
-msgstr ""
+msgstr "Farbklampen"
#. Used in checkbuttons (like on/off switches) that enable/disable something.
msgid "Enabled"
diff --git a/Translations/el_GR.po b/Translations/el_GR.po
index eb112399c..4c1bee570 100644
--- a/Translations/el_GR.po
+++ b/Translations/el_GR.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Greek\n"
"Language: el_GR\n"
-"PO-Revision-Date: 2024-08-16 16:44\n"
+"PO-Revision-Date: 2024-09-12 14:53\n"
msgid "OK"
msgstr "Εντάξει"
@@ -560,6 +560,10 @@ msgstr "Περιήγηση"
msgid "Resize:"
msgstr "Αλλαγή μεγέθους:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr "Ποιότητα:"
+
msgid "Cancel Export"
msgstr "Ακύρωση Εξαγωγής"
@@ -954,12 +958,15 @@ msgstr "Τροποποίηση Μπλε Καναλιού"
msgid "Modify Alpha Channel"
msgstr "Τροποποίηση Καναλιού Διαφάνειας"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Αποκορεσμός"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Περίγραμμα"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "Πίπτουσα σκιά"
@@ -972,6 +979,26 @@ msgstr "Μετατόπιση Y:"
msgid "Shadow color:"
msgstr "Χρώμα σκιάς:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr "Θόλωση Gauss"
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr "Τύπος θόλωσης:"
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr "Ποσότητα θόλωσης:"
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr "Ακτίνα θόλωσης:"
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr "Κατεύθυνση θόλωσης:"
+
msgid "Gradient"
msgstr "Διαβάθμιση"
@@ -1032,7 +1059,7 @@ msgstr "Είδος:"
msgid "Angle:"
msgstr "Γωνία:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Ρύθμιση απόχρωσης/κορεσμού/τιμής"
@@ -1102,11 +1129,11 @@ msgstr "Χρώματα:"
msgid "Steps:"
msgstr "Βαθμίδες:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr "Παλετοποίηση"
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr "Δημιουργία εικονοστοιχείων"
@@ -2698,6 +2725,14 @@ msgstr "Διαχωριστικοί χαρακτήρες:"
msgid "The character(s) that separate the file name and the frame number"
msgstr "Οι χαρακτήρες που διαχωρίζουν το όνομα του αρχείου και τον αριθμό του καρέ"
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr "Περικοπή εικόνων"
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr "Περικοπή των εξαγόμενων εικόνων στο ορατό τμήμα τους, θεωρώντας κάθε pixel με ένα μη μηδενικό alpha κανάλι ως ορατό."
+
msgid "Close"
msgstr "Κλείσιμο"
diff --git a/Translations/en_PT.po b/Translations/en_PT.po
index 8a756709a..848dee25e 100644
--- a/Translations/en_PT.po
+++ b/Translations/en_PT.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Pirate English\n"
"Language: en_PT\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:45\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/eo_UY.po b/Translations/eo_UY.po
index 8a7f8234b..95f52d3e7 100644
--- a/Translations/eo_UY.po
+++ b/Translations/eo_UY.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Esperanto\n"
"Language: eo_UY\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:45\n"
msgid "OK"
msgstr "Bone"
@@ -557,6 +557,10 @@ msgstr "Foliumo"
msgid "Resize:"
msgstr "Reskali:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "Nuligi eksporton"
@@ -951,12 +955,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Konturoj"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "Ĵeti ombron"
@@ -969,6 +976,26 @@ msgstr ""
msgid "Shadow color:"
msgstr "Koloro de la ombro:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "Gradiento"
@@ -1028,7 +1055,7 @@ msgstr "Tipo:"
msgid "Angle:"
msgstr "Angulo:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1098,11 +1125,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2634,6 +2661,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "Fermi"
diff --git a/Translations/es_ES.po b/Translations/es_ES.po
index a3465db82..82d2a07d0 100644
--- a/Translations/es_ES.po
+++ b/Translations/es_ES.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
-"PO-Revision-Date: 2024-08-16 13:17\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "OK"
@@ -557,6 +557,10 @@ msgstr "Explorar"
msgid "Resize:"
msgstr "Redimensionar:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "Cancelar exportación"
@@ -951,12 +955,15 @@ msgstr "Modificar canal azul"
msgid "Modify Alpha Channel"
msgstr "Modificar canal alfa"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Desaturación"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Silueta"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "Sombra paralela"
@@ -969,6 +976,26 @@ msgstr "Desplazamiento en Y:"
msgid "Shadow color:"
msgstr "Color de la sombra:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "Degradado"
@@ -1029,7 +1056,7 @@ msgstr "Tipo:"
msgid "Angle:"
msgstr "Ángulo:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Ajustar Matiz/Saturación/Valor"
@@ -1099,11 +1126,11 @@ msgstr "Colores:"
msgid "Steps:"
msgstr "Pasos:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr "Paletizar"
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr "Pixelizar"
@@ -1720,7 +1747,7 @@ msgstr "Establece el límite de fotogramas por segundo de la aplicación. Cuanto
#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
msgid "Max undo steps:"
-msgstr ""
+msgstr "Deshaceres máximos:"
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
@@ -2693,6 +2720,14 @@ msgstr "Separar carácter(es):"
msgid "The character(s) that separate the file name and the frame number"
msgstr "El(los) carácter(es) que separan Él nombre del archivo y Él número de fotograma"
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "Cerrar"
diff --git a/Translations/et_EE.po b/Translations/et_EE.po
index c253cff38..b48ae8683 100644
--- a/Translations/et_EE.po
+++ b/Translations/et_EE.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Estonian\n"
"Language: et_EE\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/fi_FI.po b/Translations/fi_FI.po
index 89faa8a04..69da4c8a9 100644
--- a/Translations/fi_FI.po
+++ b/Translations/fi_FI.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Finnish\n"
"Language: fi_FI\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "OK"
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/fil_PH.po b/Translations/fil_PH.po
index 3566813bf..9e96fb069 100644
--- a/Translations/fil_PH.po
+++ b/Translations/fil_PH.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Filipino\n"
"Language: fil_PH\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:45\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/fr_FR.po b/Translations/fr_FR.po
index 14722d17e..04572e476 100644
--- a/Translations/fr_FR.po
+++ b/Translations/fr_FR.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: French\n"
"Language: fr_FR\n"
-"PO-Revision-Date: 2024-08-16 13:17\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "OK"
@@ -558,6 +558,10 @@ msgstr "Parcourir"
msgid "Resize:"
msgstr "Redimensionner :"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "Annuler l'exportation"
@@ -952,12 +956,15 @@ msgstr "Modifier le Canal Bleu"
msgid "Modify Alpha Channel"
msgstr "Modifier le Canal Alpha"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Désaturation"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Contour"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "Ombre portée"
@@ -970,6 +977,26 @@ msgstr "Décalage Y :"
msgid "Shadow color:"
msgstr "Couleur d'ombre :"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "Dégradé"
@@ -1030,7 +1057,7 @@ msgstr "Type:"
msgid "Angle:"
msgstr "Angle :"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Ajuster la Teinte/Saturation/Valeur"
@@ -1100,11 +1127,11 @@ msgstr "Couleurs:"
msgid "Steps:"
msgstr "Étapes:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr "Pixeliser"
@@ -2687,6 +2714,14 @@ msgstr "Caractère(s) de séparation :"
msgid "The character(s) that separate the file name and the frame number"
msgstr "Le ou les caractères qui séparent le nom du fichier et le numéro de frame"
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "Fermer"
diff --git a/Translations/ga_IE.po b/Translations/ga_IE.po
index 0e5d94c49..8baec4a68 100644
--- a/Translations/ga_IE.po
+++ b/Translations/ga_IE.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Irish\n"
"Language: ga_IE\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/grc.po b/Translations/grc.po
index 375892d7a..6ff8c94bc 100644
--- a/Translations/grc.po
+++ b/Translations/grc.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Ancient Greek\n"
"Language: grc\n"
-"PO-Revision-Date: 2024-08-16 13:19\n"
+"PO-Revision-Date: 2024-09-11 15:45\n"
msgid "OK"
msgstr "Ἐντάξει"
@@ -43,7 +43,7 @@ msgid "Frame Size"
msgstr ""
msgid "Size:"
-msgstr ""
+msgstr "Μέγεθος:"
msgid "Width:"
msgstr ""
@@ -55,7 +55,7 @@ msgid "Center"
msgstr ""
msgid "File"
-msgstr ""
+msgstr "Ἀρχείον"
msgid "Edit"
msgstr ""
@@ -64,13 +64,13 @@ msgid "Select"
msgstr ""
msgid "View"
-msgstr ""
+msgstr "Ἰδεῖν"
msgid "Window"
-msgstr ""
+msgstr "Παράθυρον"
msgid "Image"
-msgstr ""
+msgstr "Εἰκών"
msgid "Effects"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/he_IL.po b/Translations/he_IL.po
index ece76eae9..099aa696e 100644
--- a/Translations/he_IL.po
+++ b/Translations/he_IL.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Hebrew\n"
"Language: he_IL\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "אישור"
@@ -556,6 +556,10 @@ msgstr "עיון"
msgid "Resize:"
msgstr "שינוי גודל:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "ביטול ייצוא"
@@ -950,12 +954,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "קו מתאר"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "הצללה"
@@ -968,6 +975,26 @@ msgstr "היסט Y:"
msgid "Shadow color:"
msgstr "צבע צל:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1027,7 +1054,7 @@ msgstr "סוג:"
msgid "Angle:"
msgstr "זווית:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1097,11 +1124,11 @@ msgstr "צבעים:"
msgid "Steps:"
msgstr "צעדים:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2638,6 +2665,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/hi_IN.po b/Translations/hi_IN.po
index c3a811fc9..744bf6757 100644
--- a/Translations/hi_IN.po
+++ b/Translations/hi_IN.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Hindi\n"
"Language: hi_IN\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:45\n"
msgid "OK"
msgstr "ठीक है"
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/hr_HR.po b/Translations/hr_HR.po
index a1d515c03..19b2b4a4d 100644
--- a/Translations/hr_HR.po
+++ b/Translations/hr_HR.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Croatian\n"
"Language: hr_HR\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/hu_HU.po b/Translations/hu_HU.po
index 4aa3a7ca6..a36113ffa 100644
--- a/Translations/hu_HU.po
+++ b/Translations/hu_HU.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Hungarian\n"
"Language: hu_HU\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "Ok"
@@ -556,6 +556,10 @@ msgstr "Tallózás"
msgid "Resize:"
msgstr "Átméretezés:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "Exportálás megszakítása"
@@ -950,12 +954,15 @@ msgstr "A kék csatorna módosítása"
msgid "Modify Alpha Channel"
msgstr "A alfa csatorna módosítása"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Kifakítás"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Körvonal"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -968,6 +975,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "Színátmenet"
@@ -1027,7 +1054,7 @@ msgstr "Típus:"
msgid "Angle:"
msgstr "Szög:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Színárnyalat/Telítettség/Érték beállítása"
@@ -1097,11 +1124,11 @@ msgstr "Színek:"
msgid "Steps:"
msgstr "Lépések:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2645,6 +2672,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "Bezárás"
diff --git a/Translations/id_ID.po b/Translations/id_ID.po
index f5d42a09f..dae1e7d8d 100644
--- a/Translations/id_ID.po
+++ b/Translations/id_ID.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Indonesian\n"
"Language: id_ID\n"
-"PO-Revision-Date: 2024-08-16 17:44\n"
+"PO-Revision-Date: 2024-09-12 03:49\n"
msgid "OK"
msgstr "Oke"
@@ -101,9 +101,9 @@ msgstr "Sertakan gambar tercampur"
msgid "If enabled, the final blended images are also being stored in the pxo, for each frame.\n"
"This makes the pxo file larger and is useful for importing by third-party software\n"
"or CLI exporting. Loading pxo files in Pixelorama does not need this option to be enabled."
-msgstr "Jika diaktifkan, bentuk akhir gambar tercampur akan disimpan jadi pxo, ke tiap bingkai.\n"
+msgstr "Jika diaktifkan, bentuk akhir gambar tercampur disimpan menjadi pxo, ke tiap bingkai.\n"
"Berkas pxo akan lebih besar dan mampu diimpor dengan peranti lunak pihak ketiga\n"
-"atau diekspor CLI. Memuat pxo di Pixelorama tidak perlu mengaktifkan opsi ini."
+"atau diekspor CLI. Membuka pxo di Pixelorama tidak perlu mengaktifkan opsi ini."
msgid "Import"
msgstr "Impor"
@@ -171,11 +171,11 @@ msgstr "Persentase"
#. Found in the image menu. Sets the size of the project to be the same as the size of the active selection.
msgid "Crop to Selection"
-msgstr "Pangkas ke Seleksi"
+msgstr "Potong ke Seleksi"
#. Found in the image menu. Automatically trims out all the transparent pixels, making the image smaller.
msgid "Crop to Content"
-msgstr "Pangkas ke Isi"
+msgstr "Potong ke Isi"
msgid "Resize Canvas"
msgstr "Ubah Ukuran Kanvas"
@@ -294,7 +294,7 @@ msgstr "Ini pratayang, mengubah ini tidak akan mengubah tata letak"
#. Found in the manage layouts dialog
msgid "Double click to set as new startup layout"
-msgstr "Klik dua kali agar jadi tata letak baru di awal buka"
+msgstr "Klik 2x agar menjadi tata letak baru di awal buka"
msgid "Add"
msgstr "Tambah"
@@ -458,7 +458,7 @@ msgstr "Jarak peleburan:"
#. Found in the preview image dialog, which appears when importing an image file. This option appears when the image is being imported as a spritesheet, if "smart slice" is enabled. Hint tooltip of the "Merge distance" value slider.
msgid "Images which crossed the threshold will get merged into a larger image, if they are within this distance"
-msgstr "Gambar yang melewati ambang batas akan dileburkan jadi gambar lebih besar, jika masih dalam jarak ini"
+msgstr "Gambar yang melewati ambang batas akan dileburkan menjadi gambar lebih besar, jika masih sejarak ini"
#. A button that, when pressed, refreshes something. Used to apply certain settings again after they changed. Currently it's only used in the preview image dialog, which appears when importing an image file. This option appears when the image is being imported as a spritesheet, if "smart slice" is enabled.
msgid "Refresh"
@@ -560,6 +560,10 @@ msgstr "Telusur"
msgid "Resize:"
msgstr "Ubah ukuran:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr "Mutu:"
+
msgid "Cancel Export"
msgstr "Batalkan Ekspor"
@@ -817,7 +821,7 @@ msgstr "Keker Integer"
#. Found in the preferences, under Canvas. Hint tooltip of "Integer Zoom".
msgid "Restricts the value to be an integer multiple of 100%"
-msgstr "Membatasi nilai jadi kelipatan bilangan bulat 100%"
+msgstr "Membatasi nilai ke kelipatan bilangan bulat 100%"
msgid "Tablet pressure sensitivity:"
msgstr "Kepekaan tekanan tablet:"
@@ -954,12 +958,15 @@ msgstr "Ubah Saluran Biru"
msgid "Modify Alpha Channel"
msgstr "Ubah Saluran Alfa"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Desaturasi"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Garis luar"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "Bayangan Jatuh"
@@ -972,6 +979,26 @@ msgstr "Offset Y:"
msgid "Shadow color:"
msgstr "Warna bayangan:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr "Buram Gauss"
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr "Tipe buram:"
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr "Jumlah buram:"
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr "Jari-jari buram:"
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr "Arah buram:"
+
msgid "Gradient"
msgstr "Gradien"
@@ -979,7 +1006,7 @@ msgid "Gradient Map"
msgstr "Peta Gradien"
msgid "Divide into equal parts"
-msgstr "Bagi jadi sama rata"
+msgstr "Bagi menjadi sama rata"
msgid "Parts:"
msgstr "Bagian:"
@@ -1032,7 +1059,7 @@ msgstr "Tipe:"
msgid "Angle:"
msgstr "Sudut:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Sesuaikan Rona/Saturasi/Nilai"
@@ -1102,11 +1129,11 @@ msgstr "Warna:"
msgid "Steps:"
msgstr "Step:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr "Paletkan"
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr "Pikselkan"
@@ -1335,7 +1362,7 @@ msgid "Polygonal Selection\n\n"
msgstr "Seleksi Poligon\n\n"
"%s untuk tetikus kiri\n"
"%s untuk tetikus kanan\n\n"
-"Pencet dua kali untuk menghubungkan titik akhir ke titik awal"
+"Klik dua kali untuk menghubungkan titik akhir ke titik awal"
msgid "Select By Color\n\n"
"%s for left mouse button\n"
@@ -1397,7 +1424,7 @@ msgstr "Pemilih Warna\n\n"
msgid "Crop\n\n"
"Resize the canvas"
-msgstr "Pangkas\n\n"
+msgstr "Potong\n\n"
"Ubah besar kanvas"
msgid "Pencil\n\n"
@@ -2698,6 +2725,14 @@ msgstr "Huruf pemisah:"
msgid "The character(s) that separate the file name and the frame number"
msgstr "Huruf-huruf untuk memisahkan nama berkas dan nomor bingkai"
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr "Pangkas gambar"
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr "Memangkas gambar terekspor ke bagian terlihat, piksel apa pun bersaluran alfa bukan nol akan dianggap terlihat."
+
msgid "Close"
msgstr "Tutup"
@@ -2787,31 +2822,31 @@ msgstr "Terbalikkan warna"
#. An option of the Sort palette button found in the palette panel. When selected, the colors of the palette are being sorted based on their hue.
msgid "Sort by hue"
-msgstr "Urut ikut rona"
+msgstr "Urut sesuai rona"
#. An option of the Sort palette button found in the palette panel. When selected, the colors of the palette are being sorted based on their saturation.
msgid "Sort by saturation"
-msgstr "Urut ikut saturasi"
+msgstr "Urut sesuai saturasi"
#. An option of the Sort palette button found in the palette panel. When selected, the colors of the palette are being sorted based on their value.
msgid "Sort by value"
-msgstr "Urut ikut nilai"
+msgstr "Urut sesuai nilai"
#. An option of the Sort palette button found in the palette panel. When selected, the colors of the palette are being sorted based on their red channel value.
msgid "Sort by red"
-msgstr "Urut ikut merah"
+msgstr "Urut sesuai merah"
#. An option of the Sort palette button found in the palette panel. When selected, the colors of the palette are being sorted based on their green channel value.
msgid "Sort by green"
-msgstr "Urut ikut hijau"
+msgstr "Urut sesuai hijau"
#. An option of the Sort palette button found in the palette panel. When selected, the colors of the palette are being sorted based on their blue channel value.
msgid "Sort by blue"
-msgstr "Urut ikut biru"
+msgstr "Urut sesuai biru"
#. An option of the Sort palette button found in the palette panel. When selected, the colors of the palette are being sorted based on their alpha channel value.
msgid "Sort by alpha"
-msgstr "Urut ikut alfa"
+msgstr "Urut sesuai alfa"
msgid "Palette with the same name and path already exists!"
msgstr "Palet dengan nama dan jalur yang sama sudah ada!"
@@ -2865,7 +2900,7 @@ msgid "Recorder"
msgstr "Perekam"
msgid "Crop"
-msgstr "Pangkas"
+msgstr "Potong"
msgid "Resize the canvas"
msgstr "Ubah ukuran kanvas"
@@ -2901,7 +2936,7 @@ msgid "Locked size\n\n"
"When enabled using the tool on the canvas will only move the cropping rectangle.\n\n"
"When disabled using the tool on the canvas will draw the rectangle."
msgstr "Ukuran terkunci\n\n"
-"Saat diaktifkan dengan alat di kanvas hanya akan memindahkan persegi berpangkas.\n\n"
+"Saat diaktifkan dengan alat di kanvas hanya akan memindahkan persegi terpotong.\n\n"
"Saat dinonaktifkan dengan alat di kanvas hanya akan membuat persegi."
#. A tool used in 3D layers, that edits 3D objects.
@@ -3196,7 +3231,7 @@ msgstr "Pindahkan gambar rujukan terpilih ke kiri"
#. Select a reference on the canvas
msgid "Selects a reference image on the canvas"
-msgstr "Memilih yang jadi gambar rujukan di kanvas"
+msgstr "Memilih gambar rujukan untuk di kanvas"
#. Moves the reference on the canvas
msgid "Move the selected reference image"
diff --git a/Translations/is_IS.po b/Translations/is_IS.po
index 01de5f687..128ea343d 100644
--- a/Translations/is_IS.po
+++ b/Translations/is_IS.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Icelandic\n"
"Language: is_IS\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/it_IT.po b/Translations/it_IT.po
index fa74b7cc6..c4ec5e10c 100644
--- a/Translations/it_IT.po
+++ b/Translations/it_IT.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Italian\n"
"Language: it_IT\n"
-"PO-Revision-Date: 2024-08-16 15:20\n"
+"PO-Revision-Date: 2024-09-12 16:19\n"
msgid "OK"
msgstr "OK"
@@ -560,6 +560,10 @@ msgstr "Esplora"
msgid "Resize:"
msgstr "Ridimensiona:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr "Qualità:"
+
msgid "Cancel Export"
msgstr "Annulla esportazione"
@@ -954,12 +958,15 @@ msgstr "Modifica Canale Blu"
msgid "Modify Alpha Channel"
msgstr "Modifica Canale Alfa"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Desaturazione"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Contorno"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "Rilascia Ombra"
@@ -972,6 +979,26 @@ msgstr "Spostamento Y:"
msgid "Shadow color:"
msgstr "Colore ombra:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr "Sfocatura Gaussiana"
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr "Tipo di sfocatura:"
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr "Quantità sfocatura:"
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr "Raggio Sfocatura:"
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr "Direzione sfocatura:"
+
msgid "Gradient"
msgstr "Gradiente"
@@ -1032,7 +1059,7 @@ msgstr "Tipo:"
msgid "Angle:"
msgstr "Angolo:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Regola Tonalità/Saturazione/Valore"
@@ -1102,11 +1129,11 @@ msgstr "Colori:"
msgid "Steps:"
msgstr "Passaggi:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr "Pallettizza"
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr "Pixellizza"
@@ -1736,7 +1763,7 @@ msgstr "Se questa opzione viene attivata, quando la finestra dell'applicazione p
#. An option found in the preferences, under the Performance section. Refers to the screen being updated (redrawn) continuously.
msgid "Update continuously"
-msgstr ""
+msgstr "Aggiorna continuamente"
#. Found in the preferences, hint of the "Update continuously" option.
msgid "If this is toggled on, the application will redraw the screen continuously, even while it's not used. Turning this off helps lower CPU and GPU usage when idle."
@@ -2698,6 +2725,14 @@ msgstr "Carattere(i) separatore(i):"
msgid "The character(s) that separate the file name and the frame number"
msgstr "I caratteri che separano il nome del file e il numero di fotogramma"
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr "Ritaglia immagini"
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr "Ritaglia le immagini esportate nella loro porzione visibile, considerando ogni pixel con un canale alfa diverso da zero come visibile."
+
msgid "Close"
msgstr "Chiudi"
diff --git a/Translations/ja_JP.po b/Translations/ja_JP.po
index 309642861..3cba3d4b4 100644
--- a/Translations/ja_JP.po
+++ b/Translations/ja_JP.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Japanese\n"
"Language: ja_JP\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 17:12\n"
msgid "OK"
msgstr "OK"
@@ -560,6 +560,10 @@ msgstr "参照"
msgid "Resize:"
msgstr "サイズを変更"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr "品質:"
+
msgid "Cancel Export"
msgstr "エクスポートをキャンセル"
@@ -954,12 +958,15 @@ msgstr "青チャンネルを変更"
msgid "Modify Alpha Channel"
msgstr "アルファチャンネルを変更"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "彩度を下げる"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "アウトライン"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "ドロップシャドウ"
@@ -972,6 +979,26 @@ msgstr "オフセット Y:"
msgid "Shadow color:"
msgstr "影の色:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "グラディエーション"
@@ -1032,7 +1059,7 @@ msgstr "タイプ:"
msgid "Angle:"
msgstr "角度:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "色相/彩度/値を調整"
@@ -1102,11 +1129,11 @@ msgstr "色:"
msgid "Steps:"
msgstr "手順:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr "パレット化"
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr "ピクセル化"
@@ -2698,6 +2725,14 @@ msgstr "区切り文字:"
msgid "The character(s) that separate the file name and the frame number"
msgstr "ファイル名とフレーム番号を区切る文字"
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr "画像をトリム"
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr "エクスポートされた画像を可視部分にトリミングします。各ピクセルをゼロではないアルファチャンネルを可視とします。"
+
msgid "Close"
msgstr "閉じる"
diff --git a/Translations/ko_KR.po b/Translations/ko_KR.po
index 4ff5901b3..268822dfa 100644
--- a/Translations/ko_KR.po
+++ b/Translations/ko_KR.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Korean\n"
"Language: ko_KR\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "예"
@@ -557,6 +557,10 @@ msgstr "찾아보기"
msgid "Resize:"
msgstr "크기 조정"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "내보내기 취소"
@@ -951,12 +955,15 @@ msgstr "블루 채널 수정"
msgid "Modify Alpha Channel"
msgstr "알파 채널 수정"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "채도 낮추기"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "외곽선"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "그림자"
@@ -969,6 +976,26 @@ msgstr "Y 오프셋:"
msgid "Shadow color:"
msgstr "그림자 색상:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "그레디언트"
@@ -1028,7 +1055,7 @@ msgstr "타입:"
msgid "Angle:"
msgstr "각도:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "색상/채도/명도 수정"
@@ -1098,11 +1125,11 @@ msgstr "색상:"
msgid "Steps:"
msgstr "단계:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2682,6 +2709,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "닫기"
diff --git a/Translations/la_LA.po b/Translations/la_LA.po
index 5f7500441..70f9aed95 100644
--- a/Translations/la_LA.po
+++ b/Translations/la_LA.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Latin\n"
"Language: la_LA\n"
-"PO-Revision-Date: 2024-08-16 13:19\n"
+"PO-Revision-Date: 2024-09-11 15:45\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/lt_LT.po b/Translations/lt_LT.po
index 01fa3b43f..382cb56ec 100644
--- a/Translations/lt_LT.po
+++ b/Translations/lt_LT.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Lithuanian\n"
"Language: lt_LT\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/lv_LV.po b/Translations/lv_LV.po
index 77d53a7c9..0d99ab710 100644
--- a/Translations/lv_LV.po
+++ b/Translations/lv_LV.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Latvian\n"
"Language: lv_LV\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "Labi"
@@ -556,6 +556,10 @@ msgstr ""
msgid "Resize:"
msgstr "Mainīt izmēru:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "Atcelt eksportēšanu"
@@ -950,12 +954,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Atsātināt"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Ārlīnija"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -968,6 +975,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1027,7 +1054,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1097,11 +1124,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2642,6 +2669,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/mk_MK.po b/Translations/mk_MK.po
index b07d4cf04..42ed9542f 100644
--- a/Translations/mk_MK.po
+++ b/Translations/mk_MK.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Macedonian\n"
"Language: mk_MK\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/ml_IN.po b/Translations/ml_IN.po
index 194315520..9c2f90948 100644
--- a/Translations/ml_IN.po
+++ b/Translations/ml_IN.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Malayalam\n"
"Language: ml_IN\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:45\n"
msgid "OK"
msgstr "ഓക്കേ"
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/mr_IN.po b/Translations/mr_IN.po
index e6f8db932..dc2f2394b 100644
--- a/Translations/mr_IN.po
+++ b/Translations/mr_IN.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Marathi\n"
"Language: mr_IN\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/ms_MY.po b/Translations/ms_MY.po
index 1741ad18d..ceebd503c 100644
--- a/Translations/ms_MY.po
+++ b/Translations/ms_MY.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Malay\n"
"Language: ms_MY\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:45\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/nb_NO.po b/Translations/nb_NO.po
index b378c7238..ca7a3a640 100644
--- a/Translations/nb_NO.po
+++ b/Translations/nb_NO.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Norwegian Bokmal\n"
"Language: nb_NO\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:45\n"
msgid "OK"
msgstr "OK"
@@ -556,6 +556,10 @@ msgstr "Bla gjennom"
msgid "Resize:"
msgstr "Endre størrelse:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "Avbryt Eksport"
@@ -950,12 +954,15 @@ msgstr "Endre Blå Kanal"
msgid "Modify Alpha Channel"
msgstr "Endre Alpha Kanal"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Avmettning"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Omriss"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -968,6 +975,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "Gradient"
@@ -1027,7 +1054,7 @@ msgstr "Type:"
msgid "Angle:"
msgstr "Vinkel:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Justér Fargetone/Metning/Verdi"
@@ -1097,11 +1124,11 @@ msgstr "Farger:"
msgid "Steps:"
msgstr "Trinn:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2681,6 +2708,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "Lukk"
diff --git a/Translations/nl_NL.po b/Translations/nl_NL.po
index af18bc92a..a78e3853f 100644
--- a/Translations/nl_NL.po
+++ b/Translations/nl_NL.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "Oké"
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/pl_PL.po b/Translations/pl_PL.po
index 66117e91d..38276ec12 100644
--- a/Translations/pl_PL.po
+++ b/Translations/pl_PL.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Polish\n"
"Language: pl_PL\n"
-"PO-Revision-Date: 2024-08-17 07:21\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "OK"
@@ -559,6 +559,10 @@ msgstr "Przeglądaj"
msgid "Resize:"
msgstr "Zmień rozmiar:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr "Jakość:"
+
msgid "Cancel Export"
msgstr "Anuluj eksportowanie"
@@ -953,12 +957,15 @@ msgstr "Modyfikuj kanał niebieski"
msgid "Modify Alpha Channel"
msgstr "Modyfikuj kanał alfa"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Desaturacja (zmniejsz nasycenie)"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Obrys"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "Cień"
@@ -971,6 +978,26 @@ msgstr "Przesunięcie Y:"
msgid "Shadow color:"
msgstr "Kolor cienia:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "Gradient"
@@ -1031,7 +1058,7 @@ msgstr "Typ:"
msgid "Angle:"
msgstr "Kąt:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Dostosuj Odcień/Nasycenie/Wartość"
@@ -1101,11 +1128,11 @@ msgstr "Kolory:"
msgid "Steps:"
msgstr "Kroki:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr "Paletyzacja"
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr "Pixelizuj"
@@ -2696,6 +2723,14 @@ msgstr "Znak(i) rozdzielające:"
msgid "The character(s) that separate the file name and the frame number"
msgstr "Znak(i) oddzielające nazwę pliku od numeru klatki"
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "Zamknij"
diff --git a/Translations/pt_BR.po b/Translations/pt_BR.po
index dcbe9f62c..9cc39f303 100644
--- a/Translations/pt_BR.po
+++ b/Translations/pt_BR.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt_BR\n"
-"PO-Revision-Date: 2024-08-16 13:17\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "OK"
@@ -560,6 +560,10 @@ msgstr "Localizar"
msgid "Resize:"
msgstr "Redimensionar:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "Cancelar exportação"
@@ -954,12 +958,15 @@ msgstr "Modificar O Canal Azul"
msgid "Modify Alpha Channel"
msgstr "Modificar O Canal Alfa"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Dessaturação"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Contorno"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "Sombra projetada"
@@ -972,6 +979,26 @@ msgstr "Deslocar Y:"
msgid "Shadow color:"
msgstr "Cor da sombra:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "Gradiente"
@@ -1032,7 +1059,7 @@ msgstr "Tipo:"
msgid "Angle:"
msgstr "Ângulo:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Ajustar Matiz/Saturação/Valor"
@@ -1102,11 +1129,11 @@ msgstr "Cores:"
msgid "Steps:"
msgstr "Etapas:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr "Paletizar"
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr "Pixelizar"
@@ -1724,7 +1751,7 @@ msgstr "Define o limite de FPS (quadros por segundo) do aplicativo. Quanto menor
#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
msgid "Max undo steps:"
-msgstr ""
+msgstr "Máximo de ações salvas para desfazer:"
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
@@ -2698,6 +2725,14 @@ msgstr "Usar caractere(s) de separação:"
msgid "The character(s) that separate the file name and the frame number"
msgstr "O(s) caractere(s) que separam o nome do arquivo e o número do quadro"
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "Fechar"
diff --git a/Translations/pt_PT.po b/Translations/pt_PT.po
index d93dfd0e7..55b34e40b 100644
--- a/Translations/pt_PT.po
+++ b/Translations/pt_PT.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Portuguese\n"
"Language: pt_PT\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "OK"
@@ -556,6 +556,10 @@ msgstr "Pesquisar"
msgid "Resize:"
msgstr "Redimensionar:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "Cancelar Exportar"
@@ -950,12 +954,15 @@ msgstr "Alterar Canal Azul"
msgid "Modify Alpha Channel"
msgstr "Alterar Canal Alpha"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Dessaturação"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Contorno"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -968,6 +975,26 @@ msgstr ""
msgid "Shadow color:"
msgstr "Cor da sombra:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "Gradiente"
@@ -1028,7 +1055,7 @@ msgstr "Tipo:"
msgid "Angle:"
msgstr "Angulo:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Ajustar Hue/Saturação/Valor"
@@ -1098,11 +1125,11 @@ msgstr "Cores:"
msgid "Steps:"
msgstr "Passos:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2677,6 +2704,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "Fechar"
diff --git a/Translations/ro_RO.po b/Translations/ro_RO.po
index 2b6ba88bd..673ab37ab 100644
--- a/Translations/ro_RO.po
+++ b/Translations/ro_RO.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Romanian\n"
"Language: ro_RO\n"
-"PO-Revision-Date: 2024-08-16 15:20\n"
+"PO-Revision-Date: 2024-09-11 18:44\n"
msgid "OK"
msgstr "OK"
@@ -558,6 +558,10 @@ msgstr "Răsfoire"
msgid "Resize:"
msgstr "Redimensionare:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr "Calitate:"
+
msgid "Cancel Export"
msgstr "Anulare exportare"
@@ -952,12 +956,15 @@ msgstr "Modificare canal albastru"
msgid "Modify Alpha Channel"
msgstr "Modificare canal alfa"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Desaturație"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Contur"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "Umbră"
@@ -970,6 +977,26 @@ msgstr "Decalaj Y:"
msgid "Shadow color:"
msgstr "Culoarea umbrei:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr "Estompare gaussiană"
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr "Tip de estompare:"
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr "Cantitate de estompare:"
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr "Rază de estompare:"
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr "Direcția de estompare:"
+
msgid "Gradient"
msgstr "Degrade"
@@ -1030,7 +1057,7 @@ msgstr "Tip:"
msgid "Angle:"
msgstr "Unghi:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Ajustare nuanță/saturație/valoare"
@@ -1100,11 +1127,11 @@ msgstr "Culori:"
msgid "Steps:"
msgstr "Pași:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr "Paletizare"
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr "Pixelizare"
@@ -2696,6 +2723,14 @@ msgstr "Caractere separatoare:"
msgid "The character(s) that separate the file name and the frame number"
msgstr "Caracterele care separă numele fișierului și numărul cadrului"
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr "Trunchiere imagini"
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr "Trunchiază imaginile exportate până la porțiunea lor vizibilă, considerând fiecare pixel cu un canal alfa non-zero ca fiind vizibil."
+
msgid "Close"
msgstr "Închide"
diff --git a/Translations/ru_RU.po b/Translations/ru_RU.po
index 1b5e663e8..cc0d0e557 100644
--- a/Translations/ru_RU.po
+++ b/Translations/ru_RU.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "OK"
@@ -329,16 +329,16 @@ msgid "Mirror View"
msgstr "Зеркальный вид"
msgid "Show Grid"
-msgstr "Показывать сетку"
+msgstr "Показать сетку"
msgid "Show Pixel Grid"
msgstr "Показать пиксельную сетку"
msgid "Show Rulers"
-msgstr "Показывать линейки"
+msgstr "Показать линейки"
msgid "Show Guides"
-msgstr "Показывать направляющие"
+msgstr "Показать направляющие"
#. Found under the View menu.
msgid "Show Mouse Guides"
@@ -558,6 +558,10 @@ msgstr "Обзор"
msgid "Resize:"
msgstr "Изменить размер:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "Отменить экспорт"
@@ -640,22 +644,22 @@ msgid "Save a File"
msgstr "Сохранить файл"
msgid "Go to previous folder."
-msgstr ""
+msgstr "Перейти к предыдущей папке."
msgid "Go to next folder."
-msgstr ""
+msgstr "Перейти к следующей папке."
msgid "Go to parent folder."
-msgstr ""
+msgstr "Перейти в родительскую папку."
msgid "Path:"
msgstr "Путь:"
msgid "Refresh files."
-msgstr ""
+msgstr "Обновить файлы."
msgid "Toggle the visibility of hidden files."
-msgstr ""
+msgstr "Переключение видимости скрытых файлов."
msgid "Directories & Files:"
msgstr "Папки и файлы:"
@@ -672,19 +676,19 @@ msgstr "Все файлы"
#. Found in the "Open" file dialog. Searches all file types supported by Pixelorama.
msgid "All Recognized"
-msgstr ""
+msgstr "Все распознано"
#. Found in "Open" and "Save" file dialogs. Searches Pixelorama Project files only (.pxo).
msgid "Pixelorama Project"
-msgstr ""
+msgstr "Проект Pixelorama"
#. Found in the "Open" file dialog. Searches PNG files only. (Note that PNG is a file type and should remain untranslated)
msgid "PNG Image"
-msgstr ""
+msgstr "Изображение PNG"
#. Found in the "Open" file dialog. Searches BMP files only. (Note that BMP is a file type and should remain untranslated)
msgid "BMP Image"
-msgstr ""
+msgstr "Изображение BMP"
#. Found in the "Open" file dialog. Searches "Radiance HDR" files only. (Note that "Radiance HDR" is a file type and is better untranslated)
msgid "Radiance HDR Image"
@@ -692,27 +696,27 @@ msgstr ""
#. Found in the "Open" file dialog. Searches JPEG files only. (Note that JPEG is a file type and should remain untranslated)
msgid "JPEG Image"
-msgstr ""
+msgstr "Изображение JPEG"
#. Found in the "Open" file dialog. Searches SVG files only. (Note that SVG is a file type and should remain untranslated)
msgid "SVG Image"
-msgstr ""
+msgstr "Изображение SVG"
#. Found in the "Open" file dialog. Searches TGA files only. (Note that TGA is a file type and should remain untranslated)
msgid "TGA Image"
-msgstr ""
+msgstr "Изображение TGA"
#. Found in the "Open" file dialog. Searches WebP files only. (Note that WebP is a file type and should remain untranslated)
msgid "WebP Image"
-msgstr ""
+msgstr "Изображение WebP"
#. Found in the "Open" file dialog. Searches Pixelorama palette files only (.json).
msgid "Pixelorama palette"
-msgstr ""
+msgstr "Палитра Pixelorama"
#. Found in the "Open" file dialog. Searches GIMP palette files only (.gpl). (Note that GIMP is a software and should remain untranslated)
msgid "GIMP palette"
-msgstr ""
+msgstr "Палитра GIMP"
#. Found in the export dialog. It is a button that when pressed, shows more options.
msgid "Advanced options"
@@ -952,12 +956,15 @@ msgstr "Изменять синий канал"
msgid "Modify Alpha Channel"
msgstr "Изменять альфа-канал"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Обесцвечивание"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Обводка"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "Отбросить тень"
@@ -970,6 +977,26 @@ msgstr "Смещение по Y:"
msgid "Shadow color:"
msgstr "Цвет тени:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "Градиент"
@@ -1029,7 +1056,7 @@ msgstr "Тип:"
msgid "Angle:"
msgstr "Угол:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Изменить Оттенок/Насыщенность/Яркость"
@@ -1051,31 +1078,31 @@ msgstr "Яркость:"
#. An image effect. Adjusts the brightness and contrast of the colors of an image.
msgid "Adjust Brightness/Contrast"
-msgstr ""
+msgstr "Регулировка яркости/контрастности"
#. Refers to the brightness of the colors of an image.
msgid "Brightness:"
-msgstr ""
+msgstr "Яркость:"
#. Refers to the contrast of the colors of an image.
msgid "Contrast:"
-msgstr ""
+msgstr "Контраст:"
#. Refers to the red value of the colors of an image.
msgid "Red value:"
-msgstr ""
+msgstr "Значение красного:"
#. Refers to the green value of the colors of an image.
msgid "Green value:"
-msgstr ""
+msgstr "Значение зеленого:"
#. Refers to the blue value of the colors of an image.
msgid "Blue value:"
-msgstr ""
+msgstr "Значение синего:"
#. Refers to a color that tints an image.
msgid "Tint color:"
-msgstr ""
+msgstr "Цвет плитки:"
#. Refers to the factor (how much) a color tints an image.
msgid "Tint effect factor:"
@@ -1099,11 +1126,11 @@ msgstr "Цвета:"
msgid "Steps:"
msgstr "Шаги:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr "Паллетизация"
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr "Пикселизация"
@@ -1358,7 +1385,9 @@ msgstr "Лассо / свободное выделение\n\n"
msgid "Select by Drawing\n\n"
"%s for left mouse button\n"
"%s for right mouse button"
-msgstr ""
+msgstr "Выбор по рисунку\n\n"
+"%s левой кнопкой мыши\n"
+"%s для правой кнопки мыши"
msgid "Move\n\n"
"%s for left mouse button\n"
@@ -1497,7 +1526,7 @@ msgstr "Поменять левый и правый цвета местами."
#. Tooltip of the average color button, found in the color picker panel. Shows the average color between the two selected.
msgid "Average Color:"
-msgstr ""
+msgstr "Средний цвет:"
msgid "Reset the colors to their default state (black for left, white for right)"
msgstr "Сбросить цвета по умолчанию (слева черный, справа белый)"
@@ -1532,7 +1561,7 @@ msgstr ""
#. Found under color options in the color picker panel.
msgid "Recent Colors"
-msgstr ""
+msgstr "Недавние цвета"
msgid "Left tool"
msgstr "Левый инструмент"
@@ -1607,7 +1636,7 @@ msgid "Isometric"
msgstr "Изометрическая"
msgid "All"
-msgstr "Обе"
+msgstr "Все"
#. Found in the Preferences, in the Canvas tab.
msgid "Rectangular grid size:"
@@ -1717,7 +1746,7 @@ msgstr "Устанавливает лимит на количество кадр
#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
msgid "Max undo steps:"
-msgstr ""
+msgstr "Максимум шагов отмены:"
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
@@ -1729,7 +1758,7 @@ msgstr "Если этот параметр включен, то, когда ок
#. An option found in the preferences, under the Performance section. Refers to the screen being updated (redrawn) continuously.
msgid "Update continuously"
-msgstr ""
+msgstr "Постоянно обновлять"
#. Found in the preferences, hint of the "Update continuously" option.
msgid "If this is toggled on, the application will redraw the screen continuously, even while it's not used. Turning this off helps lower CPU and GPU usage when idle."
@@ -2012,10 +2041,10 @@ msgid "Current frame as spritesheet"
msgstr "Текущий кадр как спрайт лист"
msgid "Jump to the first frame"
-msgstr ""
+msgstr "Перейти к первому кадру"
msgid "Go to the previous frame"
-msgstr ""
+msgstr "На предыдущий кадр"
msgid "Play the animation backwards (from end to beginning)"
msgstr ""
@@ -2024,10 +2053,10 @@ msgid "Play the animation forward (from beginning to end)"
msgstr ""
msgid "Go to the next frame"
-msgstr ""
+msgstr "На следующий кадр"
msgid "Jump to the last frame"
-msgstr ""
+msgstr "Перейти на последний кадр"
msgid "Timeline settings"
msgstr "Настройка таймлана"
@@ -2161,7 +2190,7 @@ msgstr "Новый тег"
#. Found on the popup menu that appears when a user right-clicks on a frame button. When clicked, it allows users to paste/import tags from other opened projects.
msgid "Import Tag"
-msgstr ""
+msgstr "Импорт метки"
#. Found on the popup menu that appears when a user right-clicks on a frame button. When clicked, the order of the selected frames is being reversed.
msgid "Reverse Frames"
@@ -2217,7 +2246,7 @@ msgstr "Режим смешивания:"
#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
msgid "Pass through"
-msgstr ""
+msgstr "Пропуск"
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
@@ -2531,7 +2560,7 @@ msgid "Portrait"
msgstr "Портретная"
msgid "Landscape"
-msgstr "Горизонтальное"
+msgstr "Горизонтальная"
msgid "Templates:"
msgstr "Шаблоны:"
@@ -2691,6 +2720,14 @@ msgstr "Разделитель символов:"
msgid "The character(s) that separate the file name and the frame number"
msgstr "Символы, разделяющие имя файла и номер кадра"
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "Закрыть"
@@ -3167,11 +3204,11 @@ msgstr ""
#. Removes the selected reference image.
msgid "Remove"
-msgstr ""
+msgstr "Удалить"
#. A tooltip to tell users to hold the Shift key while clicking the remove button
msgid "Hold Shift while pressing to instantly remove."
-msgstr ""
+msgstr "Удерживайте Shift, чтобы мгновенно удалить."
#. Shown in the confirmation dialog for removing a reference image.
msgid "Are you sure you want to remove this reference image? It will not be deleted from your file system."
@@ -3203,15 +3240,15 @@ msgstr "Масштабировать выбранное референсное
#. Button to select no reference images in the Reference Images panel.
msgid "none"
-msgstr ""
+msgstr "нет"
#. Resets the Transform of the selected reference image on the canvas.
msgid "Reset Transform"
-msgstr ""
+msgstr "Сбросить трансформацию"
#. Position of the selected reference image on the canvas.
msgid "Position"
-msgstr ""
+msgstr "Положение"
#. Scale of the selected reference image on the canvas.
msgid "Scale"
@@ -3223,7 +3260,7 @@ msgstr "Поворот"
#. Toggle filter of the selected reference image on the canvas.
msgid "Filter"
-msgstr ""
+msgstr "Фильтр"
#. Opacity of the selected reference image on the canvas.
msgid "Opacity"
diff --git a/Translations/si_LK.po b/Translations/si_LK.po
index ac8432839..6d84d7be6 100644
--- a/Translations/si_LK.po
+++ b/Translations/si_LK.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Sinhala\n"
"Language: si_LK\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:45\n"
msgid "OK"
msgstr "හරි"
@@ -555,6 +555,10 @@ msgstr "පිරික්සන්න"
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr "පියවර:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/sk_SK.po b/Translations/sk_SK.po
index 04cea609f..0dd21bca4 100644
--- a/Translations/sk_SK.po
+++ b/Translations/sk_SK.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Slovak\n"
"Language: sk_SK\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/sl_SI.po b/Translations/sl_SI.po
index 1990d1b72..27ef2b48e 100644
--- a/Translations/sl_SI.po
+++ b/Translations/sl_SI.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Slovenian\n"
"Language: sl_SI\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/sq_AL.po b/Translations/sq_AL.po
index d65c97db5..aa1dc151c 100644
--- a/Translations/sq_AL.po
+++ b/Translations/sq_AL.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Albanian\n"
"Language: sq_AL\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "Ne rregull"
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/sr_SP.po b/Translations/sr_SP.po
index d0dabd6f0..cc8d676ff 100644
--- a/Translations/sr_SP.po
+++ b/Translations/sr_SP.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Serbian (Cyrillic)\n"
"Language: sr_SP\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "ОК"
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr "Тип:"
msgid "Angle:"
msgstr "Угао:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr "Боја:"
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/sv_SE.po b/Translations/sv_SE.po
index 32bf6083a..2c099e0dc 100644
--- a/Translations/sv_SE.po
+++ b/Translations/sv_SE.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Swedish\n"
"Language: sv_SE\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "Okej"
@@ -555,6 +555,10 @@ msgstr "Bläddra"
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr "Typ:"
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr "Färger:"
msgid "Steps:"
msgstr "Steg:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "Stäng"
diff --git a/Translations/sw_KE.po b/Translations/sw_KE.po
index 16f78efe1..0c0d6b5ec 100644
--- a/Translations/sw_KE.po
+++ b/Translations/sw_KE.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Swahili\n"
"Language: sw_KE\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:45\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/ta_IN.po b/Translations/ta_IN.po
index a74853986..fe6a48d0f 100644
--- a/Translations/ta_IN.po
+++ b/Translations/ta_IN.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Tamil\n"
"Language: ta_IN\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/th_TH.po b/Translations/th_TH.po
index 538d7d5ac..c99954ebc 100644
--- a/Translations/th_TH.po
+++ b/Translations/th_TH.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Thai\n"
"Language: th_TH\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/tlh_AA.po b/Translations/tlh_AA.po
index 87ed68a48..947b176d0 100644
--- a/Translations/tlh_AA.po
+++ b/Translations/tlh_AA.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Klingon\n"
"Language: tlh_AA\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:45\n"
msgid "OK"
msgstr ""
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/tr_TR.po b/Translations/tr_TR.po
index aacd268cc..30053f92e 100644
--- a/Translations/tr_TR.po
+++ b/Translations/tr_TR.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
-"PO-Revision-Date: 2024-08-17 21:08\n"
+"PO-Revision-Date: 2024-09-11 20:00\n"
msgid "OK"
msgstr "Tamam"
@@ -560,6 +560,10 @@ msgstr "Gözat"
msgid "Resize:"
msgstr "Boyutlandır:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr "Kalite:"
+
msgid "Cancel Export"
msgstr "Dışarı Aktarmayı İptal Et"
@@ -954,12 +958,15 @@ msgstr "Mavi Kanalı Düzenle"
msgid "Modify Alpha Channel"
msgstr "Alfa Kanalını Düzenle"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Doygunluğu azalt"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Anahat"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "Gölge"
@@ -972,6 +979,26 @@ msgstr "Uzaklık Y:"
msgid "Shadow color:"
msgstr "Gölge rengi:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr "Gauss Bulanıklığı"
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr "Bulanıklık türü:"
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr "Bulanıklık miktarı:"
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr "Bulanıklık yarıçapı:"
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr "Bulanıklık yönü:"
+
msgid "Gradient"
msgstr "Gradyan"
@@ -1032,7 +1059,7 @@ msgstr "Tür:"
msgid "Angle:"
msgstr "Açı:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Renk Tonu/Doygunluk/Değer Ayarla"
@@ -1102,11 +1129,11 @@ msgstr "Renkler:"
msgid "Steps:"
msgstr "Adımlar:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr "Paletleştir"
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr "Pikselleştir"
@@ -2698,6 +2725,14 @@ msgstr "Ayırcı karakter(ler):"
msgid "The character(s) that separate the file name and the frame number"
msgstr "Dosya adını ve kare numarasını ayıran karakter(ler)"
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr "Görüntüleri kırp"
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr "Dışa aktarılan görüntüleri görünür kısımlarına kırpar, sıfır olmayan alfa kanalına sahip her piksel görünür kabul edilir."
+
msgid "Close"
msgstr "Kapat"
diff --git a/Translations/uk_UA.po b/Translations/uk_UA.po
index 6662ac090..56dd51228 100644
--- a/Translations/uk_UA.po
+++ b/Translations/uk_UA.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Ukrainian\n"
"Language: uk_UA\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "Гаразд"
@@ -560,6 +560,10 @@ msgstr "Огляд"
msgid "Resize:"
msgstr "Змінити розмір:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "Скасувати експорт"
@@ -954,12 +958,15 @@ msgstr "Змінити синій канал"
msgid "Modify Alpha Channel"
msgstr "Змінити альфа-канал"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "Знебарвлення"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "Контур"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "Тінь"
@@ -972,6 +979,26 @@ msgstr "Зсув за Y:"
msgid "Shadow color:"
msgstr "Колір тіні:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "Градієнт"
@@ -1032,7 +1059,7 @@ msgstr "Тип:"
msgid "Angle:"
msgstr "Кут:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "Змінити Відтінки/Насиченість/Яскравість"
@@ -1102,11 +1129,11 @@ msgstr "Кольори:"
msgid "Steps:"
msgstr "Кроки:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2689,6 +2716,14 @@ msgstr "Роздільні символ(и):"
msgid "The character(s) that separate the file name and the frame number"
msgstr "Символ(и), що розділяють назву файлу та номер кадра"
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "Закрити"
diff --git a/Translations/vi_VN.po b/Translations/vi_VN.po
index 72b5869af..1af207637 100644
--- a/Translations/vi_VN.po
+++ b/Translations/vi_VN.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Vietnamese\n"
"Language: vi_VN\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "OK"
@@ -555,6 +555,10 @@ msgstr ""
msgid "Resize:"
msgstr ""
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr ""
@@ -949,12 +953,15 @@ msgstr ""
msgid "Modify Alpha Channel"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr ""
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr ""
@@ -1026,7 +1053,7 @@ msgstr ""
msgid "Angle:"
msgstr ""
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr ""
@@ -1096,11 +1123,11 @@ msgstr ""
msgid "Steps:"
msgstr ""
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2632,6 +2659,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/Translations/zh_CN.po b/Translations/zh_CN.po
index 784c38f64..090460c10 100644
--- a/Translations/zh_CN.po
+++ b/Translations/zh_CN.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "确定"
@@ -560,6 +560,10 @@ msgstr "浏览"
msgid "Resize:"
msgstr "调整大小:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "取消导出"
@@ -954,12 +958,15 @@ msgstr "修改蓝色通道"
msgid "Modify Alpha Channel"
msgstr "修改 Alpha 通道"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "去饱和"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "轮廓"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr "阴影"
@@ -972,6 +979,26 @@ msgstr "偏移 Y:"
msgid "Shadow color:"
msgstr "阴影颜色:"
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "渐变"
@@ -1032,7 +1059,7 @@ msgstr "类型:"
msgid "Angle:"
msgstr "角度:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "调整色相/饱和度/值"
@@ -1102,11 +1129,11 @@ msgstr "颜色:"
msgid "Steps:"
msgstr "步骤:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr "调色板"
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr "像素化"
@@ -1723,7 +1750,7 @@ msgstr "设置应用程序帧每秒的限制。 数字越低,CPU 使用率越
#. Found in the Preferences, under the Performance section. Changes the value of the maximum undo steps projects can use.
msgid "Max undo steps:"
-msgstr ""
+msgstr "最大撤消步骤:"
#. An option found in the preferences, under the Performance section.
msgid "Pause application when it loses focus"
@@ -2223,7 +2250,7 @@ msgstr "混合模式:"
#. Found in the layer's section of the timeline, as a blend mode option, only available for group layers. If enabled, group blending is disabled and the group simply acts as a way to organize layers instead of affecting blending.
msgid "Pass through"
-msgstr ""
+msgstr "通过"
#. Adjective, refers to something usual/regular, such as the normal blend mode.
msgid "Normal"
@@ -2697,6 +2724,14 @@ msgstr "分隔符:"
msgid "The character(s) that separate the file name and the frame number"
msgstr "分隔文件名称和帧编号的字符(秒)"
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "关闭"
diff --git a/Translations/zh_TW.po b/Translations/zh_TW.po
index 038caba78..0ca2b814d 100644
--- a/Translations/zh_TW.po
+++ b/Translations/zh_TW.po
@@ -10,7 +10,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Language-Team: Chinese Traditional\n"
"Language: zh_TW\n"
-"PO-Revision-Date: 2024-08-16 13:18\n"
+"PO-Revision-Date: 2024-09-11 15:44\n"
msgid "OK"
msgstr "確定"
@@ -555,6 +555,10 @@ msgstr "瀏覽"
msgid "Resize:"
msgstr "調整大小:"
+#. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file.
+msgid "Quality:"
+msgstr ""
+
msgid "Cancel Export"
msgstr "取消輸出"
@@ -949,12 +953,15 @@ msgstr "修改藍色色版"
msgid "Modify Alpha Channel"
msgstr "修改透明色版"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Desaturation"
msgstr "去飽和"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Outline"
msgstr "描邊"
+#. An image effect. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Drop Shadow"
msgstr ""
@@ -967,6 +974,26 @@ msgstr ""
msgid "Shadow color:"
msgstr ""
+#. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur
+msgid "Gaussian Blur"
+msgstr ""
+
+#. The type of the Gaussian blur, an image effect.
+msgid "Blur type:"
+msgstr ""
+
+#. The applied amount of Gaussian blur, an image effect.
+msgid "Blur amount:"
+msgstr ""
+
+#. The applied radius of Gaussian blur, an image effect.
+msgid "Blur radius:"
+msgstr ""
+
+#. The applied direction of Gaussian blur, an image effect.
+msgid "Blur direction:"
+msgstr ""
+
msgid "Gradient"
msgstr "顏色漸變"
@@ -1026,7 +1053,7 @@ msgstr "類型:"
msgid "Angle:"
msgstr "角度:"
-#. An image effect. Adjusts the hue, saturation and value of the colors of an image.
+#. An image effect. Adjusts the hue, saturation and value of the colors of an image. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Adjust Hue/Saturation/Value"
msgstr "調整色相、飽和度、亮度"
@@ -1096,11 +1123,11 @@ msgstr "顏色:"
msgid "Steps:"
msgstr "色階數:"
-#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects.
+#. An image effect. It maps the color of the input to the nearest color in the selected palette. Useful for limiting color in pixel art and for artistic effects. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Palettize"
msgstr ""
-#. An image effect. It makes the input image pixelated.
+#. An image effect. It makes the input image pixelated. See Pixelorama's documentation page for more information: https://www.oramainteractive.com/Pixelorama-Docs/user_manual/image_effects
msgid "Pixelize"
msgstr ""
@@ -2643,6 +2670,14 @@ msgstr ""
msgid "The character(s) that separate the file name and the frame number"
msgstr ""
+#. Found in the export dialog. It is an option that removes the transparent area around non-transparent pixels of the exported images.
+msgid "Trim images"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "trim images" option.
+msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
+msgstr ""
+
msgid "Close"
msgstr "關閉"
From 9cf0114ab3f622704f99f172ef4fc2758a23791b Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 13 Sep 2024 16:54:26 +0300
Subject: [PATCH 066/162] [skip ci] Update CHANGELOG.md
---
CHANGELOG.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 14a985809..e54995397 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -29,6 +29,7 @@ Built using Godot 4.3
- Optimized the lasso and polygon select tools, as well as the fill options of the pencil and curve tools. The time they take to complete now depends on the size of the selection, rather than checking all of the pixels of the entire canvas.
- Fixed a crash when re-arranging palette swatches while holding Shift.
- Fixed a crash when using the move tool snapped to the grid.
+- Fixed wrong preview in the gradient dialog when editing the gradient and dithering is enabled.
- Fixed a visual bug with the preview of the resize canvas dialog.
- Fixed wrong stretch mode in the cel button previews. [#1097](https://github.com/Orama-Interactive/Pixelorama/pull/1097)
From 52e45b158bf58ab316331caeabe268bc7f4ce04e Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 13 Sep 2024 17:02:35 +0300
Subject: [PATCH 067/162] Release v1.0.3
---
.github/workflows/release.yml | 2 +-
CHANGELOG.md | 2 +-
Misc/Linux/com.orama_interactive.Pixelorama.appdata.xml | 1 +
installer/pixelorama.nsi | 2 +-
project.godot | 2 +-
src/UI/TopMenuContainer/TopMenuContainer.gd | 2 +-
6 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 152c617e1..33bab292e 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -7,7 +7,7 @@ on:
env:
GODOT_VERSION: 4.3
EXPORT_NAME: Pixelorama
- TAG: v1.0.2
+ TAG: v1.0.3
BUTLER_API_KEY: ${{ secrets.BUTLER_API_KEY }}
jobs:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e54995397..f088a1f15 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). All the dates are in YYYY-MM-DD format.
-## [v1.0.3] - Unreleased
+## [v1.0.3] - 2024-09-13
This update has been brought to you by the contributions of:
Fayez Akhtar ([@Variable-ind](https://github.com/Variable-ind)), [alikin12](https://github.com/alikin12), Vaibhav Kubre ([@kubre](https://github.com/kubre)), Donte ([@donte5405](https://github.com/donte5405))
diff --git a/Misc/Linux/com.orama_interactive.Pixelorama.appdata.xml b/Misc/Linux/com.orama_interactive.Pixelorama.appdata.xml
index 5d04ebec5..121c2e5c7 100644
--- a/Misc/Linux/com.orama_interactive.Pixelorama.appdata.xml
+++ b/Misc/Linux/com.orama_interactive.Pixelorama.appdata.xml
@@ -44,6 +44,7 @@
+
diff --git a/installer/pixelorama.nsi b/installer/pixelorama.nsi
index 566e908a2..cb23da9c9 100644
--- a/installer/pixelorama.nsi
+++ b/installer/pixelorama.nsi
@@ -6,7 +6,7 @@
; Helper variables so that we don't change 20 instances of the version for every update
!define APPNAME "Pixelorama"
- !define APPVERSION "v1.0.2"
+ !define APPVERSION "v1.0.3"
!define COMPANYNAME "Orama Interactive"
diff --git a/project.godot b/project.godot
index a1ea06ec0..d004e6230 100644
--- a/project.godot
+++ b/project.godot
@@ -12,7 +12,7 @@ config_version=5
config/name="Pixelorama"
config/description="Unleash your creativity with Pixelorama, a powerful and accessible open-source pixel art multitool. Whether you want to create sprites, tiles, animations, or just express yourself in the language of pixel art, this software will realize your pixel-perfect dreams with a vast toolbox of features."
-config/version="v1.0.3-dev"
+config/version="v1.0.3-stable"
run/main_scene="res://src/Main.tscn"
config/use_custom_user_dir=true
config/custom_user_dir_name="pixelorama"
diff --git a/src/UI/TopMenuContainer/TopMenuContainer.gd b/src/UI/TopMenuContainer/TopMenuContainer.gd
index b3feece4d..cb5d0dd17 100644
--- a/src/UI/TopMenuContainer/TopMenuContainer.gd
+++ b/src/UI/TopMenuContainer/TopMenuContainer.gd
@@ -4,7 +4,7 @@ const DOCS_URL := "https://www.oramainteractive.com/Pixelorama-Docs/"
const ISSUES_URL := "https://github.com/Orama-Interactive/Pixelorama/issues"
const SUPPORT_URL := "https://www.patreon.com/OramaInteractive"
# gdlint: ignore=max-line-length
-const CHANGELOG_URL := "https://github.com/Orama-Interactive/Pixelorama/blob/master/CHANGELOG.md#v102---2024-08-21"
+const CHANGELOG_URL := "https://github.com/Orama-Interactive/Pixelorama/blob/master/CHANGELOG.md#v103---2024-09-13"
const EXTERNAL_LINK_ICON := preload("res://assets/graphics/misc/external_link.svg")
const PIXELORAMA_ICON := preload("res://assets/graphics/icons/icon_16x16.png")
const HEART_ICON := preload("res://assets/graphics/misc/heart.svg")
From d4d5f32429120f97bbf0aacfbc3b4a74641a42a8 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Mon, 16 Sep 2024 01:57:03 +0300
Subject: [PATCH 068/162] [skip ci] Bump version to v1.0.4-dev
---
export_presets.cfg | 14 +++++++-------
project.godot | 2 +-
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/export_presets.cfg b/export_presets.cfg
index 32b513202..8cb044d89 100644
--- a/export_presets.cfg
+++ b/export_presets.cfg
@@ -83,8 +83,8 @@ application/modify_resources=true
application/icon="res://assets/graphics/icons/icon.ico"
application/console_wrapper_icon=""
application/icon_interpolation=4
-application/file_version="1.0.3.0"
-application/product_version="1.0.3.0"
+application/file_version="1.0.4.0"
+application/product_version="1.0.4.0"
application/company_name="Orama Interactive"
application/product_name="Pixelorama"
application/file_description="Pixelorama - Your free & open-source sprite editor"
@@ -198,8 +198,8 @@ application/modify_resources=true
application/icon="res://assets/graphics/icons/icon.ico"
application/console_wrapper_icon=""
application/icon_interpolation=4
-application/file_version="1.0.3.0"
-application/product_version="1.0.3.0"
+application/file_version="1.0.4.0"
+application/product_version="1.0.4.0"
application/company_name="Orama Interactive"
application/product_name="Pixelorama"
application/file_description="Pixelorama - Your free & open-source sprite editor"
@@ -402,8 +402,8 @@ application/icon_interpolation=4
application/bundle_identifier="com.orama-interactive.pixelorama"
application/signature=""
application/app_category="Graphics-design"
-application/short_version="1.0.3"
-application/version="1.0.3"
+application/short_version="1.0.4"
+application/version="1.0.4"
application/copyright="Orama Interactive and contributors 2019-present"
application/copyright_localized={}
application/min_macos_version="10.12"
@@ -657,7 +657,7 @@ architectures/arm64-v8a=true
architectures/x86=false
architectures/x86_64=false
version/code=1
-version/name="1.0"
+version/name="1.0.4"
package/unique_name="com.orama_interactive.pixelorama"
package/name="Pixelorama"
package/signed=true
diff --git a/project.godot b/project.godot
index d004e6230..c64c136cd 100644
--- a/project.godot
+++ b/project.godot
@@ -12,7 +12,7 @@ config_version=5
config/name="Pixelorama"
config/description="Unleash your creativity with Pixelorama, a powerful and accessible open-source pixel art multitool. Whether you want to create sprites, tiles, animations, or just express yourself in the language of pixel art, this software will realize your pixel-perfect dreams with a vast toolbox of features."
-config/version="v1.0.3-stable"
+config/version="v1.0.4-dev"
run/main_scene="res://src/Main.tscn"
config/use_custom_user_dir=true
config/custom_user_dir_name="pixelorama"
From b5ded76654d064001b493ba8978c2b31689d1593 Mon Sep 17 00:00:00 2001
From: Variable <77773850+Variable-ind@users.noreply.github.com>
Date: Tue, 17 Sep 2024 23:38:21 +0500
Subject: [PATCH 069/162] Stretch mode and expand mode fixes (#1103)
* Set dynamics dialog to correct size after something is made visible or hidden
* fixed aspects of brush buttons
* Fixed wrong stretch mode
* improved rotation brush UI
* Update PaintSelect.tscn
* formatting
* fix all stretch modes
* fix export expand mode
* Fix more Stretch modes
* Fixed Resize canvas transparent checker
* removed an addition
The change: https://github.com/Orama-Interactive/Pixelorama/pull/1103/commits/625fe4cdd179294abc21410d8e13f12eae7b38aa
is moved over to a new pr
* moved some changes to another pr
* Moved some more changes to another pr
---
src/Tools/BaseDraw.tscn | 2 +-
src/Tools/DesignTools/Bucket.tscn | 2 +-
src/Tools/SelectionTools/PaintSelect.tscn | 2 +-
src/UI/Buttons/BrushButton.tscn | 2 +-
src/UI/Buttons/PatternButton.tscn | 40 +++++++++----------
src/UI/Dialogs/ExportDialog.gd | 1 +
.../ImageEffects/ImageEffectParent.tscn | 4 +-
src/UI/Dialogs/ImageEffects/ResizeCanvas.tscn | 7 +---
src/UI/Dialogs/ImageEffects/ShaderEffect.tscn | 2 +-
src/UI/Recorder/Recorder.tscn | 6 +--
10 files changed, 32 insertions(+), 36 deletions(-)
diff --git a/src/Tools/BaseDraw.tscn b/src/Tools/BaseDraw.tscn
index cb625adcb..69eedb916 100644
--- a/src/Tools/BaseDraw.tscn
+++ b/src/Tools/BaseDraw.tscn
@@ -98,7 +98,7 @@ layout_mode = 0
offset_right = 32.0
offset_bottom = 32.0
expand_mode = 1
-stretch_mode = 6
+stretch_mode = 5
[node name="BrushSize" parent="Brush" index="1" instance=ExtResource("1")]
layout_mode = 2
diff --git a/src/Tools/DesignTools/Bucket.tscn b/src/Tools/DesignTools/Bucket.tscn
index 17ed602d7..871cac243 100644
--- a/src/Tools/DesignTools/Bucket.tscn
+++ b/src/Tools/DesignTools/Bucket.tscn
@@ -100,7 +100,7 @@ layout_mode = 0
offset_right = 32.0
offset_bottom = 32.0
expand_mode = 1
-stretch_mode = 6
+stretch_mode = 5
[node name="OffsetX" parent="FillPattern" index="1" instance=ExtResource("1")]
layout_mode = 2
diff --git a/src/Tools/SelectionTools/PaintSelect.tscn b/src/Tools/SelectionTools/PaintSelect.tscn
index 0661e653e..6d23a8ea2 100644
--- a/src/Tools/SelectionTools/PaintSelect.tscn
+++ b/src/Tools/SelectionTools/PaintSelect.tscn
@@ -46,7 +46,7 @@ layout_mode = 0
offset_right = 32.0
offset_bottom = 32.0
expand_mode = 1
-stretch_mode = 6
+stretch_mode = 5
[node name="BrushSize" parent="Brush" index="1" instance=ExtResource("3")]
layout_mode = 2
diff --git a/src/UI/Buttons/BrushButton.tscn b/src/UI/Buttons/BrushButton.tscn
index 0b278e1be..5e9ea796a 100644
--- a/src/UI/Buttons/BrushButton.tscn
+++ b/src/UI/Buttons/BrushButton.tscn
@@ -21,7 +21,7 @@ offset_right = -2.0
offset_bottom = -2.0
pivot_offset = Vector2(16, 16)
expand_mode = 1
-stretch_mode = 6
+stretch_mode = 5
[node name="TransparentChecker" parent="BrushTexture" instance=ExtResource("1")]
show_behind_parent = true
diff --git a/src/UI/Buttons/PatternButton.tscn b/src/UI/Buttons/PatternButton.tscn
index 5b3550209..e63ca0cd8 100644
--- a/src/UI/Buttons/PatternButton.tscn
+++ b/src/UI/Buttons/PatternButton.tscn
@@ -1,19 +1,19 @@
-[gd_scene load_steps=4 format=2]
+[gd_scene load_steps=4 format=3 uid="uid://bx6xntkb2tstx"]
-[ext_resource path="res://src/UI/Buttons/PatternButton.gd" type="Script" id=2]
+[ext_resource type="Script" path="res://src/UI/Buttons/PatternButton.gd" id="2"]
-[sub_resource type="StyleBoxFlat" id=2]
-bg_color = Color( 1, 1, 1, 1 )
-border_color = Color( 1, 1, 1, 1 )
+[sub_resource type="StyleBoxFlat" id="1"]
+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 )
+[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
@@ -21,25 +21,23 @@ corner_radius_bottom_left = 5
anti_aliasing = false
[node name="PatternButton" type="Button"]
+custom_minimum_size = Vector2(32, 32)
offset_right = 32.0
offset_bottom = 32.0
-custom_minimum_size = Vector2( 32, 32 )
-theme_override_styles/hover = SubResource( 2 )
-theme_override_styles/pressed = SubResource( 2 )
-theme_override_styles/focus = SubResource( 1 )
-theme_override_styles/disabled = SubResource( 1 )
-theme_override_styles/normal = SubResource( 2 )
+theme_override_styles/focus = SubResource("1")
+theme_override_styles/disabled = SubResource("1")
+theme_override_styles/hover = SubResource("2")
+theme_override_styles/pressed = SubResource("2")
+theme_override_styles/normal = SubResource("2")
button_mask = 7
-script = ExtResource( 2 )
+script = ExtResource("2")
[node name="PatternTexture" type="TextureRect" parent="."]
+custom_minimum_size = Vector2(32, 32)
+layout_mode = 0
offset_right = 32.0
offset_bottom = 32.0
-custom_minimum_size = Vector2( 32, 32 )
-expand = true
-stretch_mode = 6
-__meta__ = {
-"_edit_use_anchors_": false
-}
+expand_mode = 1
+stretch_mode = 5
[connection signal="pressed" from="." to="." method="_on_PatternButton_pressed"]
diff --git a/src/UI/Dialogs/ExportDialog.gd b/src/UI/Dialogs/ExportDialog.gd
index ff09416ad..9db80b27d 100644
--- a/src/UI/Dialogs/ExportDialog.gd
+++ b/src/UI/Dialogs/ExportDialog.gd
@@ -163,6 +163,7 @@ func create_preview_container() -> VBoxContainer:
func create_preview_rect() -> TextureRect:
var preview := TextureRect.new()
+ preview.expand_mode = TextureRect.EXPAND_IGNORE_SIZE
preview.size_flags_horizontal = Control.SIZE_EXPAND_FILL
preview.size_flags_vertical = Control.SIZE_EXPAND_FILL
preview.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
diff --git a/src/UI/Dialogs/ImageEffects/ImageEffectParent.tscn b/src/UI/Dialogs/ImageEffects/ImageEffectParent.tscn
index 773962b90..b60399b0d 100644
--- a/src/UI/Dialogs/ImageEffects/ImageEffectParent.tscn
+++ b/src/UI/Dialogs/ImageEffects/ImageEffectParent.tscn
@@ -35,7 +35,7 @@ grow_horizontal = 2
grow_vertical = 2
texture = ExtResource("4")
expand_mode = 1
-stretch_mode = 6
+stretch_mode = 5
[node name="AspectRatioContainer" type="AspectRatioContainer" parent="VBoxContainer"]
layout_mode = 2
@@ -45,7 +45,7 @@ size_flags_vertical = 3
custom_minimum_size = Vector2(200, 200)
layout_mode = 2
expand_mode = 1
-stretch_mode = 5
+stretch_mode = 4
[node name="TransparentChecker" parent="VBoxContainer/AspectRatioContainer/Preview" instance=ExtResource("2")]
show_behind_parent = true
diff --git a/src/UI/Dialogs/ImageEffects/ResizeCanvas.tscn b/src/UI/Dialogs/ImageEffects/ResizeCanvas.tscn
index 234da3897..ab8db99e7 100644
--- a/src/UI/Dialogs/ImageEffects/ResizeCanvas.tscn
+++ b/src/UI/Dialogs/ImageEffects/ResizeCanvas.tscn
@@ -101,12 +101,9 @@ layout_mode = 2
expand_mode = 1
stretch_mode = 5
-[node name="TransparentChecker" parent="VBoxContainer/AspectRatioContainer/Preview" instance=ExtResource("1")]
+[node name="TransparentChecker" parent="VBoxContainer/AspectRatioContainer" instance=ExtResource("1")]
show_behind_parent = true
-layout_mode = 0
-anchors_preset = 0
-anchor_right = 1.0
-anchor_bottom = 1.0
+layout_mode = 2
[connection signal="about_to_popup" from="." to="." method="_on_ResizeCanvas_about_to_show"]
[connection signal="confirmed" from="." to="." method="_on_ResizeCanvas_confirmed"]
diff --git a/src/UI/Dialogs/ImageEffects/ShaderEffect.tscn b/src/UI/Dialogs/ImageEffects/ShaderEffect.tscn
index e33f98a41..037559f87 100644
--- a/src/UI/Dialogs/ImageEffects/ShaderEffect.tscn
+++ b/src/UI/Dialogs/ImageEffects/ShaderEffect.tscn
@@ -30,7 +30,7 @@ material = SubResource("1")
custom_minimum_size = Vector2(200, 200)
layout_mode = 2
expand_mode = 1
-stretch_mode = 5
+stretch_mode = 4
[node name="TransparentChecker" parent="VBoxContainer/AspectRatioContainer/Preview" instance=ExtResource("2")]
show_behind_parent = true
diff --git a/src/UI/Recorder/Recorder.tscn b/src/UI/Recorder/Recorder.tscn
index 717cc742f..050d8af9c 100644
--- a/src/UI/Recorder/Recorder.tscn
+++ b/src/UI/Recorder/Recorder.tscn
@@ -58,7 +58,7 @@ offset_right = 10.0
offset_bottom = 10.5
texture = ExtResource("1")
expand_mode = 1
-stretch_mode = 6
+stretch_mode = 5
[node name="Settings" type="Button" parent="ScrollContainer/CenterContainer/GridContainer" groups=["UIButtons"]]
unique_name_in_owner = true
@@ -79,7 +79,7 @@ offset_top = -10.5
offset_right = 10.0
offset_bottom = 10.5
texture = ExtResource("3")
-stretch_mode = 6
+stretch_mode = 5
[node name="OpenFolder" type="Button" parent="ScrollContainer/CenterContainer/GridContainer"]
custom_minimum_size = Vector2(32, 32)
@@ -97,7 +97,7 @@ offset_top = 3.0
offset_right = -3.0
offset_bottom = -3.0
texture = ExtResource("4")
-stretch_mode = 6
+stretch_mode = 5
[node name="OptionsDialog" type="AcceptDialog" parent="."]
position = Vector2i(0, 36)
From 51f68164337ca754501c84294f24d50e75166513 Mon Sep 17 00:00:00 2001
From: Variable <77773850+Variable-ind@users.noreply.github.com>
Date: Wed, 18 Sep 2024 03:09:37 +0500
Subject: [PATCH 070/162] Fixed a colorpicker bug (fixed inconsistent raw
values) (#1108)
* Fixed a colorpicker bug
* Some changes in the comments
We should probably avoid using "I" in comments, as it's not clear who is speaking, and `##` should only be used for documentation string and not normal comments.
---------
Co-authored-by: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
---
src/UI/ColorPickers/ColorPicker.gd | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/src/UI/ColorPickers/ColorPicker.gd b/src/UI/ColorPickers/ColorPicker.gd
index 8f837f8ee..9f6b46d19 100644
--- a/src/UI/ColorPickers/ColorPicker.gd
+++ b/src/UI/ColorPickers/ColorPicker.gd
@@ -98,6 +98,12 @@ func _notification(what: int) -> void:
func _on_color_picker_color_changed(color: Color) -> void:
+ # Due to the decimal nature of the color values, some values get rounded off
+ # unintentionally before entering this method.
+ # Even though the decimal values change, the HTML code remains the same after the change.
+ # So we're using this trick to convert the values back to how they are shown in
+ # the color picker's UI.
+ color = Color(color.to_html())
if Tools.picking_color_for == MOUSE_BUTTON_RIGHT:
right_color_rect.color = color
else:
From 9824aef893aa733dad42dbd62c553fcb973801e6 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 19 Sep 2024 00:38:46 +0300
Subject: [PATCH 071/162] Attempt to fix the preview of the move tool not
being aligned to the pixel grid
---
src/Classes/Layers/GroupLayer.gd | 2 +-
src/UI/Canvas/Canvas.gd | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/Classes/Layers/GroupLayer.gd b/src/Classes/Layers/GroupLayer.gd
index 49d2b7928..6ce3f3410 100644
--- a/src/Classes/Layers/GroupLayer.gd
+++ b/src/Classes/Layers/GroupLayer.gd
@@ -18,7 +18,7 @@ func blend_children(frame: Frame, origin := Vector2i.ZERO, apply_effects := true
if children.size() <= 0:
return image
var textures: Array[Image] = []
- var metadata_image := Image.create(children.size(), 4, false, Image.FORMAT_RG8)
+ var metadata_image := Image.create(children.size(), 4, false, Image.FORMAT_RGF)
var current_child_index := 0
for i in children.size():
var layer := children[i]
diff --git a/src/UI/Canvas/Canvas.gd b/src/UI/Canvas/Canvas.gd
index 79694f977..938cf3d40 100644
--- a/src/UI/Canvas/Canvas.gd
+++ b/src/UI/Canvas/Canvas.gd
@@ -158,7 +158,7 @@ func draw_layers(force_recreate := false) -> void:
# Nx4 texture, where N is the number of layers and the first row are the blend modes,
# the second are the opacities, the third are the origins and the fourth are the
# clipping mask booleans.
- layer_metadata_image = Image.create(project.layers.size(), 4, false, Image.FORMAT_RG8)
+ layer_metadata_image = Image.create(project.layers.size(), 4, false, Image.FORMAT_RGF)
# Draw current frame layers
for i in project.layers.size():
var layer := project.layers[i]
From 10e457bf26c600ce3b3e2d40b21839bc2804381e Mon Sep 17 00:00:00 2001
From: Variable <77773850+Variable-ind@users.noreply.github.com>
Date: Fri, 20 Sep 2024 20:45:06 +0500
Subject: [PATCH 072/162] =?UTF-8?q?=20Set=20dynamics=20dialog=20to=20corre?=
=?UTF-8?q?ct=20size=20after=20something=20is=20made=20visible=20=E2=80=A6?=
=?UTF-8?q?=20(#1104)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Set dynamics dialog to correct size after something is made visible or hidden
* use a separate function instead of lambdha
---
src/UI/GlobalToolOptions/DynamicsPanel.gd | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/src/UI/GlobalToolOptions/DynamicsPanel.gd b/src/UI/GlobalToolOptions/DynamicsPanel.gd
index e798298d2..c8738ae3a 100644
--- a/src/UI/GlobalToolOptions/DynamicsPanel.gd
+++ b/src/UI/GlobalToolOptions/DynamicsPanel.gd
@@ -29,6 +29,15 @@ func _ready() -> void:
size_velocity_button.toggled.connect(
_on_dynamics_toggled.bind(size_velocity_button, SIZE, Tools.Dynamics.VELOCITY)
)
+ for child: Control in $VBoxContainer.get_children():
+ ## Resets the y-size to an appropriate value
+ child.visibility_changed.connect(_recalculate_size)
+
+
+func _recalculate_size():
+ await get_tree().process_frame
+ set_size(Vector2i(size.x, 0))
+ set_size(Vector2i(size.x, size.y + 10))
func _input(event: InputEvent) -> void:
From dbe48a468167ccbd2201aa720510bfd59786917c Mon Sep 17 00:00:00 2001
From: OverloadedOrama
Date: Tue, 24 Sep 2024 11:59:18 +0300
Subject: [PATCH 073/162] Fix issue where sometimes the camera zoom was not
being preserved when switching between projects
---
src/UI/Canvas/Canvas.gd | 1 -
src/UI/Canvas/CanvasCamera.gd | 15 +++++----------
.../CanvasPreviewContainer.gd | 1 -
3 files changed, 5 insertions(+), 12 deletions(-)
diff --git a/src/UI/Canvas/Canvas.gd b/src/UI/Canvas/Canvas.gd
index 938cf3d40..2f35195e0 100644
--- a/src/UI/Canvas/Canvas.gd
+++ b/src/UI/Canvas/Canvas.gd
@@ -100,7 +100,6 @@ func _input(event: InputEvent) -> void:
func camera_zoom() -> void:
for camera in Global.cameras:
camera.fit_to_frame(Global.current_project.size)
- camera.save_values_to_project()
Global.transparent_checker.update_rect()
diff --git a/src/UI/Canvas/CanvasCamera.gd b/src/UI/Canvas/CanvasCamera.gd
index 89a4b8130..a7cf25800 100644
--- a/src/UI/Canvas/CanvasCamera.gd
+++ b/src/UI/Canvas/CanvasCamera.gd
@@ -14,18 +14,21 @@ const CAMERA_SPEED_RATE := 15.0
var zoom := Vector2.ONE:
set(value):
zoom = value
+ Global.current_project.cameras_zoom[index] = zoom
zoom_changed.emit()
_update_viewport_transform()
var camera_angle := 0.0:
set(value):
camera_angle = wrapf(value, -PI, PI)
camera_angle_degrees = rad_to_deg(camera_angle)
+ Global.current_project.cameras_rotation[index] = camera_angle
rotation_changed.emit()
_update_viewport_transform()
var camera_angle_degrees := 0.0
var offset := Vector2.ZERO:
set(value):
offset = value
+ Global.current_project.cameras_offset[index] = offset
offset_changed.emit()
_update_viewport_transform()
var camera_screen_center := Vector2.ZERO
@@ -89,9 +92,7 @@ func _input(event: InputEvent) -> void:
else:
var dir := Input.get_vector(&"camera_left", &"camera_right", &"camera_up", &"camera_down")
if dir != Vector2.ZERO and !_has_selection_tool():
- offset += (dir.rotated(camera_angle) / zoom) * CAMERA_SPEED_RATE
-
- save_values_to_project()
+ offset = offset + (dir.rotated(camera_angle) / zoom) * CAMERA_SPEED_RATE
func zoom_camera(dir: int) -> void:
@@ -181,12 +182,6 @@ func fit_to_frame(size: Vector2) -> void:
Global.integer_zoom = !Global.integer_zoom
-func save_values_to_project() -> void:
- Global.current_project.cameras_rotation[index] = camera_angle
- Global.current_project.cameras_zoom[index] = zoom
- Global.current_project.cameras_offset[index] = offset
-
-
func update_transparent_checker_offset() -> void:
var o := get_global_transform_with_canvas().get_origin()
var s := get_global_transform_with_canvas().get_scale()
@@ -256,9 +251,9 @@ func _has_selection_tool() -> bool:
func _project_switched() -> void:
+ offset = Global.current_project.cameras_offset[index]
camera_angle = Global.current_project.cameras_rotation[index]
zoom = Global.current_project.cameras_zoom[index]
- offset = Global.current_project.cameras_offset[index]
func _rotate_camera_around_point(degrees: float, point: Vector2) -> void:
diff --git a/src/UI/CanvasPreviewContainer/CanvasPreviewContainer.gd b/src/UI/CanvasPreviewContainer/CanvasPreviewContainer.gd
index cf8152770..83f718e79 100644
--- a/src/UI/CanvasPreviewContainer/CanvasPreviewContainer.gd
+++ b/src/UI/CanvasPreviewContainer/CanvasPreviewContainer.gd
@@ -18,7 +18,6 @@ func _zoom_changed() -> void:
func _on_PreviewZoomSlider_value_changed(value: float) -> void:
camera.zoom = Vector2(value, value)
- camera.save_values_to_project()
camera.update_transparent_checker_offset()
From 597db5d44e4ec0898f1725dd702f9309c3751db2 Mon Sep 17 00:00:00 2001
From: OverloadedOrama
Date: Sat, 28 Sep 2024 23:19:14 +0300
Subject: [PATCH 074/162] Fix projects being saved with the wrong name on the
Web version
---
src/Main.gd | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/src/Main.gd b/src/Main.gd
index 52baa12ad..982e197df 100644
--- a/src/Main.gd
+++ b/src/Main.gd
@@ -452,8 +452,7 @@ func save_project(path: String) -> void:
project_to_save = changed_projects_on_quit[0]
var include_blended := false
if OS.get_name() == "Web":
- var file_name: String = save_sprite_html5.get_node("%FileNameLineEdit").text
- file_name += ".pxo"
+ var file_name := project_to_save.name + ".pxo"
path = "user://".path_join(file_name)
include_blended = save_sprite_html5.get_node("%IncludeBlended").button_pressed
else:
From 564b199fa9b24a5cbf2575c7a3f82f767ceb0b1a Mon Sep 17 00:00:00 2001
From: Variable <77773850+Variable-ind@users.noreply.github.com>
Date: Sun, 29 Sep 2024 02:15:37 +0500
Subject: [PATCH 075/162] Add hotkeys to switch between tabs (#1109)
* Added hotkey to switch tab
* Linting
---
project.godot | 10 ++++++++++
src/Autoload/Global.gd | 2 ++
src/UI/Tabs.gd | 29 +++++++++++++++++++++++++++++
3 files changed, 41 insertions(+)
diff --git a/project.godot b/project.godot
index c64c136cd..35ca2ee8d 100644
--- a/project.godot
+++ b/project.godot
@@ -888,6 +888,16 @@ gaussian_blur={
"deadzone": 0.5,
"events": []
}
+next_project={
+"deadzone": 0.5,
+"events": [null, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}
+previous_project={
+"deadzone": 0.5,
+"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":true,"ctrl_pressed":true,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194306,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
+]
+}
[input_devices]
diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd
index 28fc249c8..4f0ce33d0 100644
--- a/src/Autoload/Global.gd
+++ b/src/Autoload/Global.gd
@@ -787,6 +787,8 @@ func _initialize_keychain() -> void:
&"open_editor_data_folder": Keychain.InputAction.new("", "Help menu", true),
&"changelog": Keychain.InputAction.new("", "Help menu", true),
&"about_pixelorama": Keychain.InputAction.new("", "Help menu", true),
+ &"previous_project": Keychain.InputAction.new("", "Canvas"),
+ &"next_project": Keychain.InputAction.new("", "Canvas"),
&"zoom_in": Keychain.InputAction.new("", "Canvas"),
&"zoom_out": Keychain.InputAction.new("", "Canvas"),
&"camera_left": Keychain.InputAction.new("", "Canvas"),
diff --git a/src/UI/Tabs.gd b/src/UI/Tabs.gd
index a5260d6c3..3b8ab3f4e 100644
--- a/src/UI/Tabs.gd
+++ b/src/UI/Tabs.gd
@@ -4,6 +4,35 @@ extends TabBar
var unsaved_changes_dialog: ConfirmationDialog = Global.control.find_child("UnsavedCanvasDialog")
+func _input(_event: InputEvent) -> void:
+ # NOTE: This feature has an unavoidable bug which sometimes causes the undoredo
+ # system to fail, because user is trying to draw while switching project simultaneously.
+ # This is because the current project has changed and the system tries to commit to the
+ # wrong undoredo.
+ var tab_idx = current_tab
+ # If a project is currently worked upon, then don't switch it.
+ # This doesn't stop the bug completely but significantly reduces it's chances
+ # of appearing.
+ if (
+ Input.is_action_pressed("activate_left_tool")
+ or Input.is_action_pressed("activate_right_tool")
+ ):
+ return
+ # Due to the bug mentioned above, we will use is_action_just_released
+ # instead of is_action_just_pressed. This won't remove the bug completely
+ # but will significantly reduce it's chancce of appearing.
+ if Input.is_action_just_released(&"next_project", true):
+ tab_idx += 1
+ if tab_idx >= tab_count:
+ tab_idx = 0
+ elif Input.is_action_just_released(&"previous_project", true):
+ tab_idx = current_tab - 1
+ if tab_idx < 0:
+ tab_idx -= 1
+ if tab_idx != current_tab:
+ current_tab = tab_idx
+
+
## Handles closing tab with middle-click
## Thanks to https://github.com/godotengine/godot/issues/64498#issuecomment-1217992089
func _gui_input(event: InputEvent) -> void:
From b350f436c61bc381d0328f362d06567bc4e20632 Mon Sep 17 00:00:00 2001
From: Variable <77773850+Variable-ind@users.noreply.github.com>
Date: Tue, 1 Oct 2024 22:18:58 +0500
Subject: [PATCH 076/162] Allow clipping to selection during export (#1113)
* Allow clipping to selection during export
* linting
* removed shader
---
src/Autoload/Export.gd | 8 ++++++++
src/UI/Dialogs/ExportDialog.gd | 6 ++++++
src/UI/Dialogs/ExportDialog.tscn | 7 +++++++
3 files changed, 21 insertions(+)
diff --git a/src/Autoload/Export.gd b/src/Autoload/Export.gd
index f20c95ab2..ecd1105af 100644
--- a/src/Autoload/Export.gd
+++ b/src/Autoload/Export.gd
@@ -52,6 +52,7 @@ var blended_frames := {}
var export_json := false
var split_layers := false
var trim_images := false
+var erase_unselected_area := false
# Spritesheet options
var orientation := Orientation.COLUMNS
@@ -288,6 +289,13 @@ func process_animation(project := Global.current_project) -> void:
else:
var image := Image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8)
image.copy_from(blended_frames[frame])
+ if erase_unselected_area and project.has_selection:
+ var crop := Image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8)
+ var selection_image = project.selection_map.return_cropped_copy(project.size)
+ crop.blit_rect_mask(
+ image, selection_image, Rect2i(Vector2i.ZERO, image.get_size()), Vector2i.ZERO
+ )
+ image.copy_from(crop)
if trim_images:
image = image.get_region(image.get_used_rect())
var duration := frame.duration * (1.0 / project.fps)
diff --git a/src/UI/Dialogs/ExportDialog.gd b/src/UI/Dialogs/ExportDialog.gd
index 9db80b27d..7f952fee7 100644
--- a/src/UI/Dialogs/ExportDialog.gd
+++ b/src/UI/Dialogs/ExportDialog.gd
@@ -464,6 +464,12 @@ func _on_trim_images_toggled(toggled_on: bool) -> void:
set_preview()
+func _on_clip_images_selection_toggled(toggled_on: bool) -> void:
+ Export.erase_unselected_area = toggled_on
+ Export.process_data()
+ set_preview()
+
+
func _on_frames_item_selected(id: int) -> void:
Export.frame_current_tag = id
Export.process_data()
diff --git a/src/UI/Dialogs/ExportDialog.tscn b/src/UI/Dialogs/ExportDialog.tscn
index e98b6de23..2e2457cf3 100644
--- a/src/UI/Dialogs/ExportDialog.tscn
+++ b/src/UI/Dialogs/ExportDialog.tscn
@@ -324,6 +324,12 @@ tooltip_text = "Trims the exported images to their visible portion, considering
mouse_default_cursor_shape = 2
text = "Trim images"
+[node name="ClipSelection" type="CheckBox" parent="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer" groups=["ExportImageOptions"]]
+layout_mode = 2
+tooltip_text = "Only shows content that is within the bounds of a selected area."
+mouse_default_cursor_shape = 2
+text = "Clip image content to selection"
+
[node name="PathDialog" type="FileDialog" parent="." groups=["FileDialogs"]]
mode = 2
title = "Open a Directory"
@@ -379,6 +385,7 @@ size_flags_horizontal = 3
[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/IncludeTagsInFilename" to="." method="_on_include_tags_in_filename_toggled"]
[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/MultipleAnimationsDirectories" to="." method="_on_multiple_animations_directories_toggled"]
[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/TrimImages" to="." method="_on_trim_images_toggled"]
+[connection signal="toggled" from="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer/ClipSelection" to="." method="_on_clip_images_selection_toggled"]
[connection signal="canceled" from="PathDialog" to="." method="_on_path_dialog_canceled"]
[connection signal="dir_selected" from="PathDialog" to="." method="_on_path_dialog_dir_selected"]
[connection signal="confirmed" from="FileExistsAlert" to="." method="_on_file_exists_alert_confirmed"]
From 3f50888a6ff937b91afb42ef3bb454635776cde4 Mon Sep 17 00:00:00 2001
From: OverloadedOrama
Date: Fri, 4 Oct 2024 12:54:20 +0300
Subject: [PATCH 077/162] [skip ci] Update CHANGELOG.md
---
CHANGELOG.md | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f088a1f15..73d489e37 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,24 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). All the dates are in YYYY-MM-DD format.
+## [v1.0.4] - Unreleased
+This update has been brought to you by the contributions of:
+Fayez Akhtar ([@Variable-ind](https://github.com/Variable-ind))
+
+Built using Godot 4.3
+
+### Added
+- Clipping to selecting during export is now possible. [#1113](https://github.com/Orama-Interactive/Pixelorama/pull/1113)
+- Added hotkeys to switch between tabs. [#1109](https://github.com/Orama-Interactive/Pixelorama/pull/1109)
+
+### Fixed
+- The move tool preview is now properly aligned to the pixel grid.
+- Camera zoom is now being preserved when switching between projects.
+- Projects are no longer being saved with the wrong name in the Web version.
+- The dynamics dialog is now set to its correct size when something is made visible or invisible. [#1104](https://github.com/Orama-Interactive/Pixelorama/pull/1104)
+- The color picker values no longer change when using RAW mode. [#1108](https://github.com/Orama-Interactive/Pixelorama/pull/1108)
+- Fixed some icon strect and expand modes in the UI. [#1103](https://github.com/Orama-Interactive/Pixelorama/pull/1103)
+
## [v1.0.3] - 2024-09-13
This update has been brought to you by the contributions of:
Fayez Akhtar ([@Variable-ind](https://github.com/Variable-ind)), [alikin12](https://github.com/alikin12), Vaibhav Kubre ([@kubre](https://github.com/kubre)), Donte ([@donte5405](https://github.com/donte5405))
From 434f87e463827431d131e93140eb760630ec993f Mon Sep 17 00:00:00 2001
From: OverloadedOrama
Date: Tue, 8 Oct 2024 01:07:13 +0300
Subject: [PATCH 078/162] [skip ci] Fix a typo in CHANGELOG.md
---
CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 73d489e37..05fe9a413 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -20,7 +20,7 @@ Built using Godot 4.3
- Projects are no longer being saved with the wrong name in the Web version.
- The dynamics dialog is now set to its correct size when something is made visible or invisible. [#1104](https://github.com/Orama-Interactive/Pixelorama/pull/1104)
- The color picker values no longer change when using RAW mode. [#1108](https://github.com/Orama-Interactive/Pixelorama/pull/1108)
-- Fixed some icon strect and expand modes in the UI. [#1103](https://github.com/Orama-Interactive/Pixelorama/pull/1103)
+- Fixed some icon stretch and expand modes in the UI. [#1103](https://github.com/Orama-Interactive/Pixelorama/pull/1103)
## [v1.0.3] - 2024-09-13
This update has been brought to you by the contributions of:
From 0551b23a195490fd0f09de9fb88039a46165e98e Mon Sep 17 00:00:00 2001
From: Variable <77773850+Variable-ind@users.noreply.github.com>
Date: Wed, 9 Oct 2024 13:29:46 +0500
Subject: [PATCH 079/162] ColorReplace Shading Mode (#1107)
* ColorReplace Sdading Mode
* Fixed changing colors array by mistake
* the tool now takes more things into account
* Make it work with transparent colors (more consistent with aseprite), and improve ui a bit. This should be the last commit to this pr
---
src/Tools/DesignTools/Shading.gd | 85 ++++++++++++++++++++++++++++--
src/Tools/DesignTools/Shading.tscn | 49 +++++++++++++++--
2 files changed, 127 insertions(+), 7 deletions(-)
diff --git a/src/Tools/DesignTools/Shading.gd b/src/Tools/DesignTools/Shading.gd
index 1a964430b..4dda20c0e 100644
--- a/src/Tools/DesignTools/Shading.gd
+++ b/src/Tools/DesignTools/Shading.gd
@@ -1,6 +1,6 @@
extends "res://src/Tools/BaseDraw.gd"
-enum ShadingMode { SIMPLE, HUE_SHIFTING }
+enum ShadingMode { SIMPLE, HUE_SHIFTING, COLOR_REPLACE }
enum LightenDarken { LIGHTEN, DARKEN }
var _prev_mode := 0
@@ -12,6 +12,8 @@ var _amount := 10
var _hue_amount := 10
var _sat_amount := 10
var _value_amount := 10
+var _colors_right := 10
+var _old_palette: Palette
class LightenDarkenOp:
@@ -28,17 +30,18 @@ class LightenDarkenOp:
var sat_lighten_limit := 10.0 / 100.0
var value_darken_limit := 10.0 / 100.0
+ var color_array := PackedStringArray()
func process(_src: Color, dst: Color) -> Color:
changed = true
- if dst.a == 0:
+ if dst.a == 0 and shading_mode != ShadingMode.COLOR_REPLACE:
return dst
if shading_mode == ShadingMode.SIMPLE:
if lighten_or_darken == LightenDarken.LIGHTEN:
dst = dst.lightened(strength)
else:
dst = dst.darkened(strength)
- else:
+ elif shading_mode == ShadingMode.HUE_SHIFTING:
var hue_shift := hue_amount / 360.0
var sat_shift := sat_amount / 100.0
var value_shift := value_amount / 100.0
@@ -61,6 +64,18 @@ class LightenDarkenOp:
dst.s += sat_shift
if dst.v > value_darken_limit:
dst.v = maxf(dst.v - minf(value_shift, dst.v), value_darken_limit)
+ else:
+ if not color_array.is_empty():
+ var index = color_array.find(dst.to_html())
+ if index != -1:
+ if lighten_or_darken == LightenDarken.LIGHTEN:
+ ## Moving to Right
+ if index < color_array.size() - 1:
+ dst = Color(color_array[index + 1])
+ else:
+ ## Moving to Left
+ if index > 0:
+ dst = Color(color_array[index - 1])
return dst
@@ -106,6 +121,8 @@ class LightenDarkenOp:
func _init() -> void:
_drawer.color_op = LightenDarkenOp.new()
+ Tools.color_changed.connect(_refresh_colors_array)
+ Palettes.palette_selected.connect(palette_changed)
func _input(event: InputEvent) -> void:
@@ -161,6 +178,12 @@ func _on_LightenDarken_value_value_changed(value: float) -> void:
save_config()
+func _on_LightenDarken_colors_right_changed(value: float) -> void:
+ _colors_right = int(value)
+ update_config()
+ save_config()
+
+
func get_config() -> Dictionary:
var config := super.get_config()
config["shading_mode"] = _shading_mode
@@ -169,6 +192,7 @@ func get_config() -> Dictionary:
config["hue_amount"] = _hue_amount
config["sat_amount"] = _sat_amount
config["value_amount"] = _value_amount
+ config["colors_right"] = _colors_right
return config
@@ -182,6 +206,7 @@ func set_config(config: Dictionary) -> void:
_hue_amount = config.get("hue_amount", _hue_amount)
_sat_amount = config.get("sat_amount", _sat_amount)
_value_amount = config.get("value_amount", _value_amount)
+ _colors_right = config.get("colors_right", _colors_right)
func update_config() -> void:
@@ -192,8 +217,11 @@ func update_config() -> void:
$HueShiftingOptions/HueSlider.value = _hue_amount
$HueShiftingOptions/SatSlider.value = _sat_amount
$HueShiftingOptions/ValueSlider.value = _value_amount
+ $ColorReplaceOptions/Settings/ColorsRight.value = _colors_right
$AmountSlider.visible = _shading_mode == ShadingMode.SIMPLE
$HueShiftingOptions.visible = _shading_mode == ShadingMode.HUE_SHIFTING
+ $ColorReplaceOptions.visible = _shading_mode == ShadingMode.COLOR_REPLACE
+ _refresh_colors_array()
update_strength()
@@ -293,3 +321,54 @@ func _draw_brush_image(image: Image, src_rect: Rect2i, dst: Vector2i) -> void:
func update_brush() -> void:
super.update_brush()
$ColorInterpolation.visible = false
+
+
+## this function is also used by a signal, this is why there is _color = Color.TRANSPARENT in here.
+func _refresh_colors_array(_color = Color.TRANSPARENT, mouse_button := tool_slot.button) -> void:
+ if mouse_button != tool_slot.button:
+ return
+ if _shading_mode == ShadingMode.COLOR_REPLACE:
+ await get_tree().process_frame
+ var index = Palettes.current_palette_get_selected_color_index(mouse_button)
+ if index > -1:
+ $ColorReplaceOptions/Settings.visible = true
+ $ColorReplaceOptions/Label.visible = false
+ var color_array := PackedStringArray()
+ for i in _colors_right + 1:
+ var next_color = Palettes.current_palette.get_color(index + i)
+ if next_color != null:
+ color_array.append(next_color.to_html())
+ _drawer.color_op.color_array = color_array
+ construct_preview()
+ else:
+ $ColorReplaceOptions/Settings.visible = false
+ $ColorReplaceOptions/Label.visible = true
+ _drawer.color_op.color_array.clear()
+
+
+func construct_preview() -> void:
+ var colors_container: HFlowContainer = $ColorReplaceOptions/Settings/Colors
+ for i in colors_container.get_child_count():
+ if i >= _drawer.color_op.color_array.size():
+ colors_container.get_child(i).queue_free()
+ for i in _drawer.color_op.color_array.size():
+ var color = _drawer.color_op.color_array[i]
+ if i < colors_container.get_child_count():
+ colors_container.get_child(i).color = color
+ else:
+ var color_rect := ColorRect.new()
+ color_rect.color = color
+ color_rect.custom_minimum_size = Vector2(20, 20)
+ var checker = preload("res://src/UI/Nodes/TransparentChecker.tscn").instantiate()
+ checker.show_behind_parent = true
+ checker.set_anchors_preset(Control.PRESET_FULL_RECT)
+ color_rect.add_child(checker)
+ colors_container.add_child(color_rect)
+
+
+func palette_changed(_palette_name):
+ if _old_palette:
+ _old_palette.data_changed.disconnect(_refresh_colors_array)
+ Palettes.current_palette.data_changed.connect(_refresh_colors_array)
+ _old_palette = Palettes.current_palette
+ _refresh_colors_array()
diff --git a/src/Tools/DesignTools/Shading.tscn b/src/Tools/DesignTools/Shading.tscn
index 21fd4c309..b78e383a1 100644
--- a/src/Tools/DesignTools/Shading.tscn
+++ b/src/Tools/DesignTools/Shading.tscn
@@ -24,22 +24,22 @@ button_group = SubResource("ButtonGroup_se02m")
custom_minimum_size = Vector2(92, 0)
layout_mode = 2
mouse_default_cursor_shape = 2
-item_count = 2
selected = 0
+item_count = 2
popup/item_0/text = "Lighten"
-popup/item_0/id = 0
popup/item_1/text = "Darken"
popup/item_1/id = 1
[node name="ShadingMode" type="OptionButton" parent="." index="6"]
layout_mode = 2
mouse_default_cursor_shape = 2
-item_count = 2
selected = 0
+item_count = 3
popup/item_0/text = "Simple Shading"
-popup/item_0/id = 0
popup/item_1/text = "Hue Shifting"
popup/item_1/id = 1
+popup/item_2/text = "Color Replace"
+popup/item_2/id = 2
[node name="AmountSlider" parent="." index="7" instance=ExtResource("3")]
layout_mode = 2
@@ -71,9 +71,50 @@ min_value = -100.0
value = 10.0
prefix = "Value:"
+[node name="ColorReplaceOptions" type="VBoxContainer" parent="." index="9"]
+visible = false
+layout_mode = 2
+
+[node name="Settings" type="VBoxContainer" parent="ColorReplaceOptions" index="0"]
+visible = false
+layout_mode = 2
+
+[node name="ColorsRight" parent="ColorReplaceOptions/Settings" index="0" instance=ExtResource("3")]
+layout_mode = 2
+max_value = 10.0
+allow_greater = true
+prefix = "Colors Right"
+
+[node name="HBoxContainer" type="HBoxContainer" parent="ColorReplaceOptions/Settings" index="1"]
+layout_mode = 2
+
+[node name="DarkenLabel" type="Label" parent="ColorReplaceOptions/Settings/HBoxContainer" index="0"]
+layout_mode = 2
+text = "Darken"
+
+[node name="HSeparator" type="HSeparator" parent="ColorReplaceOptions/Settings/HBoxContainer" index="1"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="LightenLabel" type="Label" parent="ColorReplaceOptions/Settings/HBoxContainer" index="2"]
+layout_mode = 2
+text = "Lighten"
+horizontal_alignment = 2
+
+[node name="Colors" type="HFlowContainer" parent="ColorReplaceOptions/Settings" index="2"]
+layout_mode = 2
+
+[node name="Label" type="Label" parent="ColorReplaceOptions" index="1"]
+custom_minimum_size = Vector2(0, 75)
+layout_mode = 2
+text = "Please Select a color from the palette."
+horizontal_alignment = 1
+autowrap_mode = 3
+
[connection signal="item_selected" from="LightenDarken" to="." method="_on_LightenDarken_item_selected"]
[connection signal="item_selected" from="ShadingMode" to="." method="_on_ShadingMode_item_selected"]
[connection signal="value_changed" from="AmountSlider" to="." method="_on_LightenDarken_value_changed"]
[connection signal="value_changed" from="HueShiftingOptions/HueSlider" to="." method="_on_LightenDarken_hue_value_changed"]
[connection signal="value_changed" from="HueShiftingOptions/SatSlider" to="." method="_on_LightenDarken_sat_value_changed"]
[connection signal="value_changed" from="HueShiftingOptions/ValueSlider" to="." method="_on_LightenDarken_value_value_changed"]
+[connection signal="value_changed" from="ColorReplaceOptions/Settings/ColorsRight" to="." method="_on_LightenDarken_colors_right_changed"]
From 2f24508dea12c52d6f38088599a2033e13d3f2d1 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Wed, 9 Oct 2024 21:20:17 +0300
Subject: [PATCH 080/162] Add a new Reset category in the Preferences
---
Translations/Translations.pot | 16 ++++++
src/Autoload/Tools.gd | 17 +++++-
src/Preferences/PreferencesDialog.gd | 45 +++++++++++++++-
src/Preferences/PreferencesDialog.tscn | 52 +++++++++++++++++++
src/UI/ColorPickers/ColorPicker.gd | 7 +++
src/UI/GlobalToolOptions/GlobalToolOptions.gd | 9 ++++
src/UI/Timeline/AnimationTimeline.gd | 25 +++++++--
7 files changed, 163 insertions(+), 8 deletions(-)
diff --git a/Translations/Translations.pot b/Translations/Translations.pot
index 9dd0492ae..4bde2c449 100644
--- a/Translations/Translations.pot
+++ b/Translations/Translations.pot
@@ -2482,6 +2482,22 @@ msgstr ""
msgid "A default background color of a new image"
msgstr ""
+#. Found in the preferences, under the Reset category.
+msgid "Reset all options available in the Preferences"
+msgstr ""
+
+#. Found in the preferences, under the Reset category.
+msgid "Reset timeline options"
+msgstr ""
+
+#. Found in the preferences, under the Reset category.
+msgid "Reset all tool options"
+msgstr ""
+
+#. Found in the preferences, under the Reset category.
+msgid "Remove all extensions"
+msgstr ""
+
msgid "Lock aspect ratio"
msgstr ""
diff --git a/src/Autoload/Tools.gd b/src/Autoload/Tools.gd
index b40f6a14d..3615c2cad 100644
--- a/src/Autoload/Tools.gd
+++ b/src/Autoload/Tools.gd
@@ -1,7 +1,9 @@
+# gdlint: ignore=max-public-methods
extends Node
signal color_changed(color: Color, button: int)
signal flip_rotated(flip_x, flip_y, rotate_90, rotate_180, rotate_270)
+signal options_reset
enum Dynamics { NONE, PRESSURE, VELOCITY }
@@ -315,6 +317,7 @@ class Slot:
func _ready() -> void:
+ options_reset.connect(reset_options)
Global.cel_switched.connect(_cel_switched)
_tool_buttons = Global.control.find_child("ToolButtons")
for t in tools:
@@ -370,6 +373,12 @@ func _ready() -> void:
_show_relevant_tools(layer_type)
+func reset_options() -> void:
+ default_color()
+ assign_tool(get_tool(MOUSE_BUTTON_LEFT).tool_node.name, MOUSE_BUTTON_LEFT, true)
+ assign_tool(get_tool(MOUSE_BUTTON_RIGHT).tool_node.name, MOUSE_BUTTON_RIGHT, true)
+
+
func add_tool_button(t: Tool, insert_pos := -1) -> void:
var tool_button: BaseButton = _tool_button_scene.instantiate()
tool_button.name = t.name
@@ -414,12 +423,16 @@ func set_tool(tool_name: String, button: int) -> void:
_right_tools_per_layer_type[_curr_layer_type] = tool_name
-func assign_tool(tool_name: String, button: int) -> void:
+func get_tool(button: int) -> Slot:
+ return _slots[button]
+
+
+func assign_tool(tool_name: String, button: int, allow_refresh := false) -> void:
var slot: Slot = _slots[button]
var panel: Node = _panels[button]
if slot.tool_node != null:
- if slot.tool_node.name == tool_name:
+ if slot.tool_node.name == tool_name and not allow_refresh:
return
panel.remove_child(slot.tool_node)
slot.tool_node.queue_free()
diff --git a/src/Preferences/PreferencesDialog.gd b/src/Preferences/PreferencesDialog.gd
index c2490a64f..971aa0094 100644
--- a/src/Preferences/PreferencesDialog.gd
+++ b/src/Preferences/PreferencesDialog.gd
@@ -198,6 +198,7 @@ var selected_item := 0
@onready var list: ItemList = $HSplitContainer/List
@onready var right_side: VBoxContainer = $"%RightSide"
@onready var language: VBoxContainer = %Language
+@onready var system_language := language.get_node(^"System Language") as CheckBox
@onready var autosave_container: Container = right_side.get_node("Backup/AutosaveContainer")
@onready var autosave_interval: SpinBox = autosave_container.get_node("AutosaveInterval")
@onready var themes: BoxContainer = right_side.get_node("Interface/Themes")
@@ -271,7 +272,6 @@ func _ready() -> void:
content_list.append(child.name)
# Create buttons for each language
- var system_language := language.get_node(^"System Language") as Button
var button_group: ButtonGroup = system_language.button_group
for locale in Global.loaded_locales: # Create radiobuttons for each language
var button := CheckBox.new()
@@ -424,3 +424,46 @@ func _on_language_pressed(index: int) -> void:
Tools.update_hint_tooltips()
list.clear()
add_tabs(true)
+
+
+func _on_reset_button_pressed() -> void:
+ $ResetOptionsConfirmation.popup_centered()
+
+
+func _on_reset_options_confirmation_confirmed() -> void:
+ # Clear preferences
+ if %ResetPreferences.button_pressed:
+ system_language.button_pressed = true
+ _on_language_pressed(0)
+ themes.buttons_container.get_child(0).button_pressed = true
+ Themes.change_theme(0)
+ for pref in preferences:
+ var property_name := pref.prop_name
+ var default_value = pref.default_value
+ var node := right_side.get_node(pref.node_path)
+ if is_instance_valid(node):
+ node.set(pref.value_type, default_value)
+ Global.set(property_name, default_value)
+ _on_shrink_apply_button_pressed()
+ _on_font_size_apply_button_pressed()
+ Global.config_cache.erase_section("preferences")
+ # Clear timeline options
+ if %ResetTimelineOptions.button_pressed:
+ Global.animation_timeline.reset_settings()
+ Global.config_cache.erase_section("timeline")
+ # Clear tool options
+ if %ResetAllToolOptions.button_pressed:
+ Global.config_cache.erase_section("color_picker")
+ Global.config_cache.erase_section("tools")
+ Global.config_cache.erase_section("left_tool")
+ Global.config_cache.erase_section("right_tool")
+ Tools.options_reset.emit()
+ # Remove all extensions
+ if %RemoveAllExtensions.button_pressed:
+ var extensions_node := Global.control.get_node("Extensions") as Extensions
+ var extensions_list := extensions_node.extensions.duplicate()
+ for extension in extensions_list:
+ extensions_node.uninstall_extension(extension)
+ Global.config_cache.erase_section("extensions")
+
+ Global.config_cache.save(Global.CONFIG_PATH)
diff --git a/src/Preferences/PreferencesDialog.tscn b/src/Preferences/PreferencesDialog.tscn
index 8bf8cba7e..dbaf691f9 100644
--- a/src/Preferences/PreferencesDialog.tscn
+++ b/src/Preferences/PreferencesDialog.tscn
@@ -1344,6 +1344,53 @@ tooltip_text = "A default background color of a new image"
mouse_default_cursor_shape = 2
color = Color(0, 0, 0, 0)
+[node name="Reset" type="VBoxContainer" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide"]
+visible = false
+layout_mode = 2
+
+[node name="ResetHeader" type="HBoxContainer" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Reset"]
+layout_mode = 2
+theme_override_constants/separation = 0
+
+[node name="Label" type="Label" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Reset/ResetHeader"]
+layout_mode = 2
+theme_type_variation = &"HeaderSmall"
+text = "Reset"
+
+[node name="HSeparator" type="HSeparator" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Reset/ResetHeader"]
+layout_mode = 2
+size_flags_horizontal = 3
+
+[node name="ResetPreferences" type="CheckBox" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Reset"]
+unique_name_in_owner = true
+layout_mode = 2
+mouse_default_cursor_shape = 2
+button_pressed = true
+text = "Reset all options available in the Preferences"
+
+[node name="ResetTimelineOptions" type="CheckBox" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Reset"]
+unique_name_in_owner = true
+layout_mode = 2
+mouse_default_cursor_shape = 2
+text = "Reset timeline options"
+
+[node name="ResetAllToolOptions" type="CheckBox" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Reset"]
+unique_name_in_owner = true
+layout_mode = 2
+mouse_default_cursor_shape = 2
+text = "Reset all tool options"
+
+[node name="RemoveAllExtensions" type="CheckBox" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Reset"]
+unique_name_in_owner = true
+layout_mode = 2
+mouse_default_cursor_shape = 2
+text = "Remove all extensions"
+
+[node name="ResetButton" type="Button" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Reset"]
+layout_mode = 2
+mouse_default_cursor_shape = 2
+text = "Reset"
+
[node name="MustRestart" type="HBoxContainer" parent="HSplitContainer/VBoxContainer"]
unique_name_in_owner = true
visible = false
@@ -1379,6 +1426,9 @@ ok_button_text = "Delete Permanently"
dialog_text = "Are you sure you want to delete this extension?"
dialog_autowrap = true
+[node name="ResetOptionsConfirmation" type="ConfirmationDialog" parent="."]
+dialog_text = "Are you sure you want to reset the selected options? There will be no way to undo this."
+
[connection signal="about_to_popup" from="." to="." method="_on_PreferencesDialog_about_to_show"]
[connection signal="visibility_changed" from="." to="." method="_on_PreferencesDialog_visibility_changed"]
[connection signal="item_selected" from="HSplitContainer/List" to="." method="_on_List_item_selected"]
@@ -1392,6 +1442,8 @@ dialog_autowrap = true
[connection signal="pressed" from="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Extensions/HBoxContainer/EnableButton" to="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Extensions" method="_on_EnableButton_pressed"]
[connection signal="pressed" from="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Extensions/HBoxContainer/UninstallButton" to="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Extensions" method="_on_UninstallButton_pressed"]
[connection signal="pressed" from="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Extensions/HBoxContainer/OpenFolderButton" to="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Extensions" method="_on_OpenFolderButton_pressed"]
+[connection signal="pressed" from="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Reset/ResetButton" to="." method="_on_reset_button_pressed"]
[connection signal="files_selected" from="AddExtensionFileDialog" to="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Extensions" method="_on_AddExtensionFileDialog_files_selected"]
[connection signal="confirmed" from="DeleteExtensionConfirmation" to="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Extensions" method="_on_delete_confirmation_confirmed"]
[connection signal="custom_action" from="DeleteExtensionConfirmation" to="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Extensions" method="_on_delete_confirmation_custom_action"]
+[connection signal="confirmed" from="ResetOptionsConfirmation" to="." method="_on_reset_options_confirmation_confirmed"]
diff --git a/src/UI/ColorPickers/ColorPicker.gd b/src/UI/ColorPickers/ColorPicker.gd
index 9f6b46d19..0a9599763 100644
--- a/src/UI/ColorPickers/ColorPicker.gd
+++ b/src/UI/ColorPickers/ColorPicker.gd
@@ -21,6 +21,7 @@ var color_sliders_vbox: VBoxContainer
func _ready() -> void:
+ Tools.options_reset.connect(reset_options)
Tools.color_changed.connect(update_color)
_average(left_color_rect.color, right_color_rect.color)
color_picker.color_mode = Global.config_cache.get_value(
@@ -121,6 +122,12 @@ func _on_left_color_button_toggled(toggled_on: bool) -> void:
_average(left_color_rect.color, right_color_rect.color)
+func reset_options() -> void:
+ color_picker.color_mode = ColorPicker.MODE_RGB
+ color_picker.picker_shape = ColorPicker.SHAPE_HSV_RECTANGLE
+ expand_button.button_pressed = false
+
+
func update_color(color: Color, button: int) -> void:
if Tools.picking_color_for == button:
color_picker.color = color
diff --git a/src/UI/GlobalToolOptions/GlobalToolOptions.gd b/src/UI/GlobalToolOptions/GlobalToolOptions.gd
index 5f179a39f..e23d1abda 100644
--- a/src/UI/GlobalToolOptions/GlobalToolOptions.gd
+++ b/src/UI/GlobalToolOptions/GlobalToolOptions.gd
@@ -10,11 +10,20 @@ extends PanelContainer
func _ready() -> void:
+ Tools.options_reset.connect(reset_options)
# Resize tools panel when window gets resized
get_tree().get_root().size_changed.connect(_on_resized)
horizontal_mirror.button_pressed = Tools.horizontal_mirror
vertical_mirror.button_pressed = Tools.vertical_mirror
pixel_perfect.button_pressed = Tools.pixel_perfect
+ alpha_lock.button_pressed = Tools.alpha_locked
+
+
+func reset_options() -> void:
+ horizontal_mirror.button_pressed = false
+ vertical_mirror.button_pressed = false
+ pixel_perfect.button_pressed = false
+ alpha_lock.button_pressed = false
func _on_resized() -> void:
diff --git a/src/UI/Timeline/AnimationTimeline.gd b/src/UI/Timeline/AnimationTimeline.gd
index 162b79c30..e16cc793c 100644
--- a/src/UI/Timeline/AnimationTimeline.gd
+++ b/src/UI/Timeline/AnimationTimeline.gd
@@ -7,7 +7,7 @@ const FRAME_BUTTON_TSCN := preload("res://src/UI/Timeline/FrameButton.tscn")
const LAYER_FX_SCENE_PATH := "res://src/UI/Timeline/LayerEffects/LayerEffectsSettings.tscn"
var is_animation_running := false
-var animation_loop := 1 ## 0 is no loop, 1 is cycle loop, 2 is ping-pong loop
+var animation_loop := 1 ## 0 is no loop, 1 is cycle loop, 2 is ping-pong loop.
var animation_forward := true
var first_frame := 0
var last_frame := 0
@@ -28,7 +28,7 @@ var global_layer_visibility := true
var global_layer_lock := false
var global_layer_expand := true
-@onready var old_scroll := 0 ## The previous scroll state of $ScrollContainer
+@onready var old_scroll := 0 ## The previous scroll state of $ScrollContainer.
@onready var tag_spacer := %TagSpacer as Control
@onready var layer_settings_container := %LayerSettingsContainer as VBoxContainer
@onready var layer_container := %LayerContainer as VBoxContainer
@@ -72,7 +72,7 @@ func _ready() -> void:
Global.animation_timer.wait_time = 1 / Global.current_project.fps
fps_spinbox.value = Global.current_project.fps
_fill_blend_modes_option_button()
- # Config loading
+ # Config loading.
layer_frame_h_split.split_offset = Global.config_cache.get_value("timeline", "layer_size", 0)
layer_frame_header_h_split.split_offset = layer_frame_h_split.split_offset
cel_size = Global.config_cache.get_value("timeline", "cel_size", cel_size) # Call setter
@@ -94,13 +94,13 @@ func _ready() -> void:
var onion_skinning_opacity = Global.config_cache.get_value(
"timeline", "onion_skinning_opacity", 0.6
)
- get_node("%OnionSkinningOpacity").value = onion_skinning_opacity * 100.0
+ %OnionSkinningOpacity.value = onion_skinning_opacity * 100.0
%PastOnionSkinning.value = past_rate
%FutureOnionSkinning.value = future_rate
%BlueRedMode.button_pressed = blue_red
%PastPlacement.select(0 if past_above else 1)
%FuturePlacement.select(0 if future_above else 1)
- # emit signals that were supposed to be emitted (Check if it's still required in godot 4)
+ # Emit signals that were supposed to be emitted.
%PastPlacement.item_selected.emit(0 if past_above else 1)
%FuturePlacement.item_selected.emit(0 if future_above else 1)
Global.cel_switched.connect(_cel_switched)
@@ -140,6 +140,21 @@ func _input(event: InputEvent) -> void:
cel_size += (2 * int(event.is_action("zoom_in")) - 2 * int(event.is_action("zoom_out")))
+func reset_settings() -> void:
+ cel_size = 36
+ %OnionSkinningOpacity.value = 60.0
+ %PastOnionSkinning.value = 1
+ %FutureOnionSkinning.value = 1
+ %BlueRedMode.button_pressed = false
+ %PastPlacement.select(0)
+ %FuturePlacement.select(0)
+ %PastPlacement.item_selected.emit(0)
+ %FuturePlacement.item_selected.emit(0)
+ for onion_skinning_node: Node2D in get_tree().get_nodes_in_group("canvas_onion_skinning"):
+ onion_skinning_node.opacity = 0.6
+ onion_skinning_node.queue_redraw()
+
+
func _get_minimum_size() -> Vector2:
# X targets enough to see layers, 1 frame, vertical scrollbar, and padding
# Y targets enough to see 1 layer
From 7eeb0b0cbad28ab062f8faa2adf44fea6e8eced7 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 10 Oct 2024 00:40:51 +0300
Subject: [PATCH 081/162] Add a clear recently open file list option
---
Translations/Translations.pot | 4 ++++
src/Preferences/PreferencesDialog.gd | 6 ++++++
src/Preferences/PreferencesDialog.tscn | 6 ++++++
3 files changed, 16 insertions(+)
diff --git a/Translations/Translations.pot b/Translations/Translations.pot
index 4bde2c449..f5933fcb4 100644
--- a/Translations/Translations.pot
+++ b/Translations/Translations.pot
@@ -2498,6 +2498,10 @@ msgstr ""
msgid "Remove all extensions"
msgstr ""
+#. Found in the preferences, under the Reset category.
+msgid "Clear the recently opened file list"
+msgstr ""
+
msgid "Lock aspect ratio"
msgstr ""
diff --git a/src/Preferences/PreferencesDialog.gd b/src/Preferences/PreferencesDialog.gd
index 971aa0094..1d96dcdee 100644
--- a/src/Preferences/PreferencesDialog.gd
+++ b/src/Preferences/PreferencesDialog.gd
@@ -253,6 +253,7 @@ func _ready() -> void:
startup.queue_free()
right_side.get_node(^"Language").visible = true
Global.open_last_project = false
+ %ClearRecentFiles.hide()
if OS.get_name() == "Windows":
tablet_driver_label.visible = true
tablet_driver.visible = true
@@ -465,5 +466,10 @@ func _on_reset_options_confirmation_confirmed() -> void:
for extension in extensions_list:
extensions_node.uninstall_extension(extension)
Global.config_cache.erase_section("extensions")
+ # Clear recent files list
+ if %ClearRecentFiles.button_pressed:
+ Global.config_cache.erase_section_key("data", "last_project_path")
+ Global.config_cache.erase_section_key("data", "recent_projects")
+ Global.top_menu_container.recent_projects_submenu.clear()
Global.config_cache.save(Global.CONFIG_PATH)
diff --git a/src/Preferences/PreferencesDialog.tscn b/src/Preferences/PreferencesDialog.tscn
index dbaf691f9..d7092aae4 100644
--- a/src/Preferences/PreferencesDialog.tscn
+++ b/src/Preferences/PreferencesDialog.tscn
@@ -1386,6 +1386,12 @@ layout_mode = 2
mouse_default_cursor_shape = 2
text = "Remove all extensions"
+[node name="ClearRecentFiles" type="CheckBox" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Reset"]
+unique_name_in_owner = true
+layout_mode = 2
+mouse_default_cursor_shape = 2
+text = "Clear the recently opened file list"
+
[node name="ResetButton" type="Button" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Reset"]
layout_mode = 2
mouse_default_cursor_shape = 2
From 39afb5e15b5a171f6628d4c3b03b07e4e8e01904 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 10 Oct 2024 15:27:06 +0300
Subject: [PATCH 082/162] Add buttons with menus that move the symmetry guides
to the center of the canvas, or the view center
---
Translations/Translations.pot | 10 ++-
src/UI/GlobalToolOptions/GlobalToolOptions.gd | 22 +++++
.../GlobalToolOptions/GlobalToolOptions.tscn | 89 ++++++++++++++++---
3 files changed, 107 insertions(+), 14 deletions(-)
diff --git a/Translations/Translations.pot b/Translations/Translations.pot
index f5933fcb4..18fed9a85 100644
--- a/Translations/Translations.pot
+++ b/Translations/Translations.pot
@@ -1957,10 +1957,18 @@ msgstr ""
msgid "Enable horizontal mirrored drawing"
msgstr ""
+msgid "Vertical"
+msgstr ""
+
msgid "Enable vertical mirrored drawing"
msgstr ""
-msgid "Vertical"
+#. Found in the global tool options, in the menu that appears next to each mirror button. It affects the position of a symmetry guide.
+msgid "Move to canvas center"
+msgstr ""
+
+#. Found in the global tool options, in the menu that appears next to each mirror button. It affects the position of a symmetry guide.
+msgid "Move to view center"
msgstr ""
msgid "Current frame:"
diff --git a/src/UI/GlobalToolOptions/GlobalToolOptions.gd b/src/UI/GlobalToolOptions/GlobalToolOptions.gd
index e23d1abda..fe7f8f954 100644
--- a/src/UI/GlobalToolOptions/GlobalToolOptions.gd
+++ b/src/UI/GlobalToolOptions/GlobalToolOptions.gd
@@ -11,6 +11,8 @@ extends PanelContainer
func _ready() -> void:
Tools.options_reset.connect(reset_options)
+ %HorizontalMirrorOptions.get_popup().id_pressed.connect(_on_horizontal_mirror_options_id_pressed)
+ %VerticalMirrorOptions.get_popup().id_pressed.connect(_on_vertical_mirror_options_id_pressed)
# Resize tools panel when window gets resized
get_tree().get_root().size_changed.connect(_on_resized)
horizontal_mirror.button_pressed = Tools.horizontal_mirror
@@ -89,3 +91,23 @@ func _on_alpha_lock_toggled(toggled_on: bool) -> void:
func _on_Dynamics_pressed() -> void:
var pos := dynamics.global_position + Vector2(0, 32)
dynamics_panel.popup_on_parent(Rect2(pos, dynamics_panel.size))
+
+
+func _on_horizontal_mirror_options_id_pressed(id: int) -> void:
+ var project := Global.current_project
+ if id == 0:
+ project.x_symmetry_point = project.size.x - 1
+ elif id == 1:
+ project.x_symmetry_point = Global.camera.camera_screen_center.x * 2
+ project.y_symmetry_axis.points[0].x = project.x_symmetry_point / 2 + 0.5
+ project.y_symmetry_axis.points[1].x = project.x_symmetry_point / 2 + 0.5
+
+
+func _on_vertical_mirror_options_id_pressed(id: int) -> void:
+ var project := Global.current_project
+ if id == 0:
+ project.y_symmetry_point = project.size.y - 1
+ elif id == 1:
+ project.y_symmetry_point = Global.camera.camera_screen_center.y * 2
+ project.x_symmetry_axis.points[0].y = project.y_symmetry_point / 2 + 0.5
+ project.x_symmetry_axis.points[1].y = project.y_symmetry_point / 2 + 0.5
diff --git a/src/UI/GlobalToolOptions/GlobalToolOptions.tscn b/src/UI/GlobalToolOptions/GlobalToolOptions.tscn
index f60013ef2..9abe461b1 100644
--- a/src/UI/GlobalToolOptions/GlobalToolOptions.tscn
+++ b/src/UI/GlobalToolOptions/GlobalToolOptions.tscn
@@ -1,8 +1,9 @@
-[gd_scene load_steps=24 format=3 uid="uid://wo0hqxkst808"]
+[gd_scene load_steps=25 format=3 uid="uid://wo0hqxkst808"]
[ext_resource type="Texture2D" uid="uid://cjrokejjsp5dm" path="res://assets/graphics/misc/horizontal_mirror_off.png" id="1"]
[ext_resource type="Texture2D" uid="uid://hiduvaa73fr6" path="res://assets/graphics/misc/vertical_mirror_off.png" id="2"]
[ext_resource type="Script" path="res://src/UI/GlobalToolOptions/GlobalToolOptions.gd" id="3"]
+[ext_resource type="Texture2D" uid="uid://ct8wn8m6x4m54" path="res://assets/graphics/misc/value_arrow.svg" id="3_faalk"]
[ext_resource type="Texture2D" uid="uid://22h12g8p3jtd" path="res://assets/graphics/misc/pixel_perfect_off.png" id="4"]
[ext_resource type="Script" path="res://src/UI/Nodes/ValueSlider.gd" id="5"]
[ext_resource type="Texture2D" uid="uid://j8eywwy082a4" path="res://assets/graphics/misc/alpha_lock_off.png" id="5_jv20x"]
@@ -73,7 +74,7 @@ size_flags_vertical = 0
columns = 5
[node name="Horizontal" type="Button" parent="ScrollContainer/CenterContainer/GridContainer" groups=["UIButtons"]]
-custom_minimum_size = Vector2(32, 32)
+custom_minimum_size = Vector2(44, 32)
layout_mode = 2
tooltip_text = "Enable horizontal mirrored drawing"
mouse_default_cursor_shape = 2
@@ -81,19 +82,49 @@ toggle_mode = true
shortcut = SubResource("Shortcut_eld87")
[node name="TextureRect" type="TextureRect" parent="ScrollContainer/CenterContainer/GridContainer/Horizontal"]
+layout_mode = 1
+anchors_preset = 4
+anchor_top = 0.5
+anchor_bottom = 0.5
+offset_left = 5.0
+offset_top = -10.0
+offset_right = 25.0
+offset_bottom = 11.0
+grow_vertical = 2
+texture = ExtResource("1")
+
+[node name="HorizontalMirrorOptions" type="MenuButton" parent="ScrollContainer/CenterContainer/GridContainer/Horizontal"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(22, 0)
+layout_mode = 1
+anchors_preset = 6
+anchor_left = 1.0
+anchor_top = 0.5
+anchor_right = 1.0
+anchor_bottom = 0.5
+offset_left = -22.0
+offset_top = -10.0
+offset_bottom = 10.0
+mouse_default_cursor_shape = 2
+item_count = 2
+popup/item_0/text = "Move to canvas center"
+popup/item_1/text = "Move to view center"
+popup/item_1/id = 1
+
+[node name="TextureRect" type="TextureRect" parent="ScrollContainer/CenterContainer/GridContainer/Horizontal/HorizontalMirrorOptions"]
layout_mode = 0
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
-offset_left = -10.0
-offset_top = -10.5
-offset_right = 10.0
-offset_bottom = 10.5
-texture = ExtResource("1")
+offset_left = -6.0
+offset_top = -6.0
+offset_right = 6.0
+offset_bottom = 6.0
+texture = ExtResource("3_faalk")
[node name="Vertical" type="Button" parent="ScrollContainer/CenterContainer/GridContainer" groups=["UIButtons"]]
-custom_minimum_size = Vector2(32, 32)
+custom_minimum_size = Vector2(44, 32)
layout_mode = 2
tooltip_text = "Enable vertical mirrored drawing"
mouse_default_cursor_shape = 2
@@ -101,16 +132,48 @@ toggle_mode = true
shortcut = SubResource("Shortcut_ai7qc")
[node name="TextureRect" type="TextureRect" parent="ScrollContainer/CenterContainer/GridContainer/Vertical"]
+layout_mode = 1
+anchors_preset = 4
+anchor_top = 0.5
+anchor_bottom = 0.5
+offset_left = 5.0
+offset_top = -10.0
+offset_right = 25.0
+offset_bottom = 10.0
+grow_vertical = 2
+texture = ExtResource("2")
+
+[node name="VerticalMirrorOptions" type="MenuButton" parent="ScrollContainer/CenterContainer/GridContainer/Vertical"]
+unique_name_in_owner = true
+custom_minimum_size = Vector2(22, 0)
+layout_mode = 1
+anchors_preset = 6
+anchor_left = 1.0
+anchor_top = 0.5
+anchor_right = 1.0
+anchor_bottom = 0.5
+offset_left = -22.0
+offset_top = -10.0
+offset_bottom = 10.0
+grow_horizontal = 0
+grow_vertical = 2
+mouse_default_cursor_shape = 2
+item_count = 2
+popup/item_0/text = "Move to canvas center"
+popup/item_1/text = "Move to view center"
+popup/item_1/id = 1
+
+[node name="TextureRect" type="TextureRect" parent="ScrollContainer/CenterContainer/GridContainer/Vertical/VerticalMirrorOptions"]
layout_mode = 0
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
-offset_left = -10.0
-offset_top = -10.0
-offset_right = 10.0
-offset_bottom = 10.0
-texture = ExtResource("2")
+offset_left = -6.0
+offset_top = -6.0
+offset_right = 6.0
+offset_bottom = 6.0
+texture = ExtResource("3_faalk")
[node name="PixelPerfect" type="Button" parent="ScrollContainer/CenterContainer/GridContainer" groups=["UIButtons"]]
custom_minimum_size = Vector2(32, 32)
From 9cf3045bf3e261a3d9caa0500e9f980f04154018 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 10 Oct 2024 15:27:45 +0300
Subject: [PATCH 083/162] Fix "previous_project" shortcut not doing anything
when we are on the first tab
---
src/UI/Tabs.gd | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/UI/Tabs.gd b/src/UI/Tabs.gd
index 3b8ab3f4e..66f8c4dca 100644
--- a/src/UI/Tabs.gd
+++ b/src/UI/Tabs.gd
@@ -9,9 +9,8 @@ func _input(_event: InputEvent) -> void:
# system to fail, because user is trying to draw while switching project simultaneously.
# This is because the current project has changed and the system tries to commit to the
# wrong undoredo.
- var tab_idx = current_tab
# If a project is currently worked upon, then don't switch it.
- # This doesn't stop the bug completely but significantly reduces it's chances
+ # This doesn't stop the bug completely but significantly reduces its chances
# of appearing.
if (
Input.is_action_pressed("activate_left_tool")
@@ -20,15 +19,16 @@ func _input(_event: InputEvent) -> void:
return
# Due to the bug mentioned above, we will use is_action_just_released
# instead of is_action_just_pressed. This won't remove the bug completely
- # but will significantly reduce it's chancce of appearing.
+ # but it will significantly reduce its chance of appearing.
+ var tab_idx := current_tab
if Input.is_action_just_released(&"next_project", true):
tab_idx += 1
if tab_idx >= tab_count:
tab_idx = 0
elif Input.is_action_just_released(&"previous_project", true):
- tab_idx = current_tab - 1
+ tab_idx -= 1
if tab_idx < 0:
- tab_idx -= 1
+ tab_idx = tab_count - 1
if tab_idx != current_tab:
current_tab = tab_idx
From abcf6f5ec61cafe9dee41aa7ddd06e311017ef10 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 10 Oct 2024 15:28:46 +0300
Subject: [PATCH 084/162] Remove unneeded Global.current_project in
SymmetryGuide
---
src/UI/Canvas/Rulers/SymmetryGuide.gd | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/UI/Canvas/Rulers/SymmetryGuide.gd b/src/UI/Canvas/Rulers/SymmetryGuide.gd
index f4edb5155..39e9c374b 100644
--- a/src/UI/Canvas/Rulers/SymmetryGuide.gd
+++ b/src/UI/Canvas/Rulers/SymmetryGuide.gd
@@ -21,11 +21,11 @@ func _input(_event: InputEvent) -> void:
super._input(_event)
if type == Types.HORIZONTAL:
project.y_symmetry_point = points[0].y * 2 - 1
- points[0].y = clampf(points[0].y, 0, Global.current_project.size.y)
- points[1].y = clampf(points[1].y, 0, Global.current_project.size.y)
+ points[0].y = clampf(points[0].y, 0, project.size.y)
+ points[1].y = clampf(points[1].y, 0, project.size.y)
elif type == Types.VERTICAL:
- points[0].x = clampf(points[0].x, 0, Global.current_project.size.x)
- points[1].x = clampf(points[1].x, 0, Global.current_project.size.x)
+ points[0].x = clampf(points[0].x, 0, project.size.x)
+ points[1].x = clampf(points[1].x, 0, project.size.x)
project.x_symmetry_point = points[0].x * 2 - 1
From 8802e3ab41af8d5f46db397cf5ac5cb4206d1529 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 10 Oct 2024 15:29:12 +0300
Subject: [PATCH 085/162] Slightly improve camera zoom and pan touch gestures
Not quite there yet
---
src/UI/Canvas/CanvasCamera.gd | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)
diff --git a/src/UI/Canvas/CanvasCamera.gd b/src/UI/Canvas/CanvasCamera.gd
index a7cf25800..fc6870611 100644
--- a/src/UI/Canvas/CanvasCamera.gd
+++ b/src/UI/Canvas/CanvasCamera.gd
@@ -78,13 +78,14 @@ func _input(event: InputEvent) -> void:
zoom_camera(-1)
elif event is InputEventMagnifyGesture: # Zoom gesture on touchscreens
- if event.factor >= 1: # Zoom in
- zoom_camera(1)
+ #zoom_camera(event.factor)
+ if event.factor >= 1.0: # Zoom in
+ zoom_camera(event.factor * 0.3)
else: # Zoom out
- zoom_camera(-1)
+ zoom_camera((event.factor * 0.7) - 1.0)
elif event is InputEventPanGesture:
# Pan gesture on touchscreens
- offset = offset + event.delta.rotated(camera_angle) * 7.0 / zoom
+ offset = offset + event.delta.rotated(camera_angle) * 2.0 / zoom
elif event is InputEventMouseMotion:
if drag:
offset = offset - event.relative.rotated(camera_angle) / zoom
@@ -95,7 +96,7 @@ func _input(event: InputEvent) -> void:
offset = offset + (dir.rotated(camera_angle) / zoom) * CAMERA_SPEED_RATE
-func zoom_camera(dir: int) -> void:
+func zoom_camera(dir: float) -> void:
var viewport_size := viewport_container.size
if Global.smooth_zoom:
var zoom_margin := zoom * dir / 5
From 55325a38a4cd3687f281ba7734d399126793dcb8 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 10 Oct 2024 15:29:36 +0300
Subject: [PATCH 086/162] Use a Vector2i in Selection.gd when pasting
---
src/UI/Canvas/Selection.gd | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/UI/Canvas/Selection.gd b/src/UI/Canvas/Selection.gd
index 43c0b6254..a6f9a6b58 100644
--- a/src/UI/Canvas/Selection.gd
+++ b/src/UI/Canvas/Selection.gd
@@ -736,9 +736,9 @@ func paste(in_place := false) -> void:
var clip_map := SelectionMap.new()
clip_map.data = clipboard.selection_map
- var max_size := Vector2(
- max(clip_map.get_size().x, project.selection_map.get_size().x),
- max(clip_map.get_size().y, project.selection_map.get_size().y)
+ var max_size := Vector2i(
+ maxi(clip_map.get_size().x, project.selection_map.get_size().x),
+ maxi(clip_map.get_size().y, project.selection_map.get_size().y)
)
project.selection_map.copy_from(clip_map)
From 7a3050b5a0c59f1963687f9cec9d1510206b2d6f Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 10 Oct 2024 15:29:41 +0300
Subject: [PATCH 087/162] Fix formatting
---
src/UI/GlobalToolOptions/GlobalToolOptions.gd | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/src/UI/GlobalToolOptions/GlobalToolOptions.gd b/src/UI/GlobalToolOptions/GlobalToolOptions.gd
index fe7f8f954..8a1a1415b 100644
--- a/src/UI/GlobalToolOptions/GlobalToolOptions.gd
+++ b/src/UI/GlobalToolOptions/GlobalToolOptions.gd
@@ -11,7 +11,9 @@ extends PanelContainer
func _ready() -> void:
Tools.options_reset.connect(reset_options)
- %HorizontalMirrorOptions.get_popup().id_pressed.connect(_on_horizontal_mirror_options_id_pressed)
+ %HorizontalMirrorOptions.get_popup().id_pressed.connect(
+ _on_horizontal_mirror_options_id_pressed
+ )
%VerticalMirrorOptions.get_popup().id_pressed.connect(_on_vertical_mirror_options_id_pressed)
# Resize tools panel when window gets resized
get_tree().get_root().size_changed.connect(_on_resized)
From ffc98a4b7f49d147ba50ddc2005d527db6bf16e8 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Thu, 10 Oct 2024 16:33:50 +0300
Subject: [PATCH 088/162] Remove confusing text from the tooltips of the play
animation buttons
Addresses #1114
---
Translations/Translations.pot | 4 ++--
src/UI/Timeline/AnimationTimeline.tscn | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/Translations/Translations.pot b/Translations/Translations.pot
index 18fed9a85..bc216a89c 100644
--- a/Translations/Translations.pot
+++ b/Translations/Translations.pot
@@ -1986,10 +1986,10 @@ msgstr ""
msgid "Go to the previous frame"
msgstr ""
-msgid "Play the animation backwards (from end to beginning)"
+msgid "Play the animation backwards"
msgstr ""
-msgid "Play the animation forward (from beginning to end)"
+msgid "Play the animation forward"
msgstr ""
msgid "Go to the next frame"
diff --git a/src/UI/Timeline/AnimationTimeline.tscn b/src/UI/Timeline/AnimationTimeline.tscn
index ba10b0341..efb04ba70 100644
--- a/src/UI/Timeline/AnimationTimeline.tscn
+++ b/src/UI/Timeline/AnimationTimeline.tscn
@@ -589,7 +589,7 @@ texture = ExtResource("23")
unique_name_in_owner = true
custom_minimum_size = Vector2(24, 24)
layout_mode = 2
-tooltip_text = "Play the animation backwards (from end to beginning)"
+tooltip_text = "Play the animation backwards"
focus_mode = 0
mouse_default_cursor_shape = 2
toggle_mode = true
@@ -612,7 +612,7 @@ unique_name_in_owner = true
custom_minimum_size = Vector2(24, 24)
layout_mode = 2
size_flags_horizontal = 0
-tooltip_text = "Play the animation forward (from beginning to end)"
+tooltip_text = "Play the animation forward"
focus_mode = 0
mouse_default_cursor_shape = 2
toggle_mode = true
From ae4b5046edacceaa70b08b6cc7d1d9c8703c9068 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 11 Oct 2024 12:13:13 +0300
Subject: [PATCH 089/162] Implement support for floating windows
---
addons/README.md | 2 +-
.../dockable_container/dockable_container.gd | 71 +++++++++++++++++-
addons/dockable_container/dockable_panel.gd | 2 +
addons/dockable_container/floating_window.gd | 73 +++++++++++++++++++
addons/dockable_container/layout.gd | 18 +++++
.../dockable_container/samples/TestScene.tscn | 4 +
assets/layouts/Default.tres | 1 +
assets/layouts/Tallscreen.tres | 1 +
8 files changed, 170 insertions(+), 2 deletions(-)
create mode 100644 addons/dockable_container/floating_window.gd
diff --git a/addons/README.md b/addons/README.md
index e42e3318d..263765b85 100644
--- a/addons/README.md
+++ b/addons/README.md
@@ -24,7 +24,7 @@ Files extracted from source:
## godot-dockable-container
- Upstream: https://github.com/gilzoide/godot-dockable-container
-- Version: Based on [ddff84aa31e466101b4a75c7ff68d3a82701e387](https://github.com/gilzoide/godot-dockable-container/commit/ddff84aa31e466101b4a75c7ff68d3a82701e387), but with changes in layout.gd that add a `save_on_change` variable and a `save()` method.
+- Version: Based on [e852cbeeb3f06f62c559898b4cf5756858367766](https://github.com/OverloadedOrama/godot-dockable-container/commit/e852cbeeb3f06f62c559898b4cf5756858367766), but with changes in layout.gd that add a `save_on_change` variable and a `save()` method.
- License: [CC0-1.0](https://github.com/gilzoide/godot-dockable-container/blob/main/LICENSE)
## SmartSlicer
diff --git a/addons/dockable_container/dockable_container.gd b/addons/dockable_container/dockable_container.gd
index 3913a68f5..496d683ab 100644
--- a/addons/dockable_container/dockable_container.gd
+++ b/addons/dockable_container/dockable_container.gd
@@ -54,6 +54,7 @@ const DragNDropPanel := preload("drag_n_drop_panel.gd")
var _layout := DockableLayout.new()
var _panel_container := Container.new()
+var _windows_container := Container.new()
var _split_container := Container.new()
var _drag_n_drop_panel := DragNDropPanel.new()
var _drag_panel: DockablePanel
@@ -80,6 +81,8 @@ func _ready() -> void:
_split_container.name = "_split_container"
_split_container.mouse_filter = MOUSE_FILTER_PASS
_panel_container.add_child(_split_container)
+ _windows_container.name = "_windows_container"
+ get_parent().call_deferred("add_child", _windows_container)
_drag_n_drop_panel.name = "_drag_n_drop_panel"
_drag_n_drop_panel.mouse_filter = MOUSE_FILTER_PASS
@@ -161,6 +164,61 @@ func _drop_data(_position: Vector2, data) -> void:
queue_sort()
+func _add_floating_options(tab_container: DockablePanel) -> void:
+ var options := PopupMenu.new()
+ options.add_item("Make Floating")
+ options.id_pressed.connect(_toggle_floating.bind(tab_container))
+ options.size.y = 0
+ _windows_container.add_child(options)
+ tab_container.set_popup(options)
+
+
+## Required when converting a window back to panel.
+func _refresh_tabs_visible() -> void:
+ if tabs_visible:
+ tabs_visible = false
+ await get_tree().process_frame
+ await get_tree().process_frame
+ tabs_visible = true
+
+
+func _toggle_floating(_id: int, tab_container: DockablePanel) -> void:
+ var node_name := tab_container.get_tab_title(tab_container.current_tab)
+ var node := get_node(node_name)
+ if is_instance_valid(node):
+ var tab_position := maxi(tab_container.leaf.find_child(node), 0)
+ _convert_to_window(node, {"tab_position": tab_position, "tab_container": tab_container})
+ else:
+ print("Node ", node_name, " not found!")
+
+
+## Converts a panel to floating window.
+func _convert_to_window(content: Control, previous_data := {}) -> void:
+ var old_owner := content.owner
+ var data := {}
+ if content.name in layout.windows:
+ data = layout.windows[content.name]
+ var window := FloatingWindow.new(content, data)
+ _windows_container.add_child(window)
+ window.show()
+ _refresh_tabs_visible()
+ window.close_requested.connect(_convert_to_panel.bind(window, old_owner, previous_data))
+ window.data_changed.connect(layout.save_window_properties)
+
+
+## Converts a floating window into a panel.
+func _convert_to_panel(window: FloatingWindow, old_owner: Node, previous_data := {}) -> void:
+ var content := window.window_content
+ window.remove_child(content)
+ window.destroy()
+ add_child(content)
+ content.owner = old_owner
+ if previous_data.has("tab_container") and is_instance_valid(previous_data["tab_container"]):
+ var tab_position := previous_data.get("tab_position", 0) as int
+ previous_data["tab_container"].leaf.insert_node(tab_position, content)
+ _refresh_tabs_visible()
+
+
func set_control_as_current_tab(control: Control) -> void:
assert(
control.get_parent_control() == self,
@@ -195,6 +253,16 @@ func set_layout(value: DockableLayout) -> void:
_layout.changed.disconnect(queue_sort)
_layout = value
_layout.changed.connect(queue_sort)
+ for window in _windows_container.get_children():
+ if not window.name in _layout.windows and window is FloatingWindow:
+ window.prevent_data_erasure = true # We don't want to delete data.
+ window.close_requested.emit() # Removes the window.
+ continue
+ for window: String in _layout.windows.keys():
+ var panel := find_child(window, false)
+ # Only those windows get created which were not previously created.
+ if panel:
+ _convert_to_window(panel)
_layout_dirty = true
queue_sort()
@@ -202,7 +270,7 @@ func set_layout(value: DockableLayout) -> void:
func set_use_hidden_tabs_for_min_size(value: bool) -> void:
_use_hidden_tabs_for_min_size = value
for i in range(1, _panel_container.get_child_count()):
- var panel = _panel_container.get_child(i)
+ var panel := _panel_container.get_child(i) as DockablePanel
panel.use_hidden_tabs_for_min_size = value
@@ -401,6 +469,7 @@ func _get_panel(idx: int) -> DockablePanel:
panel.hide_single_tab = _hide_single_tab
panel.use_hidden_tabs_for_min_size = _use_hidden_tabs_for_min_size
panel.set_tabs_rearrange_group(maxi(0, rearrange_group))
+ _add_floating_options(panel)
_panel_container.add_child(panel)
panel.tab_layout_changed.connect(_on_panel_tab_layout_changed.bind(panel))
return panel
diff --git a/addons/dockable_container/dockable_panel.gd b/addons/dockable_container/dockable_panel.gd
index d522027dd..a32bf6b28 100644
--- a/addons/dockable_container/dockable_panel.gd
+++ b/addons/dockable_container/dockable_panel.gd
@@ -40,6 +40,8 @@ func _exit_tree() -> void:
active_tab_rearranged.disconnect(_on_tab_changed)
tab_selected.disconnect(_on_tab_selected)
tab_changed.disconnect(_on_tab_changed)
+ if is_instance_valid(get_popup()):
+ get_popup().queue_free()
func track_nodes(nodes: Array[Control], new_leaf: DockableLayoutPanel) -> void:
diff --git a/addons/dockable_container/floating_window.gd b/addons/dockable_container/floating_window.gd
new file mode 100644
index 000000000..386aa18b6
--- /dev/null
+++ b/addons/dockable_container/floating_window.gd
@@ -0,0 +1,73 @@
+class_name FloatingWindow
+extends Window
+
+## Emitted when the window's position or size changes, or when it's closed.
+signal data_changed
+
+var window_content: Control
+var prevent_data_erasure := false
+var _is_initialized := false
+
+
+func _init(content: Control, data := {}) -> void:
+ window_content = content
+ title = window_content.name
+ name = window_content.name
+ min_size = window_content.get_minimum_size()
+ unresizable = false
+ wrap_controls = true
+ always_on_top = true
+ ready.connect(_deserialize.bind(data))
+
+
+func _ready() -> void:
+ set_deferred(&"size", Vector2(300, 300))
+ await get_tree().process_frame
+ await get_tree().process_frame
+ if get_tree().current_scene.get_window().gui_embed_subwindows:
+ position = DisplayServer.window_get_size() / 2 - size / 2
+ else:
+ position = DisplayServer.screen_get_usable_rect().size / 2 - size / 2
+
+
+func _input(event: InputEvent) -> void:
+ if event is InputEventMouse:
+ # Emit `data_changed` when the window is being moved.
+ if not window_content.get_rect().has_point(event.position) and _is_initialized:
+ data_changed.emit(name, serialize())
+
+
+func serialize() -> Dictionary:
+ return {"size": size, "position": position}
+
+
+func _deserialize(data: Dictionary) -> void:
+ window_content.get_parent().remove_child(window_content)
+ window_content.visible = true
+ window_content.global_position = Vector2.ZERO
+ add_child(window_content)
+ size_changed.connect(window_size_changed)
+ if "position" in data:
+ await get_tree().process_frame
+ await get_tree().process_frame
+ position = data["position"]
+ if "size" in data:
+ set_deferred(&"size", data["size"])
+ _is_initialized = true
+
+
+func window_size_changed() -> void:
+ window_content.size = size
+ window_content.position = Vector2.ZERO
+ if _is_initialized:
+ data_changed.emit(name, serialize())
+
+
+func destroy() -> void:
+ size_changed.disconnect(window_size_changed)
+ queue_free()
+
+
+func _exit_tree() -> void:
+ if _is_initialized and !prevent_data_erasure:
+ data_changed.emit(name, {})
diff --git a/addons/dockable_container/layout.gd b/addons/dockable_container/layout.gd
index d0eb28938..409418185 100644
--- a/addons/dockable_container/layout.gd
+++ b/addons/dockable_container/layout.gd
@@ -23,6 +23,14 @@ enum { MARGIN_LEFT, MARGIN_RIGHT, MARGIN_TOP, MARGIN_BOTTOM, MARGIN_CENTER }
if value != _hidden_tabs:
_hidden_tabs = value
changed.emit()
+## A [Dictionary] of [StringName] and [Dictionary], containing data such as position and size.
+@export var windows := {}:
+ get:
+ return _windows
+ set(value):
+ if value != _windows:
+ _windows = value
+ changed.emit()
@export var save_on_change := false:
set(value):
save_on_change = value
@@ -36,6 +44,7 @@ enum { MARGIN_LEFT, MARGIN_RIGHT, MARGIN_TOP, MARGIN_BOTTOM, MARGIN_CENTER }
var _changed_signal_queued := false
var _first_leaf: DockableLayoutPanel
var _hidden_tabs: Dictionary
+var _windows: Dictionary
var _leaf_by_node_name: Dictionary
var _root: DockableLayoutNode = DockableLayoutPanel.new()
@@ -182,6 +191,15 @@ func set_tab_hidden(name: String, hidden: bool) -> void:
_on_root_changed()
+func save_window_properties(window_name: StringName, data: Dictionary) -> void:
+ var new_windows = windows.duplicate(true)
+ if data.is_empty():
+ new_windows.erase(window_name)
+ else:
+ new_windows[window_name] = data
+ windows = new_windows
+
+
func is_tab_hidden(name: String) -> bool:
return _hidden_tabs.get(name, false)
diff --git a/addons/dockable_container/samples/TestScene.tscn b/addons/dockable_container/samples/TestScene.tscn
index 80ca9cc6a..311440da1 100644
--- a/addons/dockable_container/samples/TestScene.tscn
+++ b/addons/dockable_container/samples/TestScene.tscn
@@ -31,6 +31,8 @@ resource_name = "Layout"
script = ExtResource("2")
root = SubResource("Resource_hl8y1")
hidden_tabs = {}
+windows = {}
+save_on_change = false
[sub_resource type="Resource" id="Resource_ntwfj"]
resource_name = "Tabs"
@@ -71,6 +73,8 @@ resource_name = "Layout"
script = ExtResource("2")
root = SubResource("Resource_jhibs")
hidden_tabs = {}
+windows = {}
+save_on_change = false
[node name="SampleScene" type="VBoxContainer"]
anchors_preset = 15
diff --git a/assets/layouts/Default.tres b/assets/layouts/Default.tres
index 95b086465..6f753dda1 100644
--- a/assets/layouts/Default.tres
+++ b/assets/layouts/Default.tres
@@ -175,4 +175,5 @@ hidden_tabs = {
"Recorder": true,
"Second Canvas": true
}
+windows = {}
save_on_change = false
diff --git a/assets/layouts/Tallscreen.tres b/assets/layouts/Tallscreen.tres
index 99b36b946..cf1252892 100644
--- a/assets/layouts/Tallscreen.tres
+++ b/assets/layouts/Tallscreen.tres
@@ -145,4 +145,5 @@ hidden_tabs = {
"Recorder": true,
"Second Canvas": true
}
+windows = {}
save_on_change = false
From 72da34a97d6cf37eb58eaddf25700c6d07d9a8c7 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 11 Oct 2024 13:03:26 +0300
Subject: [PATCH 090/162] Fix icons not being set to the correct color when
launching Pixelorama with the dark theme
---
src/Autoload/Themes.gd | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/Autoload/Themes.gd b/src/Autoload/Themes.gd
index 9128c33a8..4db8c8340 100644
--- a/src/Autoload/Themes.gd
+++ b/src/Autoload/Themes.gd
@@ -27,6 +27,7 @@ func _ready() -> void:
change_theme(theme_id)
else:
change_clear_color()
+ change_icon_colors()
func add_theme(theme: Theme) -> void:
From bd68f3d20b250a5c3b837246e8bcaec74e6442fc Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 11 Oct 2024 13:08:29 +0300
Subject: [PATCH 091/162] [skip ci] Add some strings to Translations.pot
---
Translations/Translations.pot | 8 ++++++++
src/UI/Dialogs/ExportDialog.tscn | 2 +-
2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/Translations/Translations.pot b/Translations/Translations.pot
index bc216a89c..c1e88df21 100644
--- a/Translations/Translations.pot
+++ b/Translations/Translations.pot
@@ -2685,6 +2685,14 @@ msgstr ""
msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible."
msgstr ""
+#. Found in the export dialog. It is an option that allows users to only export the portions of the images that are within the selected area.
+msgid "Clip image content to selection"
+msgstr ""
+
+#. Found in the export dialog. Tooltip of the "clip image content to selection" option.
+msgid "Only export content that is within the bounds of a selected area."
+msgstr ""
+
msgid "Close"
msgstr ""
diff --git a/src/UI/Dialogs/ExportDialog.tscn b/src/UI/Dialogs/ExportDialog.tscn
index 2e2457cf3..f81fb8c87 100644
--- a/src/UI/Dialogs/ExportDialog.tscn
+++ b/src/UI/Dialogs/ExportDialog.tscn
@@ -326,7 +326,7 @@ text = "Trim images"
[node name="ClipSelection" type="CheckBox" parent="VBoxContainer/VSplitContainer/VBoxContainer/AdvancedOptions/GridContainer" groups=["ExportImageOptions"]]
layout_mode = 2
-tooltip_text = "Only shows content that is within the bounds of a selected area."
+tooltip_text = "Only export content that is within the bounds of a selected area."
mouse_default_cursor_shape = 2
text = "Clip image content to selection"
From fc695a038e0227347886ffb7c1eec5e093cf487b Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 11 Oct 2024 14:08:43 +0300
Subject: [PATCH 092/162] Remove `Global.canvas` from the canvas' children
---
src/UI/Canvas/CanvasCamera.gd | 6 +++---
src/UI/Canvas/Gizmos3D.gd | 8 +++++---
src/UI/Canvas/Measurements.gd | 12 +++++++-----
src/UI/Canvas/OnionSkinning.gd | 6 +++---
src/UI/Canvas/Selection.gd | 12 ++++++------
src/UI/Canvas/TileMode.gd | 4 +++-
src/UI/UI.tscn | 1 +
7 files changed, 28 insertions(+), 21 deletions(-)
diff --git a/src/UI/Canvas/CanvasCamera.gd b/src/UI/Canvas/CanvasCamera.gd
index fc6870611..c75e4a22b 100644
--- a/src/UI/Canvas/CanvasCamera.gd
+++ b/src/UI/Canvas/CanvasCamera.gd
@@ -57,8 +57,8 @@ func _ready() -> void:
zoom_slider.value_changed.connect(_zoom_slider_value_changed)
zoom_changed.connect(_zoom_changed)
rotation_changed.connect(_rotation_changed)
- viewport_container = get_parent().get_parent()
- transparent_checker = get_parent().get_node("TransparentChecker")
+ viewport_container = get_viewport().get_parent()
+ transparent_checker = get_viewport().get_node("TransparentChecker")
update_transparent_checker_offset()
@@ -160,7 +160,7 @@ func fit_to_frame(size: Vector2) -> void:
size.x = maxf(absf(a.x - d.x), absf(b.x - c.x))
size.y = maxf(absf(a.y - d.y), absf(b.y - c.y))
- viewport_container = get_parent().get_parent()
+ viewport_container = get_viewport().get_parent()
var h_ratio := viewport_container.size.x / size.x
var v_ratio := viewport_container.size.y / size.y
var ratio := minf(h_ratio, v_ratio)
diff --git a/src/UI/Canvas/Gizmos3D.gd b/src/UI/Canvas/Gizmos3D.gd
index e6e2801c1..0106e4709 100644
--- a/src/UI/Canvas/Gizmos3D.gd
+++ b/src/UI/Canvas/Gizmos3D.gd
@@ -30,6 +30,8 @@ var gizmo_rot_x := PackedVector2Array()
var gizmo_rot_y := PackedVector2Array()
var gizmo_rot_z := PackedVector2Array()
+@onready var canvas := get_parent() as Canvas
+
func _ready() -> void:
set_process_input(false)
@@ -188,13 +190,13 @@ func _draw() -> void:
# Draw bounding box outline
draw_multiline(points, selected_color, 0.5)
if object.applying_gizmos == Cel3DObject.Gizmos.X_ROT:
- draw_line(gizmos_origin, Global.canvas.current_pixel, Color.RED)
+ draw_line(gizmos_origin, canvas.current_pixel, Color.RED)
continue
elif object.applying_gizmos == Cel3DObject.Gizmos.Y_ROT:
- draw_line(gizmos_origin, Global.canvas.current_pixel, Color.GREEN)
+ draw_line(gizmos_origin, canvas.current_pixel, Color.GREEN)
continue
elif object.applying_gizmos == Cel3DObject.Gizmos.Z_ROT:
- draw_line(gizmos_origin, Global.canvas.current_pixel, Color.BLUE)
+ draw_line(gizmos_origin, canvas.current_pixel, Color.BLUE)
continue
draw_set_transform(gizmos_origin, 0, draw_scale)
# Draw position arrows
diff --git a/src/UI/Canvas/Measurements.gd b/src/UI/Canvas/Measurements.gd
index ca8318859..86b7e43d9 100644
--- a/src/UI/Canvas/Measurements.gd
+++ b/src/UI/Canvas/Measurements.gd
@@ -8,6 +8,8 @@ var mode := Global.MeasurementMode.NONE
var apparent_width: float = WIDTH
var rect_bounds: Rect2i
+@onready var canvas := get_parent() as Canvas
+
func _ready() -> void:
font = Themes.get_font()
@@ -34,10 +36,10 @@ func _input(_event: InputEvent) -> void:
func _prepare_movement_rect() -> void:
var project := Global.current_project
if project.has_selection:
- rect_bounds = Global.canvas.selection.preview_image.get_used_rect()
- rect_bounds.position += Vector2i(Global.canvas.selection.big_bounding_rectangle.position)
+ rect_bounds = canvas.selection.preview_image.get_used_rect()
+ rect_bounds.position += Vector2i(canvas.selection.big_bounding_rectangle.position)
if !rect_bounds.has_area():
- rect_bounds = Global.canvas.selection.big_bounding_rectangle
+ rect_bounds = canvas.selection.big_bounding_rectangle
return
if rect_bounds.has_area():
return
@@ -65,7 +67,7 @@ func _prepare_movement_rect() -> void:
else:
rect_bounds = rect_bounds.merge(used_rect)
if not rect_bounds.has_area():
- rect_bounds = Rect2(Vector2.ZERO, project.size)
+ rect_bounds = Rect2i(Vector2i.ZERO, project.size)
func _draw_move_measurement() -> void:
@@ -74,7 +76,7 @@ func _draw_move_measurement() -> void:
dashed_color.a = 0.5
# Draw boundary
var boundary := Rect2i(rect_bounds)
- boundary.position += Global.canvas.move_preview_location
+ boundary.position += canvas.move_preview_location
draw_rect(boundary, line_color, false, apparent_width)
# calculate lines
var top := Vector2(boundary.get_center().x, boundary.position.y)
diff --git a/src/UI/Canvas/OnionSkinning.gd b/src/UI/Canvas/OnionSkinning.gd
index 2f2409fa1..fec72a4ff 100644
--- a/src/UI/Canvas/OnionSkinning.gd
+++ b/src/UI/Canvas/OnionSkinning.gd
@@ -7,6 +7,8 @@ var opacity := 0.6
var blue_red_color := Color.BLUE
var rate := Global.onion_skinning_past_rate
+@onready var canvas := get_parent() as Canvas
+
func _draw() -> void:
var project := Global.current_project
@@ -36,9 +38,7 @@ func _draw() -> void:
if not (layer.name.to_lower().ends_with("_io")):
color.a = opacity / i
if [change, layer_i] in project.selected_cels:
- draw_texture(
- cel.image_texture, Global.canvas.move_preview_location, color
- )
+ draw_texture(cel.image_texture, canvas.move_preview_location, color)
else:
draw_texture(cel.image_texture, Vector2.ZERO, color)
layer_i += 1
diff --git a/src/UI/Canvas/Selection.gd b/src/UI/Canvas/Selection.gd
index a6f9a6b58..a540054ad 100644
--- a/src/UI/Canvas/Selection.gd
+++ b/src/UI/Canvas/Selection.gd
@@ -43,7 +43,7 @@ var content_pivot := Vector2.ZERO
var mouse_pos_on_gizmo_drag := Vector2.ZERO
var resize_keep_ratio := false
-@onready var canvas: Canvas = get_parent()
+@onready var canvas := get_parent() as Canvas
@onready var marching_ants_outline: Sprite2D = $MarchingAntsOutline
@@ -393,7 +393,7 @@ func resize_selection() -> void:
)
Global.current_project.selection_map_changed()
queue_redraw()
- Global.canvas.queue_redraw()
+ canvas.queue_redraw()
func _gizmo_rotate() -> void:
@@ -461,7 +461,7 @@ func move_borders_end() -> void:
else:
Global.current_project.selection_map_changed()
queue_redraw()
- Global.canvas.queue_redraw()
+ canvas.queue_redraw()
func transform_content_start() -> void:
@@ -478,7 +478,7 @@ func transform_content_start() -> void:
original_big_bounding_rectangle = big_bounding_rectangle
original_offset = Global.current_project.selection_offset
queue_redraw()
- Global.canvas.queue_redraw()
+ canvas.queue_redraw()
func move_content(move: Vector2) -> void:
@@ -522,7 +522,7 @@ func transform_content_confirm() -> void:
angle = 0.0
content_pivot = Vector2.ZERO
queue_redraw()
- Global.canvas.queue_redraw()
+ canvas.queue_redraw()
func transform_content_cancel() -> void:
@@ -555,7 +555,7 @@ func transform_content_cancel() -> void:
angle = 0.0
content_pivot = Vector2.ZERO
queue_redraw()
- Global.canvas.queue_redraw()
+ canvas.queue_redraw()
func commit_undo(action: String, undo_data_tmp: Dictionary) -> void:
diff --git a/src/UI/Canvas/TileMode.gd b/src/UI/Canvas/TileMode.gd
index 316f2eeca..641fde9b6 100644
--- a/src/UI/Canvas/TileMode.gd
+++ b/src/UI/Canvas/TileMode.gd
@@ -3,6 +3,8 @@ extends Node2D
var tiles: Tiles
var draw_center := false
+@onready var canvas := get_parent() as Canvas
+
func _draw() -> void:
var positions := get_tile_positions()
@@ -16,7 +18,7 @@ func _draw() -> void:
var modulate_color := Color(
tilemode_opacity, tilemode_opacity, tilemode_opacity, tilemode_opacity
) # premultiply alpha blending is applied
- var current_frame_texture: Texture2D = Global.canvas.currently_visible_frame.get_texture()
+ var current_frame_texture := canvas.currently_visible_frame.get_texture()
for pos in positions:
draw_texture(current_frame_texture, pos, modulate_color)
diff --git a/src/UI/UI.tscn b/src/UI/UI.tscn
index 33f01a452..1bb78eb62 100644
--- a/src/UI/UI.tscn
+++ b/src/UI/UI.tscn
@@ -205,6 +205,7 @@ hidden_tabs = {
"Reference Images": true,
"Second Canvas": true
}
+windows = {}
save_on_change = false
[sub_resource type="ShaderMaterial" id="2"]
From b79ce0ae15d279970ff771bf7c15dd8cafc38c46 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 11 Oct 2024 14:44:21 +0300
Subject: [PATCH 093/162] Add a new "CanvasCameras" node group for the canvas
cameras
---
project.godot | 4 +++
src/Autoload/Global.gd | 6 ----
src/Tools/UtilityTools/Pan.gd | 8 ++---
src/Tools/UtilityTools/Zoom.gd | 27 +++++++-------
src/UI/Canvas/Canvas.gd | 2 +-
src/UI/Canvas/CanvasCamera.gd | 35 +++++++------------
.../CanvasPreviewContainer.tscn | 5 ++-
src/UI/UI.tscn | 4 +--
8 files changed, 40 insertions(+), 51 deletions(-)
diff --git a/project.godot b/project.godot
index 35ca2ee8d..3737bddf8 100644
--- a/project.godot
+++ b/project.godot
@@ -61,6 +61,10 @@ window/per_pixel_transparency/allowed.web=false
enabled=PackedStringArray("res://addons/aimg_io/plugin.cfg", "res://addons/dockable_container/plugin.cfg", "res://addons/keychain/plugin.cfg")
+[global_group]
+
+CanvasCameras=""
+
[importer_defaults]
texture={
diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd
index 4f0ce33d0..5b8259fae 100644
--- a/src/Autoload/Global.gd
+++ b/src/Autoload/Global.gd
@@ -622,12 +622,6 @@ var cel_button_scene: PackedScene = load("res://src/UI/Timeline/CelButton.tscn")
)
## Camera of the main canvas.
@onready var camera: CanvasCamera = main_viewport.find_child("Camera2D")
-## Camera of the second canvas preview.
-@onready var camera2: CanvasCamera = second_viewport.find_child("Camera2D2")
-## Camera of the canvas preview.
-@onready var camera_preview: CanvasCamera = control.find_child("CameraPreview")
-## Array of cameras used in Pixelorama.
-@onready var cameras := [camera, camera2, camera_preview]
## Horizontal ruler of the main canvas. It has the [param HorizontalRuler.gd] script attached.
@onready var horizontal_ruler: BaseButton = control.find_child("HorizontalRuler")
## Vertical ruler of the main canvas. It has the [param VerticalRuler.gd] script attached.
diff --git a/src/Tools/UtilityTools/Pan.gd b/src/Tools/UtilityTools/Pan.gd
index b6b5c7d89..5c9d0d652 100644
--- a/src/Tools/UtilityTools/Pan.gd
+++ b/src/Tools/UtilityTools/Pan.gd
@@ -3,8 +3,8 @@ extends BaseTool
func draw_start(pos: Vector2i) -> void:
super.draw_start(pos)
- Global.camera.drag = true
- Global.camera2.drag = true
+ for camera: CanvasCamera in get_tree().get_nodes_in_group("CanvasCameras"):
+ camera.drag = true
func draw_move(pos: Vector2i) -> void:
@@ -13,5 +13,5 @@ func draw_move(pos: Vector2i) -> void:
func draw_end(pos: Vector2i) -> void:
super.draw_end(pos)
- Global.camera.drag = false
- Global.camera2.drag = false
+ for camera: CanvasCamera in get_tree().get_nodes_in_group("CanvasCameras"):
+ camera.drag = false
diff --git a/src/Tools/UtilityTools/Zoom.gd b/src/Tools/UtilityTools/Zoom.gd
index 2fa158af3..0c2efbe0d 100644
--- a/src/Tools/UtilityTools/Zoom.gd
+++ b/src/Tools/UtilityTools/Zoom.gd
@@ -28,11 +28,13 @@ func _on_ModeOptions_item_selected(id: ZoomMode) -> void:
func _on_FitToFrame_pressed() -> void:
- Global.camera.fit_to_frame(Global.current_project.size)
+ for camera: CanvasCamera in get_tree().get_nodes_in_group("CanvasCameras"):
+ camera.fit_to_frame(Global.current_project.size)
func _on_100_pressed() -> void:
- Global.camera.zoom_100()
+ for camera: CanvasCamera in get_tree().get_nodes_in_group("CanvasCameras"):
+ camera.zoom_100()
func get_config() -> Dictionary:
@@ -50,20 +52,21 @@ func update_config() -> void:
func draw_start(pos: Vector2i) -> void:
super.draw_start(pos)
var mouse_pos := get_global_mouse_position()
- var viewport_rect := Rect2(Global.main_viewport.global_position, Global.main_viewport.size)
- var viewport_rect_2 := Rect2(
- Global.second_viewport.global_position, Global.second_viewport.size
- )
-
- if viewport_rect.has_point(mouse_pos):
- Global.camera.zoom_camera(_zoom_mode * 2 - 1)
- elif viewport_rect_2.has_point(mouse_pos):
- Global.camera2.zoom_camera(_zoom_mode * 2 - 1)
+ for camera: CanvasCamera in get_tree().get_nodes_in_group("CanvasCameras"):
+ var viewport_container := camera.get_viewport().get_parent() as SubViewportContainer
+ var viewport_rect := Rect2(viewport_container.global_position, viewport_container.size)
+ if viewport_rect.has_point(mouse_pos):
+ camera.zoom_camera(_zoom_mode * 2 - 1)
func draw_move(pos: Vector2i) -> void:
super.draw_move(pos)
- Global.camera.zoom_camera(-_relative.x / 3)
+ var mouse_pos := get_global_mouse_position()
+ for camera: CanvasCamera in get_tree().get_nodes_in_group("CanvasCameras"):
+ var viewport_container := camera.get_viewport().get_parent() as SubViewportContainer
+ var viewport_rect := Rect2(viewport_container.global_position, viewport_container.size)
+ if viewport_rect.has_point(mouse_pos):
+ camera.zoom_camera(-_relative.x / 3)
func draw_end(pos: Vector2i) -> void:
diff --git a/src/UI/Canvas/Canvas.gd b/src/UI/Canvas/Canvas.gd
index 2f35195e0..35867c633 100644
--- a/src/UI/Canvas/Canvas.gd
+++ b/src/UI/Canvas/Canvas.gd
@@ -98,7 +98,7 @@ func _input(event: InputEvent) -> void:
func camera_zoom() -> void:
- for camera in Global.cameras:
+ for camera: CanvasCamera in get_tree().get_nodes_in_group("CanvasCameras"):
camera.fit_to_frame(Global.current_project.size)
Global.transparent_checker.update_rect()
diff --git a/src/UI/Canvas/CanvasCamera.gd b/src/UI/Canvas/CanvasCamera.gd
index c75e4a22b..19465324f 100644
--- a/src/UI/Canvas/CanvasCamera.gd
+++ b/src/UI/Canvas/CanvasCamera.gd
@@ -142,7 +142,13 @@ func zoom_100() -> void:
func fit_to_frame(size: Vector2) -> void:
- # temporarily disable integer zoom
+ viewport_container = get_viewport().get_parent()
+ var h_ratio := viewport_container.size.x / size.x
+ var v_ratio := viewport_container.size.y / size.y
+ var ratio := minf(h_ratio, v_ratio)
+ if ratio == 0 or !viewport_container.visible:
+ return
+ # Temporarily disable integer zoom.
var reset_integer_zoom := Global.integer_zoom
if reset_integer_zoom:
Global.integer_zoom = !Global.integer_zoom
@@ -150,33 +156,16 @@ func fit_to_frame(size: Vector2) -> void:
# Adjust to the rotated size:
if camera_angle != 0.0:
- # Calculating the rotated corners of the frame to find its rotated size
+ # Calculating the rotated corners of the frame to find its rotated size.
var a := Vector2.ZERO # Top left
- var b := Vector2(size.x, 0).rotated(camera_angle) # Top right
- var c := Vector2(0, size.y).rotated(camera_angle) # Bottom left
- var d := Vector2(size.x, size.y).rotated(camera_angle) # Bottom right
+ var b := Vector2(size.x, 0).rotated(camera_angle) # Top right.
+ var c := Vector2(0, size.y).rotated(camera_angle) # Bottom left.
+ var d := Vector2(size.x, size.y).rotated(camera_angle) # Bottom right.
- # Find how far apart each opposite point is on each axis, and take the longer one
+ # Find how far apart each opposite point is on each axis, and take the longer one.
size.x = maxf(absf(a.x - d.x), absf(b.x - c.x))
size.y = maxf(absf(a.y - d.y), absf(b.y - c.y))
- viewport_container = get_viewport().get_parent()
- var h_ratio := viewport_container.size.x / size.x
- var v_ratio := viewport_container.size.y / size.y
- var ratio := minf(h_ratio, v_ratio)
- if ratio == 0 or !viewport_container.visible:
- ratio = 0.1 # Set it to a non-zero value just in case
- # If the ratio is 0, it means that the viewport container is hidden
- # in that case, use the other viewport to get the ratio
- if index == Cameras.MAIN:
- h_ratio = Global.second_viewport.size.x / size.x
- v_ratio = Global.second_viewport.size.y / size.y
- ratio = minf(h_ratio, v_ratio)
- elif index == Cameras.SECOND:
- h_ratio = Global.main_viewport.size.x / size.x
- v_ratio = Global.main_viewport.size.y / size.y
- ratio = minf(h_ratio, v_ratio)
-
ratio = clampf(ratio, 0.1, ratio)
zoom = Vector2(ratio, ratio)
if reset_integer_zoom:
diff --git a/src/UI/CanvasPreviewContainer/CanvasPreviewContainer.tscn b/src/UI/CanvasPreviewContainer/CanvasPreviewContainer.tscn
index 715a8e54e..097f0c53b 100644
--- a/src/UI/CanvasPreviewContainer/CanvasPreviewContainer.tscn
+++ b/src/UI/CanvasPreviewContainer/CanvasPreviewContainer.tscn
@@ -77,7 +77,7 @@ anchors_preset = 0
[node name="CanvasPreview" parent="VBox/HBox/PreviewViewportContainer/SubViewport" instance=ExtResource("5")]
unique_name_in_owner = true
-[node name="CameraPreview" type="Node2D" parent="VBox/HBox/PreviewViewportContainer/SubViewport"]
+[node name="CameraPreview" type="Node2D" parent="VBox/HBox/PreviewViewportContainer/SubViewport" groups=["CanvasCameras"]]
unique_name_in_owner = true
script = ExtResource("5_ge2km")
index = 2
@@ -122,10 +122,9 @@ layout_mode = 2
size_flags_horizontal = 3
mouse_default_cursor_shape = 2
clip_text = true
-item_count = 2
selected = 0
+item_count = 2
popup/item_0/text = "All frames"
-popup/item_0/id = 0
popup/item_1/text = "Current frame as spritesheet"
popup/item_1/id = 1
diff --git a/src/UI/UI.tscn b/src/UI/UI.tscn
index 1bb78eb62..c6b892717 100644
--- a/src/UI/UI.tscn
+++ b/src/UI/UI.tscn
@@ -325,7 +325,7 @@ anchors_preset = 0
[node name="Canvas" parent="DockableContainer/Main Canvas/ViewportandVerticalRuler/SubViewportContainer/SubViewport" instance=ExtResource("19")]
-[node name="Camera2D" type="Node2D" parent="DockableContainer/Main Canvas/ViewportandVerticalRuler/SubViewportContainer/SubViewport"]
+[node name="Camera2D" type="Node2D" parent="DockableContainer/Main Canvas/ViewportandVerticalRuler/SubViewportContainer/SubViewport" groups=["CanvasCameras"]]
script = ExtResource("7")
[node name="CanvasLayer" type="CanvasLayer" parent="DockableContainer/Main Canvas/ViewportandVerticalRuler/SubViewportContainer/SubViewport"]
@@ -361,7 +361,7 @@ anchors_preset = 0
[node name="CanvasPreview" parent="DockableContainer/Second Canvas/SubViewport" instance=ExtResource("2")]
-[node name="Camera2D2" type="Node2D" parent="DockableContainer/Second Canvas/SubViewport"]
+[node name="Camera2D2" type="Node2D" parent="DockableContainer/Second Canvas/SubViewport" groups=["CanvasCameras"]]
script = ExtResource("7")
index = 1
From d05787d6ef14c1fe640acc59561a9253f8b7a5c6 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 11 Oct 2024 16:24:44 +0300
Subject: [PATCH 094/162] Add a new "CanvasPreviews" node group for the canvas
previews
---
project.godot | 1 +
src/Autoload/Global.gd | 14 ++------------
.../CanvasPreviewContainer.tscn | 2 +-
src/UI/Nodes/TransparentChecker.gd | 4 ++--
src/UI/UI.tscn | 2 +-
5 files changed, 7 insertions(+), 16 deletions(-)
diff --git a/project.godot b/project.godot
index 3737bddf8..12285e151 100644
--- a/project.godot
+++ b/project.godot
@@ -64,6 +64,7 @@ enabled=PackedStringArray("res://addons/aimg_io/plugin.cfg", "res://addons/docka
[global_group]
CanvasCameras=""
+CanvasPreviews=""
[importer_defaults]
diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd
index 5b8259fae..24ee555f7 100644
--- a/src/Autoload/Global.gd
+++ b/src/Autoload/Global.gd
@@ -608,18 +608,8 @@ var cel_button_scene: PackedScene = load("res://src/UI/Timeline/CelButton.tscn")
@onready var main_viewport: SubViewportContainer = control.find_child("SubViewportContainer")
## The main canvas node. It has the [param Canvas.gd] script attached.
@onready var canvas: Canvas = main_viewport.find_child("Canvas")
-## Contains viewport of the second canvas preview.
-## It has the [param ViewportContainer.gd] script attached.
-@onready var second_viewport: SubViewportContainer = control.find_child("Second Canvas")
-## The panel container of the canvas preview.
-## It has the [param CanvasPreviewContainer.gd] script attached.
-@onready var canvas_preview_container: Container = control.find_child("Canvas Preview")
## The global tool options. It has the [param GlobalToolOptions.gd] script attached.
@onready var global_tool_options: PanelContainer = control.find_child("Global Tool Options")
-## Contains viewport of the canvas preview.
-@onready var small_preview_viewport: SubViewportContainer = canvas_preview_container.find_child(
- "PreviewViewportContainer"
-)
## Camera of the main canvas.
@onready var camera: CanvasCamera = main_viewport.find_child("Camera2D")
## Horizontal ruler of the main canvas. It has the [param HorizontalRuler.gd] script attached.
@@ -956,8 +946,8 @@ func undo_or_redo(
await RenderingServer.frame_post_draw
canvas.queue_redraw()
- second_viewport.get_child(0).get_node("CanvasPreview").queue_redraw()
- canvas_preview_container.canvas_preview.queue_redraw()
+ for canvas_preview in get_tree().get_nodes_in_group("CanvasPreviews"):
+ canvas_preview.queue_redraw()
if !project.has_changed:
if project == current_project:
get_window().title = get_window().title + "(*)"
diff --git a/src/UI/CanvasPreviewContainer/CanvasPreviewContainer.tscn b/src/UI/CanvasPreviewContainer/CanvasPreviewContainer.tscn
index 097f0c53b..1bc02c895 100644
--- a/src/UI/CanvasPreviewContainer/CanvasPreviewContainer.tscn
+++ b/src/UI/CanvasPreviewContainer/CanvasPreviewContainer.tscn
@@ -74,7 +74,7 @@ render_target_update_mode = 4
material = SubResource("1")
anchors_preset = 0
-[node name="CanvasPreview" parent="VBox/HBox/PreviewViewportContainer/SubViewport" instance=ExtResource("5")]
+[node name="CanvasPreview" parent="VBox/HBox/PreviewViewportContainer/SubViewport" groups=["CanvasPreviews"] instance=ExtResource("5")]
unique_name_in_owner = true
[node name="CameraPreview" type="Node2D" parent="VBox/HBox/PreviewViewportContainer/SubViewport" groups=["CanvasCameras"]]
diff --git a/src/UI/Nodes/TransparentChecker.gd b/src/UI/Nodes/TransparentChecker.gd
index a1d39cb8a..f01d2250f 100644
--- a/src/UI/Nodes/TransparentChecker.gd
+++ b/src/UI/Nodes/TransparentChecker.gd
@@ -11,8 +11,8 @@ func update_rect() -> void:
set_bounds(Global.current_project.size)
if self == Global.transparent_checker:
fit_rect(Global.current_project.tiles.get_bounding_rect())
- Global.second_viewport.get_node("SubViewport/TransparentChecker").update_rect()
- Global.small_preview_viewport.get_node("SubViewport/TransparentChecker").update_rect()
+ for canvas_preview in get_tree().get_nodes_in_group("CanvasPreviews"):
+ canvas_preview.get_viewport().get_node("TransparentChecker").update_rect()
material.set_shader_parameter("size", Global.checker_size)
material.set_shader_parameter("color1", Global.checker_color_1)
material.set_shader_parameter("color2", Global.checker_color_2)
diff --git a/src/UI/UI.tscn b/src/UI/UI.tscn
index c6b892717..c4406b0c2 100644
--- a/src/UI/UI.tscn
+++ b/src/UI/UI.tscn
@@ -359,7 +359,7 @@ render_target_update_mode = 0
material = SubResource("3")
anchors_preset = 0
-[node name="CanvasPreview" parent="DockableContainer/Second Canvas/SubViewport" instance=ExtResource("2")]
+[node name="CanvasPreview" parent="DockableContainer/Second Canvas/SubViewport" groups=["CanvasPreviews"] instance=ExtResource("2")]
[node name="Camera2D2" type="Node2D" parent="DockableContainer/Second Canvas/SubViewport" groups=["CanvasCameras"]]
script = ExtResource("7")
From dddcfed3c48004f3b411b42e92da6bbac1742550 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 11 Oct 2024 16:31:18 +0300
Subject: [PATCH 095/162] Add a new "CanvasRulers" node group for the canvas
rulers
---
src/Autoload/Global.gd | 9 ++++-----
src/UI/Canvas/Rulers/HorizontalRuler.gd | 4 +++-
src/UI/TopMenuContainer/TopMenuContainer.gd | 2 --
src/UI/UI.tscn | 4 ++--
4 files changed, 9 insertions(+), 10 deletions(-)
diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd
index 24ee555f7..2e504068d 100644
--- a/src/Autoload/Global.gd
+++ b/src/Autoload/Global.gd
@@ -561,7 +561,10 @@ var draw_grid := false
## If [code]true[/code], the pixel grid is visible.
var draw_pixel_grid := false
## If [code]true[/code], the rulers are visible.
-var show_rulers := true
+var show_rulers := true:
+ set(value):
+ show_rulers = value
+ get_tree().set_group(&"CanvasRulers", "visible", value)
## If [code]true[/code], the guides are visible.
var show_guides := true
## If [code]true[/code], the mouse guides are visible.
@@ -612,10 +615,6 @@ var cel_button_scene: PackedScene = load("res://src/UI/Timeline/CelButton.tscn")
@onready var global_tool_options: PanelContainer = control.find_child("Global Tool Options")
## Camera of the main canvas.
@onready var camera: CanvasCamera = main_viewport.find_child("Camera2D")
-## Horizontal ruler of the main canvas. It has the [param HorizontalRuler.gd] script attached.
-@onready var horizontal_ruler: BaseButton = control.find_child("HorizontalRuler")
-## Vertical ruler of the main canvas. It has the [param VerticalRuler.gd] script attached.
-@onready var vertical_ruler: BaseButton = control.find_child("VerticalRuler")
## Transparent checker of the main canvas. It has the [param TransparentChecker.gd] script attached.
@onready var transparent_checker: ColorRect = control.find_child("TransparentChecker")
diff --git a/src/UI/Canvas/Rulers/HorizontalRuler.gd b/src/UI/Canvas/Rulers/HorizontalRuler.gd
index e08ef25d2..b60ca19aa 100644
--- a/src/UI/Canvas/Rulers/HorizontalRuler.gd
+++ b/src/UI/Canvas/Rulers/HorizontalRuler.gd
@@ -8,6 +8,8 @@ var minor_subdivision := 4
var first: Vector2
var last: Vector2
+@onready var vertical_ruler := $"../ViewportandVerticalRuler/VerticalRuler" as Button
+
func _ready() -> void:
Global.project_switched.connect(queue_redraw)
@@ -120,7 +122,7 @@ func create_guide() -> void:
return
var mouse_pos := get_local_mouse_position()
if mouse_pos.x < RULER_WIDTH: # For double guides
- Global.vertical_ruler.create_guide()
+ vertical_ruler.create_guide()
var guide := Guide.new()
if absf(Global.camera.rotation_degrees) < 45 or absf(Global.camera.rotation_degrees) > 135:
guide.type = guide.Types.HORIZONTAL
diff --git a/src/UI/TopMenuContainer/TopMenuContainer.gd b/src/UI/TopMenuContainer/TopMenuContainer.gd
index cb5d0dd17..9b3c6534a 100644
--- a/src/UI/TopMenuContainer/TopMenuContainer.gd
+++ b/src/UI/TopMenuContainer/TopMenuContainer.gd
@@ -735,8 +735,6 @@ func _toggle_show_pixel_grid() -> void:
func _toggle_show_rulers() -> void:
Global.show_rulers = !Global.show_rulers
view_menu.set_item_checked(Global.ViewMenu.SHOW_RULERS, Global.show_rulers)
- Global.horizontal_ruler.visible = Global.show_rulers
- Global.vertical_ruler.visible = Global.show_rulers
func _toggle_show_guides() -> void:
diff --git a/src/UI/UI.tscn b/src/UI/UI.tscn
index c4406b0c2..1700b0868 100644
--- a/src/UI/UI.tscn
+++ b/src/UI/UI.tscn
@@ -275,7 +275,7 @@ tab_close_display_policy = 2
drag_to_rearrange_enabled = true
script = ExtResource("3")
-[node name="HorizontalRuler" type="Button" parent="DockableContainer/Main Canvas"]
+[node name="HorizontalRuler" type="Button" parent="DockableContainer/Main Canvas" groups=["CanvasRulers"]]
clip_contents = true
custom_minimum_size = Vector2(0, 16)
layout_mode = 2
@@ -291,7 +291,7 @@ size_flags_horizontal = 3
size_flags_vertical = 3
theme_override_constants/separation = 0
-[node name="VerticalRuler" type="Button" parent="DockableContainer/Main Canvas/ViewportandVerticalRuler"]
+[node name="VerticalRuler" type="Button" parent="DockableContainer/Main Canvas/ViewportandVerticalRuler" groups=["CanvasRulers"]]
clip_contents = true
custom_minimum_size = Vector2(16, 0)
layout_mode = 2
From b9bf8290b0c3216abdd6b2ae8c026cbf823e5029 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 11 Oct 2024 16:38:35 +0300
Subject: [PATCH 096/162] Remove `Global.animation_timer`
---
src/Autoload/Global.gd | 2 --
src/Tools/BaseDraw.gd | 4 +--
src/Tools/DesignTools/Bucket.gd | 4 +--
src/Tools/UtilityTools/Move.gd | 4 +--
src/UI/Timeline/AnimationTimeline.gd | 39 +++++++++++++---------------
5 files changed, 24 insertions(+), 29 deletions(-)
diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd
index 2e504068d..bb8dcd207 100644
--- a/src/Autoload/Global.gd
+++ b/src/Autoload/Global.gd
@@ -626,8 +626,6 @@ var cel_button_scene: PackedScene = load("res://src/UI/Timeline/CelButton.tscn")
@onready var cursor_position_label: Label = top_menu_container.find_child("CursorPosition")
## The animation timeline. It has the [param AnimationTimeline.gd] script attached.
@onready var animation_timeline: Panel = control.find_child("Animation Timeline")
-## The timer used by the animation timeline.
-@onready var animation_timer: Timer = animation_timeline.find_child("AnimationTimer")
## The container of frame buttons
@onready var frame_hbox: HBoxContainer = animation_timeline.find_child("FrameHBox")
## The container of layer buttons
diff --git a/src/Tools/BaseDraw.gd b/src/Tools/BaseDraw.gd
index 295ca9dfa..83ff42273 100644
--- a/src/Tools/BaseDraw.gd
+++ b/src/Tools/BaseDraw.gd
@@ -238,7 +238,7 @@ func commit_undo() -> void:
var project := Global.current_project
var frame := -1
var layer := -1
- if Global.animation_timer.is_stopped() and project.selected_cels.size() == 1:
+ if Global.animation_timeline.animation_timer.is_stopped() and project.selected_cels.size() == 1:
frame = project.current_frame
layer = project.current_layer
@@ -694,7 +694,7 @@ func _get_undo_data() -> Dictionary:
var data := {}
var project := Global.current_project
var cels: Array[BaseCel] = []
- if Global.animation_timer.is_stopped():
+ if Global.animation_timeline.animation_timer.is_stopped():
for cel_index in project.selected_cels:
cels.append(project.frames[cel_index[0]].cels[cel_index[1]])
else:
diff --git a/src/Tools/DesignTools/Bucket.gd b/src/Tools/DesignTools/Bucket.gd
index 1862f256c..794ed5422 100644
--- a/src/Tools/DesignTools/Bucket.gd
+++ b/src/Tools/DesignTools/Bucket.gd
@@ -487,7 +487,7 @@ func commit_undo() -> void:
var project := Global.current_project
var frame := -1
var layer := -1
- if Global.animation_timer.is_stopped() and project.selected_cels.size() == 1:
+ if Global.animation_timeline.animation_timer.is_stopped() and project.selected_cels.size() == 1:
frame = project.current_frame
layer = project.current_layer
@@ -502,7 +502,7 @@ func commit_undo() -> void:
func _get_undo_data() -> Dictionary:
var data := {}
- if Global.animation_timer.is_stopped():
+ if Global.animation_timeline.animation_timer.is_stopped():
var images := _get_selected_draw_images()
for image in images:
data[image] = image.data
diff --git a/src/Tools/UtilityTools/Move.gd b/src/Tools/UtilityTools/Move.gd
index dcca36e9f..0520dcc6c 100644
--- a/src/Tools/UtilityTools/Move.gd
+++ b/src/Tools/UtilityTools/Move.gd
@@ -128,7 +128,7 @@ func _commit_undo(action: String) -> void:
var project := Global.current_project
var frame := -1
var layer := -1
- if Global.animation_timer.is_stopped() and project.selected_cels.size() == 1:
+ if Global.animation_timeline.animation_timer.is_stopped() and project.selected_cels.size() == 1:
frame = project.current_frame
layer = project.current_layer
@@ -145,7 +145,7 @@ func _get_undo_data() -> Dictionary:
var data := {}
var project := Global.current_project
var cels: Array[BaseCel] = []
- if Global.animation_timer.is_stopped():
+ if Global.animation_timeline.animation_timer.is_stopped():
for cel_index in project.selected_cels:
cels.append(project.frames[cel_index[0]].cels[cel_index[1]])
else:
diff --git a/src/UI/Timeline/AnimationTimeline.gd b/src/UI/Timeline/AnimationTimeline.gd
index e16cc793c..d495a2522 100644
--- a/src/UI/Timeline/AnimationTimeline.gd
+++ b/src/UI/Timeline/AnimationTimeline.gd
@@ -28,6 +28,7 @@ var global_layer_visibility := true
var global_layer_lock := false
var global_layer_expand := true
+@onready var animation_timer := $AnimationTimer as Timer
@onready var old_scroll := 0 ## The previous scroll state of $ScrollContainer.
@onready var tag_spacer := %TagSpacer as Control
@onready var layer_settings_container := %LayerSettingsContainer as VBoxContainer
@@ -69,7 +70,7 @@ func _ready() -> void:
cel_size_slider.value = cel_size
add_layer_list.get_popup().id_pressed.connect(add_layer)
frame_scroll_bar.value_changed.connect(_frame_scroll_changed)
- Global.animation_timer.wait_time = 1 / Global.current_project.fps
+ animation_timer.wait_time = 1 / Global.current_project.fps
fps_spinbox.value = Global.current_project.fps
_fill_blend_modes_option_button()
# Config loading.
@@ -651,7 +652,7 @@ func _on_AnimationTimer_timeout() -> void:
if first_frame == last_frame:
play_forward.button_pressed = false
play_backwards.button_pressed = false
- Global.animation_timer.stop()
+ animation_timer.stop()
return
Global.canvas.selection.transform_content_confirm()
@@ -661,25 +662,23 @@ func _on_AnimationTimer_timeout() -> void:
if project.current_frame < last_frame:
project.selected_cels.clear()
project.change_cel(project.current_frame + 1, -1)
- Global.animation_timer.wait_time = (
- project.frames[project.current_frame].duration * (1 / fps)
- )
- Global.animation_timer.start() # Change the frame, change the wait time and start a cycle
+ animation_timer.wait_time = project.frames[project.current_frame].duration * (1.0 / fps)
+ animation_timer.start() # Change the frame, change the wait time and start a cycle
else:
match animation_loop:
0: # No loop
play_forward.button_pressed = false
play_backwards.button_pressed = false
- Global.animation_timer.stop()
+ animation_timer.stop()
animation_finished.emit()
is_animation_running = false
1: # Cycle loop
project.selected_cels.clear()
project.change_cel(first_frame, -1)
- Global.animation_timer.wait_time = (
+ animation_timer.wait_time = (
project.frames[project.current_frame].duration * (1 / fps)
)
- Global.animation_timer.start()
+ animation_timer.start()
2: # Ping pong loop
animation_forward = false
_on_AnimationTimer_timeout()
@@ -688,25 +687,23 @@ func _on_AnimationTimer_timeout() -> void:
if project.current_frame > first_frame:
project.selected_cels.clear()
project.change_cel(project.current_frame - 1, -1)
- Global.animation_timer.wait_time = (
- project.frames[project.current_frame].duration * (1 / fps)
- )
- Global.animation_timer.start()
+ animation_timer.wait_time = project.frames[project.current_frame].duration * (1.0 / fps)
+ animation_timer.start()
else:
match animation_loop:
0: # No loop
play_backwards.button_pressed = false
play_forward.button_pressed = false
- Global.animation_timer.stop()
+ animation_timer.stop()
animation_finished.emit()
is_animation_running = false
1: # Cycle loop
project.selected_cels.clear()
project.change_cel(last_frame, -1)
- Global.animation_timer.wait_time = (
+ animation_timer.wait_time = (
project.frames[project.current_frame].duration * (1 / fps)
)
- Global.animation_timer.start()
+ animation_timer.start()
2: # Ping pong loop
animation_forward = true
_on_AnimationTimer_timeout()
@@ -746,16 +743,16 @@ func play_animation(play: bool, forward_dir: bool) -> void:
play_forward.toggled.connect(_on_PlayForward_toggled)
if play:
- Global.animation_timer.set_one_shot(true) # wait_time can't change correctly if it's playing
+ animation_timer.set_one_shot(true) # wait_time can't change correctly if it's playing
var duration: float = (
Global.current_project.frames[Global.current_project.current_frame].duration
)
- Global.animation_timer.wait_time = duration * (1 / Global.current_project.fps)
- Global.animation_timer.start()
+ animation_timer.wait_time = duration * (1 / Global.current_project.fps)
+ animation_timer.start()
animation_forward = forward_dir
animation_started.emit(forward_dir)
else:
- Global.animation_timer.stop()
+ animation_timer.stop()
animation_finished.emit()
is_animation_running = play
@@ -791,7 +788,7 @@ func _on_FirstFrame_pressed() -> void:
func _on_FPSValue_value_changed(value: float) -> void:
Global.current_project.fps = value
- Global.animation_timer.wait_time = 1 / Global.current_project.fps
+ animation_timer.wait_time = 1 / Global.current_project.fps
func _on_PastOnionSkinning_value_changed(value: float) -> void:
From ed5449bb66a176bc695c6fd987a0239a1e737576 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 11 Oct 2024 16:42:11 +0300
Subject: [PATCH 097/162] Use an enum for the loop types in the timeline
I should have done that years ago. Literally. I don't know what took so long.
---
src/UI/Timeline/AnimationTimeline.gd | 28 +++++++++++++++-------------
1 file changed, 15 insertions(+), 13 deletions(-)
diff --git a/src/UI/Timeline/AnimationTimeline.gd b/src/UI/Timeline/AnimationTimeline.gd
index d495a2522..5c591495f 100644
--- a/src/UI/Timeline/AnimationTimeline.gd
+++ b/src/UI/Timeline/AnimationTimeline.gd
@@ -3,11 +3,13 @@ extends Panel
signal animation_started(forward: bool)
signal animation_finished
+enum LoopType {NO, CYCLE, PINGPONG}
+
const FRAME_BUTTON_TSCN := preload("res://src/UI/Timeline/FrameButton.tscn")
const LAYER_FX_SCENE_PATH := "res://src/UI/Timeline/LayerEffects/LayerEffectsSettings.tscn"
var is_animation_running := false
-var animation_loop := 1 ## 0 is no loop, 1 is cycle loop, 2 is ping-pong loop.
+var animation_loop := LoopType.CYCLE
var animation_forward := true
var first_frame := 0
var last_frame := 0
@@ -617,16 +619,16 @@ func _on_timeline_settings_button_pressed() -> void:
func _on_LoopAnim_pressed() -> void:
var texture_button: TextureRect = loop_animation_button.get_child(0)
match animation_loop:
- 0: # Make it loop
- animation_loop = 1
+ LoopType.NO:
+ animation_loop = LoopType.CYCLE
Global.change_button_texturerect(texture_button, "loop.png")
loop_animation_button.tooltip_text = "Cycle loop"
- 1: # Make it ping-pong
- animation_loop = 2
+ LoopType.CYCLE:
+ animation_loop = LoopType.PINGPONG
Global.change_button_texturerect(texture_button, "loop_pingpong.png")
loop_animation_button.tooltip_text = "Ping-pong loop"
- 2: # Make it stop
- animation_loop = 0
+ LoopType.PINGPONG:
+ animation_loop = LoopType.NO
Global.change_button_texturerect(texture_button, "loop_none.png")
loop_animation_button.tooltip_text = "No loop"
@@ -666,20 +668,20 @@ func _on_AnimationTimer_timeout() -> void:
animation_timer.start() # Change the frame, change the wait time and start a cycle
else:
match animation_loop:
- 0: # No loop
+ LoopType.NO:
play_forward.button_pressed = false
play_backwards.button_pressed = false
animation_timer.stop()
animation_finished.emit()
is_animation_running = false
- 1: # Cycle loop
+ LoopType.CYCLE:
project.selected_cels.clear()
project.change_cel(first_frame, -1)
animation_timer.wait_time = (
project.frames[project.current_frame].duration * (1 / fps)
)
animation_timer.start()
- 2: # Ping pong loop
+ LoopType.PINGPONG:
animation_forward = false
_on_AnimationTimer_timeout()
@@ -691,20 +693,20 @@ func _on_AnimationTimer_timeout() -> void:
animation_timer.start()
else:
match animation_loop:
- 0: # No loop
+ LoopType.NO:
play_backwards.button_pressed = false
play_forward.button_pressed = false
animation_timer.stop()
animation_finished.emit()
is_animation_running = false
- 1: # Cycle loop
+ LoopType.CYCLE:
project.selected_cels.clear()
project.change_cel(last_frame, -1)
animation_timer.wait_time = (
project.frames[project.current_frame].duration * (1 / fps)
)
animation_timer.start()
- 2: # Ping pong loop
+ LoopType.PINGPONG:
animation_forward = true
_on_AnimationTimer_timeout()
frame_scroll_container.ensure_control_visible(
From dcd93b4366e4952acf7a5052ae66419a4451f6f5 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Fri, 11 Oct 2024 17:12:55 +0300
Subject: [PATCH 098/162] Remove `Global.open_sprites_dialog` and
`Global.save_sprites_dialog`.
---
src/Autoload/Global.gd | 4 ----
src/Autoload/OpenSave.gd | 1 -
src/Classes/Project.gd | 3 ---
src/Main.gd | 14 ++++++++++++--
src/UI/Timeline/AnimationTimeline.gd | 2 +-
src/UI/TopMenuContainer/TopMenuContainer.gd | 2 +-
6 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd
index bb8dcd207..98444e866 100644
--- a/src/Autoload/Global.gd
+++ b/src/Autoload/Global.gd
@@ -641,10 +641,6 @@ var cel_button_scene: PackedScene = load("res://src/UI/Timeline/CelButton.tscn")
## The patterns popup dialog used to display patterns
## It has the [param PatternsPopup.gd] script attached.
@onready var patterns_popup: Popup = control.find_child("PatternsPopup")
-## Dialog used to navigate and open images and projects.
-@onready var open_sprites_dialog: FileDialog = control.find_child("OpenSprite")
-## Dialog used to save (.pxo) projects.
-@onready var save_sprites_dialog: FileDialog = control.find_child("SaveSprite")
## Dialog used to export images. It has the [param ExportDialog.gd] script attached.
@onready var export_dialog: AcceptDialog = control.find_child("ExportDialog")
## An error dialog to show errors.
diff --git a/src/Autoload/OpenSave.gd b/src/Autoload/OpenSave.gd
index 037fe503c..466c9275e 100644
--- a/src/Autoload/OpenSave.gd
+++ b/src/Autoload/OpenSave.gd
@@ -276,7 +276,6 @@ func open_pxo_file(path: String, is_backup := false, replace_empty := true) -> v
# Loading a backup should not change window title and save path
new_project.save_path = path
get_window().title = new_project.name + " - Pixelorama " + Global.current_version
- Global.save_sprites_dialog.current_path = path
# Set last opened project path and save
Global.config_cache.set_value("data", "current_dir", path.get_base_dir())
Global.config_cache.set_value("data", "last_project_path", path)
diff --git a/src/Classes/Project.gd b/src/Classes/Project.gd
index bb75514e3..fbfee1362 100644
--- a/src/Classes/Project.gd
+++ b/src/Classes/Project.gd
@@ -203,9 +203,6 @@ func change_project() -> void:
Global.get_window().title = "%s - Pixelorama %s" % [name, Global.current_version]
if has_changed:
Global.get_window().title = Global.get_window().title + "(*)"
- if export_directory_path != "":
- Global.open_sprites_dialog.current_path = export_directory_path
- Global.save_sprites_dialog.current_path = export_directory_path
selection_map_changed()
diff --git a/src/Main.gd b/src/Main.gd
index 982e197df..521bbde1f 100644
--- a/src/Main.gd
+++ b/src/Main.gd
@@ -18,6 +18,9 @@ var splash_dialog: AcceptDialog:
@onready var main_ui := $MenuAndUI/UI/DockableContainer as DockableContainer
@onready var backup_confirmation: ConfirmationDialog = $Dialogs/BackupConfirmation
+## Dialog used to open images and project (.pxo) files.
+@onready var open_sprite_dialog := $Dialogs/OpenSprite as FileDialog
+## Dialog used to save project (.pxo) files.
@onready var save_sprite_dialog := $Dialogs/SaveSprite as FileDialog
@onready var save_sprite_html5: ConfirmationDialog = $Dialogs/SaveSpriteHTML5
@onready var tile_mode_offsets_dialog: ConfirmationDialog = $Dialogs/TileModeOffsetsDialog
@@ -157,6 +160,7 @@ some useful [SYSTEM OPTIONS] are:
func _init() -> void:
+ Global.project_switched.connect(_project_switched)
if not DirAccess.dir_exists_absolute("user://backups"):
DirAccess.make_dir_recursive_absolute("user://backups")
Global.shrink = _get_auto_display_scale()
@@ -177,7 +181,7 @@ func _ready() -> void:
quit_and_save_dialog.add_button("Exit without saving", false, "ExitWithoutSaving")
- Global.open_sprites_dialog.current_dir = Global.config_cache.get_value(
+ open_sprite_dialog.current_dir = Global.config_cache.get_value(
"data", "current_dir", OS.get_system_dir(OS.SYSTEM_DIR_DESKTOP)
)
save_sprite_dialog.current_dir = Global.config_cache.get_value(
@@ -203,6 +207,12 @@ func _input(event: InputEvent) -> void:
get_viewport().gui_get_focus_owner().release_focus()
+func _project_switched() -> void:
+ if Global.current_project.export_directory_path != "":
+ open_sprite_dialog.current_path = Global.current_project.export_directory_path
+ save_sprite_dialog.current_path = Global.current_project.export_directory_path
+
+
# Taken from https://github.com/godotengine/godot/blob/3.x/editor/editor_settings.cpp#L1474
func _get_auto_display_scale() -> float:
if OS.get_name() == "macOS":
@@ -462,7 +472,7 @@ func save_project(path: String) -> void:
]
var success := OpenSave.save_pxo_file(path, false, include_blended, project_to_save)
if success:
- Global.open_sprites_dialog.current_dir = path.get_base_dir()
+ open_sprite_dialog.current_dir = path.get_base_dir()
if is_quitting_on_save:
changed_projects_on_quit.pop_front()
_save_on_quit_confirmation()
diff --git a/src/UI/Timeline/AnimationTimeline.gd b/src/UI/Timeline/AnimationTimeline.gd
index 5c591495f..a26b9acaa 100644
--- a/src/UI/Timeline/AnimationTimeline.gd
+++ b/src/UI/Timeline/AnimationTimeline.gd
@@ -3,7 +3,7 @@ extends Panel
signal animation_started(forward: bool)
signal animation_finished
-enum LoopType {NO, CYCLE, PINGPONG}
+enum LoopType { NO, CYCLE, PINGPONG }
const FRAME_BUTTON_TSCN := preload("res://src/UI/Timeline/FrameButton.tscn")
const LAYER_FX_SCENE_PATH := "res://src/UI/Timeline/LayerEffects/LayerEffectsSettings.tscn"
diff --git a/src/UI/TopMenuContainer/TopMenuContainer.gd b/src/UI/TopMenuContainer/TopMenuContainer.gd
index 9b3c6534a..f27505ef1 100644
--- a/src/UI/TopMenuContainer/TopMenuContainer.gd
+++ b/src/UI/TopMenuContainer/TopMenuContainer.gd
@@ -535,7 +535,7 @@ func _open_project_file() -> void:
if OS.get_name() == "Web":
Html5FileExchange.load_image()
else:
- _popup_dialog(Global.open_sprites_dialog)
+ _popup_dialog(Global.control.open_sprite_dialog)
Global.control.opensprite_file_selected = false
From 970b24ec407060bce80f2159fc69cd4a4ad26d0f Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Sat, 12 Oct 2024 00:52:18 +0300
Subject: [PATCH 099/162] Fix 3DShapeEdit option values not updating when
selecting 3D objects
---
src/Tools/3DTools/3DShapeEdit.gd | 2 +-
src/Tools/3DTools/3DShapeEdit.tscn | 17 +++++++----------
2 files changed, 8 insertions(+), 11 deletions(-)
diff --git a/src/Tools/3DTools/3DShapeEdit.gd b/src/Tools/3DTools/3DShapeEdit.gd
index 29d841614..b68a99e9c 100644
--- a/src/Tools/3DTools/3DShapeEdit.gd
+++ b/src/Tools/3DTools/3DShapeEdit.gd
@@ -359,7 +359,7 @@ func _set_node_values(to_edit: Object, properties: Dictionary) -> void:
if property_path.ends_with("v2"):
property_path = property_path.replace("v2", "")
var value = to_edit.get_indexed(property_path)
- if not is_instance_valid(value):
+ if value == null:
continue
if "scale" in prop:
value *= 100
diff --git a/src/Tools/3DTools/3DShapeEdit.tscn b/src/Tools/3DTools/3DShapeEdit.tscn
index 01cc9c90f..564f56fe4 100644
--- a/src/Tools/3DTools/3DShapeEdit.tscn
+++ b/src/Tools/3DTools/3DShapeEdit.tscn
@@ -6,7 +6,7 @@
[ext_resource type="PackedScene" uid="uid://yjhp0ssng2mp" path="res://src/UI/Nodes/ValueSlider.tscn" id="4"]
[ext_resource type="Script" path="res://src/UI/Nodes/ValueSlider.gd" id="5"]
[ext_resource type="Script" path="res://src/UI/Nodes/CollapsibleContainer.gd" id="6"]
-[ext_resource type="PackedScene" path="res://src/UI/Nodes/ValueSliderV3.tscn" id="7"]
+[ext_resource type="PackedScene" uid="uid://dpoteid430evf" path="res://src/UI/Nodes/ValueSliderV3.tscn" id="7"]
[sub_resource type="InputEventAction" id="InputEventAction_8sqgw"]
action = &"delete"
@@ -31,10 +31,9 @@ unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
mouse_default_cursor_shape = 2
-item_count = 1
selected = 0
+item_count = 1
popup/item_0/text = "None"
-popup/item_0/id = 0
[node name="NewObjectMenuButton" type="MenuButton" parent="HandleObjects" index="2"]
unique_name_in_owner = true
@@ -80,10 +79,9 @@ unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
mouse_default_cursor_shape = 2
-item_count = 3
selected = 0
+item_count = 3
popup/item_0/text = "Perspective"
-popup/item_0/id = 0
popup/item_1/text = "Orthogonal"
popup/item_1/id = 1
popup/item_2/text = "Frustum"
@@ -552,7 +550,7 @@ focus_mode = 2
mouse_default_cursor_shape = 2
theme_type_variation = &"ValueSlider"
min_value = 1.0
-max_value = 10.0
+max_value = 128.0
value = 1.0
allow_greater = true
nine_patch_stretch = true
@@ -561,6 +559,7 @@ stretch_margin_top = 3
stretch_margin_right = 3
stretch_margin_bottom = 3
script = ExtResource("5")
+snap_step = 2.0
[node name="MeshOffsetLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="26"]
layout_mode = 2
@@ -614,10 +613,9 @@ unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
mouse_default_cursor_shape = 2
-item_count = 3
selected = 0
+item_count = 3
popup/item_0/text = "Left"
-popup/item_0/id = 0
popup/item_1/text = "Center"
popup/item_1/id = 1
popup/item_2/text = "Right"
@@ -634,10 +632,9 @@ unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
mouse_default_cursor_shape = 2
-item_count = 3
selected = 0
+item_count = 3
popup/item_0/text = "Top"
-popup/item_0/id = 0
popup/item_1/text = "Center"
popup/item_1/id = 1
popup/item_2/text = "Bottom"
From bbf0ae80408de7441d8ace9031763f8dc46c873a Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Sat, 12 Oct 2024 01:14:37 +0300
Subject: [PATCH 100/162] Add a 3D text depth option
---
Translations/Translations.pot | 7 +++++
src/Classes/Cel3DObject.gd | 2 ++
src/Tools/3DTools/3DShapeEdit.gd | 3 +-
src/Tools/3DTools/3DShapeEdit.tscn | 44 ++++++++++++++++++++++++------
4 files changed, 46 insertions(+), 10 deletions(-)
diff --git a/Translations/Translations.pot b/Translations/Translations.pot
index c1e88df21..027ebe2d4 100644
--- a/Translations/Translations.pot
+++ b/Translations/Translations.pot
@@ -3035,6 +3035,10 @@ msgstr ""
msgid "Text:"
msgstr ""
+#. Refers to the depth of something, such as the depth of a 3D object.
+msgid "Depth:"
+msgstr ""
+
#. Found in the tool options of the 3D Shape Edit tool, under the Mesh category if a Text object is selected. Refers to the size of one pixel's width on the text to scale it in 3D.
msgid "Pixel size:"
msgstr ""
@@ -3046,6 +3050,9 @@ msgstr ""
msgid "Horizontal alignment:"
msgstr ""
+msgid "Vertical alignment:"
+msgstr ""
+
msgid "Left"
msgstr ""
diff --git a/src/Classes/Cel3DObject.gd b/src/Classes/Cel3DObject.gd
index b03f07ee0..615dc65c5 100644
--- a/src/Classes/Cel3DObject.gd
+++ b/src/Classes/Cel3DObject.gd
@@ -96,6 +96,7 @@ func serialize() -> Dictionary:
dict["mesh_text"] = mesh.text
dict["mesh_pixel_size"] = mesh.pixel_size
dict["mesh_font_size"] = mesh.font_size
+ dict["mesh_depth"] = mesh.depth
dict["mesh_offset"] = mesh.offset
dict["mesh_curve_step"] = mesh.curve_step
dict["mesh_horizontal_alignment"] = mesh.horizontal_alignment
@@ -157,6 +158,7 @@ func deserialize(dict: Dictionary) -> void:
mesh.text = dict["mesh_text"]
mesh.pixel_size = dict["mesh_pixel_size"]
mesh.font_size = dict["mesh_font_size"]
+ mesh.depth = dict["mesh_depth"]
mesh.offset = dict["mesh_offset"]
mesh.curve_step = dict["mesh_curve_step"]
mesh.horizontal_alignment = dict["mesh_horizontal_alignment"]
diff --git a/src/Tools/3DTools/3DShapeEdit.gd b/src/Tools/3DTools/3DShapeEdit.gd
index b68a99e9c..41f1ead52 100644
--- a/src/Tools/3DTools/3DShapeEdit.gd
+++ b/src/Tools/3DTools/3DShapeEdit.gd
@@ -58,9 +58,10 @@ var _object_names := {
"node3d_type:mesh:top_radius": $"%MeshTopRadius",
"node3d_type:mesh:bottom_radius": $"%MeshBottomRadius",
"node3d_type:mesh:text": $"%MeshText",
- "node3d_type:mesh:offset": $"%MeshOffsetV2",
"node3d_type:mesh:pixel_size": $"%MeshPixelSize",
"node3d_type:mesh:font_size": $"%MeshFontSize",
+ "node3d_type:mesh:offset": $"%MeshOffsetV2",
+ "node3d_type:mesh:depth": $"%MeshDepth",
"node3d_type:mesh:curve_step": $"%MeshCurveStep",
"node3d_type:mesh:horizontal_alignment": $"%MeshHorizontalAlignment",
"node3d_type:mesh:vertical_alignment": $"%MeshVerticalAlignment",
diff --git a/src/Tools/3DTools/3DShapeEdit.tscn b/src/Tools/3DTools/3DShapeEdit.tscn
index 564f56fe4..7108be2c0 100644
--- a/src/Tools/3DTools/3DShapeEdit.tscn
+++ b/src/Tools/3DTools/3DShapeEdit.tscn
@@ -561,13 +561,37 @@ stretch_margin_bottom = 3
script = ExtResource("5")
snap_step = 2.0
-[node name="MeshOffsetLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="26"]
+[node name="MeshDepthLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="26"]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Depth:"
+clip_text = true
+
+[node name="MeshDepth" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="27"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+focus_mode = 2
+mouse_default_cursor_shape = 2
+theme_type_variation = &"ValueSlider"
+step = 0.001
+value = 0.05
+allow_greater = true
+nine_patch_stretch = true
+stretch_margin_left = 3
+stretch_margin_top = 3
+stretch_margin_right = 3
+stretch_margin_bottom = 3
+script = ExtResource("5")
+snap_step = 2.0
+
+[node name="MeshOffsetLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="28"]
layout_mode = 2
size_flags_horizontal = 3
text = "Offset:"
clip_text = true
-[node name="MeshOffsetV2" parent="ObjectOptions/MeshOptions/GridContainer" index="27" instance=ExtResource("3")]
+[node name="MeshOffsetV2" parent="ObjectOptions/MeshOptions/GridContainer" index="29" instance=ExtResource("3")]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
@@ -577,13 +601,13 @@ allow_lesser = true
show_ratio = true
snap_step = 0.01
-[node name="MeshCurveStepLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="28"]
+[node name="MeshCurveStepLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="30"]
layout_mode = 2
size_flags_horizontal = 3
text = "Curve step:"
clip_text = true
-[node name="MeshCurveStep" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="29"]
+[node name="MeshCurveStep" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="31"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
@@ -602,32 +626,34 @@ stretch_margin_right = 3
stretch_margin_bottom = 3
script = ExtResource("5")
-[node name="MeshHorizontalAlignmentLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="30"]
+[node name="MeshHorizontalAlignmentLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="32"]
layout_mode = 2
size_flags_horizontal = 3
text = "Horizontal alignment:"
clip_text = true
-[node name="MeshHorizontalAlignment" type="OptionButton" parent="ObjectOptions/MeshOptions/GridContainer" index="31"]
+[node name="MeshHorizontalAlignment" type="OptionButton" parent="ObjectOptions/MeshOptions/GridContainer" index="33"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
mouse_default_cursor_shape = 2
selected = 0
-item_count = 3
+item_count = 4
popup/item_0/text = "Left"
popup/item_1/text = "Center"
popup/item_1/id = 1
popup/item_2/text = "Right"
popup/item_2/id = 2
+popup/item_3/text = "Fill"
+popup/item_3/id = 3
-[node name="MeshVerticalAlignmentLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="32"]
+[node name="MeshVerticalAlignmentLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="34"]
layout_mode = 2
size_flags_horizontal = 3
text = "Vertical alignment:"
clip_text = true
-[node name="MeshVerticalAlignment" type="OptionButton" parent="ObjectOptions/MeshOptions/GridContainer" index="33"]
+[node name="MeshVerticalAlignment" type="OptionButton" parent="ObjectOptions/MeshOptions/GridContainer" index="35"]
unique_name_in_owner = true
layout_mode = 2
size_flags_horizontal = 3
From 9fcb06aa72e6788f331ba9f9080d85b270f26d80 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Sat, 12 Oct 2024 14:31:15 +0300
Subject: [PATCH 101/162] Add a 3D text line spacing option
---
Translations/Translations.pot | 4 ++++
src/Classes/Cel3DObject.gd | 2 ++
src/Tools/3DTools/3DShapeEdit.gd | 3 ++-
src/Tools/3DTools/3DShapeEdit.tscn | 25 +++++++++++++++++++++++++
4 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/Translations/Translations.pot b/Translations/Translations.pot
index 027ebe2d4..8afcb498e 100644
--- a/Translations/Translations.pot
+++ b/Translations/Translations.pot
@@ -3059,6 +3059,10 @@ msgstr ""
msgid "Right"
msgstr ""
+#. Refers to the vertical space between lines in a text.
+msgid "Line spacing:"
+msgstr ""
+
#. Found in the tool options of the 3D Shape Edit tool, under the Light category if a light is selected. Refers to the energy of the light. The more energy, the brighter it shines.
msgid "Energy:"
msgstr ""
diff --git a/src/Classes/Cel3DObject.gd b/src/Classes/Cel3DObject.gd
index 615dc65c5..e1bd67455 100644
--- a/src/Classes/Cel3DObject.gd
+++ b/src/Classes/Cel3DObject.gd
@@ -101,6 +101,7 @@ func serialize() -> Dictionary:
dict["mesh_curve_step"] = mesh.curve_step
dict["mesh_horizontal_alignment"] = mesh.horizontal_alignment
dict["mesh_vertical_alignment"] = mesh.vertical_alignment
+ dict["mesh_line_spacing"] = mesh.line_spacing
else:
dict["light_color"] = node3d_type.light_color
dict["light_energy"] = node3d_type.light_energy
@@ -163,6 +164,7 @@ func deserialize(dict: Dictionary) -> void:
mesh.curve_step = dict["mesh_curve_step"]
mesh.horizontal_alignment = dict["mesh_horizontal_alignment"]
mesh.vertical_alignment = dict["mesh_vertical_alignment"]
+ mesh.line_spacing = dict["mesh_line_spacing"]
else:
node3d_type.light_color = dict["light_color"]
node3d_type.light_energy = dict["light_energy"]
diff --git a/src/Tools/3DTools/3DShapeEdit.gd b/src/Tools/3DTools/3DShapeEdit.gd
index 41f1ead52..939dcd637 100644
--- a/src/Tools/3DTools/3DShapeEdit.gd
+++ b/src/Tools/3DTools/3DShapeEdit.gd
@@ -65,6 +65,7 @@ var _object_names := {
"node3d_type:mesh:curve_step": $"%MeshCurveStep",
"node3d_type:mesh:horizontal_alignment": $"%MeshHorizontalAlignment",
"node3d_type:mesh:vertical_alignment": $"%MeshVerticalAlignment",
+ "node3d_type:mesh:line_spacing": $"%MeshLineSpacing",
"node3d_type:light_color": $"%LightColor",
"node3d_type:light_energy": $"%LightEnergy",
"node3d_type:light_negative": $"%LightNegative",
@@ -75,7 +76,7 @@ var _object_names := {
}
-func sprite_changed_this_frame():
+func sprite_changed_this_frame() -> void:
_checker_update_qued = true
_old_cel_image = _cel.get_image()
Global.canvas.sprite_changed_this_frame = true
diff --git a/src/Tools/3DTools/3DShapeEdit.tscn b/src/Tools/3DTools/3DShapeEdit.tscn
index 7108be2c0..c2bbda60a 100644
--- a/src/Tools/3DTools/3DShapeEdit.tscn
+++ b/src/Tools/3DTools/3DShapeEdit.tscn
@@ -666,6 +666,31 @@ popup/item_1/id = 1
popup/item_2/text = "Bottom"
popup/item_2/id = 2
+[node name="MeshLineSpacingLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="36"]
+layout_mode = 2
+size_flags_horizontal = 3
+text = "Line spacing:"
+clip_text = true
+
+[node name="MeshLineSpacing" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="37"]
+unique_name_in_owner = true
+layout_mode = 2
+size_flags_horizontal = 3
+focus_mode = 2
+mouse_default_cursor_shape = 2
+theme_type_variation = &"ValueSlider"
+min_value = -10.0
+max_value = 10.0
+step = 0.001
+allow_greater = true
+allow_lesser = true
+nine_patch_stretch = true
+stretch_margin_left = 3
+stretch_margin_top = 3
+stretch_margin_right = 3
+stretch_margin_bottom = 3
+script = ExtResource("5")
+
[node name="LightOptions" type="VBoxContainer" parent="ObjectOptions" index="3"]
unique_name_in_owner = true
layout_mode = 2
From be7d45205ecdd2f6540a87b30bf97ee6fee23892 Mon Sep 17 00:00:00 2001
From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com>
Date: Sat, 12 Oct 2024 15:36:46 +0300
Subject: [PATCH 102/162] Remove Roboto-Italic
Pixelorama now takes ~100KB less space
---
assets/fonts/Roboto-Italic.ttf | Bin 173932 -> 0 bytes
assets/fonts/Roboto-Italic.ttf.import | 34 --------------------------
src/UI/Dialogs/AboutDialog.tscn | 11 ++++++---
3 files changed, 8 insertions(+), 37 deletions(-)
delete mode 100644 assets/fonts/Roboto-Italic.ttf
delete mode 100644 assets/fonts/Roboto-Italic.ttf.import
diff --git a/assets/fonts/Roboto-Italic.ttf b/assets/fonts/Roboto-Italic.ttf
deleted file mode 100644
index 6a1cee5b2948dbddf8fe6bb050a5cdca1c206dbf..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 173932
zcmcG%1y~%(7B*bgJvf5|2oM+`KpYYhh`YOOHnMSd;_faR;_mJlCLUtDaVPE}?(V|O
z{BQLz$lks8`=0N4{>i?5x~sdZPMtb+&M9e@P(p|&4uTk}RIF5aM|tCD!U}FCgte(s
zw@w4Azvp$r3hN1Jezr=3-^#xl{kREXGwu+QZF-#sQHAD>POMJ|U5{K^we8+Io(^an
zL`XnmWLmjx|Goy1l>ZhX(aUkaeuwyu-TQnC-b6@#T+{s>Tla}44#W%P$@?xHyAA5_
zapbaUgp}|m^kdFW?Ya*v-mGS8LVU^+qWE=c-@0AunoI5RZazF8+X)FSYdsg^x*e`_
zcIw`DU`)Gfso>p#5bvVhdbVvnH1S70l>eC!r=aew2gd74bB5<9;(0@l*4^8`UX{HD
zVfl+f09E39_UUVFP1=EiRam__fIvsb2vQUWuH^DZ_FOm+j7<*BK+$YRhml&EM(I7LgQm0N8
znV;3H5(^<6bPE}7&}H(TD6SZBVIZ8(MZMF0^egfQm?Npc#*vfaBB?Jrkm|}_k|geu
z;*j=6mPop@1J(rIhIAG2q$ZtiO<)B`c9xA4;iaqzc)kaar
ziIaGS^f*#NO~yT>E3L=?@lK;X!FzGBhD3@@WWC}^I*OlUwfdSI5znkw#CEb?Y_q;%
z*{xPyj2r?T%&U?*e6n>EizmsV0*MjrNwDxIl|>g)Lqw2DY(MFXG$HDeVEURw(Z^PA
z{(~6gxq6)hfuCS8fK(Fgt=GYCHMSAgPNV>vMJkATq!~X;dMGJmB!6T*%6D1UfWE;q
zMd@1-!Zuo`D)mTb`quhERE5l^T0fyao+1aSK%ZK_iL=(b;O~|iM%wVvq(^F<1@%%zJ<7>J@=~a
zWQXcSmV%edx*FE8B0tFm`5DA=QdF!XLFzo>CFYVp#6VI}^d!Z^80&qpnbc4Qks|a9
zDIl7W{GuocWuYWY=|YO&nVhN(;z-5Gk+p1ien0Qj675
zgpkrak^1tXG?FhM-*{81qpztOTS+Mkvu@+t$zAr2{LSiHUl3yM0=xp8fiHxl-UgDG
zj)w5BNx5ld?0es$qPCWuO;qcWP5gAD4Z
zJxB*Jfz%UuNk=u5bWm=S6-p&C(4mR-tV1_aL2XKQpbg85x1_Lg-#SH?&AJ)-7>=|G
z%0%mF@si9^b)=cH3;8uA=XJl6^15k|(;G5LJq$g1PGXT?U-c(+{g?GQ^uIFX7|m-y
z?t86&D!-sZzetD}N1{XtV7&FDa)v~Uu{cK>KT29D8%a&E3fJYy5VbD!v>)nun>14O
zc&;1}OA4zkL2FtMNxhbJRhLRZ>TkAq7+msis^Z`NVGPJ`rVI
zsiu&o$}_yPjzlO2Np6Qzq^fQibi>tpo}aLumhB;WLk4fi7XFru#dR0RvZ8tw{n|?E
z+w)euAnKmqUKha^_z)KK?RfOF8n8JdP^ZJB
z0)G$v>t)@n7PqcJ`&1N5@$7373tN+4ZAX%nwkY#9?8QM6rCUOZqaAYUQb~FB6v?Ta
zCcVTS(h_pMBD}3fRV&%7lp?3(0vgj0{ogkfZ3|^FaeuCo&l_)gkX9uoL-}TWHJ6
zko|P<2R%ajl@Q4&19nUGBhj)Sh-svxm}X5CORV4d0_zJ!k8*NDPj8WeYFAPS@~){y
zku8cVY-b^|jejJ|bqUrKwU+gk?j-UVNW$=J7oj6Hl__MQ!pSh`Mi=EC%D!ej$vw$O
zZiTObx3g2W6?R;}p2LGd2889tIcz_b4&$oL;IsU&+kg^E)~VUa0zS*yg3cpbfk||Z
zbw217c9QI37swp8%Q_o&Y=G!*{mRyn_zdei*qXMy
zE*UQEm|B21shvnMhcb})N#Y1y3I;#*l--b*3v~Mr;-uuZepI5ZPn4tNEKede92Cg*
z33&;dJzAw?r@EQURM(IMwE{UP`jc8pceME&^rt~&lh{bg;rUujwfc+Bq@eUAJQecI
zPO|e)q#UbA2Ev!c!|ptS{pkz4*%&(6SKVlXxCGjpKsu10#k$F%h_s>B7pOy5AP4_R
zx&pa?c-Z?Ipw;o-szP&4R$nFgJ|BeEg?Qr2C{dooAVA%jIb^kY5g4nN=_Vn`0L
z0@sx^T3wtVIh1?Iem=nFd}}W7lZAXpEOnTkR0k5yhlh~<(&3RuxLvRYHi%_VNHQ-f2twKqcz@rO@fr{
zu(``gT~P&fpJv^q7DxHW2gsqUKp)%&|1QgueCL3_y+DF=Z;{sw>s`qC7w{f(_5p%`
zD8LzrFwaXt(qHJ~=04$p54sd@A)s8PkEbz$9P>uo4&!Y*1R0QOZ=YjTopi{9rljD6s>wZ(zNOm?baD@}ddW1L_dy@-k9}ezUrZ4$#dG(6wjeu~V3y=dq3`AWRu{u&K@RbyRj~*rjK=*GSj++MOe2heMuw5*E(6L0z3UDF=+QO
zM$`HS+DYo3)L}U$`{#H}>WJ2^7<*~Y$nlqq#bx}Bm`RJf5nF3x3fZ^i*ahPyIab2G
z4l?f6`aGx>cgsGBm|yCs%umY`eMb5QZA^&RI-NiH9G(Y%6*BXs$nk+3D@r>c`IF;9
zX`f_Ymoc^ELyqNOD>Rz|UgSM4<8Sl}Z44-F6vlxv{+7?!b@`vvuG`x9S&pkcF|NZn
zh$7CCJjwB+-A>tgwez8kT`=CT$IuS>NhL=g^ks}CWc;u3FYTx7KN#0YS;(=593RMY
zd%kvR??YOpmKbJ
z_+yBQag8?iz?j<3&;MW4UcdiWDrG1A52zdL^M`-h&;RRd`}p_&ME_|w)5gp8ar1wp
zcHR09ikU8{*V;HRP5!daNc~M8!^kn;bCOp>Got4;tWT8y^kGk=+4QNo>=&{hYJIh#
z^|~Ay>1pIQ#3{2uhbnfTX!lEUK1cSgG+zpPl0v^=44bA;cHg6<$v`An
zYs>i`8UJYWKT==hJdmVm{#5pJ%{SVq<|C~i)BBUXY*_~Sxz?9$zV2|C!*(B}thF51?7kaf3vT_31zV3nzFwl9wWYXEe6)LrL8ZOdY^cq?=aIHt
z#`)=XTgLy=CZ~-Rq|KM-nxBv{KJ2$lld$^&8K0-;FJo9)2IBWD`C=@fjV+`vlKEpC
zqQ%|d1OBP1EJKUOW!x|0eT*5DWh9S`8MSy3*hxYtG+D-Bx%SPLMz;KCTPEzma
zgh3`_j4O(&FwTX73!$X{vg1U$8ILLsI{6=TA*F>Mc$Rem=K>|jwzbt1Pdm!Cl0V52?g>?9f=0(os`j(p<#-D>
zz^L%XH_WYwhBr2oKy)(EILQf+T)g-Y#_iS}Rm8}dZUB|Qa-gDf-s%angcs(eTL
zp*#leAaMv^Q!G4hdrl_cU&c?n&d5WmfF?XCIa{NqKPv?w^G{F6IMHOIU1|*AUHmd`
zXFjvHfhwyG=D-<)vP$8|?x1xm*?5vk`K*+tc307!(ppnKCfir*y^>G)4=us*w5_FO
z<3Wv_G?hdj)uEedb;D7sV&*E#X0~a6W*KKW*GkNEkk!nRMV6;C-;sjEKN}-b(a<}<
zgQi(FSs+{63$n7fr3uBJpL|ZMlcqg*6dHsyS>1Gr$?TaXEZmni1o>#v$60z2S}7b(h#V&u$W!u;
zSg1Sopy4!
zh)+mpNJL11kQP`BP($5AJwyFNgF^F$Rt;?x+CKdBTlV$HFJZA-%~s4&rq$YjTCYH@
zx01u;1W6{($a`X?dg@6dXf9fiHl(d+r?grxr`u5LpUf|<*2hun8>lrFuhMEg7PX$n
zXYo}$k?-TD`9;*4hzJoaDvP?Jt%w(c#YC}OY!oJuBrb>>;-UD8hV=*{L8XI61}zWz
z81xynCI%;i-r!~MH5d%xsC6MjvGiK6GORUhLap~2_GhVev$R@!WU6&L)S9B!2=c9|
zs5P{}`qlcF-mv~n&szV2>pTSP19kyB028ng*lhK&>a2?8yX6&DhVZkrw^XEI<{Reg
z=2PY!=Jn=v=9T6p=E=y>Vl~Sr%+M|Cy;Mu;FU*}I&s5}tqfBfvp&?mzl^nTFiK~F*+bbHYCLFWgpA8mNh+v%H{#E#Gt
zn%+z1GJcP7iW*Trpim~revs)$`_kc=F0-7{Zt@aOOviD(?G`xmSTc$YVF_$Ho55zXS!^~LO~$Y}
zY%ZI}=CcK4EE&fZvPEn$Tf&yIWn?^=z&5f?Y%|-!wz6$xB4#CxERmVmcD92|W`oHT
zGL;P_f3ipHF?+(EvS;i$nZ{nQm+TdL&EBxL>>Ybg5-_Xzfqi73*k|^IeP!Rs3^J2_
zXFu3a_KT%5GnqwZa~JN)_1uGdaxXTF4QJ!na-NsxArFgD*A~%sM;yF_Pw^`Dpm?`g7uvsM$nqHmKY|6^UwSX|4M7qIAJ8
zMh~Wq=HU8U<6Ds4iWiXmdC2oQm^8U2Gcr!8RBCefB6hnP%z(s(+GjuunJ
z6gp4zr%MR-9T4KYKTVT=WYTEql~^XY;#@*{EdwBXAi{dsXbo&2D69$m6d`SaEjD1C
znLtknd>0|GA+Y6y97EP4K#!+k6zB=y0@BBWCfmSuXBW*w*B^1_{M&p@VpapFpe}YQ8
z7l-smphayUuvN4eP!{PgK+6H;Q5IxED*)Ayj(X7QKnO@-stk8@e44nRjdGYqs7fVSq|plCA*0+~};HbCZr&a{Ed16>YC
z8P5mZ21xm#E$Dk2INFN-w1JHSg-4QL^1W05^5uDP?FVGXIXoA3xeykBb2m^a8-OeZ
zZDIpi0ty|Lz*>$bcXk5LEXDaL8wm1eHvs62)Km7!2C@$CAc<2P)`Q|g8wWxkxT6hZ
z6R5ilQonha4N}KBbdIAQQpaHnGcW073mZ^oc`v^4Zb
zVy;;O{2LJgHb^^&H9#Ulktbv=!hoE3_a11t4Op8*vs1O1Th
z3)&wTfOIL(fi_^?onSA52L2j!Ffbm^%Ql<{zy?U4Af~2aBO45a4+oe9hWMgy~f
zc}On^Iv-eovSb@A1ePFOw&79${a=g)mILUs(uZI#gq-sw{5|MqU<&|Vh3o^{kp2icK{|0))28uQlH`72tZ>0e$fxSrt^S-uzd>`}y@@WG45RiH&+e_-1%x?(r
z9rytR06zgUo^J+f0jvOIuOMFu=@%80CxLx+L}7p)>8(ILY!H({JpuGz3OxwIdqH@f
zqx_)KKpC9h2OSBF!}(><<-iBziHCzA-=I%ONBx2zqaeu}^eDKN4N_hP0>JLj-k?r^
zGtMDf19&lj59xyqDBs|X^HHGLY>>KR@C8r~9RrGt452uOZW+RXNSsdtjkbZ#04)T>
zfS=o-#em{?W+rG!8~9yN^iv56y)*Q+fzAPyd;oMV=qeke9vfEMfVC@PSPN{#Gtg7R
zCL3h`FhKVt5Q7p!q78H@=w4tS(wBik#|#H>zJg#8%La;aLQr=JigH4HY@lmEQCA6y
zGD9M4Ajm7EfDLpVDB3=x1)fOpu1sODF8m`9)zLjFA{Rp{|o8A
z1kND?i`54DH^R?Uz>IV}XC(P*7#-_2PNZ~NlReZr&R8)=q9bqFBEOO5GZ-p$u4tsK
z@*7z`Bh3?%-^lYBDjRut<@$}oniwVexT2{BYM9hm0
zzXpxNLX0CPPY#%j8rZK7XT9D-$v+dyW=?mn^0uGy0%x`qe
zSEE7WN?gMpnvibk1kY1>%w~F_KO+Om5J4Z&?HvZTC2ki47a?C6WAje3JlU
z7??Fo+@puw($ZutUGo{sPTXT4O&cfXA{7JnVw>3Wib!|KYb1GziMq4A)TF04?$#HN
z4iC^1hrDDrty-c$h&N7mv&L16=F-l1{R)M{ePo(wQLAL$?D9;B%@>;8U7o4EnpZ9q
zAkTC&2K-SxOrALm?^w5(zdUnnSSdC_%f+dGs~WL6WSaAscC~HKx!g2OZd+2Oxq9ne
z994PdR3o&^(>%g|HwM=!h(Y~fK*=ZkBOL-U}4^i2XR!1Is%0q%Y
zY?BA8JOpQ_{p1_{)j-s#lD}
zTlFK^U@1J*!^BO!Nznh(eyxf9-*R%CR;DM|0G^!}3g%(b*@
zTi5NbAKZR-Tj%cO-q-z=-dF#JeyaYyM-h(>9?LyWc--?;J@b23^X%mL-s=yqecm~}
z=Xk%%HYD5eY`=V}`KemC^T9Bj3asUep_BSRO5?hn(4l?-bhHaF~4
zPT!niIZNgIJ!h|+SHnw&4~`HKEhDZ*uFvJ4t4pr;xqr|7C{L9sD=cwU^afR=-iht46mP
zdupuqhq+LUh7q|K?ek!@GEz1EJkYuRpJyW{OHwY%5uW&4Wl
zH+5hg+I5KUFto$zj&U6qb^O|CQRl*)%XY5Wd3on&oj-N9c4^XObC+*j2XuYkt!B54
z-F9{RyL)i=3EgLPU)Ft7_uW16^_bb?Yfq(T_MYKA3-%n-^KJa(UJktm_j=L0LGM$2
zO7+>*w@BaFeP8t}+izii|NasE3-#~tKmPUT-@pIJ{*(J3?w``%JRopD$pKXdG#oH~
zz=?tR2i70hVqlMfa|d-BG;z?HL3;+B9qcoB^^ht77{yC<{n0aF^jd?pZZ0we?pT~6{w{6^kac9Ph@gC!g
zj;}Yq`S`yk1WYhaEIIMeq`8ykPVt@6cgoQz@1|CmYWlPEpWXhvKCSq)p$SSt(}eK}
z&!J>rm5wVruH3z5fqP9anc*4+d63Lmu+3P?K2W%dE;c`
zjl?2}n-f2pTue1hC$~Fq|84tUI|}b;x#RrKkex+#R@>QZXV0CZcFy0qd6$0I&|MdH
z7uvmG_pvM~SmA#wy{=KjMz9aiS?)#a4Cu?IgKYIW%B;olFpJpBHzvVR%>R{x%Qgdh1G
z|5_foaJ0Rt9Pu^u@T4S9@}#4*s&YO9v^#uTz5SC@#y0fjyFBt?f97EbB}L1
ze)RaY<8Mxg6TT-3oG5$Z_Y+-C3_UUH#F`UHC(fQoIq~s?<)qWekdrYdtDXGgWbcz>
zPA)uYI(g*et&^`$u~S~BB2JY$Rp(UuQv**;KDGGN_EV=$-9Pp5bgMJ^Gofb+pQ(K2
z_cNW(3_0`XnWblTp84y{xkhsHnTi~TQ7yg2*f@{7AKp1FAU;@eB)lEF6=@bZ?+hb~{d{QR=@iqDmNS1Md-dZpKuiB~pVIe+Eel`mIyS94q~
zaJAgkhF4o%?RIs{)j3z!Ufpx`{MD4JAFhdOKG*VJD|4;hwYJy#U;FdgvTMd`N3LDH
z_Vn8K>+P=(xIXdvvg^C9pS^zf`r8}IjZrt|-B^EP-;Ikm?%sHJliu{Y8GbYRX62iW
zZ??PH@8+nRb8oJ^x#Q;Ho7Zo?xcTdr+bzSbe7DNqYIv*ttzNe#+*)vJ+pVNqXK&rT
z_3k#io$dCh+p})3zP;=A$=fNnzuX~rT<-YY$$2OGPRTn}@3g(s^-iBVL+*^ZGv&^#
zJB#kDy0hud_B%;;j@&tO=klGWcYfS;zMJE2)ZMaof4kfKZu`64@AkX<{O-?tF86}&
zMc*rbuj##B_nzN-pTbj|Q@m30q?AjkmQpXJNlNRKJ}E;|#-vQaO3|W}RVkZNwx=Ye
z97(yFayRA4{R;PM+;4Ed!~J3R$KC(){_^|l?;pB<_5SMz{DJ?2f)A=aX#HT|gM