From e2d18d8cebd8e2315b2bf3eaae3ed06c57b3e58e Mon Sep 17 00:00:00 2001 From: CJMAXiK Date: Sun, 1 Sep 2024 01:38:06 +0300 Subject: [PATCH 1/4] [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 2/4] 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 3/4] 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 4/4] 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)]