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 @@

- Build Passing - + Build Passing - Build Passing - + Build Passing - Code Size - + Code Size - Repository size - + Repository size - License - + License

- Downloads - + Downloads - Discord Chat - + Discord Chat - Crowdin Localized % - + Crowdin Localized % - Mentioned in Awesome Godot - + Mentioned in Awesome Godot

[![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 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

O45a4+oe9hWMgy~f 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

-xU>*^F=BPK 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 lQ}rTFGDc@=;e7F1K0Nz~x Date: Sat, 12 Oct 2024 15:44:06 +0300 Subject: [PATCH 103/162] Fix some text in the About dialog not having the text color of the theme --- src/UI/Dialogs/AboutDialog.gd | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/UI/Dialogs/AboutDialog.gd b/src/UI/Dialogs/AboutDialog.gd index e610bbbb3..a5a4ffade 100644 --- a/src/UI/Dialogs/AboutDialog.gd +++ b/src/UI/Dialogs/AboutDialog.gd @@ -224,15 +224,20 @@ const DONORS: PackedStringArray = [ @onready var donors_container := $AboutUI/Credits/Donors as VBoxContainer @onready var translators_container := $AboutUI/Credits/Translators as VBoxContainer @onready var licenses_container := $AboutUI/Credits/Licenses as VBoxContainer - @onready var authors := $AboutUI/Credits/Authors/AuthorTree as Tree @onready var donors := $AboutUI/Credits/Donors/DonorTree as Tree @onready var translators := $AboutUI/Credits/Translators/TranslatorTree as Tree @onready var license_tabs := $AboutUI/Credits/Licenses/LicenseTabs as TabBar @onready var license_text := $AboutUI/Credits/Licenses/LicenseText as TextEdit +@onready var pixelorama_slogan := ( + $AboutUI/IconsButtons/SloganAndLinks/VBoxContainer/PixeloramaSlogan as Label +) +@onready var copyright_label := $AboutUI/Copyright as Label func _ready() -> void: + pixelorama_slogan.label_settings.font_color = get_theme_color(&"font_color", &"Label") + copyright_label.label_settings.font_color = get_theme_color(&"font_color", &"Label") create_donors() license_tabs.add_tab("Pixelorama") license_tabs.add_tab("Godot") @@ -249,6 +254,14 @@ func _ready() -> void: license_text.text = licenses[0] +func _notification(what: int) -> void: + if not is_instance_valid(pixelorama_slogan): + return + if what == NOTIFICATION_THEME_CHANGED: + pixelorama_slogan.label_settings.font_color = get_theme_color(&"font_color", &"Label") + copyright_label.label_settings.font_color = get_theme_color(&"font_color", &"Label") + + func _on_AboutDialog_about_to_show() -> void: title = tr("About Pixelorama") + " " + Global.current_version From 1ed52903b38e5eeb925d1529d2b3d4370b77b404 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Sat, 12 Oct 2024 16:30:16 +0300 Subject: [PATCH 104/162] Implement the ability to change the font of a 3D text This code will also be useful for the text tool --- Translations/Translations.pot | 4 +++ src/Autoload/Global.gd | 32 +++++++++++++++++++-- src/Classes/Cel3DObject.gd | 2 ++ src/Tools/3DTools/3DShapeEdit.gd | 15 ++++++++++ src/Tools/3DTools/3DShapeEdit.tscn | 45 +++++++++++++++++++----------- 5 files changed, 79 insertions(+), 19 deletions(-) diff --git a/Translations/Translations.pot b/Translations/Translations.pot index 8afcb498e..bc63b953c 100644 --- a/Translations/Translations.pot +++ b/Translations/Translations.pot @@ -828,6 +828,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd index 98444e866..46f430172 100644 --- a/src/Autoload/Global.gd +++ b/src/Autoload/Global.gd @@ -163,6 +163,9 @@ var default_layouts: Array[DockableLayout] = [ preload("res://assets/layouts/Tallscreen.tres"), ] var layouts: Array[DockableLayout] = [] +var loaded_fonts: Array[Font] = [ + ThemeDB.fallback_font, preload("res://assets/fonts/Roboto-Regular.ttf") +] # Canvas related stuff ## Tells if the user allowed to draw on the canvas. Usually it is temporarily set to @@ -604,7 +607,6 @@ var cel_button_scene: PackedScene = load("res://src/UI/Timeline/CelButton.tscn") ## The control node (aka Main node). It has the [param Main.gd] script attached. @onready var control := get_tree().current_scene as Control - ## The project tabs bar. It has the [param Tabs.gd] script attached. @onready var tabs: TabBar = control.find_child("TabBar") ## Contains viewport of the main canvas. It has the [param ViewportContainer.gd] script attached. @@ -617,7 +619,6 @@ var cel_button_scene: PackedScene = load("res://src/UI/Timeline/CelButton.tscn") @onready var camera: CanvasCamera = main_viewport.find_child("Camera2D") ## Transparent checker of the main canvas. It has the [param TransparentChecker.gd] script attached. @onready var transparent_checker: ColorRect = control.find_child("TransparentChecker") - ## The perspective editor. It has the [param PerspectiveEditor.gd] script attached. @onready var perspective_editor := control.find_child("Perspective Editor") ## The top menu container. It has the [param TopMenuContainer.gd] script attached. @@ -634,7 +635,6 @@ var cel_button_scene: PackedScene = load("res://src/UI/Timeline/CelButton.tscn") @onready var cel_vbox: VBoxContainer = animation_timeline.find_child("CelVBox") ## The container of animation tags. @onready var tag_container: Control = animation_timeline.find_child("TagContainer") - ## The brushes popup dialog used to display brushes. ## It has the [param BrushesPopup.gd] script attached. @onready var brushes_popup: Popup = control.find_child("BrushesPopup") @@ -1028,6 +1028,32 @@ func find_nearest_locale(locale: String) -> String: return closest_locale +func get_available_font_names() -> PackedStringArray: + var font_names := PackedStringArray() + for font in loaded_fonts: + var font_name := font.get_font_name() + if font_name in font_names: + continue + font_names.append(font_name) + for system_font_name in OS.get_system_fonts(): + if system_font_name in font_names: + continue + font_names.append(system_font_name) + return font_names + + +func find_font_from_name(font_name: String) -> Font: + for font in loaded_fonts: + if font.get_font_name() == font_name: + return font + for system_font_name in OS.get_system_fonts(): + if system_font_name == font_name: + var system_font := SystemFont.new() + system_font.font_names = [font_name] + return system_font + return ThemeDB.fallback_font + + ## Used by undo/redo operations to store compressed images in memory. ## [param redo_data] and [param undo_data] are Dictionaries, ## with keys of type [Image] and [Dictionary] values, coming from [member Image.data]. diff --git a/src/Classes/Cel3DObject.gd b/src/Classes/Cel3DObject.gd index e1bd67455..b988d51ec 100644 --- a/src/Classes/Cel3DObject.gd +++ b/src/Classes/Cel3DObject.gd @@ -93,6 +93,7 @@ func serialize() -> Dictionary: dict["mesh_ring_segments"] = mesh.ring_segments dict["mesh_rings"] = mesh.rings Type.TEXT: + dict["mesh_font_name"] = mesh.font.get_font_name() dict["mesh_text"] = mesh.text dict["mesh_pixel_size"] = mesh.pixel_size dict["mesh_font_size"] = mesh.font_size @@ -156,6 +157,7 @@ func deserialize(dict: Dictionary) -> void: mesh.ring_segments = dict["mesh_ring_segments"] mesh.rings = dict["mesh_rings"] Type.TEXT: + mesh.font = Global.find_font_from_name(dict["mesh_font_name"]) mesh.text = dict["mesh_text"] mesh.pixel_size = dict["mesh_pixel_size"] mesh.font_size = dict["mesh_font_size"] diff --git a/src/Tools/3DTools/3DShapeEdit.gd b/src/Tools/3DTools/3DShapeEdit.gd index 939dcd637..8e3c8a348 100644 --- a/src/Tools/3DTools/3DShapeEdit.gd +++ b/src/Tools/3DTools/3DShapeEdit.gd @@ -58,6 +58,7 @@ var _object_names := { "node3d_type:mesh:top_radius": $"%MeshTopRadius", "node3d_type:mesh:bottom_radius": $"%MeshBottomRadius", "node3d_type:mesh:text": $"%MeshText", + "node3d_type:mesh:font": $"%MeshFont", "node3d_type:mesh:pixel_size": $"%MeshPixelSize", "node3d_type:mesh:font_size": $"%MeshFontSize", "node3d_type:mesh:offset": $"%MeshOffsetV2", @@ -98,6 +99,10 @@ func _ready() -> void: for object in _object_names: new_object_popup.add_item(_object_names[object], object) new_object_popup.id_pressed.connect(_new_object_popup_id_pressed) + # Load font names + for font_name in Global.get_available_font_names(): + $"%MeshFont".add_item(font_name) + # Connect the signals of the cel property nodes for prop in cel_properties: var node: Control = cel_properties[prop] if node is ValueSliderV3: @@ -108,6 +113,7 @@ func _ready() -> void: node.item_selected.connect(_cel_property_item_selected.bind(prop)) elif node is ColorPickerButton: node.color_changed.connect(_cel_property_color_changed.bind(prop)) + # Connect the signals of the object property nodes for prop in object_properties: var node: Control = object_properties[prop] if node is ValueSliderV3: @@ -365,6 +371,13 @@ func _set_node_values(to_edit: Object, properties: Dictionary) -> void: continue if "scale" in prop: value *= 100 + if value is Font: + var font_name: String = value.get_font_name() + value = 0 + for i in %MeshFont.item_count: + var item_name: String = %MeshFont.get_item_text(i) + if font_name == item_name: + value = i var node: Control = properties[prop] if node is Range or node is ValueSliderV3 or node is ValueSliderV2: if typeof(node.value) != typeof(value) and typeof(value) != TYPE_INT: @@ -393,6 +406,8 @@ func _set_value_from_node(to_edit: Object, value, prop: String) -> void: to_edit = to_edit.node3d_type.mesh if "scale" in prop: value /= 100 + if "font" in prop and not "font_" in prop: + value = Global.find_font_from_name(%MeshFont.get_item_text(value)) to_edit.set_indexed(prop, value) diff --git a/src/Tools/3DTools/3DShapeEdit.tscn b/src/Tools/3DTools/3DShapeEdit.tscn index c2bbda60a..8902c834c 100644 --- a/src/Tools/3DTools/3DShapeEdit.tscn +++ b/src/Tools/3DTools/3DShapeEdit.tscn @@ -510,13 +510,26 @@ custom_minimum_size = Vector2(150, 50) layout_mode = 2 size_flags_horizontal = 3 -[node name="MeshPixelSizeLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="22"] +[node name="MeshFontLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="22"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Font:" +clip_text = true + +[node name="MeshFont" type="OptionButton" parent="ObjectOptions/MeshOptions/GridContainer" index="23"] +unique_name_in_owner = true +layout_mode = 2 +size_flags_horizontal = 3 +mouse_default_cursor_shape = 2 +selected = 0 + +[node name="MeshPixelSizeLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="24"] layout_mode = 2 size_flags_horizontal = 3 text = "Pixel size:" clip_text = true -[node name="MeshPixelSize" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="23"] +[node name="MeshPixelSize" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="25"] unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 @@ -536,13 +549,13 @@ stretch_margin_bottom = 3 script = ExtResource("5") snap_step = 0.01 -[node name="MeshFontSizeLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="24"] +[node name="MeshFontSizeLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="26"] layout_mode = 2 size_flags_horizontal = 3 text = "Font size:" clip_text = true -[node name="MeshFontSize" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="25"] +[node name="MeshFontSize" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="27"] unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 @@ -561,13 +574,13 @@ stretch_margin_bottom = 3 script = ExtResource("5") snap_step = 2.0 -[node name="MeshDepthLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="26"] +[node name="MeshDepthLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="28"] layout_mode = 2 size_flags_horizontal = 3 text = "Depth:" clip_text = true -[node name="MeshDepth" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="27"] +[node name="MeshDepth" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="29"] unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 @@ -585,13 +598,13 @@ stretch_margin_bottom = 3 script = ExtResource("5") snap_step = 2.0 -[node name="MeshOffsetLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="28"] +[node name="MeshOffsetLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="30"] layout_mode = 2 size_flags_horizontal = 3 text = "Offset:" clip_text = true -[node name="MeshOffsetV2" parent="ObjectOptions/MeshOptions/GridContainer" index="29" instance=ExtResource("3")] +[node name="MeshOffsetV2" parent="ObjectOptions/MeshOptions/GridContainer" index="31" instance=ExtResource("3")] unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 @@ -601,13 +614,13 @@ allow_lesser = true show_ratio = true snap_step = 0.01 -[node name="MeshCurveStepLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="30"] +[node name="MeshCurveStepLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="32"] layout_mode = 2 size_flags_horizontal = 3 text = "Curve step:" clip_text = true -[node name="MeshCurveStep" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="31"] +[node name="MeshCurveStep" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="33"] unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 @@ -626,13 +639,13 @@ stretch_margin_right = 3 stretch_margin_bottom = 3 script = ExtResource("5") -[node name="MeshHorizontalAlignmentLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="32"] +[node name="MeshHorizontalAlignmentLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="34"] layout_mode = 2 size_flags_horizontal = 3 text = "Horizontal alignment:" clip_text = true -[node name="MeshHorizontalAlignment" type="OptionButton" parent="ObjectOptions/MeshOptions/GridContainer" index="33"] +[node name="MeshHorizontalAlignment" type="OptionButton" parent="ObjectOptions/MeshOptions/GridContainer" index="35"] unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 @@ -647,13 +660,13 @@ 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="34"] +[node name="MeshVerticalAlignmentLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="36"] layout_mode = 2 size_flags_horizontal = 3 text = "Vertical alignment:" clip_text = true -[node name="MeshVerticalAlignment" type="OptionButton" parent="ObjectOptions/MeshOptions/GridContainer" index="35"] +[node name="MeshVerticalAlignment" type="OptionButton" parent="ObjectOptions/MeshOptions/GridContainer" index="37"] unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 @@ -666,13 +679,13 @@ 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"] +[node name="MeshLineSpacingLabel" type="Label" parent="ObjectOptions/MeshOptions/GridContainer" index="38"] layout_mode = 2 size_flags_horizontal = 3 text = "Line spacing:" clip_text = true -[node name="MeshLineSpacing" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="37"] +[node name="MeshLineSpacing" type="TextureProgressBar" parent="ObjectOptions/MeshOptions/GridContainer" index="39"] unique_name_in_owner = true layout_mode = 2 size_flags_horizontal = 3 From c21e089e5829ecb0ee3df36401c2766b6980d485 Mon Sep 17 00:00:00 2001 From: Variable <77773850+Variable-ind@users.noreply.github.com> Date: Sun, 13 Oct 2024 03:57:10 +0500 Subject: [PATCH 105/162] Add alpha erase blend mode (#1117) * Add alpha erase blend mode * implemented suggestions --- src/Classes/Layers/BaseLayer.gd | 1 + src/Shaders/BlendLayers.gdshader | 48 ++++++++++++++++------------ src/UI/Timeline/AnimationTimeline.gd | 1 + src/UI/Timeline/LayerProperties.gd | 1 + 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/Classes/Layers/BaseLayer.gd b/src/Classes/Layers/BaseLayer.gd index d45ba7333..bd67c1d50 100644 --- a/src/Classes/Layers/BaseLayer.gd +++ b/src/Classes/Layers/BaseLayer.gd @@ -12,6 +12,7 @@ signal visibility_changed ## Emits when [member visible] is changed. enum BlendModes { 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. + ERASE, ## Subtracts the numerical value of alpha from the base alpha. 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. diff --git a/src/Shaders/BlendLayers.gdshader b/src/Shaders/BlendLayers.gdshader index 974394e3f..5db7d8f32 100644 --- a/src/Shaders/BlendLayers.gdshader +++ b/src/Shaders/BlendLayers.gdshader @@ -61,68 +61,74 @@ vec4 blend(int blend_type, vec4 current_color, vec4 prev_color, float opacity) { return prev_color; } vec4 result; + bool should_blend_alpha = true; switch(blend_type) { - case 1: // Darken + case 1: // Erase + result = prev_color; + result.a -= current_color.a; // clamping will be done at the end so not doing it here. + should_blend_alpha = false; + break; + case 2: // Darken result.rgb = min(prev_color.rgb, current_color.rgb); break; - case 2: // Multiply + case 3: // Multiply result.rgb = prev_color.rgb * current_color.rgb; break; - case 3: // Color burn + case 4: // Color burn result.rgb = 1.0 - (1.0 - prev_color.rgb) / current_color.rgb; break; - case 4: // Linear burn + case 5: // Linear burn result.rgb = prev_color.rgb + current_color.rgb - 1.0; break; - case 5: // Lighten + case 6: // Lighten result.rgb = max(prev_color.rgb, current_color.rgb); break; - case 6: // Screen + case 7: // Screen result.rgb = 1.0 - (1.0 - prev_color.rgb) * (1.0 - current_color.rgb); break; - case 7: // Color dodge + case 8: // Color dodge result.rgb = prev_color.rgb / (1.0 - current_color.rgb); break; - case 8: // Add (linear dodge) + case 9: // Add (linear dodge) result.rgb = prev_color.rgb + current_color.rgb; break; - case 9: // Overlay + case 10: // Overlay result.rgb = mix(2.0 * prev_color.rgb * current_color.rgb, 1.0 - 2.0 * (1.0 - current_color.rgb) * (1.0 - prev_color.rgb), round(prev_color.rgb)); break; - case 10: // Soft light + case 11: // Soft light result.rgb = mix(2.0 * prev_color.rgb * current_color.rgb + prev_color.rgb * prev_color.rgb * (1.0 - 2.0 * current_color.rgb), sqrt(prev_color.rgb) * (2.0 * current_color.rgb - 1.0) + (2.0 * prev_color.rgb) * (1.0 - current_color.rgb), round(prev_color.rgb)); break; - case 11: // Hard light + case 12: // Hard light result.rgb = mix(2.0 * prev_color.rgb * current_color.rgb, 1.0 - 2.0 * (1.0 - current_color.rgb) * (1.0 - prev_color.rgb), round(current_color.rgb)); break; - case 12: // Difference + case 13: // Difference result.rgb = abs(prev_color.rgb - current_color.rgb); break; - case 13: // Exclusion + case 14: // Exclusion result.rgb = prev_color.rgb + current_color.rgb - 2.0 * prev_color.rgb * current_color.rgb; break; - case 14: // Subtract + case 15: // Subtract result.rgb = prev_color.rgb - current_color.rgb; break; - case 15: // Divide + case 16: // Divide result.rgb = prev_color.rgb / current_color.rgb; break; - case 16: // Hue + case 17: // Hue vec3 current_hsl = rgb_to_hsl(current_color.rgb); vec3 prev_hsl = rgb_to_hsl(prev_color.rgb); result.rgb = hsl_to_rgb(vec3(current_hsl.r, prev_hsl.g, prev_hsl.b)); break; - case 17: // Saturation + case 18: // Saturation vec3 current_hsl = rgb_to_hsl(current_color.rgb); vec3 prev_hsl = rgb_to_hsl(prev_color.rgb); result.rgb = hsl_to_rgb(vec3(prev_hsl.r, current_hsl.g, prev_hsl.b)); break; - case 18: // Color + case 19: // Color vec3 current_hsl = rgb_to_hsl(current_color.rgb); vec3 prev_hsl = rgb_to_hsl(prev_color.rgb); result.rgb = hsl_to_rgb(vec3(current_hsl.r, current_hsl.g, prev_hsl.b)); break; - case 19: // Luminosity + case 20: // Luminosity vec3 current_hsl = rgb_to_hsl(current_color.rgb); vec3 prev_hsl = rgb_to_hsl(prev_color.rgb); result.rgb = hsl_to_rgb(vec3(prev_hsl.r, prev_hsl.g, current_hsl.b)); @@ -132,7 +138,9 @@ vec4 blend(int blend_type, vec4 current_color, vec4 prev_color, float opacity) { break; } result.rgb = mix(prev_color.rgb, result.rgb, current_color.a); - result.a = prev_color.a * (1.0 - current_color.a) + current_color.a; + if (should_blend_alpha){ + result.a = prev_color.a * (1.0 - current_color.a) + current_color.a; + } result = clamp(result, 0.0, 1.0); return mix(current_color, result, prev_color.a); } diff --git a/src/UI/Timeline/AnimationTimeline.gd b/src/UI/Timeline/AnimationTimeline.gd index a26b9acaa..2b126738d 100644 --- a/src/UI/Timeline/AnimationTimeline.gd +++ b/src/UI/Timeline/AnimationTimeline.gd @@ -239,6 +239,7 @@ func _fill_blend_modes_option_button() -> void: # 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("Erase", BaseLayer.BlendModes.ERASE) blend_modes_button.add_separator("Darken") blend_modes_button.add_item("Darken", BaseLayer.BlendModes.DARKEN) blend_modes_button.add_item("Multiply", BaseLayer.BlendModes.MULTIPLY) diff --git a/src/UI/Timeline/LayerProperties.gd b/src/UI/Timeline/LayerProperties.gd index eb58bdff9..f8753ac85 100644 --- a/src/UI/Timeline/LayerProperties.gd +++ b/src/UI/Timeline/LayerProperties.gd @@ -39,6 +39,7 @@ func _fill_blend_modes_option_button() -> void: # 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("Erase", BaseLayer.BlendModes.ERASE) 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) From 084bdcccb14d4870a18437e814fb0bff13fb01e6 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Sun, 13 Oct 2024 02:06:24 +0300 Subject: [PATCH 106/162] Use gdtoolkit's GitHub Action --- .github/workflows/static-checks.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/static-checks.yml b/.github/workflows/static-checks.yml index 7bf2fb610..4f386ff2b 100644 --- a/.github/workflows/static-checks.yml +++ b/.github/workflows/static-checks.yml @@ -19,8 +19,7 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - - name: Install gdtoolkit - run: pip3 install "gdtoolkit==4.*" + - uses: Scony/godot-gdscript-toolkit@master - name: Formatting checks run: gdformat --diff . - name: Linting checks From a2e5d165cb2e67845434cbd1d19abfa0b8f80b2d Mon Sep 17 00:00:00 2001 From: HuanWuCode Date: Sun, 13 Oct 2024 04:03:52 -0700 Subject: [PATCH 107/162] [skip ci] Update PerspectiveEditor.gd (#1119) --- src/UI/PerspectiveEditor/PerspectiveEditor.gd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/UI/PerspectiveEditor/PerspectiveEditor.gd b/src/UI/PerspectiveEditor/PerspectiveEditor.gd index 8db7402d5..bc0eae541 100644 --- a/src/UI/PerspectiveEditor/PerspectiveEditor.gd +++ b/src/UI/PerspectiveEditor/PerspectiveEditor.gd @@ -2,7 +2,7 @@ extends PanelContainer var axes: Node2D var do_pool := [] ## A pool that stores data of points removed by undo -var delete_pool := [] ## A pool that containing deleted data and their index +var delete_pool := [] ## A pool that contains deleted data and their index ## The vanishing point UI resource var vanishing_point_res := preload("res://src/UI/PerspectiveEditor/VanishingPoint.tscn") ## Option to show/hide tracker guides. (guides whose end points follow the mouse) @@ -73,7 +73,7 @@ func _update_points() -> void: # Delete old vanishing points for c in vanishing_point_container.get_children(): c.queue_free() - # Add the "updated" vanising points from the current_project + # Add the "updated" vanishing points from the current_project for idx in Global.current_project.vanishing_points.size(): # Create the point var vanishing_point := vanishing_point_res.instantiate() From 98997340906089abcc0ebba8a7e73a9e851ecdc0 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Sun, 13 Oct 2024 14:22:01 +0300 Subject: [PATCH 108/162] Ensure that the preview clears when switching to a different tool --- src/Tools/BaseTool.gd | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Tools/BaseTool.gd b/src/Tools/BaseTool.gd index c022e0437..519f5aa49 100644 --- a/src/Tools/BaseTool.gd +++ b/src/Tools/BaseTool.gd @@ -374,3 +374,4 @@ func _add_polylines_segment(lines: Array, start: Vector2i, end: Vector2i) -> voi func _exit_tree() -> void: if is_moving: draw_end(Global.canvas.current_pixel.floor()) + Global.canvas.previews_sprite.texture = null From 37f48e3372b5a3886d471340df421dfa38059c70 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Mon, 14 Oct 2024 12:42:41 +0300 Subject: [PATCH 109/162] [skip ci] Update CHANGELOG.md --- CHANGELOG.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05fe9a413..a8dd8fe71 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,13 +11,23 @@ Fayez Akhtar ([@Variable-ind](https://github.com/Variable-ind)) Built using Godot 4.3 ### Added +- It is now possible to make panels into floating windows. This allows for any panel in the user interface to be its own window, and if single window mode is disabled, you can move these windows anywhere you want. This is especially useful for multi-monitor setups. +- Added a new "color replace" mode to the Shading tool, that uses the colors of the palette to apply shading. [#1107](https://github.com/Orama-Interactive/Pixelorama/pull/1107) +- Added a new Erase blend mode. [#1117](https://github.com/Orama-Interactive/Pixelorama/pull/1117) +- It is now possible to change the font, depth and line spacing of 3D text. - 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) +- Added hotkeys to switch between tabs. Control+Tab to go to the next project tab, and Control+Shift+Tab to go to the previous. [#1109](https://github.com/Orama-Interactive/Pixelorama/pull/1109) +- Added menus next to each of the two mirroring buttons in the Global Tool Options, that allow users to automatically move the symmetry guides to the center of the canvas, or the view center. +- A new Reset category has been added to the Preferences that lets users easily restore certain options. ### 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. +- Fixed 3D Shape Edit tool option values not updating when switching between 3D objects. +- Tool previews are now being properly cleared when switching to other tools before finishing the action being performed by the previous tool. +- Fixed icons not being set to the correct color when launching Pixelorama with the dark theme. +- Fixed some text in the About dialog not having the text color of the theme. - 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 stretch and expand modes in the UI. [#1103](https://github.com/Orama-Interactive/Pixelorama/pull/1103) From fe5ced80854e972d4215df4e1704461990c50c02 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Mon, 14 Oct 2024 15:55:48 +0300 Subject: [PATCH 110/162] Set the backup confirmation dialog's `popup_window` to false --- src/Main.tscn | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Main.tscn b/src/Main.tscn index ba4c1a8d4..1dfb9224e 100644 --- a/src/Main.tscn +++ b/src/Main.tscn @@ -74,7 +74,6 @@ dialog_text = "This is an error message!" [node name="BackupConfirmation" type="ConfirmationDialog" parent="Dialogs"] size = Vector2i(320, 200) -popup_window = true dialog_text = "Autosaved project(s) from a crashed session were found. Do you want to recover the data?" dialog_autowrap = true From 4561c1fee4deed80d79149a9ec54e2ab45cb7107 Mon Sep 17 00:00:00 2001 From: Variable <77773850+Variable-ind@users.noreply.github.com> Date: Mon, 14 Oct 2024 18:08:10 +0500 Subject: [PATCH 111/162] improved rotate/flip brush UI (#1105) * Update BaseDraw.tscn * Update BaseDraw.gd * Implemented proposed changed, Also added a VFlowContainer for Rotate options --- src/Tools/BaseDraw.gd | 10 +++---- src/Tools/BaseDraw.tscn | 65 ++++++++++++++++++++++++++--------------- 2 files changed, 47 insertions(+), 28 deletions(-) diff --git a/src/Tools/BaseDraw.gd b/src/Tools/BaseDraw.gd index 83ff42273..bfcadbe3c 100644 --- a/src/Tools/BaseDraw.gd +++ b/src/Tools/BaseDraw.gd @@ -130,11 +130,11 @@ func set_config(config: Dictionary) -> void: func update_config() -> void: $Brush/BrushSize.value = _brush_size $ColorInterpolation.value = _brush_interpolate - $RotationOptions/Flip/FlipX.button_pressed = _brush_flip_x - $RotationOptions/Flip/FlipY.button_pressed = _brush_flip_y - $RotationOptions/Rotate/Rotate90.button_pressed = _brush_rotate_90 - $RotationOptions/Rotate/Rotate180.button_pressed = _brush_rotate_180 - $RotationOptions/Rotate/Rotate270.button_pressed = _brush_rotate_270 + %FlipX.button_pressed = _brush_flip_x + %FlipY.button_pressed = _brush_flip_y + %Rotate90.button_pressed = _brush_rotate_90 + %Rotate180.button_pressed = _brush_rotate_180 + %Rotate270.button_pressed = _brush_rotate_270 update_brush() diff --git a/src/Tools/BaseDraw.tscn b/src/Tools/BaseDraw.tscn index 69eedb916..fc6872696 100644 --- a/src/Tools/BaseDraw.tscn +++ b/src/Tools/BaseDraw.tscn @@ -9,7 +9,7 @@ resource_name = "rotate" allow_unpress = true -[sub_resource type="StyleBoxFlat" id="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 @@ -18,7 +18,7 @@ corner_radius_bottom_right = 5 corner_radius_bottom_left = 5 anti_aliasing = false -[sub_resource type="StyleBoxFlat" id="2"] +[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 @@ -38,44 +38,63 @@ script = ExtResource("3_76bek") text = "Rotation options" flat = true -[node name="Flip" type="HBoxContainer" parent="RotationOptions" index="1"] +[node name="GridContainer" type="GridContainer" parent="RotationOptions" index="1"] visible = false layout_mode = 2 +columns = 2 -[node name="FlipX" type="CheckBox" parent="RotationOptions/Flip" index="0"] +[node name="FlipLabel" type="Label" parent="RotationOptions/GridContainer" index="0"] +layout_mode = 2 +text = "Flip:" + +[node name="Flip" type="HBoxContainer" parent="RotationOptions/GridContainer" index="1"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="FlipX" type="CheckBox" parent="RotationOptions/GridContainer/Flip" index="0"] +unique_name_in_owner = true layout_mode = 2 mouse_default_cursor_shape = 2 -text = "Flip X" +text = "X" -[node name="FlipY" type="CheckBox" parent="RotationOptions/Flip" index="1"] +[node name="FlipY" type="CheckBox" parent="RotationOptions/GridContainer/Flip" index="1"] +unique_name_in_owner = true layout_mode = 2 mouse_default_cursor_shape = 2 -text = "Flip Y" +text = "Y" -[node name="Rotate" type="HBoxContainer" parent="RotationOptions" index="2"] -visible = false +[node name="RotateLabel" type="Label" parent="RotationOptions/GridContainer" index="2"] layout_mode = 2 +size_flags_vertical = 0 +text = "Rotate:" -[node name="Rotate90" type="CheckBox" parent="RotationOptions/Rotate" index="0"] +[node name="Rotate" type="HFlowContainer" parent="RotationOptions/GridContainer" index="3"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="Rotate90" type="CheckBox" parent="RotationOptions/GridContainer/Rotate" index="0"] +unique_name_in_owner = true layout_mode = 2 tooltip_text = "rotate the brush 90 degrees" mouse_default_cursor_shape = 2 button_group = SubResource("ButtonGroup_7u3x0") -text = "R 90" +text = "90°" -[node name="Rotate180" type="CheckBox" parent="RotationOptions/Rotate" index="1"] +[node name="Rotate180" type="CheckBox" parent="RotationOptions/GridContainer/Rotate" index="1"] +unique_name_in_owner = true layout_mode = 2 tooltip_text = "rotate the brush 180 degrees" mouse_default_cursor_shape = 2 button_group = SubResource("ButtonGroup_7u3x0") -text = "R 180" +text = "180°" -[node name="Rotate270" type="CheckBox" parent="RotationOptions/Rotate" index="2"] +[node name="Rotate270" type="CheckBox" parent="RotationOptions/GridContainer/Rotate" index="2"] +unique_name_in_owner = true layout_mode = 2 tooltip_text = "rotate the brush 270 degrees" mouse_default_cursor_shape = 2 button_group = SubResource("ButtonGroup_7u3x0") -text = "R 270" +text = "270°" [node name="Brush" type="HBoxContainer" parent="." index="3"] layout_mode = 2 @@ -87,11 +106,11 @@ layout_mode = 2 size_flags_horizontal = 0 tooltip_text = "Select a brush" mouse_default_cursor_shape = 2 -theme_override_styles/normal = SubResource("1") +theme_override_styles/focus = SubResource("2") +theme_override_styles/disabled = SubResource("2") theme_override_styles/hover = SubResource("1") theme_override_styles/pressed = SubResource("1") -theme_override_styles/disabled = SubResource("2") -theme_override_styles/focus = SubResource("2") +theme_override_styles/normal = SubResource("1") [node name="Texture" type="TextureRect" parent="Brush/Type" index="0"] layout_mode = 0 @@ -117,11 +136,11 @@ layout_mode = 2 tooltip_text = "0: Color from the brush itself, 100: the currently selected color" prefix = "Brush color from:" -[connection signal="toggled" from="RotationOptions/Flip/FlipX" to="." method="_on_flip_x_toggled"] -[connection signal="toggled" from="RotationOptions/Flip/FlipY" to="." method="_on_flip_y_toggled"] -[connection signal="toggled" from="RotationOptions/Rotate/Rotate90" to="." method="_on_rotate_90_toggled"] -[connection signal="toggled" from="RotationOptions/Rotate/Rotate180" to="." method="_on_rotate_180_toggled"] -[connection signal="toggled" from="RotationOptions/Rotate/Rotate270" to="." method="_on_rotate_270_toggled"] +[connection signal="toggled" from="RotationOptions/GridContainer/Flip/FlipX" to="." method="_on_flip_x_toggled"] +[connection signal="toggled" from="RotationOptions/GridContainer/Flip/FlipY" to="." method="_on_flip_y_toggled"] +[connection signal="toggled" from="RotationOptions/GridContainer/Rotate/Rotate90" to="." method="_on_rotate_90_toggled"] +[connection signal="toggled" from="RotationOptions/GridContainer/Rotate/Rotate180" to="." method="_on_rotate_180_toggled"] +[connection signal="toggled" from="RotationOptions/GridContainer/Rotate/Rotate270" to="." method="_on_rotate_270_toggled"] [connection signal="pressed" from="Brush/Type" to="." method="_on_BrushType_pressed"] [connection signal="value_changed" from="Brush/BrushSize" to="." method="_on_BrushSize_value_changed"] [connection signal="value_changed" from="ColorInterpolation" to="." method="_on_InterpolateFactor_value_changed"] From 1ae34bf57abd1688eb46d43ee027266585c91cf5 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Tue, 15 Oct 2024 16:31:04 +0300 Subject: [PATCH 112/162] Use an anchor and offset preset for the CollapsibleContainer's texture rect --- src/UI/Nodes/CollapsibleContainer.gd | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/UI/Nodes/CollapsibleContainer.gd b/src/UI/Nodes/CollapsibleContainer.gd index 61bf7dc96..d311e8b0c 100644 --- a/src/UI/Nodes/CollapsibleContainer.gd +++ b/src/UI/Nodes/CollapsibleContainer.gd @@ -33,12 +33,9 @@ func _ready() -> void: _button.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND _button.toggled.connect(set_visible_children) add_child(_button, false, Node.INTERNAL_MODE_FRONT) - _texture_rect.anchor_top = 0.5 - _texture_rect.anchor_bottom = 0.5 - _texture_rect.offset_left = 2 - _texture_rect.offset_top = -6 - _texture_rect.offset_right = 14 - _texture_rect.offset_bottom = 6 + _texture_rect.set_anchors_and_offsets_preset( + Control.PRESET_CENTER_LEFT, Control.PRESET_MODE_MINSIZE + ) _texture_rect.rotation_degrees = -90 _texture_rect.pivot_offset = Vector2(6, 6) _texture_rect.add_to_group("UIButtons") From 3863cbaee7303d13f8ed5300c78b60b4fca42352 Mon Sep 17 00:00:00 2001 From: Variable <77773850+Variable-ind@users.noreply.github.com> Date: Wed, 16 Oct 2024 18:00:20 +0500 Subject: [PATCH 113/162] Add a preference to share options between tools (#1120) * Add share config button * fill parameter now saves with curve tool * rename _fill to _fill_inside for sync consistency (fill in pencil and shape tools basically represent the same thing) * add icon * Move the option to the preferences * Add string to Translations.pot * Re-introduce `is_syncing` --------- Co-authored-by: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> --- Translations/Translations.pot | 4 ++ src/Autoload/Global.gd | 4 ++ src/Autoload/Tools.gd | 40 ++++++++++++ src/Preferences/PreferencesDialog.gd | 10 ++- src/Preferences/PreferencesDialog.tscn | 63 +++++++++++++------ src/Tools/BaseDraw.gd | 30 ++++++--- src/Tools/BaseShapeDrawer.gd | 12 ++-- src/Tools/BaseTool.gd | 3 + src/Tools/DesignTools/CurveTool.gd | 9 ++- src/Tools/DesignTools/Pencil.gd | 5 +- .../GlobalToolOptions/GlobalToolOptions.tscn | 2 + 11 files changed, 141 insertions(+), 41 deletions(-) diff --git a/Translations/Translations.pot b/Translations/Translations.pot index bc63b953c..561aae0a7 100644 --- a/Translations/Translations.pot +++ b/Translations/Translations.pot @@ -898,6 +898,10 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + msgid "Left tool color:" msgstr "" diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd index 46f430172..5d89cdb28 100644 --- a/src/Autoload/Global.gd +++ b/src/Autoload/Global.gd @@ -276,6 +276,10 @@ var tool_button_size := ButtonSize.SMALL: return tool_button_size = value Tools.set_button_size(tool_button_size) +var share_options_between_tools := false: + set(value): + share_options_between_tools = value + Tools.attempt_config_share(MOUSE_BUTTON_LEFT) ## Found in Preferences. The left tool color. var left_tool_color := Color("0086cf"): set(value): diff --git a/src/Autoload/Tools.gd b/src/Autoload/Tools.gd index 3615c2cad..b236f3d7a 100644 --- a/src/Autoload/Tools.gd +++ b/src/Autoload/Tools.gd @@ -2,6 +2,8 @@ extends Node signal color_changed(color: Color, button: int) +signal config_changed(slot_idx: int, config: Dictionary) +@warning_ignore("unused_signal") signal flip_rotated(flip_x, flip_y, rotate_90, rotate_180, rotate_270) signal options_reset @@ -373,6 +375,34 @@ func _ready() -> void: _show_relevant_tools(layer_type) +## Syncs the other tool using the config of tool located at [param from_idx].[br] +## NOTE: For optimization, if there is already a ready made config available, then we will use that +## instead of re-calculating the config, else we have no choice but to re-generate it +func attempt_config_share(from_idx: int, config: Dictionary = {}) -> void: + if not Global.share_options_between_tools: + return + if _slots.is_empty(): + return + if config.is_empty() and _slots[from_idx]: + var from_slot: Slot = _slots.get(from_idx, null) + if from_slot: + var from_tool = from_slot.tool_node + if from_tool.has_method("get_config"): + config = from_tool.get_config() + var target_slot: Slot = _slots.get(MOUSE_BUTTON_LEFT, null) + if from_idx == MOUSE_BUTTON_LEFT: + target_slot = _slots.get(MOUSE_BUTTON_RIGHT, null) + if is_instance_valid(target_slot): + if ( + target_slot.tool_node.has_method("set_config") + and target_slot.tool_node.has_method("update_config") + ): + target_slot.tool_node.set("is_syncing", true) + target_slot.tool_node.set_config(config) + target_slot.tool_node.update_config() + target_slot.tool_node.set("is_syncing", false) + + func reset_options() -> void: default_color() assign_tool(get_tool(MOUSE_BUTTON_LEFT).tool_node.name, MOUSE_BUTTON_LEFT, true) @@ -401,9 +431,13 @@ func remove_tool(t: Tool) -> void: func set_tool(tool_name: String, button: int) -> void: + # To prevent any unintentional syncing, we will temporarily disconnect the signal + if config_changed.is_connected(attempt_config_share): + config_changed.disconnect(attempt_config_share) var slot: Slot = _slots[button] var panel: Node = _panels[button] var node: Node = tools[tool_name].instantiate_scene() + var config_slot := MOUSE_BUTTON_LEFT if button == MOUSE_BUTTON_RIGHT else MOUSE_BUTTON_RIGHT if button == MOUSE_BUTTON_LEFT: # As guides are only moved with left mouse if tool_name == "Pan": # tool you want to give more access at guides Global.move_guides_on_canvas = true @@ -422,6 +456,12 @@ func set_tool(tool_name: String, button: int) -> void: elif button == MOUSE_BUTTON_RIGHT: _right_tools_per_layer_type[_curr_layer_type] = tool_name + # Wait for config to get loaded, then re-connect and sync + await get_tree().process_frame + if not config_changed.is_connected(attempt_config_share): + config_changed.connect(attempt_config_share) + attempt_config_share(config_slot) # Sync it with the other tool + func get_tool(button: int) -> Slot: return _slots[button] diff --git a/src/Preferences/PreferencesDialog.gd b/src/Preferences/PreferencesDialog.gd index 1d96dcdee..074cdc7b6 100644 --- a/src/Preferences/PreferencesDialog.gd +++ b/src/Preferences/PreferencesDialog.gd @@ -36,10 +36,16 @@ var preferences: Array[Preference] = [ "custom_icon_color", "Interface/ButtonOptions/IconColorButton", "color", Color.GRAY ), Preference.new( - "left_tool_color", "Interface/ButtonOptions/LeftToolColorButton", "color", Color("0086cf") + "share_options_between_tools", + "Tools/ToolOptions/ShareOptionsCheckBox", + "button_pressed", + false ), Preference.new( - "right_tool_color", "Interface/ButtonOptions/RightToolColorButton", "color", Color("fd6d14") + "left_tool_color", "Tools/ToolOptions/LeftToolColorButton", "color", Color("0086cf") + ), + Preference.new( + "right_tool_color", "Tools/ToolOptions/RightToolColorButton", "color", Color("fd6d14") ), Preference.new( "tool_button_size", diff --git a/src/Preferences/PreferencesDialog.tscn b/src/Preferences/PreferencesDialog.tscn index d7092aae4..f252a4533 100644 --- a/src/Preferences/PreferencesDialog.tscn +++ b/src/Preferences/PreferencesDialog.tscn @@ -324,26 +324,6 @@ layout_mode = 2 mouse_default_cursor_shape = 2 color = Color(0.75, 0.75, 0.75, 1) -[node name="Label4" type="Label" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Interface/ButtonOptions"] -layout_mode = 2 -text = "Left tool color:" - -[node name="LeftToolColorButton" type="ColorPickerButton" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Interface/ButtonOptions"] -custom_minimum_size = Vector2(64, 20) -layout_mode = 2 -mouse_default_cursor_shape = 2 -color = Color(0, 0.52549, 0.811765, 1) - -[node name="Label5" type="Label" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Interface/ButtonOptions"] -layout_mode = 2 -text = "Right tool color:" - -[node name="RightToolColorButton" type="ColorPickerButton" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Interface/ButtonOptions"] -custom_minimum_size = Vector2(64, 20) -layout_mode = 2 -mouse_default_cursor_shape = 2 -color = Color(0.992157, 0.427451, 0.0784314, 1) - [node name="Canvas" type="VBoxContainer" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide"] visible = false layout_mode = 2 @@ -875,6 +855,49 @@ layout_mode = 2 mouse_default_cursor_shape = 2 color = Color(0, 0, 1, 1) +[node name="Tools" type="VBoxContainer" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide"] +visible = false +layout_mode = 2 + +[node name="ToolOptions" type="GridContainer" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Tools"] +layout_mode = 2 +columns = 3 + +[node name="ShareOptionsLabel" type="Label" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Tools/ToolOptions"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Share options between the left and the right tools" + +[node name="ShareOptionsCheckBox" type="CheckBox" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Tools/ToolOptions"] +layout_mode = 2 +size_flags_horizontal = 3 +mouse_default_cursor_shape = 2 +text = "On" + +[node name="LeftToolColorLabel" type="Label" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Tools/ToolOptions"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Left tool color:" + +[node name="LeftToolColorButton" type="ColorPickerButton" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Tools/ToolOptions"] +custom_minimum_size = Vector2(64, 20) +layout_mode = 2 +size_flags_horizontal = 3 +mouse_default_cursor_shape = 2 +color = Color(0, 0.52549, 0.811765, 1) + +[node name="RightToolColorLabel" type="Label" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Tools/ToolOptions"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Right tool color:" + +[node name="RightToolColorButton" type="ColorPickerButton" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Tools/ToolOptions"] +custom_minimum_size = Vector2(64, 20) +layout_mode = 2 +size_flags_horizontal = 3 +mouse_default_cursor_shape = 2 +color = Color(0.992157, 0.427451, 0.0784314, 1) + [node name="Selection" type="VBoxContainer" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide"] visible = false layout_mode = 2 diff --git a/src/Tools/BaseDraw.gd b/src/Tools/BaseDraw.gd index bfcadbe3c..be429d31a 100644 --- a/src/Tools/BaseDraw.gd +++ b/src/Tools/BaseDraw.gd @@ -71,14 +71,13 @@ func _on_Brush_selected(brush: Brushes.Brush) -> void: func _on_BrushSize_value_changed(value: float) -> void: - if _brush_size != int(value): - _brush_size = int(value) - _brush_size_dynamics = _brush_size - if Tools.dynamics_size != Tools.Dynamics.NONE: - _brush_size_dynamics = Tools.brush_size_min - _cache_limit = (_brush_size * _brush_size) * 3 # This equation seems the best match - update_config() - save_config() + _brush_size = int(value) + _brush_size_dynamics = _brush_size + if Tools.dynamics_size != Tools.Dynamics.NONE: + _brush_size_dynamics = Tools.brush_size_min + _cache_limit = (_brush_size * _brush_size) * 3 # This equation seems the best match + update_config() + save_config() func _reset_dynamics() -> void: @@ -113,6 +112,11 @@ func get_config() -> Dictionary: "brush_index": _brush.index, "brush_size": _brush_size, "brush_interpolate": _brush_interpolate, + "brush_flip_x": _brush_flip_x, + "brush_flip_y": _brush_flip_y, + "brush_rotate_90": _brush_rotate_90, + "brush_rotate_180": _brush_rotate_180, + "brush_rotate_270": _brush_rotate_270, } @@ -125,6 +129,11 @@ func set_config(config: Dictionary) -> void: if Tools.dynamics_size != Tools.Dynamics.NONE: _brush_size_dynamics = Tools.brush_size_min _brush_interpolate = config.get("brush_interpolate", _brush_interpolate) + _brush_flip_x = config.get("brush_flip_x", _brush_flip_x) + _brush_flip_y = config.get("brush_flip_y", _brush_flip_y) + _brush_rotate_90 = config.get("brush_rotate_90", _brush_rotate_90) + _brush_rotate_180 = config.get("brush_rotate_180", _brush_rotate_180) + _brush_rotate_270 = config.get("brush_rotate_270", _brush_rotate_270) func update_config() -> void: @@ -743,23 +752,28 @@ func _pick_color(pos: Vector2i) -> void: func _on_flip_x_toggled(button_pressed: bool) -> void: _brush_flip_x = button_pressed update_brush() + save_config() func _on_flip_y_toggled(button_pressed: bool) -> void: _brush_flip_y = button_pressed update_brush() + save_config() func _on_rotate_90_toggled(button_pressed: bool) -> void: _brush_rotate_90 = button_pressed update_brush() + save_config() func _on_rotate_180_toggled(button_pressed: bool) -> void: _brush_rotate_180 = button_pressed update_brush() + save_config() func _on_rotate_270_toggled(button_pressed: bool) -> void: _brush_rotate_270 = button_pressed update_brush() + save_config() diff --git a/src/Tools/BaseShapeDrawer.gd b/src/Tools/BaseShapeDrawer.gd index 54369d670..9544c7438 100644 --- a/src/Tools/BaseShapeDrawer.gd +++ b/src/Tools/BaseShapeDrawer.gd @@ -3,7 +3,7 @@ extends "res://src/Tools/BaseDraw.gd" var _start := Vector2i.ZERO var _offset := Vector2i.ZERO var _dest := Vector2i.ZERO -var _fill := false +var _fill_inside := false var _drawing := false var _displace_origin := false var _thickness := 1 @@ -41,27 +41,27 @@ func update_indicator() -> void: func _on_FillCheckbox_toggled(button_pressed: bool) -> void: - _fill = button_pressed + _fill_inside = button_pressed update_config() save_config() func get_config() -> Dictionary: var config := super.get_config() - config["fill"] = _fill + config["fill_inside"] = _fill_inside config["thickness"] = _thickness return config func set_config(config: Dictionary) -> void: super.set_config(config) - _fill = config.get("fill", _fill) + _fill_inside = config.get("fill_inside", _fill_inside) _thickness = config.get("thickness", _thickness) func update_config() -> void: super.update_config() - $FillCheckbox.button_pressed = _fill + $FillCheckbox.button_pressed = _fill_inside $ThicknessSlider.value = _thickness @@ -237,7 +237,7 @@ func _get_result_rect(origin: Vector2i, dest: Vector2i) -> Rect2i: func _get_points(shape_size: Vector2i) -> Array[Vector2i]: - return _get_shape_points_filled(shape_size) if _fill else _get_shape_points(shape_size) + return _get_shape_points_filled(shape_size) if _fill_inside else _get_shape_points(shape_size) func _set_cursor_text(rect: Rect2i) -> void: diff --git a/src/Tools/BaseTool.gd b/src/Tools/BaseTool.gd index 519f5aa49..23326db37 100644 --- a/src/Tools/BaseTool.gd +++ b/src/Tools/BaseTool.gd @@ -2,6 +2,7 @@ class_name BaseTool extends VBoxContainer var is_moving := false +var is_syncing := false var kname: String var tool_slot: Tools.Slot = null var cursor_text := "" @@ -34,6 +35,8 @@ func _ready() -> void: func save_config() -> void: var config := get_config() Global.config_cache.set_value(tool_slot.kname, kname, config) + if not is_syncing: # If the tool isn't busy syncing with another tool. + Tools.config_changed.emit(tool_slot.button, config) func load_config() -> void: diff --git a/src/Tools/DesignTools/CurveTool.gd b/src/Tools/DesignTools/CurveTool.gd index 80a1d3b81..9219c2bbc 100644 --- a/src/Tools/DesignTools/CurveTool.gd +++ b/src/Tools/DesignTools/CurveTool.gd @@ -2,7 +2,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 := 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. @@ -29,7 +29,7 @@ func _on_thickness_value_changed(value: int) -> void: func _on_fill_checkbox_toggled(toggled_on: bool) -> void: - _fill = toggled_on + _fill_inside = toggled_on update_config() save_config() @@ -44,17 +44,20 @@ func update_indicator() -> void: func get_config() -> Dictionary: var config := super.get_config() + config["fill_inside"] = _fill_inside config["thickness"] = _thickness return config func set_config(config: Dictionary) -> void: super.set_config(config) + _fill_inside = config.get("fill_inside", _fill_inside) _thickness = config.get("thickness", _thickness) func update_config() -> void: super.update_config() + $FillCheckbox.button_pressed = _fill_inside $ThicknessSlider.value = _thickness @@ -188,7 +191,7 @@ func _draw_shape() -> void: _fill_inside_rect = _fill_inside_rect.expand(point) # Draw each point offsetted based on the shape's thickness _draw_pixel(point, images) - if _fill: + if _fill_inside: var v := Vector2i() for x in _fill_inside_rect.size.x: v.x = x + _fill_inside_rect.position.x diff --git a/src/Tools/DesignTools/Pencil.gd b/src/Tools/DesignTools/Pencil.gd index 5e80f654a..d4b7f0d76 100644 --- a/src/Tools/DesignTools/Pencil.gd +++ b/src/Tools/DesignTools/Pencil.gd @@ -50,6 +50,7 @@ func _on_SpacingMode_toggled(button_pressed: bool) -> void: func _on_Spacing_value_changed(value: Vector2) -> void: _spacing = value + save_config() func _input(event: InputEvent) -> void: @@ -58,10 +59,10 @@ func _input(event: InputEvent) -> void: if event.is_action_pressed("change_tool_mode"): _prev_mode = overwrite_button.button_pressed if event.is_action("change_tool_mode"): - overwrite_button.button_pressed = !_prev_mode + overwrite_button.set_pressed_no_signal(!_prev_mode) _overwrite = overwrite_button.button_pressed if event.is_action_released("change_tool_mode"): - overwrite_button.button_pressed = _prev_mode + overwrite_button.set_pressed_no_signal(_prev_mode) _overwrite = overwrite_button.button_pressed diff --git a/src/UI/GlobalToolOptions/GlobalToolOptions.tscn b/src/UI/GlobalToolOptions/GlobalToolOptions.tscn index 9abe461b1..ba988ab9e 100644 --- a/src/UI/GlobalToolOptions/GlobalToolOptions.tscn +++ b/src/UI/GlobalToolOptions/GlobalToolOptions.tscn @@ -105,6 +105,8 @@ 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" From d894e9db860ddad9f82011baa9babcb2d8e3e267 Mon Sep 17 00:00:00 2001 From: Variable <77773850+Variable-ind@users.noreply.github.com> Date: Wed, 16 Oct 2024 18:30:30 +0500 Subject: [PATCH 114/162] Added Centre Canvas Option (#1123) * add a centre frame option * moved code to view menu * restore left over stuff * fix typo --- project.godot | 5 +++++ src/Autoload/Global.gd | 2 ++ src/UI/TopMenuContainer/TopMenuContainer.gd | 5 +++++ 3 files changed, 12 insertions(+) diff --git a/project.godot b/project.godot index 12285e151..dfbc256ed 100644 --- a/project.godot +++ b/project.godot @@ -903,6 +903,11 @@ previous_project={ "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) ] } +centre_canvas={ +"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":67,"physical_keycode":0,"key_label":0,"unicode":67,"location":0,"echo":false,"script":null) +] +} [input_devices] diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd index 5d89cdb28..b4b14b1bc 100644 --- a/src/Autoload/Global.gd +++ b/src/Autoload/Global.gd @@ -27,6 +27,7 @@ enum FileMenu { NEW, OPEN, OPEN_LAST_PROJECT, RECENT, SAVE, SAVE_AS, EXPORT, EXP enum EditMenu { UNDO, REDO, COPY, CUT, PASTE, PASTE_IN_PLACE, DELETE, NEW_BRUSH, PREFERENCES } ## Enumeration of items present in the View Menu. enum ViewMenu { + CENTRE_CANVAS, TILE_MODE, TILE_MODE_OFFSETS, GREYSCALE_VIEW, @@ -750,6 +751,7 @@ func _initialize_keychain() -> void: &"palettize": Keychain.InputAction.new("", "Effects menu", true), &"pixelize": Keychain.InputAction.new("", "Effects menu", true), &"posterize": Keychain.InputAction.new("", "Effects menu", true), + &"centre_canvas": Keychain.InputAction.new("", "View menu", true), &"mirror_view": Keychain.InputAction.new("", "View menu", true), &"show_grid": Keychain.InputAction.new("", "View menu", true), &"show_pixel_grid": Keychain.InputAction.new("", "View menu", true), diff --git a/src/UI/TopMenuContainer/TopMenuContainer.gd b/src/UI/TopMenuContainer/TopMenuContainer.gd index f27505ef1..00cf248d7 100644 --- a/src/UI/TopMenuContainer/TopMenuContainer.gd +++ b/src/UI/TopMenuContainer/TopMenuContainer.gd @@ -206,6 +206,7 @@ func _setup_edit_menu() -> void: func _setup_view_menu() -> void: # Order as in Global.ViewMenu enum var view_menu_items := { + "Centre Canvas": "centre_canvas", "Tile Mode": "", "Tile Mode Offsets": "", "Grayscale View": "", @@ -226,6 +227,8 @@ func _setup_view_menu() -> void: _setup_snap_to_submenu(item) elif item == "Tile Mode Offsets": view_menu.add_item(item, i) + elif item == "Centre Canvas": + _set_menu_shortcut(view_menu_items[item], view_menu, i, item) else: _set_menu_shortcut(view_menu_items[item], view_menu, i, item, true) view_menu.set_item_checked(Global.ViewMenu.SHOW_RULERS, true) @@ -599,6 +602,8 @@ func edit_menu_id_pressed(id: int) -> void: func view_menu_id_pressed(id: int) -> void: match id: + Global.ViewMenu.CENTRE_CANVAS: + Global.camera.offset = Global.current_project.size / 2 Global.ViewMenu.TILE_MODE_OFFSETS: _popup_dialog(get_tree().current_scene.tile_mode_offsets_dialog) Global.ViewMenu.GREYSCALE_VIEW: From 4dc55e538e86a25a73d2b041d45f56165c2d070d Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Thu, 17 Oct 2024 02:34:27 +0300 Subject: [PATCH 115/162] Fix issues when picking color with the bucket tool 1) The bucket tool now picks colors from the top-most layer, like the rest of the drawing tools. 2) Using the tool while moving the cursor and also holding the color picker shortcut (Alt by default), now picks colors instead of using the bucket tool. --- src/Tools/BaseDraw.gd | 29 ----------------------------- src/Tools/BaseTool.gd | 24 ++++++++++++++++++++++++ src/Tools/DesignTools/Bucket.gd | 30 +++++++++--------------------- 3 files changed, 33 insertions(+), 50 deletions(-) diff --git a/src/Tools/BaseDraw.gd b/src/Tools/BaseDraw.gd index be429d31a..5544679a4 100644 --- a/src/Tools/BaseDraw.gd +++ b/src/Tools/BaseDraw.gd @@ -720,35 +720,6 @@ func _get_undo_data() -> Dictionary: return data -func _pick_color(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(_get_draw_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: Frame = project.frames[project.current_frame] - for layer in project.layers.size(): - var idx := (project.layers.size() - 1) - layer - if project.layers[idx].is_visible_in_hierarchy(): - image = curr_frame.cels[idx].get_image() - color = image.get_pixelv(pos) - if not is_zero_approx(color.a): - break - var button := ( - MOUSE_BUTTON_LEFT - if Tools._slots[MOUSE_BUTTON_LEFT].tool_node == self - else MOUSE_BUTTON_RIGHT - ) - Tools.assign_color(color, button, false) - - func _on_flip_x_toggled(button_pressed: bool) -> void: _brush_flip_x = button_pressed update_brush() diff --git a/src/Tools/BaseTool.gd b/src/Tools/BaseTool.gd index 23326db37..c3d43aabb 100644 --- a/src/Tools/BaseTool.gd +++ b/src/Tools/BaseTool.gd @@ -315,6 +315,30 @@ func _get_selected_draw_images() -> Array[Image]: return images +func _pick_color(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(_get_draw_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: Frame = project.frames[project.current_frame] + for layer in project.layers.size(): + var idx := (project.layers.size() - 1) - layer + if project.layers[idx].is_visible_in_hierarchy(): + image = curr_frame.cels[idx].get_image() + color = image.get_pixelv(pos) + if not is_zero_approx(color.a): + break + Tools.assign_color(color, tool_slot.button, false) + + func _flip_rect(rect: Rect2, rect_size: Vector2, horiz: bool, vert: bool) -> Rect2: var result := rect if horiz: diff --git a/src/Tools/DesignTools/Bucket.gd b/src/Tools/DesignTools/Bucket.gd index 794ed5422..2635ab356 100644 --- a/src/Tools/DesignTools/Bucket.gd +++ b/src/Tools/DesignTools/Bucket.gd @@ -7,6 +7,7 @@ const COLOR_REPLACE_SHADER := preload("res://src/Shaders/ColorReplace.gdshader") const PATTERN_FILL_SHADER := preload("res://src/Shaders/PatternFill.gdshader") var _undo_data := {} +var _picking_color := false var _prev_mode := 0 var _pattern: Patterns.Pattern var _tolerance := 0.003 @@ -152,8 +153,10 @@ func update_pattern() -> void: func draw_start(pos: Vector2i) -> void: super.draw_start(pos) if Input.is_action_pressed(&"draw_color_picker", true): + _picking_color = true _pick_color(pos) return + _picking_color = false _undo_data = _get_undo_data() if !Global.current_project.layers[Global.current_project.current_layer].can_layer_get_drawn(): return @@ -164,6 +167,10 @@ func draw_start(pos: Vector2i) -> void: func draw_move(pos: Vector2i) -> void: super.draw_move(pos) + if _picking_color: # Still return even if we released Alt + if Input.is_action_pressed(&"draw_color_picker", true): + _pick_color(pos) + return Global.canvas.selection.transform_content_confirm() if !Global.current_project.layers[Global.current_project.current_layer].can_layer_get_drawn(): return @@ -174,6 +181,8 @@ func draw_move(pos: Vector2i) -> void: func draw_end(pos: Vector2i) -> void: super.draw_end(pos) + if _picking_color: + return commit_undo() @@ -514,24 +523,3 @@ func _get_undo_data() -> Dictionary: var image := cel.get_image() data[image] = image.data return data - - -func _pick_color(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(_get_draw_image()) - if pos.x > image.get_width() - 1 or pos.y > image.get_height() - 1: - return - - var color := image.get_pixelv(pos) - var button := ( - MOUSE_BUTTON_LEFT - if Tools._slots[MOUSE_BUTTON_LEFT].tool_node == self - else MOUSE_BUTTON_RIGHT - ) - Tools.assign_color(color, button, false) From 263e19f17a65e26fabe307c55f20957efe58e8e3 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Thu, 17 Oct 2024 13:06:53 +0300 Subject: [PATCH 116/162] Add a tooltip of the "Share options between the left and the right tools" preference --- Translations/Translations.pot | 5 +++++ src/Preferences/PreferencesDialog.tscn | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/Translations/Translations.pot b/Translations/Translations.pot index 561aae0a7..8457f6bdf 100644 --- a/Translations/Translations.pot +++ b/Translations/Translations.pot @@ -902,6 +902,11 @@ msgstr "" msgid "Share options between the left and the right tools" msgstr "" +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" diff --git a/src/Preferences/PreferencesDialog.tscn b/src/Preferences/PreferencesDialog.tscn index f252a4533..5f939baf4 100644 --- a/src/Preferences/PreferencesDialog.tscn +++ b/src/Preferences/PreferencesDialog.tscn @@ -866,11 +866,16 @@ columns = 3 [node name="ShareOptionsLabel" type="Label" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Tools/ToolOptions"] layout_mode = 2 size_flags_horizontal = 3 +tooltip_text = "If this is enabled, options will be synced between the left and the right tool. +For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +mouse_filter = 1 text = "Share options between the left and the right tools" [node name="ShareOptionsCheckBox" type="CheckBox" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Tools/ToolOptions"] layout_mode = 2 size_flags_horizontal = 3 +tooltip_text = "If this is enabled, options will be synced between the left and the right tool. +For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." mouse_default_cursor_shape = 2 text = "On" From c83680183b92a0541e985797ae4efa9adade1494 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Thu, 17 Oct 2024 13:08:43 +0300 Subject: [PATCH 117/162] Minor changes in Shading.tscn --- src/Tools/DesignTools/Shading.tscn | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Tools/DesignTools/Shading.tscn b/src/Tools/DesignTools/Shading.tscn index b78e383a1..2a8bc4fff 100644 --- a/src/Tools/DesignTools/Shading.tscn +++ b/src/Tools/DesignTools/Shading.tscn @@ -4,21 +4,21 @@ [ext_resource type="Script" path="res://src/Tools/DesignTools/Shading.gd" id="2"] [ext_resource type="PackedScene" uid="uid://yjhp0ssng2mp" path="res://src/UI/Nodes/ValueSlider.tscn" id="3"] -[sub_resource type="ButtonGroup" id="ButtonGroup_se02m"] +[sub_resource type="ButtonGroup" id="ButtonGroup_lvcwb"] resource_name = "rotate" allow_unpress = true [node name="ToolOptions" instance=ExtResource("1")] script = ExtResource("2") -[node name="Rotate90" parent="RotationOptions/Rotate" index="0"] -button_group = SubResource("ButtonGroup_se02m") +[node name="Rotate90" parent="RotationOptions/GridContainer/Rotate" index="0"] +button_group = SubResource("ButtonGroup_lvcwb") -[node name="Rotate180" parent="RotationOptions/Rotate" index="1"] -button_group = SubResource("ButtonGroup_se02m") +[node name="Rotate180" parent="RotationOptions/GridContainer/Rotate" index="1"] +button_group = SubResource("ButtonGroup_lvcwb") -[node name="Rotate270" parent="RotationOptions/Rotate" index="2"] -button_group = SubResource("ButtonGroup_se02m") +[node name="Rotate270" parent="RotationOptions/GridContainer/Rotate" index="2"] +button_group = SubResource("ButtonGroup_lvcwb") [node name="LightenDarken" type="OptionButton" parent="." index="5"] custom_minimum_size = Vector2(92, 0) @@ -83,7 +83,7 @@ layout_mode = 2 layout_mode = 2 max_value = 10.0 allow_greater = true -prefix = "Colors Right" +prefix = "Colors right" [node name="HBoxContainer" type="HBoxContainer" parent="ColorReplaceOptions/Settings" index="1"] layout_mode = 2 @@ -107,7 +107,7 @@ 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." +text = "Please select a color from the palette." horizontal_alignment = 1 autowrap_mode = 3 From 120bd9a7df2040cf370ea5ab75aa0f86c77df390 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Thu, 17 Oct 2024 13:46:18 +0300 Subject: [PATCH 118/162] Use American English spelling for "Center Canvas" to make it more consistent with the rest of the application --- Translations/Translations.pot | 4 ++++ project.godot | 2 +- src/Autoload/Global.gd | 4 ++-- src/UI/TopMenuContainer/TopMenuContainer.gd | 6 +++--- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Translations/Translations.pot b/Translations/Translations.pot index 8457f6bdf..b9042f22f 100644 --- a/Translations/Translations.pot +++ b/Translations/Translations.pot @@ -220,6 +220,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" diff --git a/project.godot b/project.godot index dfbc256ed..78920d2f8 100644 --- a/project.godot +++ b/project.godot @@ -903,7 +903,7 @@ previous_project={ "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) ] } -centre_canvas={ +center_canvas={ "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":67,"physical_keycode":0,"key_label":0,"unicode":67,"location":0,"echo":false,"script":null) ] diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd index b4b14b1bc..79b7567ba 100644 --- a/src/Autoload/Global.gd +++ b/src/Autoload/Global.gd @@ -27,7 +27,7 @@ enum FileMenu { NEW, OPEN, OPEN_LAST_PROJECT, RECENT, SAVE, SAVE_AS, EXPORT, EXP enum EditMenu { UNDO, REDO, COPY, CUT, PASTE, PASTE_IN_PLACE, DELETE, NEW_BRUSH, PREFERENCES } ## Enumeration of items present in the View Menu. enum ViewMenu { - CENTRE_CANVAS, + CENTER_CANVAS, TILE_MODE, TILE_MODE_OFFSETS, GREYSCALE_VIEW, @@ -751,7 +751,7 @@ func _initialize_keychain() -> void: &"palettize": Keychain.InputAction.new("", "Effects menu", true), &"pixelize": Keychain.InputAction.new("", "Effects menu", true), &"posterize": Keychain.InputAction.new("", "Effects menu", true), - &"centre_canvas": Keychain.InputAction.new("", "View menu", true), + &"center_canvas": Keychain.InputAction.new("", "View menu", true), &"mirror_view": Keychain.InputAction.new("", "View menu", true), &"show_grid": Keychain.InputAction.new("", "View menu", true), &"show_pixel_grid": Keychain.InputAction.new("", "View menu", true), diff --git a/src/UI/TopMenuContainer/TopMenuContainer.gd b/src/UI/TopMenuContainer/TopMenuContainer.gd index 00cf248d7..8a49839e0 100644 --- a/src/UI/TopMenuContainer/TopMenuContainer.gd +++ b/src/UI/TopMenuContainer/TopMenuContainer.gd @@ -206,7 +206,7 @@ func _setup_edit_menu() -> void: func _setup_view_menu() -> void: # Order as in Global.ViewMenu enum var view_menu_items := { - "Centre Canvas": "centre_canvas", + "Center Canvas": "center_canvas", "Tile Mode": "", "Tile Mode Offsets": "", "Grayscale View": "", @@ -227,7 +227,7 @@ func _setup_view_menu() -> void: _setup_snap_to_submenu(item) elif item == "Tile Mode Offsets": view_menu.add_item(item, i) - elif item == "Centre Canvas": + elif item == "Center Canvas": _set_menu_shortcut(view_menu_items[item], view_menu, i, item) else: _set_menu_shortcut(view_menu_items[item], view_menu, i, item, true) @@ -602,7 +602,7 @@ func edit_menu_id_pressed(id: int) -> void: func view_menu_id_pressed(id: int) -> void: match id: - Global.ViewMenu.CENTRE_CANVAS: + Global.ViewMenu.CENTER_CANVAS: Global.camera.offset = Global.current_project.size / 2 Global.ViewMenu.TILE_MODE_OFFSETS: _popup_dialog(get_tree().current_scene.tile_mode_offsets_dialog) From 91f0b26245b875a77773bb52378bcaa37a12b61d Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Thu, 17 Oct 2024 14:41:43 +0300 Subject: [PATCH 119/162] Change the font of the interface from the properties --- src/Autoload/Global.gd | 15 +++++++++++++++ src/Autoload/Themes.gd | 2 ++ src/Preferences/PreferencesDialog.gd | 5 +++++ src/Preferences/PreferencesDialog.tscn | 9 +++++++++ 4 files changed, 31 insertions(+) diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd index 79b7567ba..72a8ae827 100644 --- a/src/Autoload/Global.gd +++ b/src/Autoload/Global.gd @@ -210,6 +210,20 @@ var integer_zoom := false: ## Found in Preferences. The scale of the interface. var shrink := 1.0 +var theme_font := loaded_fonts[theme_font_index]: + set(value): + theme_font = value + if is_instance_valid(control) and is_instance_valid(control.theme): + control.theme.default_font = theme_font +## Found in Preferences. The index of the font used by the interface. +var theme_font_index := 1: + set(value): + theme_font_index = value + if theme_font_index < loaded_fonts.size(): + theme_font = loaded_fonts[theme_font_index] + else: + var font_name := get_available_font_names()[theme_font_index] + theme_font = find_font_from_name(font_name) ## Found in Preferences. The font size used by the interface. var font_size := 16 ## Found in Preferences. If [code]true[/code], the interface dims on popups. @@ -277,6 +291,7 @@ var tool_button_size := ButtonSize.SMALL: return tool_button_size = value Tools.set_button_size(tool_button_size) +## Found in Preferences. var share_options_between_tools := false: set(value): share_options_between_tools = value diff --git a/src/Autoload/Themes.gd b/src/Autoload/Themes.gd index 4db8c8340..b9d47076b 100644 --- a/src/Autoload/Themes.gd +++ b/src/Autoload/Themes.gd @@ -43,6 +43,8 @@ func remove_theme(theme: Theme) -> void: func change_theme(id: int) -> void: theme_index = id var theme := themes[id] + if theme.default_font != Global.theme_font: + theme.default_font = Global.theme_font theme.default_font_size = Global.font_size theme.set_font_size("font_size", "HeaderSmall", Global.font_size + 2) var icon_color := theme.get_color("modulate_color", "Icons") diff --git a/src/Preferences/PreferencesDialog.gd b/src/Preferences/PreferencesDialog.gd index 074cdc7b6..c662950d4 100644 --- a/src/Preferences/PreferencesDialog.gd +++ b/src/Preferences/PreferencesDialog.gd @@ -9,6 +9,7 @@ var preferences: Array[Preference] = [ ), Preference.new("ffmpeg_path", "Startup/StartupContainer/FFMPEGPath", "text", ""), Preference.new("shrink", "%ShrinkSlider", "value", 1.0), + Preference.new("theme_font_index", "%FontOptionButton", "selected", 1), Preference.new("font_size", "%FontSizeSlider", "value", 16), Preference.new( "dim_on_popup", "Interface/InterfaceOptions/DimCheckBox", "button_pressed", true @@ -292,6 +293,10 @@ func _ready() -> void: language.add_child(button) button.pressed.connect(_on_language_pressed.bind(button.get_index())) + # Add fonts to the font option button + for font_name in Global.get_available_font_names(): + %FontOptionButton.add_item(font_name) + for pref in preferences: if not right_side.has_node(pref.node_path): continue diff --git a/src/Preferences/PreferencesDialog.tscn b/src/Preferences/PreferencesDialog.tscn index 5f939baf4..411e305ad 100644 --- a/src/Preferences/PreferencesDialog.tscn +++ b/src/Preferences/PreferencesDialog.tscn @@ -205,6 +205,15 @@ layout_mode = 2 mouse_default_cursor_shape = 2 text = "Apply" +[node name="FontLabel" type="Label" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Interface/InterfaceOptions"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Font:" + +[node name="FontOptionButton" type="OptionButton" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Interface/InterfaceOptions"] +unique_name_in_owner = true +layout_mode = 2 + [node name="DimLabel" type="Label" parent="HSplitContainer/VBoxContainer/ScrollContainer/RightSide/Interface/InterfaceOptions"] layout_mode = 2 size_flags_horizontal = 3 From fd714d04dff2547fec6236a8b9103e31829065ba Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Thu, 17 Oct 2024 16:52:42 +0300 Subject: [PATCH 120/162] Update the ExtensionsAPI to handle fonts --- project.godot | 2 +- src/Autoload/ExtensionsApi.gd | 23 +++++++++++++++++++++++ src/Autoload/Global.gd | 1 + src/Preferences/PreferencesDialog.gd | 13 ++++++++++--- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/project.godot b/project.godot index 78920d2f8..e5ac05993 100644 --- a/project.godot +++ b/project.godot @@ -24,7 +24,7 @@ boot_splash/use_filter=false config/icon="res://assets/graphics/icons/icon.png" config/macos_native_icon="res://assets/graphics/icons/icon.icns" config/windows_native_icon="res://assets/graphics/icons/icon.ico" -config/ExtensionsAPI_Version=4 +config/ExtensionsAPI_Version=5 config/Pxo_Version=3 [audio] diff --git a/src/Autoload/ExtensionsApi.gd b/src/Autoload/ExtensionsApi.gd index 6c4259e63..3b4faaaba 100644 --- a/src/Autoload/ExtensionsApi.gd +++ b/src/Autoload/ExtensionsApi.gd @@ -409,6 +409,29 @@ class ThemeAPI: Themes.remove_theme(theme) ExtensionsApi.remove_action("ThemeAPI", "add_theme") + ## Adds a new font. + func add_font(font: Font) -> void: + Global.loaded_fonts.append(font) + Global.font_loaded.emit() + + ## Removes a loaded font. + ## If that font is the current one of the interface, set it back to Roboto. + func remove_font(font: Font) -> void: + var font_index := Global.loaded_fonts.find(font) + if font_index == -1: + return + if Global.theme_font_index == font_index: + Global.theme_font_index = 1 + Global.loaded_fonts.remove_at(font_index) + Global.font_loaded.emit() + + ## Sets a font as the current one for the interface. The font must have been + ## added beforehand by [method add_font]. + func set_font(font: Font) -> void: + var font_index := Global.loaded_fonts.find(font) + if font_index > -1: + Global.theme_font_index = font_index + ## Gives ability to add/remove tools. class ToolAPI: diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd index 72a8ae827..1d6e7ed22 100644 --- a/src/Autoload/Global.gd +++ b/src/Autoload/Global.gd @@ -12,6 +12,7 @@ signal project_about_to_switch ## Emitted before a project is about to be switc signal project_switched ## Emitted whenever you switch to some other project tab. signal cel_switched ## Emitted whenever you select a different cel. signal project_data_changed(project: Project) ## Emitted when project data is modified. +signal font_loaded ## Emitted when a new font has been loaded, or an old one gets unloaded. enum LayerTypes { PIXEL, GROUP, THREE_D } enum GridTypes { CARTESIAN, ISOMETRIC, ALL } diff --git a/src/Preferences/PreferencesDialog.gd b/src/Preferences/PreferencesDialog.gd index c662950d4..3d6bcf42f 100644 --- a/src/Preferences/PreferencesDialog.gd +++ b/src/Preferences/PreferencesDialog.gd @@ -241,6 +241,7 @@ class Preference: func _ready() -> void: + Global.font_loaded.connect(_add_fonts) # Replace OK since preference changes are being applied immediately, not after OK confirmation get_ok_button().text = "Close" get_ok_button().size_flags_horizontal = Control.SIZE_EXPAND_FILL @@ -293,9 +294,7 @@ func _ready() -> void: language.add_child(button) button.pressed.connect(_on_language_pressed.bind(button.get_index())) - # Add fonts to the font option button - for font_name in Global.get_available_font_names(): - %FontOptionButton.add_item(font_name) + _add_fonts() for pref in preferences: if not right_side.has_node(pref.node_path): @@ -363,6 +362,14 @@ func _on_Preference_value_changed(value, pref: Preference, button: RestoreDefaul disable_restore_default_button(button, disable) +## Add fonts to the font option button. +func _add_fonts() -> void: + %FontOptionButton.clear() + for font_name in Global.get_available_font_names(): + %FontOptionButton.add_item(font_name) + %FontOptionButton.select(Global.theme_font_index) + + func preference_update(require_restart := false) -> void: if require_restart: must_restart.visible = true From 203340b3a10214d7747f64545dfcc89c4bc03eb2 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Thu, 17 Oct 2024 16:58:15 +0300 Subject: [PATCH 121/162] If the selected font index is out of bounds, fall back to Roboto --- src/Autoload/Global.gd | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd index 1d6e7ed22..314b0b012 100644 --- a/src/Autoload/Global.gd +++ b/src/Autoload/Global.gd @@ -223,8 +223,12 @@ var theme_font_index := 1: if theme_font_index < loaded_fonts.size(): theme_font = loaded_fonts[theme_font_index] else: - var font_name := get_available_font_names()[theme_font_index] - theme_font = find_font_from_name(font_name) + var available_font_names := get_available_font_names() + if theme_font_index < available_font_names.size(): + var font_name := available_font_names[theme_font_index] + theme_font = find_font_from_name(font_name) + else: + theme_font = loaded_fonts[1] # Fall back to Roboto if out of bounds ## Found in Preferences. The font size used by the interface. var font_size := 16 ## Found in Preferences. If [code]true[/code], the interface dims on popups. From a64f5f34293d3fa9bdf865c565d10e0a5199fa8a Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Thu, 17 Oct 2024 17:16:17 +0300 Subject: [PATCH 122/162] Make ExtensionsAPI version 5 backwards compatible with version 4 This means that extensions that use version 4 can work in version 5, but not necessarily vice versa. Therefore we don't need to show a warning message when loading version 4 extensions. TODO: Find a better way to determine which API versions have backwards compatibility with each other. --- src/HandleExtensions.gd | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/HandleExtensions.gd b/src/HandleExtensions.gd index 4e115f751..a0857ba31 100644 --- a/src/HandleExtensions.gd +++ b/src/HandleExtensions.gd @@ -159,6 +159,12 @@ func _load_extension(extension_file_or_folder_name: StringName, internal := fals var supported_api_versions = extension_json["supported_api_versions"] if typeof(supported_api_versions) == TYPE_ARRAY: supported_api_versions = PackedInt32Array(supported_api_versions) + # Extensions that support API version 4 are backwards compatible with version 5. + # Version 5 only adds new methods and does not break compatibility. + # TODO: Find a better way to determine which API versions + # have backwards compatibility with each other. + if 4 in supported_api_versions and not 5 in supported_api_versions: + supported_api_versions.append(5) if not ExtensionsApi.get_api_version() in supported_api_versions: var err_text := ( "The extension %s will not work on this version of Pixelorama \n" From 2cb29ab2746c2c85780ce7d02f70ccbe8484105e Mon Sep 17 00:00:00 2001 From: Variable <77773850+Variable-ind@users.noreply.github.com> Date: Thu, 17 Oct 2024 21:51:45 +0500 Subject: [PATCH 123/162] somewhat fix transparency for floating window (#1116) * somewhat fix transparency * some formatting --- src/UI/Dialogs/WindowOpacityDialog.gd | 16 ++++++++++++---- src/UI/UI.gd | 22 +++++++++++++++++++--- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/UI/Dialogs/WindowOpacityDialog.gd b/src/UI/Dialogs/WindowOpacityDialog.gd index e8f0524a3..8ab8230cf 100644 --- a/src/UI/Dialogs/WindowOpacityDialog.gd +++ b/src/UI/Dialogs/WindowOpacityDialog.gd @@ -1,18 +1,22 @@ extends AcceptDialog +var main_canvas := Global.control.find_child("Main Canvas", true, false) + @onready var slider := $VBoxContainer/ValueSlider as ValueSlider @onready var fullscreen_warning := $VBoxContainer/FullscreenWarning as Label -@onready var main_canvas := Global.control.find_child("Main Canvas") as Control func _ready() -> void: + if main_canvas is FloatingWindow: ## If it's shifted to a window then get the content + main_canvas = main_canvas.window_content await get_tree().process_frame Global.control.main_ui.sort_children.connect(_recalculate_opacity) func _on_WindowOpacityDialog_about_to_show() -> void: - get_tree().root.transparent = true - get_tree().root.transparent_bg = true + var canvas_window = main_canvas.get_window() + canvas_window.transparent = true + canvas_window.transparent_bg = true slider.editable = not is_fullscreen() fullscreen_warning.visible = not slider.editable @@ -31,7 +35,11 @@ func set_window_opacity(value: float) -> void: if container is TabContainer: var center := container.get_rect().get_center() if main_canvas.get_rect().has_point(center): - container.self_modulate.a = value + if main_canvas.get_window() != get_tree().root: + ## In case we converted to window while trransparency was active + container.self_modulate.a = 1.0 + else: + container.self_modulate.a = value Global.transparent_checker.update_transparency(value) diff --git a/src/UI/UI.gd b/src/UI/UI.gd index 3cbc532b0..105e46511 100644 --- a/src/UI/UI.gd +++ b/src/UI/UI.gd @@ -1,12 +1,28 @@ extends Panel +var shader_disabled := false +var transparency_material: ShaderMaterial + @onready var main_canvas_container := find_child("Main Canvas") as Container func _ready() -> void: + transparency_material = material + main_canvas_container.property_list_changed.connect(_re_configure_shader) update_transparent_shader() +func _re_configure_shader(): + await get_tree().process_frame + if get_window() != main_canvas_container.get_window(): + material = null + shader_disabled = true + else: + if shader_disabled: + material = transparency_material + shader_disabled = false + + func _on_main_canvas_item_rect_changed() -> void: update_transparent_shader() @@ -20,6 +36,6 @@ func update_transparent_shader() -> void: return # Works independently of the transparency feature var canvas_size: Vector2 = (main_canvas_container.size - Vector2.DOWN * 2) * Global.shrink - material.set_shader_parameter("screen_resolution", get_viewport().size) - material.set_shader_parameter("position", main_canvas_container.global_position * Global.shrink) - material.set_shader_parameter("size", canvas_size) + transparency_material.set_shader_parameter("screen_resolution", get_viewport().size) + transparency_material.set_shader_parameter("position", main_canvas_container.global_position * Global.shrink) + transparency_material.set_shader_parameter("size", canvas_size) From 370ae7525a1acbd7418f2b7ee8a51ae1f55480f2 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Fri, 18 Oct 2024 00:01:27 +0300 Subject: [PATCH 124/162] Fix formatting and make unused docstrings to comments of the previous commit --- src/UI/Dialogs/WindowOpacityDialog.gd | 6 +++--- src/UI/UI.gd | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/UI/Dialogs/WindowOpacityDialog.gd b/src/UI/Dialogs/WindowOpacityDialog.gd index 8ab8230cf..1aa4f83db 100644 --- a/src/UI/Dialogs/WindowOpacityDialog.gd +++ b/src/UI/Dialogs/WindowOpacityDialog.gd @@ -7,7 +7,7 @@ var main_canvas := Global.control.find_child("Main Canvas", true, false) func _ready() -> void: - if main_canvas is FloatingWindow: ## If it's shifted to a window then get the content + if main_canvas is FloatingWindow: # If it's shifted to a window then get the content. main_canvas = main_canvas.window_content await get_tree().process_frame Global.control.main_ui.sort_children.connect(_recalculate_opacity) @@ -30,13 +30,13 @@ func set_window_opacity(value: float) -> void: value = 100.0 slider.value = value value = value / 100.0 - # Find the TabContainer that has the Main Canvas panel + # Find the TabContainer that has the Main Canvas panel. for container: Control in Global.control.main_ui._panel_container.get_children(): if container is TabContainer: var center := container.get_rect().get_center() if main_canvas.get_rect().has_point(center): if main_canvas.get_window() != get_tree().root: - ## In case we converted to window while trransparency was active + # In case we converted to window while trransparency was active. container.self_modulate.a = 1.0 else: container.self_modulate.a = value diff --git a/src/UI/UI.gd b/src/UI/UI.gd index 105e46511..c95234f6d 100644 --- a/src/UI/UI.gd +++ b/src/UI/UI.gd @@ -37,5 +37,7 @@ func update_transparent_shader() -> void: # Works independently of the transparency feature var canvas_size: Vector2 = (main_canvas_container.size - Vector2.DOWN * 2) * Global.shrink transparency_material.set_shader_parameter("screen_resolution", get_viewport().size) - transparency_material.set_shader_parameter("position", main_canvas_container.global_position * Global.shrink) + transparency_material.set_shader_parameter( + "position", main_canvas_container.global_position * Global.shrink + ) transparency_material.set_shader_parameter("size", canvas_size) From f0307a77441cb57804bc2071eb13760059f2478f Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Fri, 18 Oct 2024 19:54:00 +0300 Subject: [PATCH 125/162] Bump version to v1.0.4-rc1 --- project.godot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.godot b/project.godot index e5ac05993..7979e0032 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.4-dev" +config/version="v1.0.4-rc1" run/main_scene="res://src/Main.tscn" config/use_custom_user_dir=true config/custom_user_dir_name="pixelorama" From 66f150122af7949da9db8cf052ae18b41131c522 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Sat, 19 Oct 2024 00:14:39 +0300 Subject: [PATCH 126/162] [skip ci] Update CHANGELOG.md --- CHANGELOG.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8dd8fe71..c0f8fe9b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,19 +15,29 @@ Built using Godot 4.3 - Added a new "color replace" mode to the Shading tool, that uses the colors of the palette to apply shading. [#1107](https://github.com/Orama-Interactive/Pixelorama/pull/1107) - Added a new Erase blend mode. [#1117](https://github.com/Orama-Interactive/Pixelorama/pull/1117) - It is now possible to change the font, depth and line spacing of 3D text. -- Clipping to selecting during export is now possible. [#1113](https://github.com/Orama-Interactive/Pixelorama/pull/1113) +- Implemented the ability to change the font of the interface from the properties. +- Clipping to selection during export is now possible. [#1113](https://github.com/Orama-Interactive/Pixelorama/pull/1113) +- Added a preference to share options between tools. [#1120](https://github.com/Orama-Interactive/Pixelorama/pull/1120) +- Added an option to quickly center the canvas in the View menu. [#1123](https://github.com/Orama-Interactive/Pixelorama/pull/1123) - Added hotkeys to switch between tabs. Control+Tab to go to the next project tab, and Control+Shift+Tab to go to the previous. [#1109](https://github.com/Orama-Interactive/Pixelorama/pull/1109) - Added menus next to each of the two mirroring buttons in the Global Tool Options, that allow users to automatically move the symmetry guides to the center of the canvas, or the view center. - A new Reset category has been added to the Preferences that lets users easily restore certain options. +### Changed +- Bumped extensions API version to 5. +- Made some UI improvements to the rotate/flip image brush options. [#1105](https://github.com/Orama-Interactive/Pixelorama/pull/1105) +- The bucket tool now picks colors from the top-most layer, like the rest of the drawing tools. + ### 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. - Fixed 3D Shape Edit tool option values not updating when switching between 3D objects. +- Using the bucket tool while moving the cursor and also holding the color picker shortcut (Alt by default), now picks colors instead of actually using the tool. - Tool previews are now being properly cleared when switching to other tools before finishing the action being performed by the previous tool. - Fixed icons not being set to the correct color when launching Pixelorama with the dark theme. - Fixed some text in the About dialog not having the text color of the theme. +- Fixed the backup confirmation dialog closing when clicking outside of it when single window mode is disabled. - 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 stretch and expand modes in the UI. [#1103](https://github.com/Orama-Interactive/Pixelorama/pull/1103) From e2b54f70f7b060f28a3e93f1ecb8ac8e8289d3fb Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Tue, 22 Oct 2024 15:39:30 +0300 Subject: [PATCH 127/162] Bump pxo file version to 4 to fix blend mode compatibility with older pxo files The addition of the erase blend mode from #1117 resulted in loading pxo files from v1.0-v1.0.3 to have incorrect blend modes in their layers, if they are set to anything below normal, because the values of the `BaseLayer.BlendModes` enumerator changed. --- project.godot | 2 +- src/Classes/Project.gd | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/project.godot b/project.godot index 7979e0032..b10078036 100644 --- a/project.godot +++ b/project.godot @@ -25,7 +25,7 @@ config/icon="res://assets/graphics/icons/icon.png" config/macos_native_icon="res://assets/graphics/icons/icon.icns" config/windows_native_icon="res://assets/graphics/icons/icon.ico" config/ExtensionsAPI_Version=5 -config/Pxo_Version=3 +config/Pxo_Version=4 [audio] diff --git a/src/Classes/Project.gd b/src/Classes/Project.gd index fbfee1362..3016ad133 100644 --- a/src/Classes/Project.gd +++ b/src/Classes/Project.gd @@ -278,6 +278,9 @@ func serialize() -> Dictionary: func deserialize(dict: Dictionary, zip_reader: ZIPReader = null, file: FileAccess = null) -> void: about_to_deserialize.emit(dict) + var pxo_version = dict.get( + "pxo_version", ProjectSettings.get_setting("application/config/Pxo_Version") + ) if dict.has("size_x") and dict.has("size_y"): size.x = dict.size_x size.y = dict.size_y @@ -327,8 +330,7 @@ func deserialize(dict: Dictionary, zip_reader: ZIPReader = null, file: FileAcces # Don't do anything with it, just read it so that the file can move on file.get_buffer(size.x * size.y * 4) cels.append(Cel3D.new(size, true)) - if dict.has("pxo_version"): - cel["pxo_version"] = dict["pxo_version"] + cel["pxo_version"] = pxo_version cels[cel_i].deserialize(cel) _deserialize_metadata(cels[cel_i], cel) cel_i += 1 @@ -348,7 +350,15 @@ func deserialize(dict: Dictionary, zip_reader: ZIPReader = null, file: FileAcces # a layer, so loop again after creating them: for layer_i in dict.layers.size(): layers[layer_i].index = layer_i - layers[layer_i].deserialize(dict.layers[layer_i]) + var layer_dict: Dictionary = dict.layers[layer_i] + # Ensure that loaded pxo files from v1.0-v1.0.3 have the correct + # blend mode, after the addition of the Erase mode in v1.0.4. + if pxo_version < 4 and layer_dict.has("blend_mode"): + var blend_mode: int = layer_dict.get("blend_mode") + if blend_mode >= BaseLayer.BlendModes.ERASE: + blend_mode += 1 + layer_dict["blend_mode"] = blend_mode + layers[layer_i].deserialize(layer_dict) _deserialize_metadata(layers[layer_i], dict.layers[layer_i]) if dict.has("tags"): for tag in dict.tags: From 17d56bb432090d2d13808da4c1645c13ed4e1c01 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Tue, 22 Oct 2024 15:43:07 +0300 Subject: [PATCH 128/162] Update tool child scenes to reflect the changes of #1105 Just to fix some warnings --- src/Tools/BaseShapeDrawer.tscn | 14 +++++++------- src/Tools/DesignTools/Bucket.tscn | 16 +++++++--------- src/Tools/DesignTools/CurveTool.tscn | 14 +++++++------- src/Tools/DesignTools/EllipseTool.tscn | 14 +++++++------- src/Tools/DesignTools/Eraser.tscn | 14 +++++++------- src/Tools/DesignTools/LineTool.tscn | 14 +++++++------- src/Tools/DesignTools/Pencil.tscn | 14 +++++++------- src/Tools/DesignTools/RectangleTool.tscn | 14 +++++++------- 8 files changed, 56 insertions(+), 58 deletions(-) diff --git a/src/Tools/BaseShapeDrawer.tscn b/src/Tools/BaseShapeDrawer.tscn index 243e93646..a5badf2ae 100644 --- a/src/Tools/BaseShapeDrawer.tscn +++ b/src/Tools/BaseShapeDrawer.tscn @@ -4,7 +4,7 @@ [ext_resource type="PackedScene" uid="uid://ubyatap3sylf" path="res://src/Tools/BaseDraw.tscn" id="2"] [ext_resource type="PackedScene" uid="uid://yjhp0ssng2mp" path="res://src/UI/Nodes/ValueSlider.tscn" id="3"] -[sub_resource type="ButtonGroup" id="ButtonGroup_mvrqm"] +[sub_resource type="ButtonGroup" id="ButtonGroup_7w1wt"] resource_name = "rotate" allow_unpress = true @@ -26,14 +26,14 @@ tooltip_text = "Fills the drawn shape with color, instead of drawing a hollow sh mouse_default_cursor_shape = 2 text = "Fill Shape" -[node name="Rotate90" parent="RotationOptions/Rotate" index="0"] -button_group = SubResource("ButtonGroup_mvrqm") +[node name="Rotate90" parent="RotationOptions/GridContainer/Rotate" index="0"] +button_group = SubResource("ButtonGroup_7w1wt") -[node name="Rotate180" parent="RotationOptions/Rotate" index="1"] -button_group = SubResource("ButtonGroup_mvrqm") +[node name="Rotate180" parent="RotationOptions/GridContainer/Rotate" index="1"] +button_group = SubResource("ButtonGroup_7w1wt") -[node name="Rotate270" parent="RotationOptions/Rotate" index="2"] -button_group = SubResource("ButtonGroup_mvrqm") +[node name="Rotate270" parent="RotationOptions/GridContainer/Rotate" index="2"] +button_group = SubResource("ButtonGroup_7w1wt") [node name="Brush" parent="." index="5"] visible = false diff --git a/src/Tools/DesignTools/Bucket.tscn b/src/Tools/DesignTools/Bucket.tscn index 871cac243..d24b67424 100644 --- a/src/Tools/DesignTools/Bucket.tscn +++ b/src/Tools/DesignTools/Bucket.tscn @@ -5,7 +5,7 @@ [ext_resource type="Script" path="res://src/Tools/DesignTools/Bucket.gd" id="3"] [ext_resource type="Script" path="res://src/UI/Nodes/ValueSlider.gd" id="4_1pngp"] -[sub_resource type="StyleBoxFlat" id="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 @@ -14,7 +14,7 @@ corner_radius_bottom_right = 5 corner_radius_bottom_left = 5 anti_aliasing = false -[sub_resource type="StyleBoxFlat" id="2"] +[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 @@ -38,10 +38,9 @@ text = "Fill area:" layout_mode = 2 size_flags_horizontal = 3 mouse_default_cursor_shape = 2 -item_count = 3 selected = 0 +item_count = 3 popup/item_0/text = "Similar area" -popup/item_0/id = 0 popup/item_1/text = "Similar colors" popup/item_1/id = 1 popup/item_2/text = "Whole selection" @@ -71,10 +70,9 @@ text = "Fill with:" layout_mode = 2 size_flags_horizontal = 3 mouse_default_cursor_shape = 2 -item_count = 2 selected = 0 +item_count = 2 popup/item_0/text = "Selected color" -popup/item_0/id = 0 popup/item_1/text = "Pattern" popup/item_1/id = 1 @@ -89,11 +87,11 @@ layout_mode = 2 size_flags_horizontal = 0 tooltip_text = "Select a brush" mouse_default_cursor_shape = 2 -theme_override_styles/normal = SubResource("1") +theme_override_styles/focus = SubResource("2") +theme_override_styles/disabled = SubResource("2") theme_override_styles/hover = SubResource("1") theme_override_styles/pressed = SubResource("1") -theme_override_styles/disabled = SubResource("2") -theme_override_styles/focus = SubResource("2") +theme_override_styles/normal = SubResource("1") [node name="Texture2D" type="TextureRect" parent="FillPattern/Type" index="0"] layout_mode = 0 diff --git a/src/Tools/DesignTools/CurveTool.tscn b/src/Tools/DesignTools/CurveTool.tscn index 354b58a1b..094ad3e83 100644 --- a/src/Tools/DesignTools/CurveTool.tscn +++ b/src/Tools/DesignTools/CurveTool.tscn @@ -4,7 +4,7 @@ [ext_resource type="Script" path="res://src/Tools/DesignTools/CurveTool.gd" id="2_tjnp6"] [ext_resource type="PackedScene" uid="uid://yjhp0ssng2mp" path="res://src/UI/Nodes/ValueSlider.tscn" id="3_g0nav"] -[sub_resource type="ButtonGroup" id="ButtonGroup_ko8wf"] +[sub_resource type="ButtonGroup" id="ButtonGroup_drx24"] resource_name = "rotate" allow_unpress = true @@ -26,14 +26,14 @@ tooltip_text = "Fills the drawn shape with color, instead of drawing a hollow sh mouse_default_cursor_shape = 2 text = "Fill Shape" -[node name="Rotate90" parent="RotationOptions/Rotate" index="0"] -button_group = SubResource("ButtonGroup_ko8wf") +[node name="Rotate90" parent="RotationOptions/GridContainer/Rotate" index="0"] +button_group = SubResource("ButtonGroup_drx24") -[node name="Rotate180" parent="RotationOptions/Rotate" index="1"] -button_group = SubResource("ButtonGroup_ko8wf") +[node name="Rotate180" parent="RotationOptions/GridContainer/Rotate" index="1"] +button_group = SubResource("ButtonGroup_drx24") -[node name="Rotate270" parent="RotationOptions/Rotate" index="2"] -button_group = SubResource("ButtonGroup_ko8wf") +[node name="Rotate270" parent="RotationOptions/GridContainer/Rotate" index="2"] +button_group = SubResource("ButtonGroup_drx24") [node name="Brush" parent="." index="5"] visible = false diff --git a/src/Tools/DesignTools/EllipseTool.tscn b/src/Tools/DesignTools/EllipseTool.tscn index 59f20adee..65826128a 100644 --- a/src/Tools/DesignTools/EllipseTool.tscn +++ b/src/Tools/DesignTools/EllipseTool.tscn @@ -3,18 +3,18 @@ [ext_resource type="PackedScene" uid="uid://n40lhf8hm7o1" path="res://src/Tools/BaseShapeDrawer.tscn" id="1"] [ext_resource type="Script" path="res://src/Tools/DesignTools/EllipseTool.gd" id="2"] -[sub_resource type="ButtonGroup" id="ButtonGroup_q7ttl"] +[sub_resource type="ButtonGroup" id="ButtonGroup_nq4ym"] resource_name = "rotate" allow_unpress = true [node name="ToolOptions" instance=ExtResource("1")] script = ExtResource("2") -[node name="Rotate90" parent="RotationOptions/Rotate" index="0"] -button_group = SubResource("ButtonGroup_q7ttl") +[node name="Rotate90" parent="RotationOptions/GridContainer/Rotate" index="0"] +button_group = SubResource("ButtonGroup_nq4ym") -[node name="Rotate180" parent="RotationOptions/Rotate" index="1"] -button_group = SubResource("ButtonGroup_q7ttl") +[node name="Rotate180" parent="RotationOptions/GridContainer/Rotate" index="1"] +button_group = SubResource("ButtonGroup_nq4ym") -[node name="Rotate270" parent="RotationOptions/Rotate" index="2"] -button_group = SubResource("ButtonGroup_q7ttl") +[node name="Rotate270" parent="RotationOptions/GridContainer/Rotate" index="2"] +button_group = SubResource("ButtonGroup_nq4ym") diff --git a/src/Tools/DesignTools/Eraser.tscn b/src/Tools/DesignTools/Eraser.tscn index f161245e0..edb437339 100644 --- a/src/Tools/DesignTools/Eraser.tscn +++ b/src/Tools/DesignTools/Eraser.tscn @@ -4,21 +4,21 @@ [ext_resource type="Script" path="res://src/Tools/DesignTools/Eraser.gd" id="2"] [ext_resource type="PackedScene" uid="uid://yjhp0ssng2mp" path="res://src/UI/Nodes/ValueSlider.tscn" id="3"] -[sub_resource type="ButtonGroup" id="ButtonGroup_kkavr"] +[sub_resource type="ButtonGroup" id="ButtonGroup_7k1sb"] resource_name = "rotate" allow_unpress = true [node name="ToolOptions" instance=ExtResource("1")] script = ExtResource("2") -[node name="Rotate90" parent="RotationOptions/Rotate" index="0"] -button_group = SubResource("ButtonGroup_kkavr") +[node name="Rotate90" parent="RotationOptions/GridContainer/Rotate" index="0"] +button_group = SubResource("ButtonGroup_7k1sb") -[node name="Rotate180" parent="RotationOptions/Rotate" index="1"] -button_group = SubResource("ButtonGroup_kkavr") +[node name="Rotate180" parent="RotationOptions/GridContainer/Rotate" index="1"] +button_group = SubResource("ButtonGroup_7k1sb") -[node name="Rotate270" parent="RotationOptions/Rotate" index="2"] -button_group = SubResource("ButtonGroup_kkavr") +[node name="Rotate270" parent="RotationOptions/GridContainer/Rotate" index="2"] +button_group = SubResource("ButtonGroup_7k1sb") [node name="OpacitySlider" parent="." index="5" instance=ExtResource("3")] layout_mode = 2 diff --git a/src/Tools/DesignTools/LineTool.tscn b/src/Tools/DesignTools/LineTool.tscn index 08777f19c..62a9e900e 100644 --- a/src/Tools/DesignTools/LineTool.tscn +++ b/src/Tools/DesignTools/LineTool.tscn @@ -4,7 +4,7 @@ [ext_resource type="Script" path="res://src/Tools/DesignTools/LineTool.gd" id="2"] [ext_resource type="PackedScene" uid="uid://yjhp0ssng2mp" path="res://src/UI/Nodes/ValueSlider.tscn" id="3"] -[sub_resource type="ButtonGroup" id="ButtonGroup_ko8wf"] +[sub_resource type="ButtonGroup" id="ButtonGroup_o5212"] resource_name = "rotate" allow_unpress = true @@ -20,14 +20,14 @@ suffix = "px" global_increment_action = "brush_size_increment" global_decrement_action = "brush_size_decrement" -[node name="Rotate90" parent="RotationOptions/Rotate" index="0"] -button_group = SubResource("ButtonGroup_ko8wf") +[node name="Rotate90" parent="RotationOptions/GridContainer/Rotate" index="0"] +button_group = SubResource("ButtonGroup_o5212") -[node name="Rotate180" parent="RotationOptions/Rotate" index="1"] -button_group = SubResource("ButtonGroup_ko8wf") +[node name="Rotate180" parent="RotationOptions/GridContainer/Rotate" index="1"] +button_group = SubResource("ButtonGroup_o5212") -[node name="Rotate270" parent="RotationOptions/Rotate" index="2"] -button_group = SubResource("ButtonGroup_ko8wf") +[node name="Rotate270" parent="RotationOptions/GridContainer/Rotate" index="2"] +button_group = SubResource("ButtonGroup_o5212") [node name="Brush" parent="." index="4"] visible = false diff --git a/src/Tools/DesignTools/Pencil.tscn b/src/Tools/DesignTools/Pencil.tscn index af81dc0a4..2ac7774f6 100644 --- a/src/Tools/DesignTools/Pencil.tscn +++ b/src/Tools/DesignTools/Pencil.tscn @@ -4,21 +4,21 @@ [ext_resource type="PackedScene" path="res://src/UI/Nodes/ValueSliderV2.tscn" id="2"] [ext_resource type="Script" path="res://src/Tools/DesignTools/Pencil.gd" id="3"] -[sub_resource type="ButtonGroup" id="ButtonGroup_clato"] +[sub_resource type="ButtonGroup" id="ButtonGroup_e3rs3"] resource_name = "rotate" allow_unpress = true [node name="ToolOptions" instance=ExtResource("1")] script = ExtResource("3") -[node name="Rotate90" parent="RotationOptions/Rotate" index="0"] -button_group = SubResource("ButtonGroup_clato") +[node name="Rotate90" parent="RotationOptions/GridContainer/Rotate" index="0"] +button_group = SubResource("ButtonGroup_e3rs3") -[node name="Rotate180" parent="RotationOptions/Rotate" index="1"] -button_group = SubResource("ButtonGroup_clato") +[node name="Rotate180" parent="RotationOptions/GridContainer/Rotate" index="1"] +button_group = SubResource("ButtonGroup_e3rs3") -[node name="Rotate270" parent="RotationOptions/Rotate" index="2"] -button_group = SubResource("ButtonGroup_clato") +[node name="Rotate270" parent="RotationOptions/GridContainer/Rotate" index="2"] +button_group = SubResource("ButtonGroup_e3rs3") [node name="Overwrite" type="CheckBox" parent="." index="5"] layout_mode = 2 diff --git a/src/Tools/DesignTools/RectangleTool.tscn b/src/Tools/DesignTools/RectangleTool.tscn index 461bc8e09..5c0f91b34 100644 --- a/src/Tools/DesignTools/RectangleTool.tscn +++ b/src/Tools/DesignTools/RectangleTool.tscn @@ -3,18 +3,18 @@ [ext_resource type="PackedScene" uid="uid://n40lhf8hm7o1" path="res://src/Tools/BaseShapeDrawer.tscn" id="1"] [ext_resource type="Script" path="res://src/Tools/DesignTools/RectangleTool.gd" id="2"] -[sub_resource type="ButtonGroup" id="ButtonGroup_cyxrj"] +[sub_resource type="ButtonGroup" id="ButtonGroup_vkkkg"] resource_name = "rotate" allow_unpress = true [node name="ToolOptions" instance=ExtResource("1")] script = ExtResource("2") -[node name="Rotate90" parent="RotationOptions/Rotate" index="0"] -button_group = SubResource("ButtonGroup_cyxrj") +[node name="Rotate90" parent="RotationOptions/GridContainer/Rotate" index="0"] +button_group = SubResource("ButtonGroup_vkkkg") -[node name="Rotate180" parent="RotationOptions/Rotate" index="1"] -button_group = SubResource("ButtonGroup_cyxrj") +[node name="Rotate180" parent="RotationOptions/GridContainer/Rotate" index="1"] +button_group = SubResource("ButtonGroup_vkkkg") -[node name="Rotate270" parent="RotationOptions/Rotate" index="2"] -button_group = SubResource("ButtonGroup_cyxrj") +[node name="Rotate270" parent="RotationOptions/GridContainer/Rotate" index="2"] +button_group = SubResource("ButtonGroup_vkkkg") From dd8d217dc362b472f8c4690d68fd1102a2af5e61 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Tue, 22 Oct 2024 15:54:59 +0300 Subject: [PATCH 129/162] Changes in formatting due to gdtoolkit's new update https://github.com/Scony/godot-gdscript-toolkit/releases/tag/4.3.2 --- .gdlintrc | 1 - src/Classes/ShaderLoader.gd | 11 ++++++----- src/UI/Canvas/Canvas.gd | 6 +++++- src/UI/Dialogs/ManageLayouts.gd | 5 ++--- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.gdlintrc b/.gdlintrc index d0a139df2..1818289c4 100644 --- a/.gdlintrc +++ b/.gdlintrc @@ -2,6 +2,5 @@ disable: - no-elif-return - no-else-return - max-returns - - private-method-call max-file-lines: 2000 diff --git a/src/Classes/ShaderLoader.gd b/src/Classes/ShaderLoader.gd index 1db9d732f..e2f7a8a62 100644 --- a/src/Classes/ShaderLoader.gd +++ b/src/Classes/ShaderLoader.gd @@ -267,11 +267,12 @@ static func create_ui_for_shader_uniforms( 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) - ) + 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 diff --git a/src/UI/Canvas/Canvas.gd b/src/UI/Canvas/Canvas.gd index 35867c633..cae059c73 100644 --- a/src/UI/Canvas/Canvas.gd +++ b/src/UI/Canvas/Canvas.gd @@ -33,7 +33,11 @@ var layer_metadata_texture := ImageTexture.new() func _ready() -> void: material.set_shader_parameter("layers", layer_texture_array) material.set_shader_parameter("metadata", layer_metadata_texture) - Global.project_switched.connect(func(): project_changed = true ; queue_redraw()) + Global.project_switched.connect( + func(): + project_changed = true + queue_redraw() + ) onion_past.type = onion_past.PAST onion_past.blue_red_color = Global.onion_skinning_past_color onion_future.type = onion_future.FUTURE diff --git a/src/UI/Dialogs/ManageLayouts.gd b/src/UI/Dialogs/ManageLayouts.gd index 27edd6949..30ed0bd83 100644 --- a/src/UI/Dialogs/ManageLayouts.gd +++ b/src/UI/Dialogs/ManageLayouts.gd @@ -97,9 +97,8 @@ func _on_LayoutSettings_confirmed() -> void: Global.control.main_ui.layout = layout layout_list.add_item(layout_name.text) Global.layouts.sort_custom( - func(a: DockableLayout, b: DockableLayout): return ( - a.resource_path.get_file() < b.resource_path.get_file() - ) + func(a: DockableLayout, b: DockableLayout): + return a.resource_path.get_file() < b.resource_path.get_file() ) var layout_index := Global.layouts.find(layout) Global.top_menu_container.populate_layouts_submenu() From f42d361a428f21e75da5d5c9a0a03d19b8f3f90e Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Wed, 23 Oct 2024 12:00:19 +0300 Subject: [PATCH 130/162] Minor UI improvements for the mirroring buttons --- .../GlobalToolOptions/GlobalToolOptions.tscn | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/UI/GlobalToolOptions/GlobalToolOptions.tscn b/src/UI/GlobalToolOptions/GlobalToolOptions.tscn index ba988ab9e..012f227e5 100644 --- a/src/UI/GlobalToolOptions/GlobalToolOptions.tscn +++ b/src/UI/GlobalToolOptions/GlobalToolOptions.tscn @@ -74,7 +74,7 @@ size_flags_vertical = 0 columns = 5 [node name="Horizontal" type="Button" parent="ScrollContainer/CenterContainer/GridContainer" groups=["UIButtons"]] -custom_minimum_size = Vector2(44, 32) +custom_minimum_size = Vector2(46, 32) layout_mode = 2 tooltip_text = "Enable horizontal mirrored drawing" mouse_default_cursor_shape = 2 @@ -95,14 +95,14 @@ texture = ExtResource("1") [node name="HorizontalMirrorOptions" type="MenuButton" parent="ScrollContainer/CenterContainer/GridContainer/Horizontal"] unique_name_in_owner = true -custom_minimum_size = Vector2(22, 0) +custom_minimum_size = Vector2(20, 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_left = -20.0 offset_top = -10.0 offset_bottom = 10.0 grow_horizontal = 0 @@ -114,7 +114,8 @@ 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 +layout_mode = 1 +anchors_preset = 8 anchor_left = 0.5 anchor_top = 0.5 anchor_right = 0.5 @@ -123,10 +124,13 @@ offset_left = -6.0 offset_top = -6.0 offset_right = 6.0 offset_bottom = 6.0 +grow_horizontal = 2 +grow_vertical = 2 texture = ExtResource("3_faalk") +stretch_mode = 3 [node name="Vertical" type="Button" parent="ScrollContainer/CenterContainer/GridContainer" groups=["UIButtons"]] -custom_minimum_size = Vector2(44, 32) +custom_minimum_size = Vector2(46, 32) layout_mode = 2 tooltip_text = "Enable vertical mirrored drawing" mouse_default_cursor_shape = 2 @@ -147,14 +151,14 @@ texture = ExtResource("2") [node name="VerticalMirrorOptions" type="MenuButton" parent="ScrollContainer/CenterContainer/GridContainer/Vertical"] unique_name_in_owner = true -custom_minimum_size = Vector2(22, 0) +custom_minimum_size = Vector2(20, 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_left = -20.0 offset_top = -10.0 offset_bottom = 10.0 grow_horizontal = 0 @@ -166,16 +170,14 @@ 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 = -6.0 -offset_top = -6.0 -offset_right = 6.0 -offset_bottom = 6.0 +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 texture = ExtResource("3_faalk") +stretch_mode = 3 [node name="PixelPerfect" type="Button" parent="ScrollContainer/CenterContainer/GridContainer" groups=["UIButtons"]] custom_minimum_size = Vector2(32, 32) From 2d7d7e7c062435a07dcf0b41b85fffc339686baa Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Wed, 23 Oct 2024 12:02:19 +0300 Subject: [PATCH 131/162] Allow greater values in the resize slider of the export dialog --- src/UI/Dialogs/ExportDialog.tscn | 1 + 1 file changed, 1 insertion(+) diff --git a/src/UI/Dialogs/ExportDialog.tscn b/src/UI/Dialogs/ExportDialog.tscn index f81fb8c87..0efa1bc9b 100644 --- a/src/UI/Dialogs/ExportDialog.tscn +++ b/src/UI/Dialogs/ExportDialog.tscn @@ -163,6 +163,7 @@ min_value = 50.0 max_value = 1000.0 step = 50.0 value = 100.0 +allow_greater = true nine_patch_stretch = true stretch_margin_left = 3 stretch_margin_top = 3 From 0e714183b9cae87781906ea1affcffd10b03abc8 Mon Sep 17 00:00:00 2001 From: Mariano Semelman Date: Thu, 24 Oct 2024 01:32:19 +0200 Subject: [PATCH 132/162] Fix: Allow device to sleep (#1125) Updated project.godot to set window/energy_saving/keep_screen_on to false (by default is true) --- project.godot | 1 + 1 file changed, 1 insertion(+) diff --git a/project.godot b/project.godot index b10078036..de228fe3e 100644 --- a/project.godot +++ b/project.godot @@ -54,6 +54,7 @@ gdscript/warnings/narrowing_conversion=false window/size/viewport_width=1280 window/size/viewport_height=720 +window/energy_saving/keep_screen_on=false window/per_pixel_transparency/allowed.android=false window/per_pixel_transparency/allowed.web=false From ebf84e9ea9e1e6ab66d4611c1cbcee6d9ff9e43d Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Fri, 25 Oct 2024 01:24:55 +0300 Subject: [PATCH 133/162] [skip ci] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c0f8fe9b7..849995aa0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,8 @@ Built using Godot 4.3 ### Changed - Bumped extensions API version to 5. +- The screen no longer remains on when idle, avoiding unnecessary power consumption. [#1125](https://github.com/Orama-Interactive/Pixelorama/pull/1125) +- The export dialog's resize slider now allows for values greater than 1000. - Made some UI improvements to the rotate/flip image brush options. [#1105](https://github.com/Orama-Interactive/Pixelorama/pull/1105) - The bucket tool now picks colors from the top-most layer, like the rest of the drawing tools. From 9338b2e6bb43970404238448f51416459393d455 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Fri, 25 Oct 2024 11:46:29 +0300 Subject: [PATCH 134/162] New Crowdin updates (#1106) --- Translations/af_ZA.po | 72 +++++++++++++++++- Translations/ar_SA.po | 74 +++++++++++++++++-- Translations/be_BY.po | 72 +++++++++++++++++- Translations/bg_BG.po | 72 +++++++++++++++++- Translations/ca_ES.po | 74 +++++++++++++++++-- Translations/cs_CZ.po | 78 ++++++++++++++++++-- Translations/cy_GB.po | 72 +++++++++++++++++- Translations/da_DK.po | 74 +++++++++++++++++-- Translations/de_DE.po | 78 ++++++++++++++++++-- Translations/el_GR.po | 79 ++++++++++++++++++-- Translations/en_PT.po | 72 +++++++++++++++++- Translations/eo_UY.po | 74 +++++++++++++++++-- Translations/es_ES.po | 95 ++++++++++++++++++++---- Translations/et_EE.po | 72 +++++++++++++++++- Translations/fi_FI.po | 72 +++++++++++++++++- Translations/fil_PH.po | 72 +++++++++++++++++- Translations/fr_FR.po | 164 +++++++++++++++++++++++++++++------------ Translations/ga_IE.po | 72 +++++++++++++++++- Translations/grc.po | 72 +++++++++++++++++- Translations/he_IL.po | 74 +++++++++++++++++-- Translations/hi_IN.po | 72 +++++++++++++++++- Translations/hr_HR.po | 72 +++++++++++++++++- Translations/hu_HU.po | 74 +++++++++++++++++-- Translations/id_ID.po | 87 +++++++++++++++++++--- Translations/is_IS.po | 72 +++++++++++++++++- Translations/it_IT.po | 79 ++++++++++++++++++-- Translations/ja_JP.po | 89 +++++++++++++++++++--- Translations/ko_KR.po | 74 +++++++++++++++++-- Translations/la_LA.po | 72 +++++++++++++++++- Translations/lt_LT.po | 72 +++++++++++++++++- Translations/lv_LV.po | 74 +++++++++++++++++-- Translations/mk_MK.po | 72 +++++++++++++++++- Translations/ml_IN.po | 72 +++++++++++++++++- Translations/mr_IN.po | 72 +++++++++++++++++- Translations/ms_MY.po | 72 +++++++++++++++++- Translations/nb_NO.po | 74 +++++++++++++++++-- Translations/nl_NL.po | 72 +++++++++++++++++- Translations/pl_PL.po | 78 ++++++++++++++++++-- Translations/pt_BR.po | 92 +++++++++++++++++++---- Translations/pt_PT.po | 74 +++++++++++++++++-- Translations/ro_RO.po | 79 ++++++++++++++++++-- Translations/ru_RU.po | 74 +++++++++++++++++-- Translations/si_LK.po | 72 +++++++++++++++++- Translations/sk_SK.po | 72 +++++++++++++++++- Translations/sl_SI.po | 72 +++++++++++++++++- Translations/sq_AL.po | 72 +++++++++++++++++- Translations/sr_SP.po | 72 +++++++++++++++++- Translations/sv_SE.po | 74 +++++++++++++++++-- Translations/sw_KE.po | 72 +++++++++++++++++- Translations/ta_IN.po | 72 +++++++++++++++++- Translations/th_TH.po | 72 +++++++++++++++++- Translations/tlh_AA.po | 72 +++++++++++++++++- Translations/tr_TR.po | 78 ++++++++++++++++++-- Translations/uk_UA.po | 74 +++++++++++++++++-- Translations/vi_VN.po | 72 +++++++++++++++++- Translations/zh_CN.po | 92 +++++++++++++++++++---- Translations/zh_TW.po | 74 +++++++++++++++++-- installer/po/ru-RU.po | 4 +- 58 files changed, 4012 insertions(+), 356 deletions(-) diff --git a/Translations/af_ZA.po b/Translations/af_ZA.po index 318c0f2cb..7014ffff3 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:10\n" msgid "OK" msgstr "Goed" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/ar_SA.po b/Translations/ar_SA.po index c3f6c24b6..58a6cebb9 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:10\n" msgid "OK" msgstr "حسنا" @@ -231,6 +231,10 @@ msgstr "التدوير بشكل عمودي" msgid "Preferences" msgstr "خيارات" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "وضع البلاط" @@ -841,6 +845,10 @@ msgstr "لغة النظام" msgid "Display scale:" msgstr "مقياس العرض:" +#. Refers to the font of a text. +msgid "Font:" +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 "حجم الخط:" @@ -907,6 +915,15 @@ msgstr "لون الخلفية من:" msgid "Background color:" msgstr "لون الخلفية" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "لون الأداة اليسري:" @@ -1983,11 +2000,19 @@ msgstr "أفقي" msgid "Enable horizontal mirrored drawing" msgstr "" +msgid "Vertical" +msgstr "رأسي" + msgid "Enable vertical mirrored drawing" msgstr "" -msgid "Vertical" -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 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:" msgstr "الإطار الحالي:" @@ -2004,10 +2029,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" @@ -2508,6 +2533,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2683,6 +2728,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 "إغلاق" @@ -3025,6 +3078,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 "" @@ -3036,12 +3093,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/be_BY.po b/Translations/be_BY.po index 016deec5f..cd0c86bd9 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:10\n" msgid "OK" msgstr "OK" @@ -231,6 +231,10 @@ msgstr "Адлюстраваць па вертыкалі" msgid "Preferences" msgstr "Налады" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Бясшоўны рэжым" @@ -840,6 +844,10 @@ msgstr "Мова сістэмы" msgid "Display scale:" msgstr "Экранны маштаб:" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -906,6 +914,15 @@ msgstr "Колер фона з:" msgid "Background color:" msgstr "Колер фона:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "Колер левага інструмента:" @@ -1978,10 +1995,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:" @@ -1999,10 +2024,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" @@ -2503,6 +2528,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2678,6 +2723,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 "" @@ -3020,6 +3073,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 "" @@ -3031,12 +3088,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/bg_BG.po b/Translations/bg_BG.po index fedff4db7..b192500e2 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:10\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/ca_ES.po b/Translations/ca_ES.po index 2c36d8787..fb2518698 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:10\n" msgid "OK" msgstr "D'acord" @@ -231,6 +231,10 @@ msgstr "Voltejar verticalment" msgid "Preferences" msgstr "Preferències" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Mode Tile" @@ -841,6 +845,10 @@ msgstr "Idioma del sistema" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -907,6 +915,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -2017,11 +2034,19 @@ msgstr "Horitzontal" msgid "Enable horizontal mirrored drawing" msgstr "Activa el dibuix emmirallat horitzontalment" +msgid "Vertical" +msgstr "Vertical" + msgid "Enable vertical mirrored drawing" msgstr "Activa el dibuix emmirallat verticalment" -msgid "Vertical" -msgstr "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:" msgstr "Fotograma actual:" @@ -2038,10 +2063,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" @@ -2543,6 +2568,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2718,6 +2763,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 "Tancar" @@ -3060,6 +3113,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 "" @@ -3071,12 +3128,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/cs_CZ.po b/Translations/cs_CZ.po index 863e16968..6c5ffce4f 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:10\n" msgid "OK" msgstr "OK" @@ -231,6 +231,10 @@ msgstr "Převrátit svisle" msgid "Preferences" msgstr "Nastavení" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Dlaždicový režim" @@ -842,6 +846,10 @@ msgstr "Systémový jazyk" msgid "Display scale:" msgstr "Škála zobrazení:" +#. Refers to the font of a text. +msgid "Font:" +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 "Velikost písma:" @@ -908,6 +916,15 @@ msgstr "Barva pozadí z:" msgid "Background color:" msgstr "Barva pozadí:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "Barva levého nástroje:" @@ -2029,11 +2046,19 @@ msgstr "Vodorovně" msgid "Enable horizontal mirrored drawing" msgstr "Povolit kreslení ve vodorovném zrcadlení" +msgid "Vertical" +msgstr "Svisle" + msgid "Enable vertical mirrored drawing" msgstr "Povolit kreslení ve svislém zrcadlení" -msgid "Vertical" -msgstr "Svisle" +#. 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:" msgstr "Aktuální snímek:" @@ -2050,11 +2075,11 @@ msgstr "Přeskočit na první snímek" msgid "Go to the previous frame" msgstr "Přejít na předchozí snímek" -msgid "Play the animation backwards (from end to beginning)" -msgstr "Přehrát animaci pozpátku (od konce do začátku)" +msgid "Play the animation backwards" +msgstr "" -msgid "Play the animation forward (from beginning to end)" -msgstr "Přehrát animaci vpřed (od začátku do konce)" +msgid "Play the animation forward" +msgstr "" msgid "Go to the next frame" msgstr "Přejít na další snímek" @@ -2557,6 +2582,26 @@ msgstr "Výchozí barva výplně:" msgid "A default background color of a new image" msgstr "Výchozí barva pozadí nového obrázku" +#. 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "Uzamknout poměr stran" @@ -2732,6 +2777,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 "Zavřít" @@ -3078,6 +3131,10 @@ msgstr "Dolní poloměr:" msgid "Text:" msgstr "Text:" +#. 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 "Velikost pixelu:" @@ -3089,12 +3146,19 @@ msgstr "Krok křivky:" msgid "Horizontal alignment:" msgstr "Vodorovné zarovnání:" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" msgstr "Vlevo" msgid "Right" msgstr "Vpravo" +#. 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 "Energie:" diff --git a/Translations/cy_GB.po b/Translations/cy_GB.po index 013c3b49f..2c2c92bed 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-09-11 15:45\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/da_DK.po b/Translations/da_DK.po index 52a13a61c..135cee427 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:10\n" msgid "OK" msgstr "OK" @@ -231,6 +231,10 @@ msgstr "Spejlvend vertikalt" msgid "Preferences" msgstr "Præferencer" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Felt-tilstand" @@ -841,6 +845,10 @@ msgstr "Systemsprog" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -907,6 +915,15 @@ msgstr "Baggrundsfarve fra:" msgid "Background color:" msgstr "Baggrundsfarve:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "Venstre værktøjsfarve:" @@ -2016,11 +2033,19 @@ msgstr "Horisontal" msgid "Enable horizontal mirrored drawing" msgstr "Aktivér horisontal spejltegning" +msgid "Vertical" +msgstr "Vertikal" + msgid "Enable vertical mirrored drawing" msgstr "Aktivér vertikal spejltegning" -msgid "Vertical" -msgstr "Vertikal" +#. 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:" msgstr "Nuværende ramme:" @@ -2037,10 +2062,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" @@ -2541,6 +2566,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2716,6 +2761,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 "Luk" @@ -3058,6 +3111,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 "" @@ -3069,12 +3126,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/de_DE.po b/Translations/de_DE.po index 089272df7..2badc72c8 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:10\n" msgid "OK" msgstr "OK" @@ -233,6 +233,10 @@ msgstr "Vertikal spiegeln" msgid "Preferences" msgstr "Einstellungen" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Kachelmodus" @@ -843,6 +847,10 @@ msgstr "Systemsprache" msgid "Display scale:" msgstr "Bildschirmmaße:" +#. Refers to the font of a text. +msgid "Font:" +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 "Schriftgröße:" @@ -909,6 +917,15 @@ msgstr "Hintergrundfarbe von:" msgid "Background color:" msgstr "Hintergrundfarbe:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "Farbe des linken Werkzeugs:" @@ -2029,11 +2046,19 @@ msgstr "Horizontal spiegeln" msgid "Enable horizontal mirrored drawing" msgstr "Aktiviere horizontal gespiegelte Zeichnung" +msgid "Vertical" +msgstr "Vertikal" + msgid "Enable vertical mirrored drawing" msgstr "Aktiviere vertikal gespiegelte Zeichnung" -msgid "Vertical" -msgstr "Vertikal" +#. 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:" msgstr "Aktueller Frame" @@ -2050,11 +2075,11 @@ msgstr "Zum ersten Frame springen" msgid "Go to the previous frame" msgstr "Zum vorherigen Frame gehen" -msgid "Play the animation backwards (from end to beginning)" -msgstr "Spiele die Animation rückwärts ab (vom Ende bis zum Anfang)" +msgid "Play the animation backwards" +msgstr "" -msgid "Play the animation forward (from beginning to end)" -msgstr "Spiele die Animation vorwärts ab (vom Anfang bis zum Ende)" +msgid "Play the animation forward" +msgstr "" msgid "Go to the next frame" msgstr "Gehe zum nächsten Frame" @@ -2557,6 +2582,26 @@ msgstr "Standardfüllfarbe:" msgid "A default background color of a new image" msgstr "Eine Standard-Hintergrundfarbe eines neuen Bildes" +#. 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "Seitenverhältnis sperren" @@ -2732,6 +2777,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 "Schließen" @@ -3077,6 +3130,10 @@ msgstr "Unterer Radius:" msgid "Text:" msgstr "Text:" +#. 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 "Pixelgröße:" @@ -3088,12 +3145,19 @@ msgstr "Kurvenschritt:" msgid "Horizontal alignment:" msgstr "Horizontale Ausrichtung:" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" msgstr "Links" msgid "Right" msgstr "Rechts" +#. 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 "Energie:" diff --git a/Translations/el_GR.po b/Translations/el_GR.po index 4c1bee570..f09a9f4fb 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-09-12 14:53\n" +"PO-Revision-Date: 2024-10-17 17:12\n" msgid "OK" msgstr "Εντάξει" @@ -233,6 +233,10 @@ msgstr "Κάθετη αναστροφή" msgid "Preferences" msgstr "Προτιμήσεις" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "Κεντράρισμα Καμβά" + msgid "Tile Mode" msgstr "Λειτουργία μοτίβου" @@ -844,6 +848,10 @@ msgstr "Γλώσσα Συστήματος" msgid "Display scale:" msgstr "Κλίμακα εμφάνισης:" +#. Refers to the font of a text. +msgid "Font:" +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 "Μέγεθος γραμματοσειράς:" @@ -910,6 +918,16 @@ msgstr "Χρώμα υποβάθρου από:" msgid "Background color:" msgstr "Χρώμα υποβάθρου:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "Κοινή χρήση επιλογών μεταξύ αριστερών και δεξιών εργαλείων" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "Αν αυτό είναι ενεργοποιημένο, οι επιλογές θα συγχρονίζονται μεταξύ του αριστερού και του δεξιού εργαλείου.\n" +"Για παράδειγμα, και τα δύο εργαλεία θα μοιράζονται το ίδιο μέγεθος βούρτσας, και η αλλαγή του σε ένα εργαλείο θα αλλάξει αμέσως και το άλλο." + msgid "Left tool color:" msgstr "Χρώμα αριστερού εργαλείου:" @@ -2030,11 +2048,19 @@ msgstr "Οριζόντια" msgid "Enable horizontal mirrored drawing" msgstr "Ενεργοποίηση ζωγραφικής με οριζόντιο κατοπτρισμό" +msgid "Vertical" +msgstr "Κάθετα" + msgid "Enable vertical mirrored drawing" msgstr "Ενεργοποίηση ζωγραφικής με κάθετο κατοπτρισμό" -msgid "Vertical" -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 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:" msgstr "Τρέχον καρέ:" @@ -2051,11 +2077,11 @@ msgstr "Μετάβαση στο πρώτο καρέ" msgid "Go to the previous frame" msgstr "Μετάβαση στο προηγούμενο καρέ" -msgid "Play the animation backwards (from end to beginning)" -msgstr "Αναπαραγωγή της κίνησης ανάποδα (από το τέλος προς την αρχή)" +msgid "Play the animation backwards" +msgstr "Αναπαραγωγή της κίνησης προς τα πίσω" -msgid "Play the animation forward (from beginning to end)" -msgstr "Αναπαραγωγή της κίνησης κανονικά (από την αρχή προς το τέλος)" +msgid "Play the animation forward" +msgstr "Αναπαραγωγή της κίνησης προς τα εμπρός" msgid "Go to the next frame" msgstr "Μετάβαση στο επόμενο καρέ" @@ -2558,6 +2584,26 @@ 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 "Διαγραφή όλων των επεκτάσεων" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "Εκκαθάριση της λίστας αρχείων που ανοίχθηκαν πρόσφατα" + msgid "Lock aspect ratio" msgstr "Κλείδωμα αναλογίας διαστάσεων" @@ -2733,6 +2779,14 @@ msgstr "Περικοπή εικόνων" msgid "Trims the exported images to their visible portion, considering each pixel with a non-zero alpha channel as visible." msgstr "Περικοπή των εξαγόμενων εικόνων στο ορατό τμήμα τους, θεωρώντας κάθε pixel με ένα μη μηδενικό alpha κανάλι ως ορατό." +#. 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 "Κλείσιμο" @@ -3078,6 +3132,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 "Μέγεθος εικονοστοιχείου:" @@ -3089,12 +3147,19 @@ msgstr "Βήμα καμπυλότητας:" msgid "Horizontal alignment:" msgstr "Οριζόντια στοίχιση:" +msgid "Vertical alignment:" +msgstr "Κάθετη στοίχιση:" + msgid "Left" 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/Translations/en_PT.po b/Translations/en_PT.po index 848dee25e..c8872f15b 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-09-11 15:45\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/eo_UY.po b/Translations/eo_UY.po index 95f52d3e7..393cc4da0 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-09-11 15:45\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "Bone" @@ -231,6 +231,10 @@ msgstr "Speguli vertikale" msgid "Preferences" msgstr "Agordoj" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Kahela reĝimo" @@ -841,6 +845,10 @@ msgstr "Sistema lingvo" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -907,6 +915,15 @@ msgstr "Koloro de la fono el:" msgid "Background color:" msgstr "Koloro de la fono:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "Koloro de la maldekstra ilo:" @@ -1969,11 +1986,19 @@ msgstr "" msgid "Enable horizontal mirrored drawing" msgstr "" +msgid "Vertical" +msgstr "Vertikala" + msgid "Enable vertical mirrored drawing" msgstr "" -msgid "Vertical" -msgstr "Vertikala" +#. 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:" msgstr "Aktuala filmero:" @@ -1990,10 +2015,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" @@ -2494,6 +2519,26 @@ msgstr "Defaŭlta plenigkoloro:" msgid "A default background color of a new image" msgstr "Defaŭlta fona koloro de nova bildo" +#. 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2669,6 +2714,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 "Fermi" @@ -3011,6 +3064,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 "" @@ -3022,12 +3079,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/es_ES.po b/Translations/es_ES.po index 82d2a07d0..8882421fb 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-19 18:46\n" msgid "OK" msgstr "OK" @@ -231,6 +231,10 @@ msgstr "Voltear verticalmente" msgid "Preferences" msgstr "Preferencias" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "Centrar el lienzo" + msgid "Tile Mode" msgstr "Modo mosaico" @@ -559,7 +563,7 @@ msgstr "Redimensionar:" #. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file. msgid "Quality:" -msgstr "" +msgstr "Calidad:" msgid "Cancel Export" msgstr "Cancelar exportación" @@ -841,6 +845,10 @@ msgstr "Idioma del sistema" msgid "Display scale:" msgstr "Escala de la interfaz:" +#. Refers to the font of a text. +msgid "Font:" +msgstr "Fuente:" + #. Found in the preferences, under the interface section. Allows users to set the size of the font, ie the text. msgid "Font size:" msgstr "Tamaño de la fuente:" @@ -907,6 +915,16 @@ msgstr "Color del fondo:" msgid "Background color:" msgstr "Color de fondo:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "Sincronizar opciones entre las herramientas izquierda y derecha" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "Si está activado, se sincronizarán las opciones entre las herramientas izquierda y derecha.\n" +"Por ejemplo, ambas herramientas compartirán el mismo tamaño de pincel, y cambiarlo en una herramienta lo cambiará instantáneamente en la otra." + msgid "Left tool color:" msgstr "Color de la herramienta izquierda:" @@ -978,23 +996,23 @@ msgstr "Color de la sombra:" #. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur msgid "Gaussian Blur" -msgstr "" +msgstr "Desenfoque gaussiano" #. The type of the Gaussian blur, an image effect. msgid "Blur type:" -msgstr "" +msgstr "Tipo de desenfoque:" #. The applied amount of Gaussian blur, an image effect. msgid "Blur amount:" -msgstr "" +msgstr "Nivel de desenfoque:" #. The applied radius of Gaussian blur, an image effect. msgid "Blur radius:" -msgstr "" +msgstr "Radio de desenfoque:" #. The applied direction of Gaussian blur, an image effect. msgid "Blur direction:" -msgstr "" +msgstr "Dirección de desenfoque:" msgid "Gradient" msgstr "Degradado" @@ -2025,11 +2043,19 @@ msgstr "Horizontal" msgid "Enable horizontal mirrored drawing" msgstr "Activar dibujo de espejo horizontal" +msgid "Vertical" +msgstr "Vertical" + msgid "Enable vertical mirrored drawing" msgstr "Activar dibujo de espejo vertical" -msgid "Vertical" -msgstr "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 "Mover al centro del lienzo" + +#. 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 "Mover al centro de la vista" msgid "Current frame:" msgstr "Fotograma actual:" @@ -2046,11 +2072,11 @@ msgstr "Saltar al primer fotograma" msgid "Go to the previous frame" msgstr "Ir al fotograma anterior" -msgid "Play the animation backwards (from end to beginning)" -msgstr "Reproduce la animación hacia atrás (desde el final hasta el principio)" +msgid "Play the animation backwards" +msgstr "Reproducir la animación hacia atrás" -msgid "Play the animation forward (from beginning to end)" -msgstr "Reproducir la animación hacia adelante (de principio a fin)" +msgid "Play the animation forward" +msgstr "Reproducir la animación hacia adelante" msgid "Go to the next frame" msgstr "Ir al fotograma siguiente" @@ -2553,6 +2579,26 @@ msgstr "Color de relleno predeterminado:" msgid "A default background color of a new image" msgstr "Un color de fondo predeterminado de una nueva imagen" +#. Found in the preferences, under the Reset category. +msgid "Reset all options available in the Preferences" +msgstr "Reestablecer todas las opciones disponibles en Preferencias" + +#. Found in the preferences, under the Reset category. +msgid "Reset timeline options" +msgstr "Reestablecer opciones de línea de tiempo" + +#. Found in the preferences, under the Reset category. +msgid "Reset all tool options" +msgstr "Reestablecer todas las opciones de herramienta" + +#. Found in the preferences, under the Reset category. +msgid "Remove all extensions" +msgstr "Eliminar todas las extensiones" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "Limpiar la lista de archivos abiertos recientemente" + msgid "Lock aspect ratio" msgstr "Bloquear relación de aspecto" @@ -2722,11 +2768,19 @@ msgstr "El(los) carácter(es) que separan Él nombre del archivo y Él número d #. 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 "" +msgstr "Recortar imágenes" #. 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 "" +msgstr "Recorta las imágenes exportadas a su porción visible, considerando cada píxel con un canal de alfa diferente a cero como visible." + +#. 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 "Recortar contenido de la imagen a la selección" + +#. 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 "Solo exportar contenido que está dentro de los los límites de un área seleccionada." msgid "Close" msgstr "Cerrar" @@ -3074,6 +3128,10 @@ msgstr "Radio inferior:" msgid "Text:" msgstr "Texto:" +#. Refers to the depth of something, such as the depth of a 3D object. +msgid "Depth:" +msgstr "Profundidad:" + #. 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 "Tamaño del píxel:" @@ -3085,12 +3143,19 @@ msgstr "Nivel de curva:" msgid "Horizontal alignment:" msgstr "Alineación horizontal:" +msgid "Vertical alignment:" +msgstr "Alineación vertical:" + msgid "Left" msgstr "Izquierda" msgid "Right" msgstr "Derecha" +#. Refers to the vertical space between lines in a text. +msgid "Line spacing:" +msgstr "Interlineado:" + #. 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 "Energía:" diff --git a/Translations/et_EE.po b/Translations/et_EE.po index b48ae8683..6bd1f01fe 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/fi_FI.po b/Translations/fi_FI.po index 69da4c8a9..f22d8ce7d 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:10\n" msgid "OK" msgstr "OK" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/fil_PH.po b/Translations/fil_PH.po index 9e96fb069..6b926d30c 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-09-11 15:45\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/fr_FR.po b/Translations/fr_FR.po index 04572e476..d67fc09c7 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-24 18:36\n" msgid "OK" msgstr "OK" @@ -101,7 +101,8 @@ msgstr "Inclure les images fusionnées" 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 activée, les rendus finals mélangés sont aussi stockés dans le pxo, pour chaque Frame.\n" +"Cela rend le fichier pxo plus volumineux et est utile pour les importations par un logiciel tiers ou les exportations en ligne de commande. Le chargement de fichiers pxo dans Pixelorama ne nécessite pas que cette option soit activée." msgid "Import" msgstr "Importer" @@ -179,7 +180,7 @@ msgid "Resize Canvas" msgstr "Redimensionner le canevas" msgid "Offset Image" -msgstr "" +msgstr "Décalage de l'image" msgid "Offset:" msgstr "Décalage :" @@ -231,6 +232,10 @@ msgstr "Miroir vertical" msgid "Preferences" msgstr "Préférences" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "Centrer le Canevas" + msgid "Tile Mode" msgstr "Mode tuile" @@ -452,7 +457,7 @@ msgstr "" #. 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 "Distance de fusion :" #. 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" @@ -560,7 +565,7 @@ msgstr "Redimensionner :" #. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file. msgid "Quality:" -msgstr "" +msgstr "Qualité :" msgid "Cancel Export" msgstr "Annuler l'exportation" @@ -641,25 +646,25 @@ msgid "Export dimensions:" msgstr "Dimensions d'export :" msgid "Save a File" -msgstr "" +msgstr "Enregistrer un fichier" msgid "Go to previous folder." -msgstr "" +msgstr "Aller au dossier précédent." msgid "Go to next folder." -msgstr "" +msgstr "Aller au dossier suivant." msgid "Go to parent folder." -msgstr "" +msgstr "Aller au dossier parent." msgid "Path:" msgstr "Chemin :" msgid "Refresh files." -msgstr "" +msgstr "Rafraîchir les fichiers." msgid "Toggle the visibility of hidden files." -msgstr "" +msgstr "Activer/désactiver la visibilité des fichiers cachés." msgid "Directories & Files:" msgstr "Répertoires et fichiers :" @@ -842,6 +847,10 @@ msgstr "Langue système" msgid "Display scale:" msgstr "Taille d'Affichage:" +#. Refers to the font of a text. +msgid "Font:" +msgstr "Police:" + #. Found in the preferences, under the interface section. Allows users to set the size of the font, ie the text. msgid "Font size:" msgstr "Taille de police :" @@ -908,6 +917,15 @@ msgstr "Couleur d'arrière-plan à partir de :" msgid "Background color:" msgstr "Couleur d'arrière-plan :" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "Couleur de l'outil gauche:" @@ -979,23 +997,23 @@ msgstr "Couleur d'ombre :" #. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur msgid "Gaussian Blur" -msgstr "" +msgstr "Flou gaussien" #. The type of the Gaussian blur, an image effect. msgid "Blur type:" -msgstr "" +msgstr "Type de flou :" #. The applied amount of Gaussian blur, an image effect. msgid "Blur amount:" -msgstr "" +msgstr "Taux de flou :" #. The applied radius of Gaussian blur, an image effect. msgid "Blur radius:" -msgstr "" +msgstr "Rayon du flou :" #. The applied direction of Gaussian blur, an image effect. msgid "Blur direction:" -msgstr "" +msgstr "Direction du flou :" msgid "Gradient" msgstr "Dégradé" @@ -1079,7 +1097,7 @@ msgstr "Valeur :" #. An image effect. Adjusts the brightness and contrast of the colors of an image. msgid "Adjust Brightness/Contrast" -msgstr "" +msgstr "Ajuster la luminosité / le contraste" #. Refers to the brightness of the colors of an image. msgid "Brightness:" @@ -1091,23 +1109,23 @@ msgstr "Contraste :" #. Refers to the red value of the colors of an image. msgid "Red value:" -msgstr "" +msgstr "Valeur rouge :" #. Refers to the green value of the colors of an image. msgid "Green value:" -msgstr "" +msgstr "Valeur verte :" #. Refers to the blue value of the colors of an image. msgid "Blue value:" -msgstr "" +msgstr "Valeur bleue :" #. Refers to a color that tints an image. msgid "Tint color:" -msgstr "" +msgstr "Couleur de teinte :" #. Refers to the factor (how much) a color tints an image. msgid "Tint effect factor:" -msgstr "" +msgstr "Facteur d'effet de teinte :" msgid "Apply" msgstr "Appliquer" @@ -1158,7 +1176,7 @@ msgstr "Suivi des problèmes" #. 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 "Ouvrir le dossier des données de l'éditeur" msgid "Changelog" msgstr "Journal des modifications" @@ -1420,7 +1438,8 @@ msgstr "Pipette\n\n" msgid "Crop\n\n" "Resize the canvas" -msgstr "" +msgstr "Rogner\n\n" +"Redimensionner le canevas" msgid "Pencil\n\n" "%s for left mouse button\n" @@ -1520,7 +1539,7 @@ msgstr "Inverser les couleurs de gauche et droite." #. 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 "Couleur moyenne :" msgid "Reset the colors to their default state (black for left, white for right)" msgstr "Réinitialise les couleurs à leur état initial (noir pour l'outil gauche, blanc pour l'outil droit)" @@ -1531,7 +1550,7 @@ msgstr "Récupérer une couleur sur l'écran." #. 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 "Entrer le code hexadécimal (\"#ff0000\") ou le nom de la couleur (\"rouge\")." #. 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." @@ -1539,11 +1558,11 @@ msgstr "Sélectionner une forme de Pipette." #. Refers to color-related options such as sliders that set color channel values like R, G, B and A. msgid "Color options" -msgstr "" +msgstr "Options de couleur" #. 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 "Sélectionnez un mode de pipette." #. Checkbox found in the menu of the button with three dots found under color options in the color picker panel. msgid "Colorized Sliders" @@ -1555,7 +1574,7 @@ msgstr "" #. Found under color options in the color picker panel. msgid "Recent Colors" -msgstr "" +msgstr "Couleurs récentes" msgid "Left tool" msgstr "Outil gauche" @@ -1740,7 +1759,7 @@ msgstr "Définit la limite d'images par seconde de l'application. Plus le nombre #. 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 "Étapes max d'annulation :" #. An option found in the preferences, under the Performance section. msgid "Pause application when it loses focus" @@ -1752,11 +1771,11 @@ msgstr "Si activé, l'application est mise en pause quand le focus est perdu. Ce #. An option found in the preferences, under the Performance section. Refers to the screen being updated (redrawn) continuously. msgid "Update continuously" -msgstr "" +msgstr "Mettre à jour en continu" #. 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 cette option est activée, l'application redessine l'écran en permanence, même si elle n'est pas utilisée. Désactiver cette option permet de réduire l'utilisation du processeur et du GPU en cas d'inactivité." #. An option found in the preferences, under the Performance section. msgid "Enable window transparency" @@ -1800,7 +1819,7 @@ msgstr "Ouvrir le dossier" #. 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 "Explorer en ligne" #. 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." @@ -1887,7 +1906,7 @@ msgstr "Pixel Perfect\n" #. 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 "Verrouiller l'alpha" msgid "Fill inside" msgstr "Remplir à l’intérieur" @@ -2019,11 +2038,19 @@ msgstr "Horizontal" msgid "Enable horizontal mirrored drawing" msgstr "Dessine avec un miroir horizontal" +msgid "Vertical" +msgstr "Vertical" + msgid "Enable vertical mirrored drawing" msgstr "Dessine avec un miroir vertical" -msgid "Vertical" -msgstr "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 "Déplacer vers le centre du canevas" + +#. 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:" msgstr "Frame actuelle :" @@ -2035,22 +2062,22 @@ msgid "Current frame as spritesheet" msgstr "Frame actuelle en spritesheet" msgid "Jump to the first frame" -msgstr "" +msgstr "Aller à la première image" msgid "Go to the previous frame" -msgstr "" +msgstr "Aller à l'image précédente" -msgid "Play the animation backwards (from end to beginning)" -msgstr "" +msgid "Play the animation backwards" +msgstr "Jouer l'animation à l'envers" -msgid "Play the animation forward (from beginning to end)" -msgstr "" +msgid "Play the animation forward" +msgstr "Jouer l'animation à l'endroit" msgid "Go to the next frame" -msgstr "" +msgstr "Aller à l'image suivante" msgid "Jump to the last frame" -msgstr "" +msgstr "Aller à la dernière frame" msgid "Timeline settings" msgstr "" @@ -2115,7 +2142,7 @@ msgstr "Si sélectionné, l'animation ne joue que sur les frames partageant le m #. 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 "Taille de la cellule :" #. Found in the timeline, inside the timeline settings. If this is enabled, the past and future frames will have appear tinted. msgid "Color mode" @@ -2240,7 +2267,7 @@ 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 "" +msgstr "Passer à travers" #. Adjective, refers to something usual/regular, such as the normal blend mode. msgid "Normal" @@ -2547,6 +2574,26 @@ msgstr "Couleur de remplissage par défaut:" msgid "A default background color of a new image" msgstr "Une couleur de fond par défaut d'une nouvelle image" +#. 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 "Enlever toutes les extensions" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "Verrouiller les proportions" @@ -2722,6 +2769,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 "Fermer" @@ -3068,6 +3123,10 @@ msgstr "Rayon inférieur :" msgid "Text:" msgstr "Texte :" +#. Refers to the depth of something, such as the depth of a 3D object. +msgid "Depth:" +msgstr "Profondeur:" + #. 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 "Taille des Pixels:" @@ -3079,12 +3138,19 @@ msgstr "Étape de Courbe:" msgid "Horizontal alignment:" msgstr "Alignement horizontal :" +msgid "Vertical alignment:" +msgstr "Alignement vertical:" + msgid "Left" msgstr "Gauche" msgid "Right" msgstr "Droite" +#. Refers to the vertical space between lines in a text. +msgid "Line spacing:" +msgstr "Interligne:" + #. 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 "Énergie :" @@ -3203,11 +3269,11 @@ msgstr "Supprimer" #. 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 "Maintenez Maj enfoncé tout en appuyant pour supprimer instantanément." #. 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 "Êtes-vous sûr de vouloir supprimer cette image de référence ? Elle ne sera pas supprimée de vos fichiers locaux." #. Moves the reference image up in the list msgid "Move the selected reference image to the right" @@ -3235,7 +3301,7 @@ msgstr "Redimensionner l'image de référence sélectionnée" #. Button to select no reference images in the Reference Images panel. msgid "none" -msgstr "" +msgstr "aucun" #. Resets the Transform of the selected reference image on the canvas. msgid "Reset Transform" diff --git a/Translations/ga_IE.po b/Translations/ga_IE.po index 8baec4a68..dafdaee40 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:10\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/grc.po b/Translations/grc.po index 6ff8c94bc..19f15aca5 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-09-11 15:45\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "Ἐντάξει" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/he_IL.po b/Translations/he_IL.po index 099aa696e..6712b003c 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:10\n" msgid "OK" msgstr "אישור" @@ -231,6 +231,10 @@ msgstr "הפוך אנכית" msgid "Preferences" msgstr "העדפות" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "מצב אריח" @@ -840,6 +844,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -906,6 +914,15 @@ msgstr "צבע רקע מ:" msgid "Background color:" msgstr "צבע רקע:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "צבע כלי שמאלי:" @@ -1972,11 +1989,19 @@ msgstr "אופקי" msgid "Enable horizontal mirrored drawing" msgstr "" +msgid "Vertical" +msgstr "אנכי" + msgid "Enable vertical mirrored drawing" msgstr "" -msgid "Vertical" -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 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:" msgstr "פריים נוכחי:" @@ -1993,10 +2018,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" @@ -2498,6 +2523,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2673,6 +2718,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 "" @@ -3015,6 +3068,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 "" @@ -3026,12 +3083,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/hi_IN.po b/Translations/hi_IN.po index 744bf6757..e597d46bd 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-09-11 15:45\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "ठीक है" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/hr_HR.po b/Translations/hr_HR.po index 19b2b4a4d..f310d09fc 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/hu_HU.po b/Translations/hu_HU.po index a36113ffa..115423159 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:10\n" msgid "OK" msgstr "Ok" @@ -231,6 +231,10 @@ msgstr "Függőleges tükrözés" msgid "Preferences" msgstr "Beállítások" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Csempe mód" @@ -840,6 +844,10 @@ msgstr "Rendszer nyelv" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -906,6 +914,15 @@ msgstr "" msgid "Background color:" msgstr "Háttér színe:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1978,11 +1995,19 @@ msgstr "Vízszintes" msgid "Enable horizontal mirrored drawing" msgstr "Vízszintesen tükrözött rajzolás engedélyezése" +msgid "Vertical" +msgstr "Függőleges" + msgid "Enable vertical mirrored drawing" msgstr "Függőlegesen tükrözött rajzolás engedélyezése" -msgid "Vertical" -msgstr "Függőleges" +#. 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:" msgstr "Jelenlegi képkocka:" @@ -1999,10 +2024,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" @@ -2505,6 +2530,26 @@ msgstr "Alapértelmezett kitöltő szín:" msgid "A default background color of a new image" msgstr "Alapértelmezett háttérszíne az új képnek" +#. 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "Méretarány lezárása" @@ -2680,6 +2725,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 "Bezárás" @@ -3022,6 +3075,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 "" @@ -3033,12 +3090,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/id_ID.po b/Translations/id_ID.po index dae1e7d8d..847e5b216 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-09-12 03:49\n" +"PO-Revision-Date: 2024-10-18 20:11\n" msgid "OK" msgstr "Oke" @@ -213,7 +213,7 @@ msgid "Initial angle:" msgstr "Sudut inisial:" msgid "Clear" -msgstr "Lepas" +msgstr "Kosongkan" msgid "Invert" msgstr "Terbalikkan" @@ -233,6 +233,10 @@ msgstr "Dibalik Menegak" msgid "Preferences" msgstr "Preferensi" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "Tengahkan Kanvas" + msgid "Tile Mode" msgstr "Mode Petak" @@ -844,6 +848,10 @@ msgstr "Bahasa Sistem" msgid "Display scale:" msgstr "Skala tampilan:" +#. Refers to the font of a text. +msgid "Font:" +msgstr "Font:" + #. Found in the preferences, under the interface section. Allows users to set the size of the font, ie the text. msgid "Font size:" msgstr "Ukuran font:" @@ -910,6 +918,16 @@ msgstr "Warna latar belakang dari:" msgid "Background color:" msgstr "Warna latar belakang:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "Berbagi opsi antara alat di kiri dan di kanan" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "Jika ini diaktifkan, opsi alat di kiri dan di kanan akan disinkronkan.\n" +"Contoh, ada dua alat berbagi ukuran kuas, jika mengubah opsi di salah satu alat maka yang satunya juga berubah." + msgid "Left tool color:" msgstr "Warna alat di kiri:" @@ -1485,7 +1503,7 @@ msgstr "Garis Lengkung\n\n" "Menggaris lengkung Bezier\n" "Tekan %s/%s untuk menambah titik\n" "Tekan dan seret untuk melengkungkan\n" -"Tekan %s untuk melepas titik tadi" +"Tekan %s untuk menghapus titik tadi" msgid "Rectangle Tool\n\n" "%s for left mouse button\n" @@ -2030,11 +2048,19 @@ msgstr "Mendatar" msgid "Enable horizontal mirrored drawing" msgstr "Aktifkan gambar dicerminkan mendatar" +msgid "Vertical" +msgstr "Menegak" + msgid "Enable vertical mirrored drawing" msgstr "Aktifkan gambar dicerminkan menegak" -msgid "Vertical" -msgstr "Menegak" +#. 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 "Ke tengah kanvas" + +#. 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 "Ke tengah tampilan" msgid "Current frame:" msgstr "Bingkai saat ini:" @@ -2051,11 +2077,11 @@ msgstr "Lompat ke bingkai pertama" msgid "Go to the previous frame" msgstr "Ke bingkai sebelumnya" -msgid "Play the animation backwards (from end to beginning)" -msgstr "Putar animasi secara mundur (dari akhir sampai awal)" +msgid "Play the animation backwards" +msgstr "Putar mundur animasi" -msgid "Play the animation forward (from beginning to end)" -msgstr "Putar animasi secara normal (dari awal sampai akhir)" +msgid "Play the animation forward" +msgstr "Putar maju animasi" msgid "Go to the next frame" msgstr "Ke bingkai selanjutnya" @@ -2212,7 +2238,7 @@ msgstr "Lapisan" #. 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 "Cuplikkan mask" +msgstr "Cuplik mask" #. Hint tooltip of the create new layer button, found on the left side of the timeline. msgid "Create a new layer" @@ -2558,6 +2584,26 @@ msgstr "Warna isi bawaan:" msgid "A default background color of a new image" msgstr "Warna latar belakang bawaan pada gambar baru" +#. Found in the preferences, under the Reset category. +msgid "Reset all options available in the Preferences" +msgstr "Atur ulang semua opsi yang di Preferensi" + +#. Found in the preferences, under the Reset category. +msgid "Reset timeline options" +msgstr "Atur ulang opsi garis waktu" + +#. Found in the preferences, under the Reset category. +msgid "Reset all tool options" +msgstr "Atur ulang opsi alat-alat" + +#. Found in the preferences, under the Reset category. +msgid "Remove all extensions" +msgstr "Hapus semua ekstensi" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "Kosongkan daftar berkas yang dibuka" + msgid "Lock aspect ratio" msgstr "Kuncikan nisbah aspek" @@ -2733,6 +2779,14 @@ msgstr "Pangkas gambar" 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." +#. 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 "Cuplik isi gambar ke seleksi" + +#. 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 "Hanya mengekspor isi area yang diseleksi." + msgid "Close" msgstr "Tutup" @@ -2997,7 +3051,7 @@ msgid "Add new object" msgstr "Tambah objek baru" msgid "Remove object" -msgstr "Hilangkan Objek" +msgstr "Hapus objek" msgid "Camera" msgstr "Kamera" @@ -3079,6 +3133,10 @@ msgstr "Jari-jari bawah:" msgid "Text:" msgstr "Teks:" +#. Refers to the depth of something, such as the depth of a 3D object. +msgid "Depth:" +msgstr "Kedalaman:" + #. 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 "Ukuran piksel:" @@ -3090,12 +3148,19 @@ msgstr "Step lengkung:" msgid "Horizontal alignment:" msgstr "Penjajaran mendatar:" +msgid "Vertical alignment:" +msgstr "Penjajaran menegak:" + msgid "Left" msgstr "Kiri" msgid "Right" msgstr "Kanan" +#. Refers to the vertical space between lines in a text. +msgid "Line spacing:" +msgstr "Jarak baris:" + #. 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 "Tenaga:" diff --git a/Translations/is_IS.po b/Translations/is_IS.po index 128ea343d..89622d1d4 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/it_IT.po b/Translations/it_IT.po index c4ec5e10c..9ec08d994 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-09-12 16:19\n" +"PO-Revision-Date: 2024-10-17 15:11\n" msgid "OK" msgstr "OK" @@ -233,6 +233,10 @@ msgstr "Rifletti verticalmente" msgid "Preferences" msgstr "Preferenze" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "Centra tela" + msgid "Tile Mode" msgstr "Modalità Tile" @@ -844,6 +848,10 @@ msgstr "Lingua di sistema" msgid "Display scale:" msgstr "Scala di visualizzazione:" +#. Refers to the font of a text. +msgid "Font:" +msgstr "Font:" + #. Found in the preferences, under the interface section. Allows users to set the size of the font, ie the text. msgid "Font size:" msgstr "Dimensione carattere:" @@ -910,6 +918,16 @@ msgstr "Colore di sfondo da:" msgid "Background color:" msgstr "Colore dello sfondo:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "Condividi le opzioni tra gli strumenti sinistro e destro" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "Se abilitata, le opzioni saranno sincronizzate tra sinistra e destra.\n" +"Ad esempio, entrambi gli strumenti condivideranno la stessa dimensione del pennello e cambieranno istantaneamente su uno strumento l'altro." + msgid "Left tool color:" msgstr "Colore strumento sinistra:" @@ -2030,11 +2048,19 @@ msgstr "Orizzontale" msgid "Enable horizontal mirrored drawing" msgstr "Abilita disegno orizzontale a specchio" +msgid "Vertical" +msgstr "Verticale" + msgid "Enable vertical mirrored drawing" msgstr "Abilita disegno verticale a specchio" -msgid "Vertical" -msgstr "Verticale" +#. 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 "Sposta nel centro della superficie" + +#. 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 "Sposta nel centro della vista" msgid "Current frame:" msgstr "Frame corrente:" @@ -2051,11 +2077,11 @@ msgstr "Vai al primo fotogramma" msgid "Go to the previous frame" msgstr "Vai al fotogramma precedente" -msgid "Play the animation backwards (from end to beginning)" -msgstr "Riproduci l'animazione al contrario (da fine a inizio)" +msgid "Play the animation backwards" +msgstr "Riproduce l'animazione all'indietro" -msgid "Play the animation forward (from beginning to end)" -msgstr "Riproduce l'animazione in avanti (dall'inizio alla fine)" +msgid "Play the animation forward" +msgstr "Riproduce l'animazione in avanti" msgid "Go to the next frame" msgstr "Vai al prossimo fotogramma" @@ -2558,6 +2584,26 @@ msgstr "Colore di riempimento predefinito:" msgid "A default background color of a new image" msgstr "Un colore di sfondo predefinito di una nuova immagine" +#. Found in the preferences, under the Reset category. +msgid "Reset all options available in the Preferences" +msgstr "Reimposta tutte le opzioni disponibili nelle Preferenze" + +#. Found in the preferences, under the Reset category. +msgid "Reset timeline options" +msgstr "Reimposta opzioni timeline" + +#. Found in the preferences, under the Reset category. +msgid "Reset all tool options" +msgstr "Reimposta tutte le opzioni dello strumento" + +#. Found in the preferences, under the Reset category. +msgid "Remove all extensions" +msgstr "Rimuovi tutte le estensioni" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "Pulisce l'elenco dei file aperti di recente" + msgid "Lock aspect ratio" msgstr "Blocca proporzioni" @@ -2733,6 +2779,14 @@ msgstr "Ritaglia immagini" 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." +#. 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 "Ritaglia il contenuto dell'immagine alla selezione" + +#. 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 "Esporta solo contenuti che rientrano nei limiti di un'area selezionata." + msgid "Close" msgstr "Chiudi" @@ -3078,6 +3132,10 @@ msgstr "Raggio inferiore:" msgid "Text:" msgstr "Testo:" +#. Refers to the depth of something, such as the depth of a 3D object. +msgid "Depth:" +msgstr "Profondità:" + #. 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 "Dimensione pixel:" @@ -3089,12 +3147,19 @@ msgstr "Passaggio curva:" msgid "Horizontal alignment:" msgstr "Allineamento orizzontale:" +msgid "Vertical alignment:" +msgstr "Allineamento verticale:" + msgid "Left" msgstr "Sinistra" msgid "Right" msgstr "Destra" +#. Refers to the vertical space between lines in a text. +msgid "Line spacing:" +msgstr "Spaziatura linea:" + #. 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 "Energia:" diff --git a/Translations/ja_JP.po b/Translations/ja_JP.po index 3cba3d4b4..efdc005ad 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-09-11 17:12\n" +"PO-Revision-Date: 2024-10-17 16:15\n" msgid "OK" msgstr "OK" @@ -233,6 +233,10 @@ msgstr "垂直方向に反転" msgid "Preferences" msgstr "設定" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "キャンバスを中央へ" + msgid "Tile Mode" msgstr "タイルモード" @@ -844,6 +848,10 @@ msgstr "システム言語" msgid "Display scale:" msgstr "表示スケール:" +#. Refers to the font of a text. +msgid "Font:" +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 "フォントサイズ:" @@ -910,6 +918,16 @@ msgstr "背景色の参照元:" msgid "Background color:" msgstr "背景色:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "左と右のツール間でオプションを共有" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "これを有効にすると、オプションは左側と右側のツール間で同期されます。\n" +"例えば、両方のツールが同じブラシサイズを共有し、一方のツールでそれを変更すると、他のツールで即座に変更されます。" + msgid "Left tool color:" msgstr "左ツールの色:" @@ -981,23 +999,23 @@ msgstr "影の色:" #. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur msgid "Gaussian Blur" -msgstr "" +msgstr "ガウスぼかし" #. The type of the Gaussian blur, an image effect. msgid "Blur type:" -msgstr "" +msgstr "ぼかしタイプ:" #. The applied amount of Gaussian blur, an image effect. msgid "Blur amount:" -msgstr "" +msgstr "ぼかしの量:" #. The applied radius of Gaussian blur, an image effect. msgid "Blur radius:" -msgstr "" +msgstr "ぼかし半径:" #. The applied direction of Gaussian blur, an image effect. msgid "Blur direction:" -msgstr "" +msgstr "ぼかし方向:" msgid "Gradient" msgstr "グラディエーション" @@ -2030,11 +2048,19 @@ msgstr "水平" msgid "Enable horizontal mirrored drawing" msgstr "左右対称描画を有効化" +msgid "Vertical" +msgstr "垂直方向" + msgid "Enable vertical mirrored drawing" msgstr "上下対称描画を有効化" -msgid "Vertical" -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 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:" msgstr "現在のフレーム:" @@ -2051,11 +2077,11 @@ msgstr "最初のフレームにジャンプ" msgid "Go to the previous frame" msgstr "前のフレームへ移動" -msgid "Play the animation backwards (from end to beginning)" -msgstr "アニメーションを逆方向に再生 (終了から開始まで)" +msgid "Play the animation backwards" +msgstr "アニメーションを逆再生" -msgid "Play the animation forward (from beginning to end)" -msgstr "アニメーションを順方向に再生する (開始から終了まで)" +msgid "Play the animation forward" +msgstr "アニメーションを再生" msgid "Go to the next frame" msgstr "次のフレームへ移動" @@ -2558,6 +2584,26 @@ 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 "すべての拡張機能を削除" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "最近開いたファイルリストをクリア" + msgid "Lock aspect ratio" msgstr "アスペクト比をロック" @@ -2733,6 +2779,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 "閉じる" @@ -3079,6 +3133,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 "ピクセルサイズ:" @@ -3090,12 +3148,19 @@ msgstr "カーブステップ:" msgid "Horizontal alignment:" msgstr "水平方向:" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/ko_KR.po b/Translations/ko_KR.po index 268822dfa..404ea975d 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:10\n" msgid "OK" msgstr "예" @@ -231,6 +231,10 @@ msgstr "상하 대칭" msgid "Preferences" msgstr "환경설정" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "타일 모드" @@ -841,6 +845,10 @@ msgstr "시스템 언어" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -907,6 +915,15 @@ msgstr "" msgid "Background color:" msgstr "배경 색상:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "왼쪽 도구 색상" @@ -2015,11 +2032,19 @@ msgstr "수평" msgid "Enable horizontal mirrored drawing" msgstr "수평 대칭 그리기 활성화" +msgid "Vertical" +msgstr "수직" + msgid "Enable vertical mirrored drawing" msgstr "수직 대칭 그리기 활성화" -msgid "Vertical" -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 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:" msgstr "현재 프레임:" @@ -2036,10 +2061,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" @@ -2542,6 +2567,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "비율 고정" @@ -2717,6 +2762,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 "닫기" @@ -3059,6 +3112,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 "" @@ -3070,12 +3127,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/la_LA.po b/Translations/la_LA.po index 70f9aed95..d3e699b4b 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-09-11 15:45\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/lt_LT.po b/Translations/lt_LT.po index 382cb56ec..1a747aff2 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:10\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/lv_LV.po b/Translations/lv_LV.po index 0d99ab710..0b87a1653 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "Labi" @@ -231,6 +231,10 @@ msgstr "Apmest vertikāli" msgid "Preferences" msgstr "Iestatījumi" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Flīžu režīms" @@ -840,6 +844,10 @@ msgstr "Systēmas valoda" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -906,6 +914,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1976,11 +1993,19 @@ msgstr "Horizontāli" msgid "Enable horizontal mirrored drawing" msgstr "IIeslēgt horizontālo spoguļskata zīmēšanu" +msgid "Vertical" +msgstr "Vertikāls" + msgid "Enable vertical mirrored drawing" msgstr "Ieslēgt vertikālo spoguļskata zīmēšanu" -msgid "Vertical" -msgstr "Vertikāls" +#. 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:" msgstr "Patreizējais kadrs:" @@ -1997,10 +2022,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" @@ -2502,6 +2527,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2677,6 +2722,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 "" @@ -3019,6 +3072,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 "" @@ -3030,12 +3087,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/mk_MK.po b/Translations/mk_MK.po index 42ed9542f..c01bd4e78 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/ml_IN.po b/Translations/ml_IN.po index 9c2f90948..d3d2f5876 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-09-11 15:45\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "ഓക്കേ" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/mr_IN.po b/Translations/mr_IN.po index dc2f2394b..e6bd9894e 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/ms_MY.po b/Translations/ms_MY.po index ceebd503c..296dc1cdc 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-09-11 15:45\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/nb_NO.po b/Translations/nb_NO.po index ca7a3a640..706577ce7 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-09-11 15:45\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "OK" @@ -231,6 +231,10 @@ msgstr "Speilvend Vertikalt" msgid "Preferences" msgstr "Preferanser" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Flismodus" @@ -840,6 +844,10 @@ msgstr "Systemspråk" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -906,6 +914,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -2014,11 +2031,19 @@ msgstr "Horisontal" msgid "Enable horizontal mirrored drawing" msgstr "Aktivér horisontaltspeilet tegning" +msgid "Vertical" +msgstr "Vertikal" + msgid "Enable vertical mirrored drawing" msgstr "Aktivér vertikaltspeilet tegning" -msgid "Vertical" -msgstr "Vertikal" +#. 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:" msgstr "Gjeldende bilde:" @@ -2035,10 +2060,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" @@ -2541,6 +2566,26 @@ msgstr "Standard fyllfarge:" msgid "A default background color of a new image" msgstr "En standard bakgrunnsfarge for et nytt bilde" +#. 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "Lås størrelsesforhold" @@ -2716,6 +2761,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 "Lukk" @@ -3059,6 +3112,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 "" @@ -3070,12 +3127,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/nl_NL.po b/Translations/nl_NL.po index a78e3853f..ecc1ddf3b 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "Oké" @@ -231,6 +231,10 @@ msgstr "Verticaal spiegelen" msgid "Preferences" msgstr "Instellingen" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Tegelmodus" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/pl_PL.po b/Translations/pl_PL.po index 38276ec12..e1f71cc43 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "OK" @@ -233,6 +233,10 @@ msgstr "Odbij w pionie" msgid "Preferences" msgstr "Ustawienia" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Tryb kafelkowy" @@ -843,6 +847,10 @@ msgstr "Język systemowy" msgid "Display scale:" msgstr "Pokaż Skalę:" +#. Refers to the font of a text. +msgid "Font:" +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 "Rozmiar czcionki:" @@ -909,6 +917,15 @@ msgstr "Kolor tła z:" msgid "Background color:" msgstr "Kolor tła:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "Kolor lewego narzędzia:" @@ -2028,11 +2045,19 @@ msgstr "Poziome" msgid "Enable horizontal mirrored drawing" msgstr "Włącza lustrzane odbicie w poziomie podczas rysowania" +msgid "Vertical" +msgstr "Pionowe" + msgid "Enable vertical mirrored drawing" msgstr "Włącza lustrzane odbicie w pionie podczas rysowania" -msgid "Vertical" -msgstr "Pionowe" +#. 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:" msgstr "Obecna klatka:" @@ -2049,11 +2074,11 @@ msgstr "Skocz do pierwszej klatki" msgid "Go to the previous frame" msgstr "Idć do poprzedniej klatki" -msgid "Play the animation backwards (from end to beginning)" -msgstr "Odtwórz animację wstecz" +msgid "Play the animation backwards" +msgstr "" -msgid "Play the animation forward (from beginning to end)" -msgstr "Odtwórz animację do przodu" +msgid "Play the animation forward" +msgstr "" msgid "Go to the next frame" msgstr "Idź do następnej klatki" @@ -2556,6 +2581,26 @@ msgstr "Domyślny kolor wypełnienia:" msgid "A default background color of a new image" msgstr "Domyślny kolor tła dla nowego obrazu" +#. 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "Wymuś współczynnik proporcji" @@ -2731,6 +2776,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 "Zamknij" @@ -3077,6 +3130,10 @@ msgstr "Dolny promień:" msgid "Text:" msgstr "Tekst:" +#. 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 "Rozmiar piksela:" @@ -3088,12 +3145,19 @@ msgstr "Krok krzywej:" msgid "Horizontal alignment:" msgstr "Poziome wyrównanie:" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" msgstr "Lewo" msgid "Right" msgstr "Prawo" +#. 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 "Siła:" diff --git a/Translations/pt_BR.po b/Translations/pt_BR.po index 9cc39f303..27b6e3baf 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "OK" @@ -233,6 +233,10 @@ msgstr "Inverter Verticalmente" msgid "Preferences" msgstr "Preferências" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Modo de Tile" @@ -562,7 +566,7 @@ msgstr "Redimensionar:" #. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file. msgid "Quality:" -msgstr "" +msgstr "Qualidade:" msgid "Cancel Export" msgstr "Cancelar exportação" @@ -844,6 +848,10 @@ msgstr "Linguagem do Sistema" msgid "Display scale:" msgstr "Mostrar escala:" +#. Refers to the font of a text. +msgid "Font:" +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 "Tamanho da fonte:" @@ -910,6 +918,15 @@ msgstr "Cor de fundo de:" msgid "Background color:" msgstr "Cor de fundo:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "Cor da ferramenta esquerda:" @@ -981,23 +998,23 @@ msgstr "Cor da sombra:" #. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur msgid "Gaussian Blur" -msgstr "" +msgstr "Desfoque gaussiano" #. The type of the Gaussian blur, an image effect. msgid "Blur type:" -msgstr "" +msgstr "Tipo de desfoque:" #. The applied amount of Gaussian blur, an image effect. msgid "Blur amount:" -msgstr "" +msgstr "Quantidade de desfoque:" #. The applied radius of Gaussian blur, an image effect. msgid "Blur radius:" -msgstr "" +msgstr "Raio de desfocagem:" #. The applied direction of Gaussian blur, an image effect. msgid "Blur direction:" -msgstr "" +msgstr "Direção do desfoque:" msgid "Gradient" msgstr "Gradiente" @@ -2030,11 +2047,19 @@ msgstr "Horizontal" msgid "Enable horizontal mirrored drawing" msgstr "Ativar desenho com espelhamento horizontal" +msgid "Vertical" +msgstr "Vertical" + msgid "Enable vertical mirrored drawing" msgstr "Ativar desenho com espelhamento vertical" -msgid "Vertical" -msgstr "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:" msgstr "Quadro atual:" @@ -2051,11 +2076,11 @@ msgstr "Pular para o primeiro quadro" msgid "Go to the previous frame" msgstr "Ir para o quadro anterior" -msgid "Play the animation backwards (from end to beginning)" -msgstr "Reproduzir animação de trás para frente (do fim ao início)" +msgid "Play the animation backwards" +msgstr "" -msgid "Play the animation forward (from beginning to end)" -msgstr "Reproduzir animação (do início ao fim)" +msgid "Play the animation forward" +msgstr "" msgid "Go to the next frame" msgstr "Ir para o próximo quadro" @@ -2558,6 +2583,26 @@ msgstr "Cor de preenchimento padrão:" msgid "A default background color of a new image" msgstr "Cor de fundo padrão de uma nova imagem" +#. 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "Fixar proporção" @@ -2727,10 +2772,18 @@ 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 "" +msgstr "Cortar imagens" #. 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 "Corta as imagens exportadas para sua parte visível, considerando cada pixel com um canal alfa diferente de zero como visível." + +#. 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" @@ -3078,6 +3131,10 @@ msgstr "Raio inferior:" msgid "Text:" msgstr "Texto:" +#. 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 "Tamanho do pixel:" @@ -3089,12 +3146,19 @@ msgstr "Passo da curva:" msgid "Horizontal alignment:" msgstr "Alinhamento horizontal:" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" msgstr "Esquerda" msgid "Right" msgstr "Direita" +#. 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 "Energia:" diff --git a/Translations/pt_PT.po b/Translations/pt_PT.po index 55b34e40b..3cd609b54 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "OK" @@ -231,6 +231,10 @@ msgstr "Virar Verticalmente" msgid "Preferences" msgstr "Preferencias" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Modo de Azuleijo" @@ -840,6 +844,10 @@ msgstr "Linguagem de Sistema" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -906,6 +914,15 @@ msgstr "Cor de fundo de:" msgid "Background color:" msgstr "Cor de fundo:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "Cor da ferramenta esquerda:" @@ -2009,11 +2026,19 @@ msgstr "Horizontal" msgid "Enable horizontal mirrored drawing" msgstr "Habilitar o desenho espelhado horizontalmente" +msgid "Vertical" +msgstr "Vertical" + msgid "Enable vertical mirrored drawing" msgstr "Habilitar o desenho espelhado verticalmente" -msgid "Vertical" -msgstr "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:" msgstr "Fotograma atual:" @@ -2030,10 +2055,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" @@ -2537,6 +2562,26 @@ msgstr "Cor de preenchimento padrão" msgid "A default background color of a new image" msgstr "Cor de fundo de uma nova imagem" +#. 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "Trancar resolução" @@ -2712,6 +2757,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 "Fechar" @@ -3055,6 +3108,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 "" @@ -3066,12 +3123,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/ro_RO.po b/Translations/ro_RO.po index 673ab37ab..ebe51d9c2 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-09-11 18:44\n" +"PO-Revision-Date: 2024-10-22 10:34\n" msgid "OK" msgstr "OK" @@ -231,6 +231,10 @@ msgstr "Răsturnare verticală" msgid "Preferences" msgstr "Preferințe" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "Centrare pânză" + msgid "Tile Mode" msgstr "Mod mozaic" @@ -842,6 +846,10 @@ msgstr "Limba sistemului" msgid "Display scale:" msgstr "Scară de afișare:" +#. Refers to the font of a text. +msgid "Font:" +msgstr "Font:" + #. Found in the preferences, under the interface section. Allows users to set the size of the font, ie the text. msgid "Font size:" msgstr "Dimensiunea fontului:" @@ -908,6 +916,16 @@ msgstr "Culoare de fundal din:" msgid "Background color:" msgstr "Culoare de fundal:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "Sincronizează opțiunile între instrumentele din stânga și cele din dreapta" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "Dacă această setare este activată, opțiunile vor fi sincronizate între instrumentul din stânga și cel din dreapta.\n" +"De exemplu, ambele instrumente vor folosi o pensulă de aceeași mărime, iar modificarea setării pentru un instrument se va aplica instantaneu și pentru cealaltă." + msgid "Left tool color:" msgstr "Culoarea instrumentului din stânga:" @@ -2028,11 +2046,19 @@ msgstr "Orizontal" msgid "Enable horizontal mirrored drawing" msgstr "Activează desenul oglindit orizontal" +msgid "Vertical" +msgstr "Vertical" + msgid "Enable vertical mirrored drawing" msgstr "Activează desenul oglindit vertical" -msgid "Vertical" -msgstr "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 "Mutare în centrul pânzei" + +#. 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 "Mutare în centrul de vizualizare" msgid "Current frame:" msgstr "Cadrul actual:" @@ -2049,11 +2075,11 @@ msgstr "Sari la primul cadru" msgid "Go to the previous frame" msgstr "Deplasează-te la cadrul anterior" -msgid "Play the animation backwards (from end to beginning)" -msgstr "Redă animația înapoi (de la sfârșit până la început)" +msgid "Play the animation backwards" +msgstr "" -msgid "Play the animation forward (from beginning to end)" -msgstr "Redă animația înainte (de la început până la sfârșit)" +msgid "Play the animation forward" +msgstr "" msgid "Go to the next frame" msgstr "Deplasează-te la cadrul următor" @@ -2556,6 +2582,26 @@ msgstr "Culoare implicită de umplere:" msgid "A default background color of a new image" msgstr "Culoarea implicită de fundal a unei imagini noi" +#. Found in the preferences, under the Reset category. +msgid "Reset all options available in the Preferences" +msgstr "Resetează toate opțiunile disponibile în Preferințe" + +#. Found in the preferences, under the Reset category. +msgid "Reset timeline options" +msgstr "Resetează opțiunile de cronologie" + +#. Found in the preferences, under the Reset category. +msgid "Reset all tool options" +msgstr "Resetați toate opțiunile de instrumente" + +#. Found in the preferences, under the Reset category. +msgid "Remove all extensions" +msgstr "Elimină toate extensiile" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "Șterge lista de fișiere recent deschisă" + msgid "Lock aspect ratio" msgstr "Blocare raport aspect" @@ -2731,6 +2777,14 @@ msgstr "Trunchiere imagini" 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." +#. 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 "Decupează conținutul imaginii la selecție" + +#. 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 "Exportă doar conținut care se află în limitele unei zone selectate." + msgid "Close" msgstr "Închide" @@ -3077,6 +3131,10 @@ msgstr "Rază inferioară:" msgid "Text:" msgstr "Text:" +#. Refers to the depth of something, such as the depth of a 3D object. +msgid "Depth:" +msgstr "Adâncime:" + #. 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 "Dimensiune pixeli:" @@ -3088,12 +3146,19 @@ msgstr "Pasul curbei:" msgid "Horizontal alignment:" msgstr "Aliniere orizontală:" +msgid "Vertical alignment:" +msgstr "Aliniere verticală:" + msgid "Left" msgstr "Stânga" msgid "Right" msgstr "Dreapta" +#. Refers to the vertical space between lines in a text. +msgid "Line spacing:" +msgstr "Spațiere între linii:" + #. 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 "Energie:" diff --git a/Translations/ru_RU.po b/Translations/ru_RU.po index cc0d0e557..b3e16a3f1 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "OK" @@ -231,6 +231,10 @@ msgstr "Отразить по вертикали" msgid "Preferences" msgstr "Настройки" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Режим тайла" @@ -842,6 +846,10 @@ msgstr "Системный язык" msgid "Display scale:" msgstr "Масштаб интерфейса:" +#. Refers to the font of a text. +msgid "Font:" +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 "Размер шрифта:" @@ -908,6 +916,15 @@ msgstr "Источник цвета фона:" msgid "Background color:" msgstr "Цвет фона:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "Цвет левого инструмента:" @@ -2025,11 +2042,19 @@ msgstr "Горизонально" msgid "Enable horizontal mirrored drawing" msgstr "Режим рисования с горизонтальным зеркалированием" +msgid "Vertical" +msgstr "Вертикально" + msgid "Enable vertical mirrored drawing" msgstr "Режим рисования с вертикальным зеркалированием" -msgid "Vertical" -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 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:" msgstr "Текущий кадр:" @@ -2046,10 +2071,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" @@ -2553,6 +2578,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "Заблокировать соотношение сторон" @@ -2728,6 +2773,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 "Закрыть" @@ -3073,6 +3126,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 "Размер пикселя:" @@ -3084,12 +3141,19 @@ msgstr "Шаг кривой:" msgid "Horizontal alignment:" msgstr "Горизонтальное выравнивание:" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/si_LK.po b/Translations/si_LK.po index 6d84d7be6..178dd210c 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-09-11 15:45\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "හරි" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "පද්ධතියේ භාෂාව" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/sk_SK.po b/Translations/sk_SK.po index 0dd21bca4..1b0b2de66 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/sl_SI.po b/Translations/sl_SI.po index 27ef2b48e..d93252fb0 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/sq_AL.po b/Translations/sq_AL.po index aa1dc151c..7596b659a 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "Ne rregull" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/sr_SP.po b/Translations/sr_SP.po index cc8d676ff..f084e0976 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "ОК" @@ -231,6 +231,10 @@ msgstr "Обрни вертикално" msgid "Preferences" msgstr "Подешавања" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Бешавни режим" @@ -839,6 +843,10 @@ msgstr "Системски језик" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/sv_SE.po b/Translations/sv_SE.po index 2c099e0dc..f876ca01c 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "Okej" @@ -231,6 +231,10 @@ msgstr "Vänd Lodrätt" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,11 +1984,19 @@ msgstr "Horisontell" msgid "Enable horizontal mirrored drawing" msgstr "" +msgid "Vertical" +msgstr "Vertikal" + msgid "Enable vertical mirrored drawing" msgstr "" -msgid "Vertical" -msgstr "Vertikal" +#. 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:" msgstr "" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "Stäng" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/sw_KE.po b/Translations/sw_KE.po index 0c0d6b5ec..b148c7051 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-09-11 15:45\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/ta_IN.po b/Translations/ta_IN.po index fe6a48d0f..4880f4fd9 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/th_TH.po b/Translations/th_TH.po index c99954ebc..c0b81d2f0 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/tlh_AA.po b/Translations/tlh_AA.po index 947b176d0..fa6e14540 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-09-11 15:45\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/tr_TR.po b/Translations/tr_TR.po index 30053f92e..849b69329 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-09-11 20:00\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "Tamam" @@ -233,6 +233,10 @@ msgstr "Dikey Döndür" msgid "Preferences" msgstr "Tercihler" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Döşeme Kipi" @@ -844,6 +848,10 @@ msgstr "Sistem Dili" msgid "Display scale:" msgstr "Ekran ölçeği:" +#. Refers to the font of a text. +msgid "Font:" +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 "Yazı tipi boyutu:" @@ -910,6 +918,15 @@ msgstr "Şuradan arkaplan rengi:" msgid "Background color:" msgstr "Arkaplan rengi:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "Sol araç rengi:" @@ -2030,11 +2047,19 @@ msgstr "Yatay" msgid "Enable horizontal mirrored drawing" msgstr "Çizim için yatay aynamalamayı etkinleştir" +msgid "Vertical" +msgstr "Dikey" + msgid "Enable vertical mirrored drawing" msgstr "Çizim için dikey aynamalamayı etkinleştir" -msgid "Vertical" -msgstr "Dikey" +#. 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 "Tuval merkezine taşı" + +#. 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 "Görünüm merkezine taşı" msgid "Current frame:" msgstr "Geçerli kare:" @@ -2051,11 +2076,11 @@ msgstr "İlk kareye atla" msgid "Go to the previous frame" msgstr "Önceki kareye git" -msgid "Play the animation backwards (from end to beginning)" -msgstr "Animasyonu tersten oynat (sondan başa)" +msgid "Play the animation backwards" +msgstr "Canlandırmayı geri oynat" -msgid "Play the animation forward (from beginning to end)" -msgstr "Animasyonu ileri oynat (baştan sonra)" +msgid "Play the animation forward" +msgstr "Canlandırmayı ileri oynat" msgid "Go to the next frame" msgstr "Sonraki kareye git" @@ -2558,6 +2583,26 @@ msgstr "Varsayılan dolgu rengi:" msgid "A default background color of a new image" msgstr "Yeni resmin varsayılan arkaplan rengi" +#. Found in the preferences, under the Reset category. +msgid "Reset all options available in the Preferences" +msgstr "Tercihler'deki tüm seçenekleri sıfırla" + +#. Found in the preferences, under the Reset category. +msgid "Reset timeline options" +msgstr "Zaman çizelgesi seçeneklerini sıfırla" + +#. Found in the preferences, under the Reset category. +msgid "Reset all tool options" +msgstr "Tüm araç seçeneklerini sıfırla" + +#. Found in the preferences, under the Reset category. +msgid "Remove all extensions" +msgstr "Tüm uzantıları kaldır" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "Geçerli seçilmiş dosya listesini temizle" + msgid "Lock aspect ratio" msgstr "En boy oranını kilitle" @@ -2733,6 +2778,14 @@ msgstr "Görüntüleri kırp" 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." +#. 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 "Kapat" @@ -3079,6 +3132,10 @@ msgstr "Alt yarıçap:" msgid "Text:" msgstr "Metin:" +#. 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 "Piksel boyutu:" @@ -3090,12 +3147,19 @@ msgstr "Eğri adımı:" msgid "Horizontal alignment:" msgstr "Yatay hizalama:" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" msgstr "Sol" msgid "Right" msgstr "Sağ" +#. 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 "Enerji:" diff --git a/Translations/uk_UA.po b/Translations/uk_UA.po index 56dd51228..60e4f530e 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "Гаразд" @@ -233,6 +233,10 @@ msgstr "Віддзеркалити по вертикалі" msgid "Preferences" msgstr "Налаштування" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "Безшовний режим" @@ -844,6 +848,10 @@ msgstr "Мова системи" msgid "Display scale:" msgstr "Масштаб екрану:" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -910,6 +918,15 @@ msgstr "Колір фону з:" msgid "Background color:" msgstr "Колір фону:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "Колір лівого інструменту:" @@ -2021,11 +2038,19 @@ msgstr "Горизонтально" msgid "Enable horizontal mirrored drawing" msgstr "Увімкнути горизонтальне віддзеркалення для малювання" +msgid "Vertical" +msgstr "Вертикально" + msgid "Enable vertical mirrored drawing" msgstr "Увімкнути вертикальне віддзеркалення для малювання" -msgid "Vertical" -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 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:" msgstr "Поточний кадр:" @@ -2042,10 +2067,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" @@ -2549,6 +2574,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "Зафіксувати співвідношення сторін" @@ -2724,6 +2769,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 "Закрити" @@ -3069,6 +3122,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 "Розмір пікселя:" @@ -3080,12 +3137,19 @@ msgstr "Крок кривої:" msgid "Horizontal alignment:" msgstr "Горизонтальне вирівнювання:" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/vi_VN.po b/Translations/vi_VN.po index 1af207637..03222f24f 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "OK" @@ -231,6 +231,10 @@ msgstr "" msgid "Preferences" msgstr "" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "" @@ -839,6 +843,10 @@ msgstr "" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1967,10 +1984,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:" @@ -1988,10 +2013,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" @@ -2492,6 +2517,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2667,6 +2712,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 "" @@ -3009,6 +3062,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 "" @@ -3020,12 +3077,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/zh_CN.po b/Translations/zh_CN.po index 090460c10..8093e4f3e 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "确定" @@ -233,6 +233,10 @@ msgstr "垂直翻转" msgid "Preferences" msgstr "首选项" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "平铺模式" @@ -562,7 +566,7 @@ msgstr "调整大小:" #. Found in the export dialog, when exporting a jpeg file. Refers to the quality of the exported file. msgid "Quality:" -msgstr "" +msgstr "质量:" msgid "Cancel Export" msgstr "取消导出" @@ -844,6 +848,10 @@ msgstr "系统语言" msgid "Display scale:" msgstr "显示比例:" +#. Refers to the font of a text. +msgid "Font:" +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 "字体大小:" @@ -910,6 +918,15 @@ msgstr "背景颜色从:" msgid "Background color:" msgstr "背景颜色:" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "左侧工具颜色:" @@ -981,23 +998,23 @@ msgstr "阴影颜色:" #. An image effect. https://en.wikipedia.org/wiki/Gaussian_blur msgid "Gaussian Blur" -msgstr "" +msgstr "高斯模糊" #. The type of the Gaussian blur, an image effect. msgid "Blur type:" -msgstr "" +msgstr "模糊类型:" #. The applied amount of Gaussian blur, an image effect. msgid "Blur amount:" -msgstr "" +msgstr "模糊数量:" #. The applied radius of Gaussian blur, an image effect. msgid "Blur radius:" -msgstr "" +msgstr "模糊半径:" #. The applied direction of Gaussian blur, an image effect. msgid "Blur direction:" -msgstr "" +msgstr "模糊方向:" msgid "Gradient" msgstr "渐变" @@ -2029,11 +2046,19 @@ msgstr "水平" msgid "Enable horizontal mirrored drawing" msgstr "启用水平镜像绘图" +msgid "Vertical" +msgstr "垂直" + msgid "Enable vertical mirrored drawing" msgstr "启用垂直镜像绘图" -msgid "Vertical" -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 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:" msgstr "当前帧:" @@ -2050,11 +2075,11 @@ msgstr "跳转到第一帧" msgid "Go to the previous frame" msgstr "转到上一帧" -msgid "Play the animation backwards (from end to beginning)" -msgstr "向后播放动画(从结尾到开头)" +msgid "Play the animation backwards" +msgstr "" -msgid "Play the animation forward (from beginning to end)" -msgstr "向前播放动画(从头到尾)" +msgid "Play the animation forward" +msgstr "" msgid "Go to the next frame" msgstr "转到下一帧" @@ -2557,6 +2582,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "锁定长宽比" @@ -2726,10 +2771,18 @@ 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 "" +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 "将导出的图像变为可见部分,考虑到非零透明通道的每个像素。" + +#. 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" @@ -3077,6 +3130,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 "像素大小:" @@ -3088,12 +3145,19 @@ msgstr "曲线步骤:" msgid "Horizontal alignment:" msgstr "水平对齐" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/Translations/zh_TW.po b/Translations/zh_TW.po index 0ca2b814d..3a0c17970 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-09-11 15:44\n" +"PO-Revision-Date: 2024-10-17 14:11\n" msgid "OK" msgstr "確定" @@ -231,6 +231,10 @@ msgstr "垂直翻轉" msgid "Preferences" msgstr "偏好設定" +#. An option in the View menu. When selected, the canvas is being placed on the center of the screen. +msgid "Center Canvas" +msgstr "" + msgid "Tile Mode" msgstr "拼圖模式" @@ -839,6 +843,10 @@ msgstr "系統語言" msgid "Display scale:" msgstr "" +#. Refers to the font of a text. +msgid "Font:" +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 "" @@ -905,6 +913,15 @@ msgstr "" msgid "Background color:" msgstr "" +#. Found in the preferences, under the Tools category. +msgid "Share options between the left and the right tools" +msgstr "" + +#. Found in the preferences, under the Tools category. Tooltip of the "Share options between the left and the right tools" preference. +msgid "If this is enabled, options will be synced between the left and the right tool.\n" +"For example, both tools will share the same brush size, and changing it on one tool will instantly change on the other." +msgstr "" + msgid "Left tool color:" msgstr "" @@ -1977,11 +1994,19 @@ msgstr "水平" msgid "Enable horizontal mirrored drawing" msgstr "開啟水平鏡像" +msgid "Vertical" +msgstr "垂直" + msgid "Enable vertical mirrored drawing" msgstr "開啟垂直鏡像" -msgid "Vertical" -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 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:" msgstr "目前影格:" @@ -1998,10 +2023,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" @@ -2503,6 +2528,26 @@ 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 "" + +#. Found in the preferences, under the Reset category. +msgid "Clear the recently opened file list" +msgstr "" + msgid "Lock aspect ratio" msgstr "" @@ -2678,6 +2723,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 "關閉" @@ -3020,6 +3073,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 "" @@ -3031,12 +3088,19 @@ msgstr "" msgid "Horizontal alignment:" msgstr "" +msgid "Vertical alignment:" +msgstr "" + msgid "Left" 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/installer/po/ru-RU.po b/installer/po/ru-RU.po index f8ff896e0..7461602d7 100644 --- a/installer/po/ru-RU.po +++ b/installer/po/ru-RU.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-10-20 12:52\n" "Last-Translator: \n" "Language-Team: Russian\n" "Language: ru_RU\n" @@ -65,5 +65,5 @@ msgstr "Удаляет ${APPNAME} ${APPVERSION} и удаляет все ярл #. DESC_un.SecConfig #: ..\pixelorama.nsi:204 msgid "Removes configuration files for ${APPNAME}." -msgstr "Удаляет файлы конфигурации для ${APPNAME}." +msgstr "Удаление файлов конфигурации для ${APPNAME}." From 638130c5c8b446472d42f85a7017ed7cb9ac7fd6 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Fri, 25 Oct 2024 12:02:26 +0300 Subject: [PATCH 135/162] [skip ci] Update AboutDialog.gd --- src/UI/Dialogs/AboutDialog.gd | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/UI/Dialogs/AboutDialog.gd b/src/UI/Dialogs/AboutDialog.gd index a5a4ffade..a7864e078 100644 --- a/src/UI/Dialogs/AboutDialog.gd +++ b/src/UI/Dialogs/AboutDialog.gd @@ -41,6 +41,7 @@ const AUTHORS: PackedStringArray = [ "kleonc", "Laurenz Reinthaler (Schweini07)", "Marco Galli (Gaarco)", + "Mariano Semelman (msemelman)", "Marquis Kurt (alicerunsonfedora)", "Martin Novák (novhack)", "Martin Zabinski (Martin1991zab)", @@ -80,6 +81,8 @@ const TRANSLATORS_DICTIONARY := { "Nicolas.C (nico57c)": ["French"], "EGuillemot": ["French"], "Roroto Sic (Roroto_Sic)": ["French"], + "ninjdai": ["French"], + "celeste tollec (celeste73-t)": ["French"], "Schweini07": ["German"], "Martin Zabinski (Martin1991zab)": ["German"], "Manuel (DrMoebyus)": ["German"], @@ -109,13 +112,14 @@ const TRANSLATORS_DICTIONARY := { "Geraldo PMJ (geraldopmj)": ["Brazilian Portuguese"], "snorring_parrot": ["Brazilian Portuguese"], "iLeonardito (iLeoww)": ["Brazilian Portuguese"], + "Heliana Moreira (helimoreira)": ["Brazilian Portuguese"], "Andreev Andrei": ["Russian"], "ax trifonov (ax34)": ["Russian"], "Artem (blinovartem)": ["Russian"], "Иван Соколов (SokoL1337)": ["Russian"], "Daniil Belyakov (ermegil)": ["Russian"], - "pincetgore": ["Russian"], "Elijah Fronzak (pincetgore)": ["Russian"], + "toxidcheckery": ["Russian"], "stomleny_cmok": ["Russian", "Ukrainian"], "Bohdan Matviiv (BodaMat)": ["Ukrainian"], "Ruslan Hryschuk (kifflow)": ["Ukrainian"], From 6c31708e35c0aa388fc7fd2fe95f978ccaf9b8bc Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Fri, 25 Oct 2024 15:48:59 +0300 Subject: [PATCH 136/162] Release v1.0.4 --- .github/workflows/release.yml | 2 +- CHANGELOG.md | 6 +++--- 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, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 33bab292e..88dc1ea45 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.3 + TAG: v1.0.4 BUTLER_API_KEY: ${{ secrets.BUTLER_API_KEY }} jobs: diff --git a/CHANGELOG.md b/CHANGELOG.md index 849995aa0..620fa510c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,9 @@ 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 +## [v1.0.4] - 2024-10-25 This update has been brought to you by the contributions of: -Fayez Akhtar ([@Variable-ind](https://github.com/Variable-ind)) +Fayez Akhtar ([@Variable-ind](https://github.com/Variable-ind)), Mariano Semelman ([@msemelman](https://github.com/msemelman)) Built using Godot 4.3 @@ -18,7 +18,7 @@ Built using Godot 4.3 - Implemented the ability to change the font of the interface from the properties. - Clipping to selection during export is now possible. [#1113](https://github.com/Orama-Interactive/Pixelorama/pull/1113) - Added a preference to share options between tools. [#1120](https://github.com/Orama-Interactive/Pixelorama/pull/1120) -- Added an option to quickly center the canvas in the View menu. [#1123](https://github.com/Orama-Interactive/Pixelorama/pull/1123) +- Added an option to quickly center the canvas in the View menu. Mapped to Control + C by default. [#1123](https://github.com/Orama-Interactive/Pixelorama/pull/1123) - Added hotkeys to switch between tabs. Control+Tab to go to the next project tab, and Control+Shift+Tab to go to the previous. [#1109](https://github.com/Orama-Interactive/Pixelorama/pull/1109) - Added menus next to each of the two mirroring buttons in the Global Tool Options, that allow users to automatically move the symmetry guides to the center of the canvas, or the view center. - A new Reset category has been added to the Preferences that lets users easily restore certain options. diff --git a/Misc/Linux/com.orama_interactive.Pixelorama.appdata.xml b/Misc/Linux/com.orama_interactive.Pixelorama.appdata.xml index 121c2e5c7..22a999f26 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 cb23da9c9..3f030ebc0 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.3" + !define APPVERSION "v1.0.4" !define COMPANYNAME "Orama Interactive" diff --git a/project.godot b/project.godot index de228fe3e..e62a0444d 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.4-rc1" +config/version="v1.0.4-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 8a49839e0..b2342a657 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#v103---2024-09-13" +const CHANGELOG_URL := "https://github.com/Orama-Interactive/Pixelorama/blob/master/CHANGELOG.md#v104---2024-10-25" 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 aa59f73e654a2f6bab25f046641aadb4eb0138fb Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Fri, 25 Oct 2024 21:32:22 +0300 Subject: [PATCH 137/162] [skip ci] Update CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 620fa510c..bc5500d0f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,10 +15,10 @@ Built using Godot 4.3 - Added a new "color replace" mode to the Shading tool, that uses the colors of the palette to apply shading. [#1107](https://github.com/Orama-Interactive/Pixelorama/pull/1107) - Added a new Erase blend mode. [#1117](https://github.com/Orama-Interactive/Pixelorama/pull/1117) - It is now possible to change the font, depth and line spacing of 3D text. -- Implemented the ability to change the font of the interface from the properties. +- Implemented the ability to change the font of the interface from the preferences. - Clipping to selection during export is now possible. [#1113](https://github.com/Orama-Interactive/Pixelorama/pull/1113) - Added a preference to share options between tools. [#1120](https://github.com/Orama-Interactive/Pixelorama/pull/1120) -- Added an option to quickly center the canvas in the View menu. Mapped to Control + C by default. [#1123](https://github.com/Orama-Interactive/Pixelorama/pull/1123) +- Added an option to quickly center the canvas in the View menu. Mapped to Shift + C by default. [#1123](https://github.com/Orama-Interactive/Pixelorama/pull/1123) - Added hotkeys to switch between tabs. Control+Tab to go to the next project tab, and Control+Shift+Tab to go to the previous. [#1109](https://github.com/Orama-Interactive/Pixelorama/pull/1109) - Added menus next to each of the two mirroring buttons in the Global Tool Options, that allow users to automatically move the symmetry guides to the center of the canvas, or the view center. - A new Reset category has been added to the Preferences that lets users easily restore certain options. From 2d9a582f21672a199a0e39e67765403bdd21b9c3 Mon Sep 17 00:00:00 2001 From: Variable <77773850+Variable-ind@users.noreply.github.com> Date: Sat, 26 Oct 2024 03:31:52 +0500 Subject: [PATCH 138/162] Added an OKHSL Lightness sorting in palette (#1126) * added a lightness sort system * static check * lightness * formatting * more formatting * more formatting --- src/Autoload/Palettes.gd | 2 +- src/Palette/Palette.gd | 32 ++++++++++++++++++++++++++++++++ src/Palette/PalettePanel.gd | 2 ++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/Autoload/Palettes.gd b/src/Autoload/Palettes.gd index aee7ff6b2..4aa1c8588 100644 --- a/src/Autoload/Palettes.gd +++ b/src/Autoload/Palettes.gd @@ -4,7 +4,7 @@ signal palette_selected(palette_name: String) signal new_palette_created signal new_palette_imported -enum SortOptions { NEW_PALETTE, REVERSE, HUE, SATURATION, VALUE, RED, GREEN, BLUE, ALPHA } +enum SortOptions {NEW_PALETTE, REVERSE, HUE, SATURATION, VALUE, LIGHTNESS, RED, GREEN, BLUE, ALPHA} ## Presets for creating a new palette enum NewPalettePresetType {EMPTY, FROM_CURRENT_PALETTE, FROM_CURRENT_SPRITE, FROM_CURRENT_SELECTION} ## Color options when user creates a new palette from current sprite or selection diff --git a/src/Palette/Palette.gd b/src/Palette/Palette.gd index 3fda63a60..e2f480f78 100644 --- a/src/Palette/Palette.gd +++ b/src/Palette/Palette.gd @@ -287,6 +287,38 @@ func sort(option: Palettes.SortOptions) -> void: sort_method = func(a: PaletteColor, b: PaletteColor): return a.color.s < b.color.s Palettes.SortOptions.VALUE: sort_method = func(a: PaletteColor, b: PaletteColor): return a.color.v < b.color.v + Palettes.SortOptions.LIGHTNESS: + # Code inspired from: + # gdlint: ignore=max-line-length + # https://github.com/bottosson/bottosson.github.io/blob/master/misc/colorpicker/colorconversion.js#L519 + sort_method = func(a: PaletteColor, b: PaletteColor): + # function that returns OKHSL lightness + var lum: Callable = func(c: Color): + var l = 0.4122214708 * (c.r) + 0.5363325363 * (c.g) + 0.0514459929 * (c.b) + var m = 0.2119034982 * (c.r) + 0.6806995451 * (c.g) + 0.1073969566 * (c.b) + var s = 0.0883024619 * (c.r) + 0.2817188376 * (c.g) + 0.6299787005 * (c.b) + var l_cr = pow(l, 1 / 3.0) + var m_cr = pow(m, 1 / 3.0) + var s_cr = pow(s, 1 / 3.0) + var oklab_l = 0.2104542553 * l_cr + 0.7936177850 * m_cr - 0.0040720468 * s_cr + # calculating toe + var k_1 = 0.206 + var k_2 = 0.03 + var k_3 = (1 + k_1) / (1 + k_2) + return ( + 0.5 + * ( + k_3 * oklab_l + - k_1 + + sqrt( + ( + (k_3 * oklab_l - k_1) * (k_3 * oklab_l - k_1) + + 4 * k_2 * k_3 * oklab_l + ) + ) + ) + ) + return lum.call(a.color.srgb_to_linear()) < lum.call(b.color.srgb_to_linear()) Palettes.SortOptions.RED: sort_method = func(a: PaletteColor, b: PaletteColor): return a.color.r < b.color.r Palettes.SortOptions.GREEN: diff --git a/src/Palette/PalettePanel.gd b/src/Palette/PalettePanel.gd index 50ee1a9e5..7cc64c42d 100644 --- a/src/Palette/PalettePanel.gd +++ b/src/Palette/PalettePanel.gd @@ -49,6 +49,8 @@ func _ready() -> void: sort_button_popup.add_item("Sort by saturation", Palettes.SortOptions.SATURATION) sort_button_popup.add_item("Sort by value", Palettes.SortOptions.VALUE) sort_button_popup.add_separator() + sort_button_popup.add_item("Sort by lightness", Palettes.SortOptions.LIGHTNESS) + sort_button_popup.add_separator() sort_button_popup.add_item("Sort by red", Palettes.SortOptions.RED) sort_button_popup.add_item("Sort by green", Palettes.SortOptions.GREEN) sort_button_popup.add_item("Sort by blue", Palettes.SortOptions.BLUE) From dafc2fb1d5a2eb80623b5db33ce6b6ae4bda6b0c Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Wed, 30 Oct 2024 13:03:51 +0200 Subject: [PATCH 139/162] Bump version to v1.0.5-dev --- export_presets.cfg | 18 +++++++++--------- project.godot | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/export_presets.cfg b/export_presets.cfg index 8cb044d89..04d5efc40 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.4.0" -application/product_version="1.0.4.0" +application/file_version="1.0.5.0" +application/product_version="1.0.5.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.4.0" -application/product_version="1.0.4.0" +application/file_version="1.0.5.0" +application/product_version="1.0.5.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.4" -application/version="1.0.4" +application/short_version="1.0.5" +application/version="1.0.5" 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.4" +version/name="1.0.5" package/unique_name="com.orama_interactive.pixelorama" package/name="Pixelorama" package/signed=true @@ -749,13 +749,13 @@ permissions/install_location_provider=false permissions/install_packages=false permissions/install_shortcut=false permissions/internal_system_window=false -permissions/internet=false +permissions/internet=true permissions/kill_background_processes=false permissions/location_hardware=false permissions/manage_accounts=false permissions/manage_app_tokens=false permissions/manage_documents=false -permissions/manage_external_storage=false +permissions/manage_external_storage=true permissions/master_clear=false permissions/media_content_control=false permissions/modify_audio_settings=false diff --git a/project.godot b/project.godot index e62a0444d..fd1383a02 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.4-stable" +config/version="v1.0.5-dev" run/main_scene="res://src/Main.tscn" config/use_custom_user_dir=true config/custom_user_dir_name="pixelorama" From 6863adf957adb0d218bd078e9700ace101cd4312 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Wed, 30 Oct 2024 14:25:34 +0200 Subject: [PATCH 140/162] Implement support for mouse buttons to be used as menu shortcuts - fixes #1070 Also maps the mouse thumb button 1 to undo, and the mouse thumb button 2 to redo. --- project.godot | 2 ++ src/UI/TopMenuContainer/TopMenuContainer.gd | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/project.godot b/project.godot index fd1383a02..0961a757d 100644 --- a/project.godot +++ b/project.godot @@ -266,12 +266,14 @@ quit={ 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,"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":8,"canceled":false,"pressed":false,"double_click":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,"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) +, 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(138, 9),"global_position":Vector2(147, 55),"factor":1.0,"button_index":9,"canceled":false,"pressed":true,"double_click":false,"script":null) ] } show_grid={ diff --git a/src/UI/TopMenuContainer/TopMenuContainer.gd b/src/UI/TopMenuContainer/TopMenuContainer.gd index b2342a657..c9c121d30 100644 --- a/src/UI/TopMenuContainer/TopMenuContainer.gd +++ b/src/UI/TopMenuContainer/TopMenuContainer.gd @@ -98,6 +98,18 @@ func _ready() -> void: _setup_help_menu() +func _input(event: InputEvent) -> void: + if event is InputEventMouseButton and event.pressed: + file_menu.activate_item_by_event(event) + edit_menu.activate_item_by_event(event) + select_menu.activate_item_by_event(event) + image_menu.activate_item_by_event(event) + effects_menu.activate_item_by_event(event) + view_menu.activate_item_by_event(event) + window_menu.activate_item_by_event(event) + help_menu.activate_item_by_event(event) + + func _notification(what: int) -> void: if what == NOTIFICATION_TRANSLATION_CHANGED and Global.current_project != null: _update_file_menu_buttons(Global.current_project) From e2971a8fe90125a49f7dffe857a454d1092679e9 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Thu, 31 Oct 2024 23:49:58 +0200 Subject: [PATCH 141/162] Add UI buttons for confirming and cancelling a transformation Needed especially for users without a keyboard. --- assets/graphics/misc/check_plain.png | Bin 0 -> 176 bytes assets/graphics/misc/check_plain.png.import | 34 ++++++++++ assets/graphics/misc/close.png | Bin 0 -> 153 bytes assets/graphics/misc/close.png.import | 34 ++++++++++ src/Tools/BaseSelectionTool.gd | 21 +++++- src/Tools/BaseSelectionTool.tscn | 69 +++++++++++++++++--- src/UI/Canvas/Canvas.gd | 2 +- src/UI/Canvas/Selection.gd | 14 ++-- 8 files changed, 156 insertions(+), 18 deletions(-) create mode 100644 assets/graphics/misc/check_plain.png create mode 100644 assets/graphics/misc/check_plain.png.import create mode 100644 assets/graphics/misc/close.png create mode 100644 assets/graphics/misc/close.png.import diff --git a/assets/graphics/misc/check_plain.png b/assets/graphics/misc/check_plain.png new file mode 100644 index 0000000000000000000000000000000000000000..a589dba2f5001da7610a08696329785914b984a2 GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1IgEKe855R2ZY zm#u{kC~&x5^!~O#J?N!M4_8O1Q|d>HX8RwmD_3pXDs$9j35(svKDnc1>T?n|7(V3k zZkD@tP%K8)k%d`6TBdc8#DS-#=>`VT+k7L}G#i_A?{(ns-FNd6Yl}m7*#F-Gf5Yxd Xu>~+(bgwG|+REVR>gTe~DWM4fP7geO literal 0 HcmV?d00001 diff --git a/assets/graphics/misc/check_plain.png.import b/assets/graphics/misc/check_plain.png.import new file mode 100644 index 000000000..9cfa45d09 --- /dev/null +++ b/assets/graphics/misc/check_plain.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://d267xalp3p7ru" +path="res://.godot/imported/check_plain.png-6f37534ee70be1593b3b1be7b4c80f23.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://assets/graphics/misc/check_plain.png" +dest_files=["res://.godot/imported/check_plain.png-6f37534ee70be1593b3b1be7b4c80f23.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/assets/graphics/misc/close.png b/assets/graphics/misc/close.png new file mode 100644 index 0000000000000000000000000000000000000000..65415379199620e1049ffd85e8c0f1dfa7adcd36 GIT binary patch literal 153 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|f<0XvLo9mN zPCCd0ROLMT|NrMPfst4Gs+Oru)LXgg-v$GAhD+1KEs`G@CNQj?Io;+%nosoIg!C;2 z8!oGyN_An2{MsMDwed^uQrA^$Hbo~?C9YJv&=mboMR>}6pz#czu6{1-oD!M void: super._ready() + set_confirm_buttons_visibility() set_spinbox_values() refresh_options() + selection_node.is_moving_content_changed.connect(set_confirm_buttons_visibility) -## Ensure all items are added when we are selecting an option (bad things will happen otherwise) +func set_confirm_buttons_visibility() -> void: + confirm_buttons.visible = selection_node.is_moving_content + + +## Ensure all items are added when we are selecting an option. func refresh_options() -> void: $Modes.clear() $Modes.add_item("Replace selection") @@ -203,6 +210,16 @@ func apply_selection(_position: Vector2i) -> void: _intersect = true +func _on_confirm_button_pressed() -> void: + if selection_node.is_moving_content: + selection_node.transform_content_confirm() + + +func _on_cancel_button_pressed() -> void: + if selection_node.is_moving_content: + selection_node.transform_content_cancel() + + func _on_Modes_item_selected(index: int) -> void: _mode_selected = index save_config() diff --git a/src/Tools/BaseSelectionTool.tscn b/src/Tools/BaseSelectionTool.tscn index a600f1d5a..58ed7f322 100644 --- a/src/Tools/BaseSelectionTool.tscn +++ b/src/Tools/BaseSelectionTool.tscn @@ -1,34 +1,85 @@ -[gd_scene load_steps=4 format=3 uid="uid://bd62qfjn380wf"] +[gd_scene load_steps=10 format=3 uid="uid://bd62qfjn380wf"] [ext_resource type="PackedScene" uid="uid://ctfgfelg0sho8" path="res://src/Tools/BaseTool.tscn" id="1"] [ext_resource type="Script" path="res://src/Tools/BaseSelectionTool.gd" id="2"] +[ext_resource type="Texture2D" uid="uid://d267xalp3p7ru" path="res://assets/graphics/misc/check_plain.png" id="3_mtv71"] [ext_resource type="PackedScene" path="res://src/UI/Nodes/ValueSliderV2.tscn" id="4"] +[ext_resource type="Texture2D" uid="uid://bnc78807k1xjv" path="res://assets/graphics/misc/close.png" id="4_ad04n"] + +[sub_resource type="InputEventAction" id="InputEventAction_gfv4x"] +action = &"transformation_confirm" + +[sub_resource type="Shortcut" id="Shortcut_5gq73"] +events = [SubResource("InputEventAction_gfv4x")] + +[sub_resource type="InputEventAction" id="InputEventAction_nadbx"] +action = &"transformation_cancel" + +[sub_resource type="Shortcut" id="Shortcut_04tjd"] +events = [SubResource("InputEventAction_nadbx")] [node name="ToolOptions" instance=ExtResource("1")] script = ExtResource("2") -[node name="ModeLabel" type="Label" parent="." index="2"] +[node name="ConfirmButtons" type="HBoxContainer" parent="." index="2"] +layout_mode = 2 + +[node name="ConfirmButton" type="Button" parent="ConfirmButtons" index="0"] +custom_minimum_size = Vector2(0, 26) +layout_mode = 2 +size_flags_horizontal = 3 +mouse_default_cursor_shape = 2 +shortcut = SubResource("Shortcut_5gq73") + +[node name="TextureRect" type="TextureRect" parent="ConfirmButtons/ConfirmButton" index="0" groups=["UIButtons"]] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("3_mtv71") +stretch_mode = 3 + +[node name="CancelButton" type="Button" parent="ConfirmButtons" index="1"] +custom_minimum_size = Vector2(0, 26) +layout_mode = 2 +size_flags_horizontal = 3 +mouse_default_cursor_shape = 2 +shortcut = SubResource("Shortcut_04tjd") + +[node name="TextureRect" type="TextureRect" parent="ConfirmButtons/CancelButton" index="0" groups=["UIButtons"]] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +texture = ExtResource("4_ad04n") +stretch_mode = 3 + +[node name="ModeLabel" type="Label" parent="." index="3"] layout_mode = 2 text = "Mode:" -[node name="Modes" type="OptionButton" parent="." index="3"] +[node name="Modes" type="OptionButton" parent="." index="4"] layout_mode = 2 mouse_default_cursor_shape = 2 -[node name="PositionLabel" type="Label" parent="." index="4"] +[node name="PositionLabel" type="Label" parent="." index="5"] layout_mode = 2 text = "Position:" -[node name="Position" parent="." index="5" instance=ExtResource("4")] +[node name="Position" parent="." index="6" instance=ExtResource("4")] layout_mode = 2 allow_greater = true allow_lesser = true -[node name="SizeLabel" type="Label" parent="." index="6"] +[node name="SizeLabel" type="Label" parent="." index="7"] layout_mode = 2 text = "Size:" -[node name="Size" parent="." index="7" instance=ExtResource("4")] +[node name="Size" parent="." index="8" instance=ExtResource("4")] layout_mode = 2 value = Vector2(1, 1) min_value = Vector2(1, 1) @@ -37,10 +88,12 @@ show_ratio = true prefix_x = "Width:" prefix_y = "Height:" -[node name="Timer" type="Timer" parent="." index="8"] +[node name="Timer" type="Timer" parent="." index="9"] wait_time = 0.2 one_shot = true +[connection signal="pressed" from="ConfirmButtons/ConfirmButton" to="." method="_on_confirm_button_pressed"] +[connection signal="pressed" from="ConfirmButtons/CancelButton" to="." method="_on_cancel_button_pressed"] [connection signal="item_selected" from="Modes" to="." method="_on_Modes_item_selected"] [connection signal="value_changed" from="Position" to="." method="_on_Position_value_changed"] [connection signal="ratio_toggled" from="Size" to="." method="_on_Size_ratio_toggled"] diff --git a/src/UI/Canvas/Canvas.gd b/src/UI/Canvas/Canvas.gd index cae059c73..f97e3ff15 100644 --- a/src/UI/Canvas/Canvas.gd +++ b/src/UI/Canvas/Canvas.gd @@ -17,7 +17,7 @@ var layer_metadata_texture := ImageTexture.new() @onready var tile_mode := $TileMode as Node2D @onready var pixel_grid := $PixelGrid as Node2D @onready var grid := $Grid as Node2D -@onready var selection := $Selection as Node2D +@onready var selection := $Selection as SelectionNode @onready var onion_past := $OnionPast as Node2D @onready var onion_future := $OnionFuture as Node2D @onready var crop_rect := $CropRect as CropRect diff --git a/src/UI/Canvas/Selection.gd b/src/UI/Canvas/Selection.gd index a540054ad..3110734f5 100644 --- a/src/UI/Canvas/Selection.gd +++ b/src/UI/Canvas/Selection.gd @@ -1,5 +1,8 @@ +class_name SelectionNode extends Node2D +signal is_moving_content_changed + enum SelectionOperation { ADD, SUBTRACT, INTERSECT } const KEY_MOVE_ACTION_NAMES: PackedStringArray = [&"ui_up", &"ui_down", &"ui_left", &"ui_right"] const CLIPBOARD_FILE_PATH := "user://clipboard.txt" @@ -7,7 +10,10 @@ const CLIPBOARD_FILE_PATH := "user://clipboard.txt" # flags (additional properties of selection that can be toggled) var flag_tilemode := false -var is_moving_content := false +var is_moving_content := false: + set(value): + is_moving_content = value + is_moving_content_changed.emit() var arrow_key_move := false var is_pasting := false var big_bounding_rectangle := Rect2i(): @@ -100,12 +106,6 @@ func _input(event: InputEvent) -> void: image_current_pixel = canvas.current_pixel if Global.mirror_view: image_current_pixel.x = Global.current_project.size.x - image_current_pixel.x - if is_moving_content: - if Input.is_action_just_pressed("transformation_confirm"): - transform_content_confirm() - elif Input.is_action_just_pressed("transformation_cancel"): - transform_content_cancel() - if not project.layers[project.current_layer].can_layer_get_drawn(): return if event is InputEventKey: From 8beb79a33b167cb64b9ea98e22c1e7aedc4ae578 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Sun, 3 Nov 2024 03:36:37 +0200 Subject: [PATCH 142/162] Fix memory leak where the project remained referenced in BaseDraw even when its tab was closed Another memory leak remains in Recorder.gd, where the first project forever remains referenced in memory, until the user changes the project from the option button. Perhaps we should remove that option button completely and always record the current project, that also sounds like the intended behavior to me. --- src/Tools/BaseDraw.gd | 2 ++ src/Tools/DesignTools/Eraser.gd | 3 ++- src/Tools/DesignTools/Pencil.gd | 3 ++- src/Tools/DesignTools/Shading.gd | 3 ++- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Tools/BaseDraw.gd b/src/Tools/BaseDraw.gd index 5544679a4..1bea35c0a 100644 --- a/src/Tools/BaseDraw.gd +++ b/src/Tools/BaseDraw.gd @@ -273,6 +273,8 @@ func draw_tool(pos: Vector2i) -> void: func draw_end(pos: Vector2i) -> void: super.draw_end(pos) + _stroke_project = null + _stroke_images = [] _brush_size_dynamics = _brush_size if Tools.dynamics_size != Tools.Dynamics.NONE: _brush_size_dynamics = Tools.brush_size_min diff --git a/src/Tools/DesignTools/Eraser.gd b/src/Tools/DesignTools/Eraser.gd index d4d08fd37..f2e99ac45 100644 --- a/src/Tools/DesignTools/Eraser.gd +++ b/src/Tools/DesignTools/Eraser.gd @@ -92,8 +92,8 @@ func draw_move(pos_i: Vector2i) -> void: func draw_end(pos: Vector2i) -> void: pos = snap_position(pos) - super.draw_end(pos) if _picking_color: + super.draw_end(pos) return if _draw_line: @@ -105,6 +105,7 @@ func draw_end(pos: Vector2i) -> void: draw_fill_gap(_line_start, _line_end) _draw_line = false + super.draw_end(pos) commit_undo() SteamManager.set_achievement("ACH_ERASE_PIXEL") cursor_text = "" diff --git a/src/Tools/DesignTools/Pencil.gd b/src/Tools/DesignTools/Pencil.gd index d4b7f0d76..269503553 100644 --- a/src/Tools/DesignTools/Pencil.gd +++ b/src/Tools/DesignTools/Pencil.gd @@ -164,8 +164,8 @@ func draw_move(pos_i: Vector2i) -> void: func draw_end(pos: Vector2i) -> void: pos = snap_position(pos) - super.draw_end(pos) if _picking_color: + super.draw_end(pos) return if _draw_line: @@ -194,6 +194,7 @@ func draw_end(pos: Vector2i) -> void: draw_tool(v) _fill_inside_rect = Rect2i() + super.draw_end(pos) commit_undo() cursor_text = "" update_random_image() diff --git a/src/Tools/DesignTools/Shading.gd b/src/Tools/DesignTools/Shading.gd index 4dda20c0e..e18ce0615 100644 --- a/src/Tools/DesignTools/Shading.gd +++ b/src/Tools/DesignTools/Shading.gd @@ -291,8 +291,8 @@ func draw_move(pos_i: Vector2i) -> void: func draw_end(pos: Vector2i) -> void: pos = snap_position(pos) - super.draw_end(pos) if _picking_color: + super.draw_end(pos) return if _draw_line: @@ -304,6 +304,7 @@ func draw_end(pos: Vector2i) -> void: draw_fill_gap(_line_start, _line_end) _draw_line = false + super.draw_end(pos) commit_undo() cursor_text = "" update_random_image() From ec17e970e0e4baac8363a3d712dbd6867450a544 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Sun, 3 Nov 2024 18:54:08 +0200 Subject: [PATCH 143/162] The Recorder panel now automatically records for the current project Making its behavior more intuitive and consistent with the other panels. This also allows for multiple projects to be recorder at the same time, something that was not previous before. Changing projects now also changes the UI accordingly, depending on whether the current project is being recorded or not. This change also fixes a memory leak, where either the first ever project or the last recorded one, stayed forever referenced in memory by the `project` variable. Also fixed an issue where the recorder's settings size label was not showing the correct project size. --- src/Classes/Project.gd | 2 + src/UI/Recorder/Recorder.gd | 193 +++++++++++++++------------------- src/UI/Recorder/Recorder.tscn | 14 +-- 3 files changed, 86 insertions(+), 123 deletions(-) diff --git a/src/Classes/Project.gd b/src/Classes/Project.gd index 3016ad133..d4eb544cb 100644 --- a/src/Classes/Project.gd +++ b/src/Classes/Project.gd @@ -3,6 +3,7 @@ class_name Project extends RefCounted ## A class for project properties. +signal removed signal serialized(dict: Dictionary) signal about_to_deserialize(dict: Dictionary) signal resized @@ -137,6 +138,7 @@ func remove() -> void: # Prevents memory leak (due to the layers' project reference stopping ref counting from freeing) layers.clear() Global.projects.erase(self) + removed.emit() func remove_backup_file() -> void: diff --git a/src/UI/Recorder/Recorder.gd b/src/UI/Recorder/Recorder.gd index f2b611b9e..7b8e84f68 100644 --- a/src/UI/Recorder/Recorder.gd +++ b/src/UI/Recorder/Recorder.gd @@ -1,17 +1,17 @@ +class_name RecorderPanel extends PanelContainer -signal frame_saved - enum Mode { CANVAS, PIXELORAMA } var mode := Mode.CANVAS -var chosen_dir := "" +var chosen_dir := "": + set(value): + chosen_dir = value + if chosen_dir.ends_with("/"): # Remove end back-slashes if present + chosen_dir[-1] = "" +var recorded_projects := {} ## [Dictionary] of [Project] and [Recorder]. var save_dir := "" -var project: Project -var cache: Array[Image] = [] ## Images stored during recording -var frame_captured := 0 ## Used to visualize frames captured -var skip_amount := 1 ## Number of "do" actions after which a frame can be captured -var current_frame_no := 0 ## Used to compare with skip_amount to see if it can be captured +var skip_amount := 1 ## Number of "do" actions after which a frame can be captured. var resize_percent := 100 var _path_dialog: FileDialog: get: @@ -28,7 +28,6 @@ var _path_dialog: FileDialog: return _path_dialog @onready var captured_label := %CapturedLabel as Label -@onready var project_list := $"%TargetProjectOption" as OptionButton @onready var start_button := $"%Start" as Button @onready var size_label := $"%Size" as Label @onready var path_field := $"%Path" as LineEdit @@ -36,125 +35,96 @@ var _path_dialog: FileDialog: @onready var options_container := %OptionsContainer as VBoxContainer +class Recorder: + var project: Project + var recorder_panel: RecorderPanel + var actions_done := -1 + var frames_captured := 0 + var save_directory := "" + + func _init(_project: Project, _recorder_panel: RecorderPanel) -> void: + project = _project + recorder_panel = _recorder_panel + # Create a new directory based on time + var time_dict := Time.get_time_dict_from_system() + var folder := str( + project.name, time_dict.hour, "_", time_dict.minute, "_", time_dict.second + ) + var dir := DirAccess.open(recorder_panel.chosen_dir) + save_directory = recorder_panel.chosen_dir.path_join(folder) + dir.make_dir_recursive(save_directory) + project.removed.connect(recorder_panel.finalize_recording.bind(project)) + project.undo_redo.version_changed.connect(capture_frame) + + func _notification(what: int) -> void: + if what == NOTIFICATION_PREDELETE: + # Needed so that the project won't be forever remained in memory because of bind(). + project.removed.disconnect(recorder_panel.finalize_recording) + + func capture_frame() -> void: + actions_done += 1 + if actions_done % recorder_panel.skip_amount != 0: + return + var image: Image + if recorder_panel.mode == RecorderPanel.Mode.PIXELORAMA: + image = recorder_panel.get_window().get_texture().get_image() + else: + var frame := project.frames[project.current_frame] + image = Image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8) + DrawingAlgos.blend_layers(image, frame, Vector2i.ZERO, project) + + if recorder_panel.resize_percent != 100: + var resize := recorder_panel.resize_percent / 100 + var new_width := image.get_width() * resize + var new_height := image.get_height() * resize + image.resize(new_width, new_height, Image.INTERPOLATE_NEAREST) + var save_file := str(project.name, "_", frames_captured, ".png") + image.save_png(save_directory.path_join(save_file)) + frames_captured += 1 + recorder_panel.captured_label.text = str("Saved: ", frames_captured) + + func _ready() -> void: - refresh_projects_list() - project = Global.current_project - frame_saved.connect(_on_frame_saved) + Global.project_switched.connect(_on_project_switched) # Make a recordings folder if there isn't one chosen_dir = Global.home_data_directory.path_join("Recordings") DirAccess.make_dir_recursive_absolute(chosen_dir) path_field.text = chosen_dir - size_label.text = str("(", project.size.x, "×", project.size.y, ")") + + +func _on_project_switched() -> void: + if recorded_projects.has(Global.current_project): + initialize_recording() + start_button.set_pressed_no_signal(true) + Global.change_button_texturerect(start_button.get_child(0), "stop.png") + else: + finalize_recording() + start_button.set_pressed_no_signal(false) + Global.change_button_texturerect(start_button.get_child(0), "start.png") func initialize_recording() -> void: - connect_undo() # connect to detect changes in project - cache.clear() # clear the cache array to store new images - frame_captured = 0 - current_frame_no = skip_amount - 1 - # disable some options that are not required during recording - project_list.visible = false captured_label.visible = true for child in options_container.get_children(): if !child.is_in_group("visible during recording"): child.visible = false - save_dir = chosen_dir - # Remove end back-slashes if present - if save_dir.ends_with("/"): - save_dir[-1] = "" - # Create a new directory based on time - var time_dict := Time.get_time_dict_from_system() - var folder := str(project.name, time_dict.hour, "_", time_dict.minute, "_", time_dict.second) - var dir := DirAccess.open(save_dir) - save_dir = save_dir.path_join(folder) - dir.make_dir_recursive(save_dir) - - capture_frame() # capture first frame - $Timer.start() - - -func capture_frame() -> void: - current_frame_no += 1 - if current_frame_no != skip_amount: - return - current_frame_no = 0 - var image: Image - if mode == Mode.PIXELORAMA: - image = get_tree().root.get_viewport().get_texture().get_image() - else: - var frame := project.frames[project.current_frame] - image = Image.create(project.size.x, project.size.y, false, Image.FORMAT_RGBA8) - DrawingAlgos.blend_layers(image, frame, Vector2i.ZERO, project) - - if mode == Mode.CANVAS: - if resize_percent != 100: - var resize := resize_percent / 100 - image.resize( - image.get_width() * resize, image.get_height() * resize, Image.INTERPOLATE_NEAREST - ) - - cache.append(image) - - -func _on_Timer_timeout() -> void: - # Saves frames little by little during recording - if cache.size() > 0: - save_frame(cache[0]) - cache.remove_at(0) - - -func save_frame(img: Image) -> void: - var save_file := str(project.name, "_", frame_captured, ".png") - img.save_png(save_dir.path_join(save_file)) - frame_saved.emit() - - -func _on_frame_saved() -> void: - frame_captured += 1 - captured_label.text = str("Saved: ", frame_captured) - - -func finalize_recording() -> void: - $Timer.stop() - for img in cache: - save_frame(img) - cache.clear() - disconnect_undo() - project_list.visible = true - captured_label.visible = false - for child in options_container.get_children(): - child.visible = true - if mode == Mode.PIXELORAMA: - size_label.get_parent().visible = false - - -func disconnect_undo() -> void: - project.undo_redo.version_changed.disconnect(capture_frame) - - -func connect_undo() -> void: - project.undo_redo.version_changed.connect(capture_frame) - - -func _on_TargetProjectOption_item_selected(index: int) -> void: - project = Global.projects[index] - - -func _on_TargetProjectOption_pressed() -> void: - refresh_projects_list() - - -func refresh_projects_list() -> void: - project_list.clear() - for proj in Global.projects: - project_list.add_item(proj.name) +func finalize_recording(project := Global.current_project) -> void: + if recorded_projects.has(project): + recorded_projects.erase(project) + if project == Global.current_project: + captured_label.visible = false + for child in options_container.get_children(): + child.visible = true + if mode == Mode.PIXELORAMA: + size_label.get_parent().visible = false func _on_Start_toggled(button_pressed: bool) -> void: if button_pressed: + recorded_projects[Global.current_project] = Recorder.new(Global.current_project, self) initialize_recording() Global.change_button_texturerect(start_button.get_child(0), "stop.png") else: @@ -163,7 +133,8 @@ func _on_Start_toggled(button_pressed: bool) -> void: func _on_Settings_pressed() -> void: - options_dialog.popup_on_parent(Rect2(position, options_dialog.size)) + _on_SpinBox_value_changed(resize_percent) + options_dialog.popup_on_parent(Rect2i(position, options_dialog.size)) func _on_SkipAmount_value_changed(value: float) -> void: @@ -181,7 +152,7 @@ func _on_Mode_toggled(button_pressed: bool) -> void: func _on_SpinBox_value_changed(value: float) -> void: resize_percent = value - var new_size: Vector2 = project.size * (resize_percent / 100.0) + var new_size: Vector2 = Global.current_project.size * (resize_percent / 100.0) size_label.text = str("(", new_size.x, "×", new_size.y, ")") diff --git a/src/UI/Recorder/Recorder.tscn b/src/UI/Recorder/Recorder.tscn index 050d8af9c..5204fcf88 100644 --- a/src/UI/Recorder/Recorder.tscn +++ b/src/UI/Recorder/Recorder.tscn @@ -31,13 +31,6 @@ unique_name_in_owner = true visible = false layout_mode = 2 -[node name="TargetProjectOption" type="OptionButton" parent="ScrollContainer/CenterContainer/GridContainer"] -unique_name_in_owner = true -custom_minimum_size = Vector2(100, 0) -layout_mode = 2 -tooltip_text = "Choose project" -clip_text = true - [node name="Start" type="Button" parent="ScrollContainer/CenterContainer/GridContainer" groups=["UIButtons"]] unique_name_in_owner = true custom_minimum_size = Vector2(32, 32) @@ -143,6 +136,8 @@ text = "Capture frame every" [node name="SkipAmount" type="SpinBox" parent="OptionsDialog/PanelContainer/OptionsContainer/ActionGap"] layout_mode = 2 size_flags_horizontal = 3 +min_value = 1.0 +value = 1.0 suffix = "actions" [node name="ModeHeader" type="HBoxContainer" parent="OptionsDialog/PanelContainer/OptionsContainer" groups=["visible during recording"]] @@ -223,10 +218,6 @@ editable = false layout_mode = 2 text = "Choose" -[node name="Timer" type="Timer" parent="."] - -[connection signal="item_selected" from="ScrollContainer/CenterContainer/GridContainer/TargetProjectOption" to="." method="_on_TargetProjectOption_item_selected"] -[connection signal="pressed" from="ScrollContainer/CenterContainer/GridContainer/TargetProjectOption" to="." method="_on_TargetProjectOption_pressed"] [connection signal="toggled" from="ScrollContainer/CenterContainer/GridContainer/Start" to="." method="_on_Start_toggled"] [connection signal="pressed" from="ScrollContainer/CenterContainer/GridContainer/Settings" to="." method="_on_Settings_pressed"] [connection signal="pressed" from="ScrollContainer/CenterContainer/GridContainer/OpenFolder" to="." method="_on_open_folder_pressed"] @@ -234,4 +225,3 @@ text = "Choose" [connection signal="toggled" from="OptionsDialog/PanelContainer/OptionsContainer/ModeType/Mode" to="." method="_on_Mode_toggled"] [connection signal="value_changed" from="OptionsDialog/PanelContainer/OptionsContainer/OutputScale/Resize" to="." method="_on_SpinBox_value_changed"] [connection signal="pressed" from="OptionsDialog/PanelContainer/OptionsContainer/PathContainer/Choose" to="." method="_on_Choose_pressed"] -[connection signal="timeout" from="Timer" to="." method="_on_Timer_timeout"] From d2892358e31401dce190249b8abda25bcef7c3dd Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Mon, 4 Nov 2024 18:47:29 +0200 Subject: [PATCH 144/162] Add a `set_display_scale()` method to Main to avoid duplicate code --- src/Main.gd | 18 +++++++++++------- src/Preferences/PreferencesDialog.gd | 7 +------ src/UI/TopMenuContainer/TopMenuContainer.gd | 1 + 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Main.gd b/src/Main.gd index 521bbde1f..0d1094a41 100644 --- a/src/Main.gd +++ b/src/Main.gd @@ -250,16 +250,10 @@ func _handle_layout_files() -> void: func _setup_application_window_size() -> void: if DisplayServer.get_name() == "headless": return - var root := get_tree().root - root.content_scale_aspect = Window.CONTENT_SCALE_ASPECT_IGNORE - root.content_scale_mode = Window.CONTENT_SCALE_MODE_DISABLED - # Set a minimum window size to prevent UI elements from collapsing on each other. - root.min_size = Vector2(1024, 576) - root.content_scale_factor = Global.shrink + set_display_scale() if Global.font_size != theme.default_font_size: theme.default_font_size = Global.font_size theme.set_font_size("font_size", "HeaderSmall", Global.font_size + 2) - set_custom_cursor() if OS.get_name() == "Web": return @@ -280,6 +274,16 @@ func _setup_application_window_size() -> void: get_window().size = Global.config_cache.get_value("window", "size") +func set_display_scale() -> void: + var root := get_window() + root.content_scale_aspect = Window.CONTENT_SCALE_ASPECT_IGNORE + root.content_scale_mode = Window.CONTENT_SCALE_MODE_DISABLED + # Set a minimum window size to prevent UI elements from collapsing on each other. + root.min_size = Vector2(1024, 576) + root.content_scale_factor = Global.shrink + set_custom_cursor() + + func set_custom_cursor() -> void: if Global.native_cursors: return diff --git a/src/Preferences/PreferencesDialog.gd b/src/Preferences/PreferencesDialog.gd index 3d6bcf42f..5ba2f37d6 100644 --- a/src/Preferences/PreferencesDialog.gd +++ b/src/Preferences/PreferencesDialog.gd @@ -413,12 +413,7 @@ func _on_List_item_selected(index: int) -> void: func _on_shrink_apply_button_pressed() -> void: - var root := get_tree().root - root.content_scale_aspect = Window.CONTENT_SCALE_ASPECT_IGNORE - root.content_scale_mode = Window.CONTENT_SCALE_MODE_DISABLED - root.min_size = Vector2(1024, 576) - root.content_scale_factor = Global.shrink - Global.control.set_custom_cursor() + Global.control.set_display_scale() hide() popup_centered(Vector2(600, 400)) Global.dialog_open(true) diff --git a/src/UI/TopMenuContainer/TopMenuContainer.gd b/src/UI/TopMenuContainer/TopMenuContainer.gd index c9c121d30..b95524f00 100644 --- a/src/UI/TopMenuContainer/TopMenuContainer.gd +++ b/src/UI/TopMenuContainer/TopMenuContainer.gd @@ -99,6 +99,7 @@ func _ready() -> void: func _input(event: InputEvent) -> void: + # Workaround for https://github.com/Orama-Interactive/Pixelorama/issues/1070 if event is InputEventMouseButton and event.pressed: file_menu.activate_item_by_event(event) edit_menu.activate_item_by_event(event) From af703d486e3fab8f77e63abe48a3a99a8bd8774f Mon Sep 17 00:00:00 2001 From: Variable <77773850+Variable-ind@users.noreply.github.com> Date: Sun, 10 Nov 2024 02:26:14 +0500 Subject: [PATCH 145/162] Add a way to get autoloads through the api (#1131) * add autoloads to api * A name Dilemma, There are 2 autoloads for ImportApi * add docstring --- src/Autoload/ExtensionsApi.gd | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/Autoload/ExtensionsApi.gd b/src/Autoload/ExtensionsApi.gd index 3b4faaaba..e120ac9b5 100644 --- a/src/Autoload/ExtensionsApi.gd +++ b/src/Autoload/ExtensionsApi.gd @@ -381,6 +381,10 @@ class PanelAPI: ## Gives access to theme related functions. class ThemeAPI: + ## Returns the Themes autoload. Allows interacting with themes on a more deeper level. + func autoload() -> Themes: + return Themes + ## Adds the [param theme] to [code]Edit -> Preferences -> Interface -> Themes[/code]. func add_theme(theme: Theme) -> void: Themes.add_theme(theme) @@ -438,6 +442,10 @@ class ToolAPI: # gdlint: ignore=constant-name const LayerTypes := Global.LayerTypes + ## Returns the Tools autoload. Allows interacting with tools on a more deeper level. + func autoload() -> Tools: + return Tools + ## Adds a tool to pixelorama with name [param tool_name] (without spaces), ## display name [param display_name], tool scene [param scene], layers that the tool works ## on [param layer_types] defined by [constant LayerTypes], @@ -678,6 +686,11 @@ class ExportAPI: # gdlint: ignore=constant-name const ExportTab := Export.ExportTab + ## Returns the Export autoload. + ## Allows interacting with the export workflow on a more deeper level. + func autoload() -> Export: + return Export + ## [param format_info] has keys: [code]extension[/code] and [code]description[/code] ## whose values are of type [String] e.g:[codeblock] ## format_info = {"extension": ".gif", "description": "GIF Image"} @@ -730,6 +743,15 @@ class ExportAPI: ## Gives access to adding custom import options. class ImportAPI: + ## Returns the OpenSave autoload. Contains code to handle file loading. + ## It also contains code to handle project saving (.pxo) + func open_save_autoload() -> OpenSave: + return OpenSave + + ## Returns the Import autoload. Manages import of brushes and patterns. + func import_autoload() -> Import: + return Import + ## [param import_scene] is a scene preload that will be instanced and added to "import options" ## section of pixelorama's import dialogs and will appear whenever [param import_name] is ## chosen from import menu. @@ -757,6 +779,10 @@ class ImportAPI: ## Gives access to palette related stuff. class PaletteAPI: + ## Returns the Palettes autoload. Allows interacting with palettes on a more deeper level. + func autoload() -> Palettes: + return Palettes + ## 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] From 5fa97988b5f8553b9806e5ae86226ebcd4afdece Mon Sep 17 00:00:00 2001 From: Variable <77773850+Variable-ind@users.noreply.github.com> Date: Mon, 11 Nov 2024 02:12:09 +0500 Subject: [PATCH 146/162] Fixed unexpected behavior of resize_selection() (#1132) * Fixed unexpected behavior of resize_selection() * Fix typo --------- Co-authored-by: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> --- src/Autoload/ExtensionsApi.gd | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Autoload/ExtensionsApi.gd b/src/Autoload/ExtensionsApi.gd index e120ac9b5..93b8a8897 100644 --- a/src/Autoload/ExtensionsApi.gd +++ b/src/Autoload/ExtensionsApi.gd @@ -534,6 +534,10 @@ class SelectionAPI: Global.canvas.selection.move_borders_start() else: Global.canvas.selection.transform_content_start() + + if Global.canvas.selection.original_bitmap.is_empty(): # To avoid copying twice. + Global.canvas.selection.original_bitmap.copy_from(Global.current_project.selection_map) + Global.canvas.selection.big_bounding_rectangle.size = new_size Global.canvas.selection.resize_selection() Global.canvas.selection.move_borders_end() From b0b13617224089f98a6f7ef2ded5dd4c8bbe50bb Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Tue, 12 Nov 2024 00:47:53 +0200 Subject: [PATCH 147/162] Fix layer effect slider values being rounded to the nearest integer --- src/Classes/ShaderLoader.gd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Classes/ShaderLoader.gd b/src/Classes/ShaderLoader.gd index e2f7a8a62..495bc5c46 100644 --- a/src/Classes/ShaderLoader.gd +++ b/src/Classes/ShaderLoader.gd @@ -148,13 +148,13 @@ static func create_ui_for_shader_uniforms( if u_value != "": slider.value = int(u_value) + slider.min_value = min_value + slider.max_value = max_value + slider.step = step 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) From ce738f02c2b5ba1edb21f5867bc1cc475b04aefa Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Tue, 12 Nov 2024 00:59:01 +0200 Subject: [PATCH 148/162] Don't change brush size when resizing the timeline cels and the palette swatches --- src/Palette/PaletteScroll.gd | 1 + src/UI/Nodes/ValueSlider.gd | 12 +++++++++--- src/UI/Timeline/AnimationTimeline.gd | 1 + 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Palette/PaletteScroll.gd b/src/Palette/PaletteScroll.gd index 0d0dec396..c3c2156a0 100644 --- a/src/Palette/PaletteScroll.gd +++ b/src/Palette/PaletteScroll.gd @@ -90,3 +90,4 @@ func _on_PaletteScroll_gui_input(event: InputEvent) -> void: return resize_grid() set_sliders(palette_grid.current_palette, palette_grid.grid_window_origin + scroll_vector) + get_window().set_input_as_handled() diff --git a/src/UI/Nodes/ValueSlider.gd b/src/UI/Nodes/ValueSlider.gd index 9d9a4a508..8d9a8cbad 100644 --- a/src/UI/Nodes/ValueSlider.gd +++ b/src/UI/Nodes/ValueSlider.gd @@ -80,15 +80,21 @@ func _notification(what: int) -> void: _reset_display(false) -func _input(event: InputEvent) -> void: +func _unhandled_input(event: InputEvent) -> void: if not editable or not is_visible_in_tree(): return - if event.is_action_pressed(global_increment_action, true): + if ( + not global_increment_action.is_empty() + and event.is_action_pressed(global_increment_action, true) + ): if snap_by_default: value += step if event.ctrl_pressed else snap_step else: value += snap_step if event.ctrl_pressed else step - elif event.is_action_pressed(global_decrement_action, true): + elif ( + not global_decrement_action.is_empty() + and event.is_action_pressed(global_decrement_action, true) + ): if snap_by_default: value -= step if event.ctrl_pressed else snap_step else: diff --git a/src/UI/Timeline/AnimationTimeline.gd b/src/UI/Timeline/AnimationTimeline.gd index 2b126738d..490f4fb2a 100644 --- a/src/UI/Timeline/AnimationTimeline.gd +++ b/src/UI/Timeline/AnimationTimeline.gd @@ -141,6 +141,7 @@ func _input(event: InputEvent) -> void: if timeline_rect.has_point(mouse_pos): if Input.is_key_pressed(KEY_CTRL): cel_size += (2 * int(event.is_action("zoom_in")) - 2 * int(event.is_action("zoom_out"))) + get_viewport().set_input_as_handled() func reset_settings() -> void: From 5739a8b28e25273efab8a5cbb74f46ab0d7f6b5f Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Tue, 12 Nov 2024 01:46:50 +0200 Subject: [PATCH 149/162] [skip ci] Update CHANGELOG.md --- CHANGELOG.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc5500d0f..f36285e48 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,26 @@ 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.5] - 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 +- Mouse buttons can now be used as menu shortcuts. [#1070](https://github.com/Orama-Interactive/Pixelorama/issues/1070) +- Added confirm and cancel buttons in the selection tool options to confirm/cancel an active transformation. +- OKHSL Lightness sorting in palettes has been implemented. [#1126](https://github.com/Orama-Interactive/Pixelorama/pull/1126) + +### Changed +- The brush size no longer changes by Control + Mouse Wheel when resizing the timeline cels or the palette swatches. +- The Recorder panel now automatically records for the current project. This also allows for multiple projects to be recorded at the same time. + +### Fixed +- Fixed layer effect slider values being rounded to the nearest integer. +- Fixed memory leak where the project remained referenced by a drawing tool, even when its tab was closed. +- Fixed memory leak where the first project remained forever references in memory by the Recorder panel. + ## [v1.0.4] - 2024-10-25 This update has been brought to you by the contributions of: Fayez Akhtar ([@Variable-ind](https://github.com/Variable-ind)), Mariano Semelman ([@msemelman](https://github.com/msemelman)) From 26001807368b3ddc791b226c94c179edf444c56b Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Wed, 13 Nov 2024 00:40:58 +0200 Subject: [PATCH 150/162] Remove the Recorder from the Web version It's not working anyway, and I'm not sure if there is a way to make it work, at least with a good and user-friendly way. If we find a way we could re-add it in the future. --- src/UI/Recorder/Recorder.gd | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/UI/Recorder/Recorder.gd b/src/UI/Recorder/Recorder.gd index 7b8e84f68..9009c2bba 100644 --- a/src/UI/Recorder/Recorder.gd +++ b/src/UI/Recorder/Recorder.gd @@ -85,6 +85,9 @@ class Recorder: func _ready() -> void: + if OS.get_name() == "Web": + ExtensionsApi.panel.remove_node_from_tab.call_deferred(self) + return Global.project_switched.connect(_on_project_switched) # Make a recordings folder if there isn't one chosen_dir = Global.home_data_directory.path_join("Recordings") From ad77d98f42f1177da9fa227c9595632916f8455c Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Wed, 13 Nov 2024 02:55:15 +0200 Subject: [PATCH 151/162] Slightly optimize circle brushes by only calling the DrawingAlgos methods once while drawing They keep getting called when size dynamics are enabled, however. --- src/Tools/BaseDraw.gd | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/Tools/BaseDraw.gd b/src/Tools/BaseDraw.gd index 1bea35c0a..29b673173 100644 --- a/src/Tools/BaseDraw.gd +++ b/src/Tools/BaseDraw.gd @@ -177,6 +177,7 @@ func update_brush() -> void: _brush_texture = ImageTexture.create_from_image(_brush_image) update_mirror_brush() _stroke_dimensions = _brush_image.get_size() + _circle_tool_shortcut = [] _indicator = _create_brush_indicator() _polylines = _create_polylines(_indicator) $Brush/Type/Texture.texture = _brush_texture @@ -275,6 +276,7 @@ func draw_end(pos: Vector2i) -> void: super.draw_end(pos) _stroke_project = null _stroke_images = [] + _circle_tool_shortcut = [] _brush_size_dynamics = _brush_size if Tools.dynamics_size != Tools.Dynamics.NONE: _brush_size_dynamics = Tools.brush_size_min @@ -313,10 +315,6 @@ func _prepare_tool() -> void: # This may prevent a few tests when setting pixels _is_mask_size_zero = _mask.size() == 0 match _brush.type: - Brushes.CIRCLE: - _prepare_circle_tool(false) - Brushes.FILLED_CIRCLE: - _prepare_circle_tool(true) Brushes.FILE, Brushes.RANDOM_FILE, Brushes.CUSTOM: # save _brush_image for safe keeping _brush_image = _create_blended_brush_image(_orignal_brush_image) @@ -326,19 +324,6 @@ func _prepare_tool() -> void: _stroke_dimensions = _brush_image.get_size() -func _prepare_circle_tool(fill: bool) -> void: - var circle_tool_map := _create_circle_indicator(_brush_size_dynamics, fill) - # Go through that BitMap and build an Array of the "displacement" from the center of the bits - # that are true. - var diameter := _brush_size_dynamics * 2 + 1 - for n in range(0, diameter): - for m in range(0, diameter): - if circle_tool_map.get_bitv(Vector2i(m, n)): - _circle_tool_shortcut.append( - Vector2i(m - _brush_size_dynamics, n - _brush_size_dynamics) - ) - - ## Make sure to always have invoked _prepare_tool() before this. This computes the coordinates to be ## drawn if it can (except for the generic brush, when it's actually drawing them) func _draw_tool(pos: Vector2) -> PackedVector2Array: @@ -621,10 +606,24 @@ func _create_pixel_indicator(brush_size: int) -> BitMap: func _create_circle_indicator(brush_size: int, fill := false) -> BitMap: - _circle_tool_shortcut = [] + if Tools.dynamics_size != Tools.Dynamics.NONE: + _circle_tool_shortcut = [] var brush_size_v2 := Vector2i(brush_size, brush_size) - var diameter := brush_size_v2 * 2 + Vector2i.ONE - return _fill_bitmap_with_points(_compute_draw_tool_circle(brush_size_v2, fill), diameter) + var diameter_v2 := brush_size_v2 * 2 + Vector2i.ONE + var circle_tool_map := _fill_bitmap_with_points( + _compute_draw_tool_circle(brush_size_v2, fill), diameter_v2 + ) + if _circle_tool_shortcut.is_empty(): + # Go through that BitMap and build an Array of the "displacement" + # from the center of the bits that are true. + var diameter := _brush_size_dynamics * 2 + 1 + for n in range(0, diameter): + for m in range(0, diameter): + if circle_tool_map.get_bitv(Vector2i(m, n)): + _circle_tool_shortcut.append( + Vector2i(m - _brush_size_dynamics, n - _brush_size_dynamics) + ) + return circle_tool_map func _create_line_indicator(indicator: BitMap, start: Vector2i, end: Vector2i) -> BitMap: From 7c1435e95fa6896cd40601545d5b4cfbb0a13ab0 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Wed, 13 Nov 2024 17:32:01 +0200 Subject: [PATCH 152/162] When using the mouse wheel over a slider, don't scroll in ScrollContainers --- src/UI/Nodes/ValueSlider.gd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/UI/Nodes/ValueSlider.gd b/src/UI/Nodes/ValueSlider.gd index 8d9a8cbad..b990b19cf 100644 --- a/src/UI/Nodes/ValueSlider.gd +++ b/src/UI/Nodes/ValueSlider.gd @@ -114,11 +114,13 @@ func _gui_input(event: InputEvent) -> void: value += step if event.ctrl_pressed else snap_step else: value += snap_step if event.ctrl_pressed else step + get_viewport().set_input_as_handled() elif event.button_index == MOUSE_BUTTON_WHEEL_DOWN: if snap_by_default: value -= step if event.ctrl_pressed else snap_step else: value -= snap_step if event.ctrl_pressed else step + get_viewport().set_input_as_handled() elif state == HELD: if event.is_action_released("left_mouse"): state = TYPING From 36329efaf64efac46c3930d3336bfd62d12428ff Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Thu, 14 Nov 2024 01:02:51 +0200 Subject: [PATCH 153/162] Add density to the square & circle brushes 00% density means that the brush gets completely drawn, anything less leaves gaps inside the brush, acting like a spray tool. --- Translations/Translations.pot | 4 ++++ src/Tools/BaseDraw.gd | 20 +++++++++++++++++--- src/Tools/BaseDraw.tscn | 23 +++++++++++++++++++++-- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/Translations/Translations.pot b/Translations/Translations.pot index b9042f22f..5b0821833 100644 --- a/Translations/Translations.pot +++ b/Translations/Translations.pot @@ -1865,6 +1865,10 @@ msgstr "" msgid "Fills the drawn shape with color, instead of drawing a hollow shape" msgstr "" +#. Found in the tool options of the Pencil, Eraser and Shading tools. It is a percentage of how dense the brush is. 100% density means that the brush gets completely drawn, anything less leaves gaps inside the brush, acting like a spray tool. +msgid "Density:" +msgstr "" + msgid "Brush color from" msgstr "" diff --git a/src/Tools/BaseDraw.gd b/src/Tools/BaseDraw.gd index 29b673173..613051b57 100644 --- a/src/Tools/BaseDraw.gd +++ b/src/Tools/BaseDraw.gd @@ -1,8 +1,11 @@ extends BaseTool +const IMAGE_BRUSHES := [Brushes.FILE, Brushes.RANDOM_FILE, Brushes.CUSTOM] + var _brush := Brushes.get_default_brush() var _brush_size := 1 var _brush_size_dynamics := 1 +var _brush_density := 100 var _brush_flip_x := false var _brush_flip_y := false var _brush_rotate_90 := false @@ -89,6 +92,12 @@ func _reset_dynamics() -> void: save_config() +func _on_density_value_slider_value_changed(value: int) -> void: + _brush_density = value + update_config() + save_config() + + func _on_InterpolateFactor_value_changed(value: float) -> void: _brush_interpolate = int(value) update_config() @@ -111,6 +120,7 @@ func get_config() -> Dictionary: "brush_type": _brush.type, "brush_index": _brush.index, "brush_size": _brush_size, + "brush_density": _brush_density, "brush_interpolate": _brush_interpolate, "brush_flip_x": _brush_flip_x, "brush_flip_y": _brush_flip_y, @@ -128,6 +138,7 @@ func set_config(config: Dictionary) -> void: _brush_size_dynamics = _brush_size if Tools.dynamics_size != Tools.Dynamics.NONE: _brush_size_dynamics = Tools.brush_size_min + _brush_density = config.get("brush_density", _brush_density) _brush_interpolate = config.get("brush_interpolate", _brush_interpolate) _brush_flip_x = config.get("brush_flip_x", _brush_flip_x) _brush_flip_y = config.get("brush_flip_y", _brush_flip_y) @@ -181,8 +192,9 @@ func update_brush() -> void: _indicator = _create_brush_indicator() _polylines = _create_polylines(_indicator) $Brush/Type/Texture.texture = _brush_texture - $ColorInterpolation.visible = _brush.type in [Brushes.FILE, Brushes.RANDOM_FILE, Brushes.CUSTOM] - $RotationOptions.visible = _brush.type in [Brushes.FILE, Brushes.RANDOM_FILE, Brushes.CUSTOM] + $DensityValueSlider.visible = _brush.type not in IMAGE_BRUSHES + $ColorInterpolation.visible = _brush.type in IMAGE_BRUSHES + $RotationOptions.visible = _brush.type in IMAGE_BRUSHES func update_random_image() -> void: @@ -492,7 +504,7 @@ func draw_indicator(left: bool) -> void: func draw_indicator_at(pos: Vector2i, offset: Vector2i, color: Color) -> void: var canvas: Node2D = Global.canvas.indicators - if _brush.type in [Brushes.FILE, Brushes.RANDOM_FILE, Brushes.CUSTOM] and not _draw_line: + if _brush.type in IMAGE_BRUSHES and not _draw_line: pos -= _brush_image.get_size() / 2 pos -= offset canvas.draw_texture(_brush_texture, pos) @@ -522,6 +534,8 @@ func _set_pixel(pos: Vector2i, ignore_mirroring := false) -> void: func _set_pixel_no_cache(pos: Vector2i, ignore_mirroring := false) -> void: + if randi() % 100 >= _brush_density: + return pos = _stroke_project.tiles.get_canon_position(pos) if Global.current_project.has_selection: pos = Global.current_project.selection_map.get_canon_position(pos) diff --git a/src/Tools/BaseDraw.tscn b/src/Tools/BaseDraw.tscn index fc6872696..456649af8 100644 --- a/src/Tools/BaseDraw.tscn +++ b/src/Tools/BaseDraw.tscn @@ -1,9 +1,10 @@ -[gd_scene load_steps=8 format=3 uid="uid://ubyatap3sylf"] +[gd_scene load_steps=9 format=3 uid="uid://ubyatap3sylf"] [ext_resource type="PackedScene" uid="uid://yjhp0ssng2mp" path="res://src/UI/Nodes/ValueSlider.tscn" id="1"] [ext_resource type="PackedScene" uid="uid://ctfgfelg0sho8" path="res://src/Tools/BaseTool.tscn" id="2"] [ext_resource type="Script" path="res://src/Tools/BaseDraw.gd" id="3"] [ext_resource type="Script" path="res://src/UI/Nodes/CollapsibleContainer.gd" id="3_76bek"] +[ext_resource type="Script" path="res://src/UI/Nodes/ValueSlider.gd" id="5_kdxku"] [sub_resource type="ButtonGroup" id="ButtonGroup_7u3x0"] resource_name = "rotate" @@ -130,7 +131,24 @@ suffix = "px" global_increment_action = "brush_size_increment" global_decrement_action = "brush_size_decrement" -[node name="ColorInterpolation" parent="." index="4" instance=ExtResource("1")] +[node name="DensityValueSlider" type="TextureProgressBar" parent="." index="4"] +custom_minimum_size = Vector2(0, 24) +layout_mode = 2 +focus_mode = 2 +mouse_default_cursor_shape = 2 +theme_type_variation = &"ValueSlider" +min_value = 1.0 +value = 100.0 +nine_patch_stretch = true +stretch_margin_left = 3 +stretch_margin_top = 3 +stretch_margin_right = 3 +stretch_margin_bottom = 3 +script = ExtResource("5_kdxku") +prefix = "Density:" +suffix = "%" + +[node name="ColorInterpolation" parent="." index="5" instance=ExtResource("1")] visible = false layout_mode = 2 tooltip_text = "0: Color from the brush itself, 100: the currently selected color" @@ -143,4 +161,5 @@ prefix = "Brush color from:" [connection signal="toggled" from="RotationOptions/GridContainer/Rotate/Rotate270" to="." method="_on_rotate_270_toggled"] [connection signal="pressed" from="Brush/Type" to="." method="_on_BrushType_pressed"] [connection signal="value_changed" from="Brush/BrushSize" to="." method="_on_BrushSize_value_changed"] +[connection signal="value_changed" from="DensityValueSlider" to="." method="_on_density_value_slider_value_changed"] [connection signal="value_changed" from="ColorInterpolation" to="." method="_on_InterpolateFactor_value_changed"] From 4c7d7da5e7f17e66a1e89235ff49ba0b38788250 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Thu, 14 Nov 2024 01:39:41 +0200 Subject: [PATCH 154/162] Fix regression where pressing Enter or Control would not confirm/cancel selection when a selection tool wasn't active --- src/UI/Canvas/Selection.gd | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/UI/Canvas/Selection.gd b/src/UI/Canvas/Selection.gd index 3110734f5..3efe8268e 100644 --- a/src/UI/Canvas/Selection.gd +++ b/src/UI/Canvas/Selection.gd @@ -106,6 +106,11 @@ func _input(event: InputEvent) -> void: image_current_pixel = canvas.current_pixel if Global.mirror_view: image_current_pixel.x = Global.current_project.size.x - image_current_pixel.x + if is_moving_content: + if Input.is_action_just_pressed(&"transformation_confirm"): + transform_content_confirm() + elif Input.is_action_just_pressed(&"transformation_cancel"): + transform_content_cancel() if not project.layers[project.current_layer].can_layer_get_drawn(): return if event is InputEventKey: From 785d8cfc830f66a02d7c36248d7da24e2e840ee2 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Thu, 14 Nov 2024 16:22:53 +0200 Subject: [PATCH 155/162] Hide the density slider by default So that it doesn't appear in the shape tools, where it has no effect. --- src/Tools/BaseDraw.tscn | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Tools/BaseDraw.tscn b/src/Tools/BaseDraw.tscn index 456649af8..825eb7501 100644 --- a/src/Tools/BaseDraw.tscn +++ b/src/Tools/BaseDraw.tscn @@ -132,6 +132,7 @@ global_increment_action = "brush_size_increment" global_decrement_action = "brush_size_decrement" [node name="DensityValueSlider" type="TextureProgressBar" parent="." index="4"] +visible = false custom_minimum_size = Vector2(0, 24) layout_mode = 2 focus_mode = 2 From dec698024c5f447e0f10b2c4408408fb52b9034a Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Thu, 14 Nov 2024 17:59:53 +0200 Subject: [PATCH 156/162] Implement selection expanding and shrinking via the Select menu --- src/Autoload/Global.gd | 2 +- src/Classes/SelectionMap.gd | 27 ++++++++-- src/Classes/ShaderImageEffect.gd | 2 +- src/Shaders/Effects/OutlineInline.gdshader | 7 ++- src/UI/Dialogs/ModifySelection.gd | 39 ++++++++++++++ src/UI/Dialogs/ModifySelection.tscn | 60 +++++++++++++++++++++ src/UI/TopMenuContainer/TopMenuContainer.gd | 21 +++++++- 7 files changed, 151 insertions(+), 7 deletions(-) create mode 100644 src/UI/Dialogs/ModifySelection.gd create mode 100644 src/UI/Dialogs/ModifySelection.tscn diff --git a/src/Autoload/Global.gd b/src/Autoload/Global.gd index 314b0b012..21a04d459 100644 --- a/src/Autoload/Global.gd +++ b/src/Autoload/Global.gd @@ -71,7 +71,7 @@ enum EffectsMenu { SHADER } ## Enumeration of items present in the Select Menu. -enum SelectMenu { SELECT_ALL, CLEAR_SELECTION, INVERT, TILE_MODE } +enum SelectMenu { SELECT_ALL, CLEAR_SELECTION, INVERT, TILE_MODE, MODIFY } ## Enumeration of items present in the Help Menu. enum HelpMenu { VIEW_SPLASH_SCREEN, diff --git a/src/Classes/SelectionMap.gd b/src/Classes/SelectionMap.gd index 649a73299..cfb9591ee 100644 --- a/src/Classes/SelectionMap.gd +++ b/src/Classes/SelectionMap.gd @@ -1,7 +1,8 @@ class_name SelectionMap extends Image -var invert_shader := preload("res://src/Shaders/Effects/Invert.gdshader") +const INVERT_SHADER := preload("res://src/Shaders/Effects/Invert.gdshader") +const OUTLINE_INLINE_SHADER := preload("res://src/Shaders/Effects/OutlineInline.gdshader") func is_pixel_selected(pixel: Vector2i, calculate_offset := true) -> bool: @@ -87,8 +88,7 @@ func clear() -> void: func invert() -> void: var params := {"red": true, "green": true, "blue": true, "alpha": true} var gen := ShaderImageEffect.new() - gen.generate_image(self, invert_shader, params, get_size()) - self.convert(Image.FORMAT_LA8) + gen.generate_image(self, INVERT_SHADER, params, get_size()) ## Returns a copy of itself that is cropped to [param size]. @@ -183,3 +183,24 @@ func resize_bitmap_values( if new_bitmap_size != size: crop(new_bitmap_size.x, new_bitmap_size.y) blit_rect(smaller_image, Rect2i(Vector2i.ZERO, new_bitmap_size), dst) + + +func expand(width: int, pattern: int) -> void: + var params := { + "color": Color(1, 1, 1, 1), + "width": width, + "pattern": pattern, + } + var gen := ShaderImageEffect.new() + gen.generate_image(self, OUTLINE_INLINE_SHADER, params, get_size()) + + +func shrink(width: int, pattern: int) -> void: + var params := { + "color": Color(0), + "inside": true, + "width": width, + "pattern": pattern, + } + var gen := ShaderImageEffect.new() + gen.generate_image(self, OUTLINE_INLINE_SHADER, params, get_size()) diff --git a/src/Classes/ShaderImageEffect.gd b/src/Classes/ShaderImageEffect.gd index 04604fb0f..3a38b75e7 100644 --- a/src/Classes/ShaderImageEffect.gd +++ b/src/Classes/ShaderImageEffect.gd @@ -54,7 +54,7 @@ func generate_image(img: Image, shader: Shader, params: Dictionary, size: Vector RenderingServer.free_rid(ci_rid) RenderingServer.free_rid(mat_rid) RenderingServer.free_rid(texture) - viewport_texture.convert(Image.FORMAT_RGBA8) + viewport_texture.convert(img.get_format()) img.copy_from(viewport_texture) if resized_width: img.crop(img.get_width() - 1, img.get_height()) diff --git a/src/Shaders/Effects/OutlineInline.gdshader b/src/Shaders/Effects/OutlineInline.gdshader index 0eaa038a3..88325aa77 100644 --- a/src/Shaders/Effects/OutlineInline.gdshader +++ b/src/Shaders/Effects/OutlineInline.gdshader @@ -44,7 +44,12 @@ void fragment() { if ((output.a > 0.0) == inside && has_contrary_neighbour(UV, TEXTURE_PIXEL_SIZE, TEXTURE)) { output.rgb = inside ? mix(output.rgb, color.rgb, color.a) : color.rgb; - output.a += (1.0 - output.a) * color.a; + if (is_zero_approx(color.a)) { + output.a = color.a; + } + else { + output.a += (1.0 - output.a) * color.a; + } } COLOR = mix(original_color, output, selection_color.a); diff --git a/src/UI/Dialogs/ModifySelection.gd b/src/UI/Dialogs/ModifySelection.gd new file mode 100644 index 000000000..d0195d083 --- /dev/null +++ b/src/UI/Dialogs/ModifySelection.gd @@ -0,0 +1,39 @@ +extends ConfirmationDialog + +enum Types { EXPAND, SHRINK } + +@export var type := Types.EXPAND: + set(value): + type = value + if type == Types.EXPAND: + title = "Expand Selection" + else: + title = "Shrink Selection" + +@onready var width_slider: ValueSlider = $GridContainer/WidthSlider +@onready var brush_option_button: OptionButton = $GridContainer/BrushOptionButton +@onready var selection_node := Global.canvas.selection + + +func _on_visibility_changed() -> void: + if not visible: + Global.dialog_open(false) + + +func _on_confirmed() -> void: + var project := Global.current_project + if !project.has_selection: + return + selection_node.transform_content_confirm() + var undo_data_tmp := selection_node.get_undo_data(false) + var width: int = width_slider.value + var brush := brush_option_button.selected + project.selection_map.crop(project.size.x, project.size.y) + if type == Types.EXPAND: + project.selection_map.expand(width, brush) + else: + project.selection_map.shrink(width, brush) + selection_node.big_bounding_rectangle = project.selection_map.get_used_rect() + project.selection_offset = Vector2.ZERO + selection_node.commit_undo("Modify Selection", undo_data_tmp) + selection_node.queue_redraw() diff --git a/src/UI/Dialogs/ModifySelection.tscn b/src/UI/Dialogs/ModifySelection.tscn new file mode 100644 index 000000000..27a38debd --- /dev/null +++ b/src/UI/Dialogs/ModifySelection.tscn @@ -0,0 +1,60 @@ +[gd_scene load_steps=3 format=3 uid="uid://wcbpnsm7gptu"] + +[ext_resource type="Script" path="res://src/UI/Nodes/ValueSlider.gd" id="1_3jelw"] +[ext_resource type="Script" path="res://src/UI/Dialogs/ModifySelection.gd" id="1_w6rs7"] + +[node name="ModifySelection" type="ConfirmationDialog"] +title = "Expand selection" +position = Vector2i(0, 36) +size = Vector2i(260, 130) +script = ExtResource("1_w6rs7") + +[node name="GridContainer" type="GridContainer" parent="."] +offset_left = 8.0 +offset_top = 8.0 +offset_right = 252.0 +offset_bottom = 81.0 +columns = 2 + +[node name="WidthLabel" type="Label" parent="GridContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Width:" + +[node name="WidthSlider" type="TextureProgressBar" parent="GridContainer"] +custom_minimum_size = Vector2(0, 24) +layout_mode = 2 +size_flags_horizontal = 3 +focus_mode = 2 +mouse_default_cursor_shape = 2 +theme_type_variation = &"ValueSlider" +min_value = 1.0 +max_value = 25.0 +value = 1.0 +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("1_3jelw") + +[node name="BrushLabel" type="Label" parent="GridContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +text = "Brush:" + +[node name="BrushOptionButton" type="OptionButton" parent="GridContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +mouse_default_cursor_shape = 2 +selected = 0 +item_count = 3 +popup/item_0/text = "Diamond" +popup/item_1/text = "Circle" +popup/item_1/id = 1 +popup/item_2/text = "Square" +popup/item_2/id = 2 + +[connection signal="confirmed" from="." to="." method="_on_confirmed"] +[connection signal="visibility_changed" from="." to="." method="_on_visibility_changed"] diff --git a/src/UI/TopMenuContainer/TopMenuContainer.gd b/src/UI/TopMenuContainer/TopMenuContainer.gd index b95524f00..a83257d54 100644 --- a/src/UI/TopMenuContainer/TopMenuContainer.gd +++ b/src/UI/TopMenuContainer/TopMenuContainer.gd @@ -17,6 +17,7 @@ var zen_mode := false var new_image_dialog := Dialog.new("res://src/UI/Dialogs/CreateNewImage.tscn") var project_properties_dialog := Dialog.new("res://src/UI/Dialogs/ProjectProperties.tscn") var preferences_dialog := Dialog.new("res://src/Preferences/PreferencesDialog.tscn") +var modify_selection := Dialog.new("res://src/UI/Dialogs/ModifySelection.tscn") var offset_image_dialog := Dialog.new("res://src/UI/Dialogs/ImageEffects/OffsetImage.tscn") var scale_image_dialog := Dialog.new("res://src/UI/Dialogs/ImageEffects/ScaleImage.tscn") var resize_canvas_dialog := Dialog.new("res://src/UI/Dialogs/ImageEffects/ResizeCanvas.tscn") @@ -54,6 +55,7 @@ var about_dialog := Dialog.new("res://src/UI/Dialogs/AboutDialog.tscn") @onready var greyscale_vision: ColorRect = main_ui.find_child("GreyscaleVision") @onready var tile_mode_submenu := PopupMenu.new() +@onready var selection_modify_submenu := PopupMenu.new() @onready var snap_to_submenu := PopupMenu.new() @onready var panels_submenu := PopupMenu.new() @onready var layouts_submenu := PopupMenu.new() @@ -440,17 +442,29 @@ func _setup_select_menu() -> void: "All": "select_all", "Clear": "clear_selection", "Invert": "invert_selection", - "Tile Mode": "" + "Tile Mode": "", + "Modify": "" } for i in select_menu_items.size(): var item: String = select_menu_items.keys()[i] if item == "Tile Mode": select_menu.add_check_item(item, i) + elif item == "Modify": + _setup_selection_modify_submenu(item) else: _set_menu_shortcut(select_menu_items[item], select_menu, i, item) select_menu.id_pressed.connect(select_menu_id_pressed) +func _setup_selection_modify_submenu(item: String) -> void: + selection_modify_submenu.set_name("selection_modify_submenu") + selection_modify_submenu.add_item("Expand") + selection_modify_submenu.add_item("Shrink") + selection_modify_submenu.id_pressed.connect(_selection_modify_submenu_id_pressed) + select_menu.add_child(selection_modify_submenu) + select_menu.add_submenu_item(item, selection_modify_submenu.get_name()) + + func _setup_help_menu() -> void: # Order as in Global.HelpMenu enum var help_menu_items := { @@ -667,6 +681,11 @@ func _tile_mode_submenu_id_pressed(id: Tiles.MODE) -> void: get_tree().current_scene.tile_mode_offsets_dialog.change_mask() +func _selection_modify_submenu_id_pressed(id: int) -> void: + modify_selection.popup() + modify_selection.node.type = id + + func _snap_to_submenu_id_pressed(id: int) -> void: if id == 0: Global.snap_to_rectangular_grid_boundary = !Global.snap_to_rectangular_grid_boundary From 0d6b140dea53940314eb3a8cdd78af2ea7ef2c59 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Fri, 15 Nov 2024 01:41:44 +0200 Subject: [PATCH 157/162] Add border selection, fix some missing translation strings --- Translations/Translations.pot | 37 +++++++++++++++++++ src/Classes/SelectionMap.gd | 22 ++++++++--- src/Shaders/Effects/OutlineInline.gdshader | 14 ++++--- src/UI/Dialogs/ImageEffects/OutlineDialog.gd | 2 +- .../Dialogs/ImageEffects/OutlineDialog.tscn | 5 +-- src/UI/Dialogs/ModifySelection.gd | 10 +++-- src/UI/TopMenuContainer/TopMenuContainer.gd | 1 + 7 files changed, 74 insertions(+), 17 deletions(-) diff --git a/Translations/Translations.pot b/Translations/Translations.pot index 5b0821833..0745815f1 100644 --- a/Translations/Translations.pot +++ b/Translations/Translations.pot @@ -205,6 +205,43 @@ msgstr "" msgid "Invert" msgstr "" +msgid "Modify" +msgstr "" + +#. Found under the Select menu, in the Modify submenu. When selected, it shows a window that lets users expand the active selection. +msgid "Expand" +msgstr "" + +#. Title of a window that lets users expand the active selection. +msgid "Expand Selection" +msgstr "" + +#. Found under the Select menu, in the Modify submenu. When selected, it shows a window that lets users shrink the active selection. +msgid "Shrink" +msgstr "" + +#. Title of a window that lets users shrink the active selection. +msgid "Shrink Selection" +msgstr "" + +#. Found under the Select menu, in the Modify submenu. When selected, it shows a window that lets users create a border of the active selection. +msgid "Border" +msgstr "" + +#. Title of a window that lets users create a border of the active selection. +msgid "Border Selection" +msgstr "" + +#. Refers to a diamond-like shape. +msgid "Diamond" +msgstr "" + +msgid "Circle" +msgstr "" + +msgid "Square" +msgstr "" + msgid "Grayscale View" msgstr "" diff --git a/src/Classes/SelectionMap.gd b/src/Classes/SelectionMap.gd index cfb9591ee..abdc3329c 100644 --- a/src/Classes/SelectionMap.gd +++ b/src/Classes/SelectionMap.gd @@ -185,22 +185,34 @@ func resize_bitmap_values( blit_rect(smaller_image, Rect2i(Vector2i.ZERO, new_bitmap_size), dst) -func expand(width: int, pattern: int) -> void: +func expand(width: int, brush: int) -> void: var params := { "color": Color(1, 1, 1, 1), "width": width, - "pattern": pattern, + "brush": brush, } var gen := ShaderImageEffect.new() gen.generate_image(self, OUTLINE_INLINE_SHADER, params, get_size()) -func shrink(width: int, pattern: int) -> void: +func shrink(width: int, brush: int) -> void: var params := { "color": Color(0), - "inside": true, "width": width, - "pattern": pattern, + "brush": brush, + "inside": true, + } + var gen := ShaderImageEffect.new() + gen.generate_image(self, OUTLINE_INLINE_SHADER, params, get_size()) + + +func border(width: int, brush: int) -> void: + var params := { + "color": Color(1, 1, 1, 1), + "width": width, + "brush": brush, + "inside": true, + "keep_border_only": true, } var gen := ShaderImageEffect.new() gen.generate_image(self, OUTLINE_INLINE_SHADER, params, get_size()) diff --git a/src/Shaders/Effects/OutlineInline.gdshader b/src/Shaders/Effects/OutlineInline.gdshader index 88325aa77..66a4f52c8 100644 --- a/src/Shaders/Effects/OutlineInline.gdshader +++ b/src/Shaders/Effects/OutlineInline.gdshader @@ -4,9 +4,10 @@ render_mode unshaded; uniform vec4 color : source_color = vec4(1.0); uniform float width : hint_range(0, 10, 1) = 1.0; -// uniform_data pattern type:: OptionButton [Diamond||Circle||Square] -uniform int pattern : hint_range(0, 2) = 0; +// uniform_data brush type:: OptionButton [Diamond||Circle||Square] +uniform int brush : hint_range(0, 2) = 0; uniform bool inside = false; +uniform bool keep_border_only = false; uniform sampler2D selection : filter_nearest; bool is_zero_approx(float num) { @@ -17,11 +18,11 @@ bool has_contrary_neighbour(vec2 uv, vec2 texture_pixel_size, sampler2D tex) { for (float i = -ceil(width); i <= ceil(width); i++) { float offset; - if (pattern == 0) { + if (brush == 0) { offset = width - abs(i); - } else if (pattern == 1) { + } else if (brush == 1) { offset = floor(sqrt(pow(width + 0.5, 2) - i * i)); - } else if (pattern == 2) { + } else if (brush == 2) { offset = width; } @@ -51,6 +52,9 @@ void fragment() { output.a += (1.0 - output.a) * color.a; } } + else if (keep_border_only) { + output.a = 0.0; + } COLOR = mix(original_color, output, selection_color.a); } diff --git a/src/UI/Dialogs/ImageEffects/OutlineDialog.gd b/src/UI/Dialogs/ImageEffects/OutlineDialog.gd index 8543ee4e2..f3b99c5c8 100644 --- a/src/UI/Dialogs/ImageEffects/OutlineDialog.gd +++ b/src/UI/Dialogs/ImageEffects/OutlineDialog.gd @@ -31,7 +31,7 @@ func commit_action(cel: Image, project := Global.current_project) -> void: var params := { "color": color, "width": anim_thickness, - "pattern": pattern, + "brush": pattern, "inside": inside_image, "selection": selection_tex } diff --git a/src/UI/Dialogs/ImageEffects/OutlineDialog.tscn b/src/UI/Dialogs/ImageEffects/OutlineDialog.tscn index 844a82515..7f9e1699d 100644 --- a/src/UI/Dialogs/ImageEffects/OutlineDialog.tscn +++ b/src/UI/Dialogs/ImageEffects/OutlineDialog.tscn @@ -51,16 +51,15 @@ size_flags_horizontal = 3 [node name="PatternLabel" type="Label" parent="VBoxContainer/OutlineOptions" index="4"] layout_mode = 2 size_flags_horizontal = 3 -text = "Pattern:" +text = "Brush:" [node name="PatternOptionButton" type="OptionButton" parent="VBoxContainer/OutlineOptions" index="5"] layout_mode = 2 size_flags_horizontal = 3 mouse_default_cursor_shape = 2 -item_count = 3 selected = 0 +item_count = 3 popup/item_0/text = "Diamond" -popup/item_0/id = 0 popup/item_1/text = "Circle" popup/item_1/id = 1 popup/item_2/text = "Square" diff --git a/src/UI/Dialogs/ModifySelection.gd b/src/UI/Dialogs/ModifySelection.gd index d0195d083..a4f656fe8 100644 --- a/src/UI/Dialogs/ModifySelection.gd +++ b/src/UI/Dialogs/ModifySelection.gd @@ -1,14 +1,16 @@ extends ConfirmationDialog -enum Types { EXPAND, SHRINK } +enum Types { EXPAND, SHRINK, BORDER } @export var type := Types.EXPAND: set(value): type = value if type == Types.EXPAND: title = "Expand Selection" - else: + elif type == Types.SHRINK: title = "Shrink Selection" + else: + title = "Border Selection" @onready var width_slider: ValueSlider = $GridContainer/WidthSlider @onready var brush_option_button: OptionButton = $GridContainer/BrushOptionButton @@ -31,8 +33,10 @@ func _on_confirmed() -> void: project.selection_map.crop(project.size.x, project.size.y) if type == Types.EXPAND: project.selection_map.expand(width, brush) - else: + elif type == Types.SHRINK: project.selection_map.shrink(width, brush) + else: + project.selection_map.border(width, brush) selection_node.big_bounding_rectangle = project.selection_map.get_used_rect() project.selection_offset = Vector2.ZERO selection_node.commit_undo("Modify Selection", undo_data_tmp) diff --git a/src/UI/TopMenuContainer/TopMenuContainer.gd b/src/UI/TopMenuContainer/TopMenuContainer.gd index a83257d54..43456a878 100644 --- a/src/UI/TopMenuContainer/TopMenuContainer.gd +++ b/src/UI/TopMenuContainer/TopMenuContainer.gd @@ -460,6 +460,7 @@ func _setup_selection_modify_submenu(item: String) -> void: selection_modify_submenu.set_name("selection_modify_submenu") selection_modify_submenu.add_item("Expand") selection_modify_submenu.add_item("Shrink") + selection_modify_submenu.add_item("Border") selection_modify_submenu.id_pressed.connect(_selection_modify_submenu_id_pressed) select_menu.add_child(selection_modify_submenu) select_menu.add_submenu_item(item, selection_modify_submenu.get_name()) From 8077262b329f686b765bf33bb8dd975f0586166f Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Fri, 15 Nov 2024 02:04:59 +0200 Subject: [PATCH 158/162] [skip ci] Update CHANGELOG.md --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f36285e48..638a0c380 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ Fayez Akhtar ([@Variable-ind](https://github.com/Variable-ind)) Built using Godot 4.3 ### Added +- Add density to the square & circle brushes. 100% density means that the brush gets completely drawn. Anything less leaves gaps inside the brush, acting like a spray tool. +- Selection expanding, shrinking and borders have been added as options in the Select menu. - Mouse buttons can now be used as menu shortcuts. [#1070](https://github.com/Orama-Interactive/Pixelorama/issues/1070) - Added confirm and cancel buttons in the selection tool options to confirm/cancel an active transformation. - OKHSL Lightness sorting in palettes has been implemented. [#1126](https://github.com/Orama-Interactive/Pixelorama/pull/1126) @@ -20,9 +22,14 @@ Built using Godot 4.3 - The Recorder panel now automatically records for the current project. This also allows for multiple projects to be recorded at the same time. ### Fixed +- Panels no longer get scrolled when using the mouse wheel over a slider. - Fixed layer effect slider values being rounded to the nearest integer. - Fixed memory leak where the project remained referenced by a drawing tool, even when its tab was closed. - Fixed memory leak where the first project remained forever references in memory by the Recorder panel. +- Slightly optimize circle brushes by only calling the ellipse algorithms once while drawing + +### Removed +- The Recorder panel has been removed from the Web version. It wasn't functional anyway in a way that was useful, and it's unsure if we can find a way to make it work. ## [v1.0.4] - 2024-10-25 This update has been brought to you by the contributions of: From 94735fc08be73db3deb16aa022f06e263c7386ad Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Fri, 15 Nov 2024 02:08:30 +0200 Subject: [PATCH 159/162] [skip ci] Update Translations.pot --- Translations/Translations.pot | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Translations/Translations.pot b/Translations/Translations.pot index 0745815f1..e5b4b81ee 100644 --- a/Translations/Translations.pot +++ b/Translations/Translations.pot @@ -2849,6 +2849,10 @@ msgstr "" msgid "Sort by value" msgstr "" +#. 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 OKHSL Lightness. +msgid "Sort by lightness" +msgstr "" + #. 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 "" From e10b0d1b086a1824578aac0a315c684fe0c2bc81 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Fri, 15 Nov 2024 17:59:25 +0200 Subject: [PATCH 160/162] Fix crash when opening the tile mode offsets dialog --- src/UI/Canvas/TileMode.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/UI/Canvas/TileMode.gd b/src/UI/Canvas/TileMode.gd index 641fde9b6..cca70fa61 100644 --- a/src/UI/Canvas/TileMode.gd +++ b/src/UI/Canvas/TileMode.gd @@ -3,7 +3,7 @@ extends Node2D var tiles: Tiles var draw_center := false -@onready var canvas := get_parent() as Canvas +@onready var canvas := Global.canvas func _draw() -> void: From 763783f2f1a93af724f9a7a8783413d95c4fb2a1 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Fri, 15 Nov 2024 17:59:57 +0200 Subject: [PATCH 161/162] Improve the UI of the tile mode offsets dialog and add an Isometric button --- Translations/Translations.pot | 15 ++-- src/UI/Dialogs/TileModeOffsetsDialog.gd | 77 +++++++--------- src/UI/Dialogs/TileModeOffsetsDialog.tscn | 103 ++++++++++------------ 3 files changed, 83 insertions(+), 112 deletions(-) diff --git a/Translations/Translations.pot b/Translations/Translations.pot index e5b4b81ee..af06e12f9 100644 --- a/Translations/Translations.pot +++ b/Translations/Translations.pot @@ -267,19 +267,16 @@ msgstr "" msgid "Tile Mode Offsets" msgstr "" -msgid "X-basis x:" +#. Found under "Tile Mode Offsets". Basis is a linear algebra term. https://en.wikipedia.org/wiki/Basis_(linear_algebra) +msgid "X-basis:" msgstr "" -msgid "X-basis y:" +#. Found under "Tile Mode Offsets". Basis is a linear algebra term. https://en.wikipedia.org/wiki/Basis_(linear_algebra) +msgid "Y-basis:" msgstr "" -msgid "Y-basis x:" -msgstr "" - -msgid "Y-basis y:" -msgstr "" - -msgid "Tile Mask" +#. Found under "Tile Mode Offsets". It's a button that when pressed, enables masking for tile mode. Masking essentially limits drawing to the visible pixels of the image, thus preventing from drawing on transparent pixels. +msgid "Masking:" msgstr "" msgid "Reset" diff --git a/src/UI/Dialogs/TileModeOffsetsDialog.gd b/src/UI/Dialogs/TileModeOffsetsDialog.gd index 0d993e6d7..10acabc62 100644 --- a/src/UI/Dialogs/TileModeOffsetsDialog.gd +++ b/src/UI/Dialogs/TileModeOffsetsDialog.gd @@ -1,11 +1,12 @@ extends ConfirmationDialog -@onready var x_basis_x_spinbox: SpinBox = $VBoxContainer/HBoxContainer/OptionsContainer/XBasisX -@onready var x_basis_y_spinbox: SpinBox = $VBoxContainer/HBoxContainer/OptionsContainer/XBasisY -@onready var y_basis_x_spinbox: SpinBox = $VBoxContainer/HBoxContainer/OptionsContainer/YBasisX -@onready var y_basis_y_spinbox: SpinBox = $VBoxContainer/HBoxContainer/OptionsContainer/YBasisY +@onready var x_basis_label: Label = $VBoxContainer/OptionsContainer/XBasisLabel +@onready var x_basis: ValueSliderV2 = $VBoxContainer/OptionsContainer/XBasis +@onready var y_basis_label: Label = $VBoxContainer/OptionsContainer/YBasisLabel +@onready var y_basis: ValueSliderV2 = $VBoxContainer/OptionsContainer/YBasis @onready var preview_rect: Control = $VBoxContainer/AspectRatioContainer/Preview @onready var tile_mode: Node2D = $VBoxContainer/AspectRatioContainer/Preview/TileMode +@onready var masking: CheckButton = $VBoxContainer/OptionsContainer/Masking func _ready() -> void: @@ -37,35 +38,25 @@ func _on_TileModeOffsetsDialog_about_to_show() -> void: tile_mode.tiles.mode = Global.current_project.tiles.mode tile_mode.tiles.x_basis = Global.current_project.tiles.x_basis tile_mode.tiles.y_basis = Global.current_project.tiles.y_basis - x_basis_x_spinbox.value = tile_mode.tiles.x_basis.x - x_basis_y_spinbox.value = tile_mode.tiles.x_basis.y - y_basis_x_spinbox.value = tile_mode.tiles.y_basis.x - y_basis_y_spinbox.value = tile_mode.tiles.y_basis.y + x_basis.value = tile_mode.tiles.x_basis + y_basis.value = tile_mode.tiles.y_basis _show_options() if Global.current_project.tiles.mode == Tiles.MODE.X_AXIS: - y_basis_x_spinbox.visible = false - y_basis_y_spinbox.visible = false - $VBoxContainer/HBoxContainer/OptionsContainer/YBasisXLabel.visible = false - $VBoxContainer/HBoxContainer/OptionsContainer/YBasisYLabel.visible = false + y_basis.visible = false + y_basis_label.visible = false elif Global.current_project.tiles.mode == Tiles.MODE.Y_AXIS: - x_basis_x_spinbox.visible = false - x_basis_y_spinbox.visible = false - $VBoxContainer/HBoxContainer/OptionsContainer/XBasisXLabel.visible = false - $VBoxContainer/HBoxContainer/OptionsContainer/XBasisYLabel.visible = false + x_basis.visible = false + x_basis_label.visible = false update_preview() func _show_options() -> void: - x_basis_x_spinbox.visible = true - x_basis_y_spinbox.visible = true - y_basis_x_spinbox.visible = true - y_basis_y_spinbox.visible = true - $VBoxContainer/HBoxContainer/OptionsContainer/YBasisXLabel.visible = true - $VBoxContainer/HBoxContainer/OptionsContainer/YBasisYLabel.visible = true - $VBoxContainer/HBoxContainer/OptionsContainer/XBasisXLabel.visible = true - $VBoxContainer/HBoxContainer/OptionsContainer/XBasisYLabel.visible = true + x_basis.visible = true + y_basis.visible = true + x_basis_label.visible = true + y_basis_label.visible = true func _on_TileModeOffsetsDialog_confirmed() -> void: @@ -75,23 +66,13 @@ func _on_TileModeOffsetsDialog_confirmed() -> void: Global.transparent_checker.update_rect() -func _on_XBasisX_value_changed(value: int) -> void: - tile_mode.tiles.x_basis.x = value +func _on_x_basis_value_changed(value: Vector2) -> void: + tile_mode.tiles.x_basis = value update_preview() -func _on_XBasisY_value_changed(value: int) -> void: - tile_mode.tiles.x_basis.y = value - update_preview() - - -func _on_YBasisX_value_changed(value: int) -> void: - tile_mode.tiles.y_basis.x = value - update_preview() - - -func _on_YBasisY_value_changed(value: int) -> void: - tile_mode.tiles.y_basis.y = value +func _on_y_basis_value_changed(value: Vector2) -> void: + tile_mode.tiles.y_basis = value update_preview() @@ -122,10 +103,17 @@ func _on_TileModeOffsetsDialog_size_changed() -> void: func _on_Reset_pressed() -> void: tile_mode.tiles.x_basis = Vector2i(Global.current_project.size.x, 0) tile_mode.tiles.y_basis = Vector2i(0, Global.current_project.size.y) - x_basis_x_spinbox.value = Global.current_project.size.x - x_basis_y_spinbox.value = 0 - y_basis_x_spinbox.value = 0 - y_basis_y_spinbox.value = Global.current_project.size.y + x_basis.value = tile_mode.tiles.x_basis + y_basis.value = tile_mode.tiles.y_basis + update_preview() + + +func _on_isometric_pressed() -> void: + tile_mode.tiles.x_basis = Global.current_project.size / 2 + tile_mode.tiles.x_basis.y *= -1 + tile_mode.tiles.y_basis = Global.current_project.size / 2 + x_basis.value = tile_mode.tiles.x_basis + y_basis.value = tile_mode.tiles.y_basis update_preview() @@ -138,10 +126,7 @@ func change_mask() -> void: var tiles_size := tiles.tile_size var image := Image.create(tiles_size.x, tiles_size.y, false, Image.FORMAT_RGBA8) DrawingAlgos.blend_layers(image, current_frame) - if ( - image.get_used_rect().size == Vector2i.ZERO - or not $VBoxContainer/HBoxContainer/Masking.button_pressed - ): + if image.get_used_rect().size == Vector2i.ZERO or not masking.button_pressed: tiles.reset_mask() else: load_mask(image) diff --git a/src/UI/Dialogs/TileModeOffsetsDialog.tscn b/src/UI/Dialogs/TileModeOffsetsDialog.tscn index fe5896422..a995621bb 100644 --- a/src/UI/Dialogs/TileModeOffsetsDialog.tscn +++ b/src/UI/Dialogs/TileModeOffsetsDialog.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=5 format=3 uid="uid://c0nuukjakmai2"] +[gd_scene load_steps=6 format=3 uid="uid://c0nuukjakmai2"] [ext_resource type="PackedScene" uid="uid://3pmb60gpst7b" path="res://src/UI/Nodes/TransparentChecker.tscn" id="1"] [ext_resource type="Script" path="res://src/UI/Canvas/TileMode.gd" id="2"] +[ext_resource type="PackedScene" path="res://src/UI/Nodes/ValueSliderV2.tscn" id="2_ul2eq"] [ext_resource type="Script" path="res://src/UI/Dialogs/TileModeOffsetsDialog.gd" id="3"] [sub_resource type="CanvasItemMaterial" id="1"] @@ -10,83 +11,72 @@ blend_mode = 4 [node name="TileModeOffsetsDialog" type="ConfirmationDialog"] canvas_item_default_texture_filter = 0 title = "Tile Mode Offsets" +position = Vector2i(0, 36) +size = Vector2i(298, 536) script = ExtResource("3") [node name="VBoxContainer" type="VBoxContainer" parent="."] offset_left = 8.0 offset_top = 8.0 -offset_right = 293.0 -offset_bottom = 386.0 +offset_right = 290.0 +offset_bottom = 487.0 [node name="TileModeOffsets" type="Label" parent="VBoxContainer"] layout_mode = 2 text = "Tile Mode Offsets" -[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer"] -layout_mode = 2 - -[node name="OptionsContainer" type="GridContainer" parent="VBoxContainer/HBoxContainer"] +[node name="OptionsContainer" type="GridContainer" parent="VBoxContainer"] layout_mode = 2 theme_override_constants/h_separation = 2 theme_override_constants/v_separation = 4 columns = 2 -[node name="XBasisXLabel" type="Label" parent="VBoxContainer/HBoxContainer/OptionsContainer"] +[node name="XBasisLabel" type="Label" parent="VBoxContainer/OptionsContainer"] layout_mode = 2 -text = "X-basis x:" +size_flags_horizontal = 3 +text = "X-basis:" -[node name="XBasisX" type="SpinBox" parent="VBoxContainer/HBoxContainer/OptionsContainer"] +[node name="XBasis" parent="VBoxContainer/OptionsContainer" instance=ExtResource("2_ul2eq")] layout_mode = 2 -mouse_default_cursor_shape = 2 -min_value = -16384.0 -max_value = 16384.0 -suffix = "px" +size_flags_horizontal = 3 +allow_greater = true +allow_lesser = true +suffix_x = "px" +suffix_y = "px" -[node name="XBasisYLabel" type="Label" parent="VBoxContainer/HBoxContainer/OptionsContainer"] +[node name="YBasisLabel" type="Label" parent="VBoxContainer/OptionsContainer"] layout_mode = 2 -text = "X-basis y:" +size_flags_horizontal = 3 +text = "Y-basis:" -[node name="XBasisY" type="SpinBox" parent="VBoxContainer/HBoxContainer/OptionsContainer"] +[node name="YBasis" parent="VBoxContainer/OptionsContainer" instance=ExtResource("2_ul2eq")] layout_mode = 2 -mouse_default_cursor_shape = 2 -min_value = -16384.0 -max_value = 16384.0 -suffix = "px" +size_flags_horizontal = 3 +allow_greater = true +allow_lesser = true +suffix_x = "px" +suffix_y = "px" -[node name="YBasisXLabel" type="Label" parent="VBoxContainer/HBoxContainer/OptionsContainer"] +[node name="MaskingLabel" type="Label" parent="VBoxContainer/OptionsContainer"] layout_mode = 2 -text = "Y-basis x:" +text = "Masking:" -[node name="YBasisX" type="SpinBox" parent="VBoxContainer/HBoxContainer/OptionsContainer"] -layout_mode = 2 -mouse_default_cursor_shape = 2 -min_value = -16384.0 -max_value = 16384.0 -suffix = "px" - -[node name="YBasisYLabel" type="Label" parent="VBoxContainer/HBoxContainer/OptionsContainer"] -layout_mode = 2 -text = "Y-basis y:" - -[node name="YBasisY" type="SpinBox" parent="VBoxContainer/HBoxContainer/OptionsContainer"] -layout_mode = 2 -mouse_default_cursor_shape = 2 -min_value = -16384.0 -max_value = 16384.0 -suffix = "px" - -[node name="Reset" type="Button" parent="VBoxContainer/HBoxContainer/OptionsContainer"] -layout_mode = 2 -mouse_default_cursor_shape = 2 -text = "Reset" - -[node name="VSeparator" type="VSeparator" parent="VBoxContainer/HBoxContainer"] -layout_mode = 2 - -[node name="Masking" type="CheckButton" parent="VBoxContainer/HBoxContainer"] +[node name="Masking" type="CheckButton" parent="VBoxContainer/OptionsContainer"] layout_mode = 2 +size_flags_horizontal = 3 size_flags_vertical = 0 -text = "Masking" + +[node name="Reset" type="Button" parent="VBoxContainer/OptionsContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +mouse_default_cursor_shape = 2 +text = "Default" + +[node name="Isometric" type="Button" parent="VBoxContainer/OptionsContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +mouse_default_cursor_shape = 2 +text = "Isometric" [node name="AspectRatioContainer" type="AspectRatioContainer" parent="VBoxContainer"] layout_mode = 2 @@ -111,9 +101,8 @@ anchor_bottom = 1.0 [connection signal="confirmed" from="." to="." method="_on_TileModeOffsetsDialog_confirmed"] [connection signal="size_changed" from="." to="." method="_on_TileModeOffsetsDialog_size_changed"] [connection signal="visibility_changed" from="." to="." method="_on_TileModeOffsetsDialog_visibility_changed"] -[connection signal="value_changed" from="VBoxContainer/HBoxContainer/OptionsContainer/XBasisX" to="." method="_on_XBasisX_value_changed"] -[connection signal="value_changed" from="VBoxContainer/HBoxContainer/OptionsContainer/XBasisY" to="." method="_on_XBasisY_value_changed"] -[connection signal="value_changed" from="VBoxContainer/HBoxContainer/OptionsContainer/YBasisX" to="." method="_on_YBasisX_value_changed"] -[connection signal="value_changed" from="VBoxContainer/HBoxContainer/OptionsContainer/YBasisY" to="." method="_on_YBasisY_value_changed"] -[connection signal="pressed" from="VBoxContainer/HBoxContainer/OptionsContainer/Reset" to="." method="_on_Reset_pressed"] -[connection signal="toggled" from="VBoxContainer/HBoxContainer/Masking" to="." method="_on_Masking_toggled"] +[connection signal="value_changed" from="VBoxContainer/OptionsContainer/XBasis" to="." method="_on_x_basis_value_changed"] +[connection signal="value_changed" from="VBoxContainer/OptionsContainer/YBasis" to="." method="_on_y_basis_value_changed"] +[connection signal="toggled" from="VBoxContainer/OptionsContainer/Masking" to="." method="_on_Masking_toggled"] +[connection signal="pressed" from="VBoxContainer/OptionsContainer/Reset" to="." method="_on_Reset_pressed"] +[connection signal="pressed" from="VBoxContainer/OptionsContainer/Isometric" to="." method="_on_isometric_pressed"] From f4fd2c8eb3d450d299c6f5a022ab8d75724c0090 Mon Sep 17 00:00:00 2001 From: Emmanouil Papadeas <35376950+OverloadedOrama@users.noreply.github.com> Date: Sat, 16 Nov 2024 21:27:29 +0200 Subject: [PATCH 162/162] [skip ci] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 638a0c380..959aade0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,9 +19,11 @@ Built using Godot 4.3 ### Changed - The brush size no longer changes by Control + Mouse Wheel when resizing the timeline cels or the palette swatches. +- Improved the UI of the Tile Mode Offsets dialog and added an "Isometric" preset button. - The Recorder panel now automatically records for the current project. This also allows for multiple projects to be recorded at the same time. ### Fixed +- Opening the Tile Mode Offsets dialog no longer crashes the application. - Panels no longer get scrolled when using the mouse wheel over a slider. - Fixed layer effect slider values being rounded to the nearest integer. - Fixed memory leak where the project remained referenced by a drawing tool, even when its tab was closed.