1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-01-18 17:19:50 +00:00

Implements palette sorting

This commit is contained in:
Emmanouil Papadeas 2023-12-23 19:00:24 +02:00
parent 9bf8eb13c4
commit 06b405dae8
7 changed files with 162 additions and 1 deletions

View file

@ -2397,6 +2397,42 @@ msgstr ""
msgid "Remove a selected color" msgid "Remove a selected color"
msgstr "" msgstr ""
#. Tooltip of the Sort button found in the palette panel.
msgid "Sort palette"
msgstr ""
#. 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 ""
#. 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 ""
#. 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 ""
#. 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 ""
#. 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 ""
#. 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 ""
#. 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 ""
#. 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 ""
msgid "Palette with the same name and path already exists!" msgid "Palette with the same name and path already exists!"
msgstr "" msgstr ""

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 B

View file

@ -0,0 +1,34 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://db4i3w3yencxg"
path="res://.godot/imported/sort.png-d80e96b77a5aad6d1848c4243782da48.ctex"
metadata={
"vram_texture": false
}
[deps]
source_file="res://assets/graphics/palette/sort.png"
dest_files=["res://.godot/imported/sort.png-d80e96b77a5aad6d1848c4243782da48.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

View file

@ -3,6 +3,7 @@ extends Node
signal palette_selected(palette_name: String) signal palette_selected(palette_name: String)
signal new_palette_imported signal new_palette_imported
enum SortOptions { REVERSE, HUE, SATURATION, VALUE, RED, GREEN, BLUE, ALPHA }
## Presets for creating a new palette ## Presets for creating a new palette
enum NewPalettePresetType { enum NewPalettePresetType {
EMPTY = 0, FROM_CURRENT_PALETTE = 1, FROM_CURRENT_SPRITE = 2, FROM_CURRENT_SELECTION = 3 EMPTY = 0, FROM_CURRENT_PALETTE = 1, FROM_CURRENT_SPRITE = 2, FROM_CURRENT_SELECTION = 3
@ -240,6 +241,14 @@ func current_palette_delete_color(index: int) -> void:
_save_palette() _save_palette()
func current_palette_sort_colors(id: SortOptions) -> void:
if id == SortOptions.REVERSE:
current_palette.reverse_colors()
else:
current_palette.sort(id)
_save_palette()
func current_palette_swap_colors(source_index: int, target_index: int) -> void: func current_palette_swap_colors(source_index: int, target_index: int) -> void:
current_palette.swap_colors(source_index, target_index) current_palette.swap_colors(source_index, target_index)
_select_color(MOUSE_BUTTON_LEFT, target_index) _select_color(MOUSE_BUTTON_LEFT, target_index)

View file

@ -247,6 +247,40 @@ func copy_colors(from_index: int, to_index: int) -> void:
colors[to_index].index = to_index colors[to_index].index = to_index
func reverse_colors() -> void:
var reversed_colors := colors.values()
reversed_colors.reverse()
colors.clear()
for i in reversed_colors.size():
reversed_colors[i].index = i
colors[i] = reversed_colors[i]
func sort(option: Palettes.SortOptions) -> void:
var sorted_colors := colors.values()
var sort_method: Callable
match option:
Palettes.SortOptions.HUE:
sort_method = func(a: PaletteColor, b: PaletteColor): return a.color.h < b.color.h
Palettes.SortOptions.SATURATION:
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.RED:
sort_method = func(a: PaletteColor, b: PaletteColor): return a.color.r < b.color.r
Palettes.SortOptions.GREEN:
sort_method = func(a: PaletteColor, b: PaletteColor): return a.color.g < b.color.g
Palettes.SortOptions.BLUE:
sort_method = func(a: PaletteColor, b: PaletteColor): return a.color.b < b.color.b
Palettes.SortOptions.ALPHA:
sort_method = func(a: PaletteColor, b: PaletteColor): return a.color.a < b.color.a
sorted_colors.sort_custom(sort_method)
colors.clear()
for i in sorted_colors.size():
sorted_colors[i].index = i
colors[i] = sorted_colors[i]
## True if all swatches are occupied ## True if all swatches are occupied
func is_full() -> bool: func is_full() -> bool:
return colors.size() >= colors_max return colors.size() >= colors_max

View file

@ -13,6 +13,7 @@ var edited_swatch_color := Color.TRANSPARENT
@onready var add_color_button := $"%AddColor" @onready var add_color_button := $"%AddColor"
@onready var delete_color_button := $"%DeleteColor" @onready var delete_color_button := $"%DeleteColor"
@onready var sort_button := %Sort as MenuButton
@onready var edit_palette_dialog := $"%EditPaletteDialog" @onready var edit_palette_dialog := $"%EditPaletteDialog"
@onready var create_palette_dialog := $"%CreatePaletteDialog" @onready var create_palette_dialog := $"%CreatePaletteDialog"
@ -22,9 +23,20 @@ var edited_swatch_color := Color.TRANSPARENT
func _ready() -> void: func _ready() -> void:
sort_button.get_popup().add_item("Reverse colors", Palettes.SortOptions.REVERSE)
sort_button.get_popup().add_separator()
sort_button.get_popup().add_item("Sort by hue", Palettes.SortOptions.HUE)
sort_button.get_popup().add_item("Sort by saturation", Palettes.SortOptions.SATURATION)
sort_button.get_popup().add_item("Sort by value", Palettes.SortOptions.VALUE)
sort_button.get_popup().add_separator()
sort_button.get_popup().add_item("Sort by red", Palettes.SortOptions.RED)
sort_button.get_popup().add_item("Sort by green", Palettes.SortOptions.GREEN)
sort_button.get_popup().add_item("Sort by blue", Palettes.SortOptions.BLUE)
sort_button.get_popup().add_item("Sort by alpha", Palettes.SortOptions.ALPHA)
Palettes.palette_selected.connect(select_palette) Palettes.palette_selected.connect(select_palette)
Palettes.new_palette_imported.connect(setup_palettes_selector) Palettes.new_palette_imported.connect(setup_palettes_selector)
Tools.color_changed.connect(_color_changed) Tools.color_changed.connect(_color_changed)
sort_button.get_popup().id_pressed.connect(sort_pressed)
setup_palettes_selector() setup_palettes_selector()
redraw_current_palette() redraw_current_palette()
@ -73,9 +85,11 @@ func redraw_current_palette() -> void:
Palettes.select_palette(Palettes.current_palette.name) Palettes.select_palette(Palettes.current_palette.name)
add_color_button.show() add_color_button.show()
delete_color_button.show() delete_color_button.show()
sort_button.show()
else: else:
add_color_button.hide() add_color_button.hide()
delete_color_button.hide() delete_color_button.hide()
sort_button.hide()
func toggle_add_delete_buttons() -> void: func toggle_add_delete_buttons() -> void:
@ -85,10 +99,13 @@ func toggle_add_delete_buttons() -> void:
else: else:
add_color_button.mouse_default_cursor_shape = CURSOR_POINTING_HAND add_color_button.mouse_default_cursor_shape = CURSOR_POINTING_HAND
delete_color_button.disabled = Palettes.current_palette_is_empty() delete_color_button.disabled = Palettes.current_palette_is_empty()
sort_button.disabled = Palettes.current_palette_is_empty()
if delete_color_button.disabled: if delete_color_button.disabled:
delete_color_button.mouse_default_cursor_shape = CURSOR_FORBIDDEN delete_color_button.mouse_default_cursor_shape = CURSOR_FORBIDDEN
sort_button.mouse_default_cursor_shape = CURSOR_FORBIDDEN
else: else:
delete_color_button.mouse_default_cursor_shape = CURSOR_POINTING_HAND delete_color_button.mouse_default_cursor_shape = CURSOR_POINTING_HAND
sort_button.mouse_default_cursor_shape = CURSOR_POINTING_HAND
func _on_AddPalette_pressed() -> void: func _on_AddPalette_pressed() -> void:
@ -134,6 +151,11 @@ func _on_DeleteColor_gui_input(event: InputEvent) -> void:
toggle_add_delete_buttons() toggle_add_delete_buttons()
func sort_pressed(id: Palettes.SortOptions) -> void:
Palettes.current_palette_sort_colors(id)
redraw_current_palette()
func _on_CreatePaletteDialog_saved( func _on_CreatePaletteDialog_saved(
preset: int, preset: int,
palette_name: String, palette_name: String,

View file

@ -1,4 +1,4 @@
[gd_scene load_steps=14 format=3 uid="uid://wplk62pbgih4"] [gd_scene load_steps=15 format=3 uid="uid://wplk62pbgih4"]
[ext_resource type="PackedScene" uid="uid://c0p84w7umxwt1" path="res://src/Palette/EditPaletteDialog.tscn" id="1"] [ext_resource type="PackedScene" uid="uid://c0p84w7umxwt1" path="res://src/Palette/EditPaletteDialog.tscn" id="1"]
[ext_resource type="Texture2D" uid="uid://biyn51upnlxle" path="res://assets/graphics/palette/edit.png" id="2"] [ext_resource type="Texture2D" uid="uid://biyn51upnlxle" path="res://assets/graphics/palette/edit.png" id="2"]
@ -6,6 +6,7 @@
[ext_resource type="Texture2D" uid="uid://b7ydn1tt37rcl" path="res://assets/graphics/palette/add.png" id="3"] [ext_resource type="Texture2D" uid="uid://b7ydn1tt37rcl" path="res://assets/graphics/palette/add.png" id="3"]
[ext_resource type="Texture2D" uid="uid://bt72662c3gp2f" path="res://assets/graphics/timeline/remove_frame.png" id="3_0e27e"] [ext_resource type="Texture2D" uid="uid://bt72662c3gp2f" path="res://assets/graphics/timeline/remove_frame.png" id="3_0e27e"]
[ext_resource type="PackedScene" uid="uid://68aakj2l6ee1" path="res://src/Palette/CreatePaletteDialog.tscn" id="4"] [ext_resource type="PackedScene" uid="uid://68aakj2l6ee1" path="res://src/Palette/CreatePaletteDialog.tscn" id="4"]
[ext_resource type="Texture2D" uid="uid://db4i3w3yencxg" path="res://assets/graphics/palette/sort.png" id="4_hcsuy"]
[ext_resource type="Script" path="res://src/Palette/PaletteGrid.gd" id="5"] [ext_resource type="Script" path="res://src/Palette/PaletteGrid.gd" id="5"]
[ext_resource type="Script" path="res://src/Palette/PaletteScroll.gd" id="6"] [ext_resource type="Script" path="res://src/Palette/PaletteScroll.gd" id="6"]
[ext_resource type="Script" path="res://src/Palette/PalettePanel.gd" id="8"] [ext_resource type="Script" path="res://src/Palette/PalettePanel.gd" id="8"]
@ -81,6 +82,31 @@ size_flags_horizontal = 0
size_flags_vertical = 0 size_flags_vertical = 0
texture = ExtResource("3_0e27e") texture = ExtResource("3_0e27e")
[node name="Sort" type="MenuButton" parent="PaletteVBoxContainer/PaletteButtons"]
unique_name_in_owner = true
custom_minimum_size = Vector2(24, 0)
layout_mode = 2
tooltip_text = "Sort palette"
mouse_default_cursor_shape = 2
flat = false
[node name="TextureRect" type="TextureRect" parent="PaletteVBoxContainer/PaletteButtons/Sort"]
layout_mode = 1
anchors_preset = 8
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
grow_horizontal = 2
grow_vertical = 2
size_flags_horizontal = 0
size_flags_vertical = 0
texture = ExtResource("4_hcsuy")
[node name="PaletteSelect" type="OptionButton" parent="PaletteVBoxContainer/PaletteButtons"] [node name="PaletteSelect" type="OptionButton" parent="PaletteVBoxContainer/PaletteButtons"]
unique_name_in_owner = true unique_name_in_owner = true
custom_minimum_size = Vector2(100, 0) custom_minimum_size = Vector2(100, 0)