1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-01-31 07:29:49 +00:00

Add reactivity to palette grid, improve scrolling and add swatch "zoom" (#761)

* Save changed color to palette file only when color dialog is closed

* Restructure palette panel to use unique names

* Make grid size reactive to palette panel size

* Add mouse wheel scroll support to palette grid

* Add palette swatch resizing

* Reorganize palette grid rendering

* Store swatch size in cache config

* Cleanup formatting
This commit is contained in:
Martin Novák 2022-10-04 12:47:31 +02:00 committed by GitHub
parent b299ab235c
commit 5842ce00c6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 226 additions and 160 deletions

View file

@ -6,69 +6,63 @@ signal swatch_double_clicked(mouse_button, index, position)
signal swatch_dropped(source_index, target_index) signal swatch_dropped(source_index, target_index)
const PaletteSwatchScene := preload("res://src/Palette/PaletteSwatch.tscn") const PaletteSwatchScene := preload("res://src/Palette/PaletteSwatch.tscn")
const DEFAULT_SWATCH_SIZE = Vector2(26, 26)
# Must be integer values const MIN_SWATCH_SIZE = Vector2(8, 8)
const MAX_GRID_SIZE = Vector2(8, 8) const MAX_SWATCH_SIZE = Vector2(64, 64)
var swatches := [] # PaletteSwatch var swatches := [] # PaletteSwatch
var current_palette = null
var displayed_palette = null
var grid_window_origin := Vector2.ZERO var grid_window_origin := Vector2.ZERO
var grid_size := Vector2(8, 8) var grid_size := Vector2.ZERO
var swatch_size := DEFAULT_SWATCH_SIZE
func _ready(): func _ready() -> void:
init_swatches() swatch_size = Global.config_cache.get_value("palettes", "swatch_size", DEFAULT_SWATCH_SIZE)
func init_swatches() -> void: func set_palette(new_palette: Palette) -> void:
columns = grid_size.x # Only display valid palette objects
for j in range(grid_size.y): if not new_palette:
for i in range(grid_size.x): return
var index: int = i + grid_size.x * j
current_palette = new_palette
grid_window_origin = Vector2.ZERO
func setup_swatches() -> void:
# Colums cannot be 0
columns = 1.0 if grid_size.x == 0.0 else grid_size.x
if grid_size.x * grid_size.y > swatches.size():
for i in range(swatches.size(), grid_size.x * grid_size.y):
var swatch: PaletteSwatch = PaletteSwatchScene.instance() var swatch: PaletteSwatch = PaletteSwatchScene.instance()
swatch.index = index swatch.index = i
swatch.color = PaletteSwatch.DEFAULT_COLOR init_swatch(swatch)
swatch.show_left_highlight = false swatch.connect("pressed", self, "_on_PaletteSwatch_pressed", [i])
swatch.show_right_highlight = false swatch.connect("double_clicked", self, "_on_PaletteSwatch_double_clicked", [i])
swatch.empty = true
swatch.connect("pressed", self, "_on_PaletteSwatch_pressed", [index])
swatch.connect("double_clicked", self, "_on_PaletteSwatch_double_clicked", [index])
swatch.connect("dropped", self, "_on_PaletteSwatch_dropped") swatch.connect("dropped", self, "_on_PaletteSwatch_dropped")
add_child(swatch) add_child(swatch)
swatches.push_back(swatch) swatches.push_back(swatch)
else:
var diff = swatches.size() - grid_size.x * grid_size.y
for _i in range(0, diff):
var swatch = swatches.pop_back()
remove_child(swatch)
swatch.queue_free()
for i in range(0, swatches.size()):
init_swatch(swatches[i])
# Origin determines a position in palette which will be displayed on top left of grid func init_swatch(swatch: PaletteSwatch) -> void:
func display_palette(palette: Palette) -> void: swatch.color = PaletteSwatch.DEFAULT_COLOR
# Reset grid origin when palette changes swatch.show_left_highlight = false
if displayed_palette != palette: swatch.show_right_highlight = false
displayed_palette = palette swatch.empty = true
grid_window_origin = Vector2.ZERO swatch.set_swatch_size(swatch_size)
# Only display valid palette objects
if not palette:
return
if swatches.size() == 0: func draw_palette() -> void:
init_swatches()
if palette.width < MAX_GRID_SIZE.x or palette.height < MAX_GRID_SIZE.y:
grid_size = Vector2(
min(palette.width, MAX_GRID_SIZE.x), min(palette.height, MAX_GRID_SIZE.y)
)
clear_swatches()
init_swatches()
elif (
palette.width >= MAX_GRID_SIZE.x
and palette.height >= MAX_GRID_SIZE.y
and grid_size != MAX_GRID_SIZE
):
grid_size = MAX_GRID_SIZE
clear_swatches()
init_swatches()
# Create empty palette buttons
for j in range(grid_size.y): for j in range(grid_size.y):
for i in range(grid_size.x): for i in range(grid_size.x):
var grid_index: int = i + grid_size.x * j var grid_index: int = i + grid_size.x * j
@ -76,7 +70,7 @@ func display_palette(palette: Palette) -> void:
var swatch = swatches[grid_index] var swatch = swatches[grid_index]
swatch.show_left_highlight = false swatch.show_left_highlight = false
swatch.show_right_highlight = false swatch.show_right_highlight = false
var color = palette.get_color(index) var color = current_palette.get_color(index)
if color != null: if color != null:
swatch.color = color swatch.color = color
swatch.empty = false swatch.empty = false
@ -87,15 +81,7 @@ func display_palette(palette: Palette) -> void:
func scroll_palette(origin: Vector2) -> void: func scroll_palette(origin: Vector2) -> void:
grid_window_origin = origin grid_window_origin = origin
display_palette(displayed_palette) draw_palette()
# Removes all swatches
func clear_swatches() -> void:
swatches.clear()
for swatch in get_children():
remove_child(swatch) # To remove the child immediately and not at the end of the frame
swatch.queue_free()
func find_and_select_color(mouse_button: int, target_color: Color) -> void: func find_and_select_color(mouse_button: int, target_color: Color) -> void:
@ -149,6 +135,42 @@ func reset_empty_swatches_color() -> void:
swatch.empty = true swatch.empty = true
# Grid index adds grid window origin
func convert_grid_index_to_palette_index(index: int) -> int:
return (
int(index / grid_size.x + grid_window_origin.y) * current_palette.width
+ (index % int(grid_size.x) + grid_window_origin.x)
)
func convert_palette_index_to_grid_index(palette_index: int) -> int:
var x: int = palette_index % current_palette.width
var y: int = palette_index / current_palette.width
return int((x - grid_window_origin.x) + (y - grid_window_origin.y) * grid_size.x)
func resize_grid(new_rect_size: Vector2) -> void:
var grid_x: int = new_rect_size.x / (swatch_size.x + get("custom_constants/hseparation"))
var grid_y: int = new_rect_size.y / (swatch_size.y + get("custom_constants/vseparation"))
grid_size.x = min(grid_x, current_palette.width)
grid_size.y = min(grid_y, current_palette.height)
setup_swatches()
draw_palette()
func change_swatch_size(size_diff: Vector2) -> void:
swatch_size += size_diff
if swatch_size.x < MIN_SWATCH_SIZE.x:
swatch_size = MIN_SWATCH_SIZE
elif swatch_size.x > MAX_SWATCH_SIZE.x:
swatch_size = MAX_SWATCH_SIZE
for swatch in swatches:
swatch.set_swatch_size(swatch_size)
Global.config_cache.set_value("palettes", "swatch_size", swatch_size)
func _on_PaletteSwatch_pressed(mouse_button: int, index: int) -> void: func _on_PaletteSwatch_pressed(mouse_button: int, index: int) -> void:
var palette_index = convert_grid_index_to_palette_index(index) var palette_index = convert_grid_index_to_palette_index(index)
emit_signal("swatch_pressed", mouse_button, palette_index) emit_signal("swatch_pressed", mouse_button, palette_index)
@ -163,17 +185,3 @@ func _on_PaletteSwatch_dropped(source_index: int, target_index: int) -> void:
var palette_source_index = convert_grid_index_to_palette_index(source_index) var palette_source_index = convert_grid_index_to_palette_index(source_index)
var palette_target_index = convert_grid_index_to_palette_index(target_index) var palette_target_index = convert_grid_index_to_palette_index(target_index)
emit_signal("swatch_dropped", palette_source_index, palette_target_index) emit_signal("swatch_dropped", palette_source_index, palette_target_index)
# Grid index adds grid window origin
func convert_grid_index_to_palette_index(index: int) -> int:
return (
int(index / grid_size.x + grid_window_origin.y) * displayed_palette.width
+ (index % int(grid_size.x) + grid_window_origin.x)
)
func convert_palette_index_to_grid_index(palette_index: int) -> int:
var x: int = palette_index % displayed_palette.width
var y: int = palette_index / displayed_palette.width
return int((x - grid_window_origin.x) + (y - grid_window_origin.y) * grid_size.x)

View file

@ -4,21 +4,21 @@ extends PanelContainer
var palettes_path_id := {} var palettes_path_id := {}
var palettes_id_path := {} var palettes_id_path := {}
var edited_swatch_index = -1 var edited_swatch_index := -1
var edited_swatch_color := Color.transparent
onready var palette_select := $PaletteVBoxContainer/PaletteButtons/PaletteSelect onready var palette_select := $"%PaletteSelect"
onready var add_palette_button := $PaletteVBoxContainer/PaletteButtons/AddPalette onready var palette_grid := $"%PaletteGrid"
onready var palette_grid := find_node("PaletteGrid") onready var palette_scroll := $"%PaletteScroll"
onready var palette_scroll := $PaletteVBoxContainer/SwatchesContainer/PaletteScroll
onready var add_color_button := $PaletteVBoxContainer/SwatchesContainer/ColorButtons/AddColor onready var add_color_button := $"%AddColor"
onready var delete_color_button := $PaletteVBoxContainer/SwatchesContainer/ColorButtons/DeleteColor onready var delete_color_button := $"%DeleteColor"
onready var edit_palette_dialog := $EditPaletteDialog onready var edit_palette_dialog := $"%EditPaletteDialog"
onready var create_palette_dialog := $CreatePaletteDialog onready var create_palette_dialog := $"%CreatePaletteDialog"
# Color picker button itself is hidden but it's popup is used to edit color swatches # Color picker button itself is hidden but it's popup is used to edit color swatches
onready var hidden_color_picker := $HiddenColorPickerButton onready var hidden_color_picker := $"%HiddenColorPickerButton"
func _ready() -> void: func _ready() -> void:
@ -54,7 +54,8 @@ func select_palette(palette_path: String) -> void:
if palette_id != null: if palette_id != null:
palette_select.selected = palette_id palette_select.selected = palette_id
Palettes.select_palette(palette_path) Palettes.select_palette(palette_path)
palette_grid.display_palette(Palettes.get_current_palette()) palette_grid.set_palette(Palettes.get_current_palette())
palette_scroll.resize_grid()
palette_scroll.set_sliders(Palettes.get_current_palette(), palette_grid.grid_window_origin) palette_scroll.set_sliders(Palettes.get_current_palette(), palette_grid.grid_window_origin)
var left_selected = Palettes.current_palette_get_selected_color_index(BUTTON_LEFT) var left_selected = Palettes.current_palette_get_selected_color_index(BUTTON_LEFT)
@ -188,7 +189,7 @@ func _on_PaletteGrid_swatch_pressed(mouse_button: int, index: int) -> void:
func _on_ColorPicker_color_changed(color: Color) -> void: func _on_ColorPicker_color_changed(color: Color) -> void:
if edited_swatch_index != -1: if edited_swatch_index != -1:
Palettes.current_palette_set_color(edited_swatch_index, color) edited_swatch_color = color
palette_grid.set_swatch_color(edited_swatch_index, color) palette_grid.set_swatch_color(edited_swatch_index, color)
if edited_swatch_index == Palettes.current_palette_get_selected_color_index(BUTTON_LEFT): if edited_swatch_index == Palettes.current_palette_get_selected_color_index(BUTTON_LEFT):
@ -197,6 +198,11 @@ func _on_ColorPicker_color_changed(color: Color) -> void:
Tools.assign_color(color, BUTTON_RIGHT) Tools.assign_color(color, BUTTON_RIGHT)
func _on_HiddenColorPickerButton_popup_closed():
# Saves edited swatch to palette file when color selection dialog is closed
Palettes.current_palette_set_color(edited_swatch_index, edited_swatch_color)
func _on_EditPaletteDialog_deleted() -> void: func _on_EditPaletteDialog_deleted() -> void:
Palettes.current_palete_delete() Palettes.current_palete_delete()
setup_palettes_selector() setup_palettes_selector()

View file

@ -9,26 +9,24 @@
[ext_resource path="res://src/Palette/PalettePanel.gd" type="Script" id=8] [ext_resource path="res://src/Palette/PalettePanel.gd" type="Script" id=8]
[node name="PalettePanel" type="PanelContainer"] [node name="PalettePanel" type="PanelContainer"]
margin_right = 318.0
margin_bottom = 118.0
rect_min_size = Vector2( 318, 0 )
size_flags_horizontal = 3 size_flags_horizontal = 3
size_flags_vertical = 0 size_flags_vertical = 3
script = ExtResource( 8 ) script = ExtResource( 8 )
[node name="PaletteVBoxContainer" type="VBoxContainer" parent="."] [node name="PaletteVBoxContainer" type="VBoxContainer" parent="."]
margin_left = 7.0 margin_left = 7.0
margin_top = 7.0 margin_top = 7.0
margin_right = 311.0 margin_right = 159.0
margin_bottom = 111.0 margin_bottom = 93.0
size_flags_horizontal = 3 size_flags_horizontal = 3
[node name="PaletteButtons" type="HBoxContainer" parent="PaletteVBoxContainer"] [node name="PaletteButtons" type="HBoxContainer" parent="PaletteVBoxContainer"]
margin_right = 304.0 margin_right = 152.0
margin_bottom = 22.0 margin_bottom = 22.0
[node name="PaletteSelect" type="OptionButton" parent="PaletteVBoxContainer/PaletteButtons"] [node name="PaletteSelect" type="OptionButton" parent="PaletteVBoxContainer/PaletteButtons"]
margin_right = 252.0 unique_name_in_owner = true
margin_right = 100.0
margin_bottom = 22.0 margin_bottom = 22.0
grow_horizontal = 0 grow_horizontal = 0
rect_min_size = Vector2( 100, 0 ) rect_min_size = Vector2( 100, 0 )
@ -38,8 +36,8 @@ size_flags_horizontal = 3
clip_text = true clip_text = true
[node name="EditPalette" type="Button" parent="PaletteVBoxContainer/PaletteButtons" groups=["UIButtons"]] [node name="EditPalette" type="Button" parent="PaletteVBoxContainer/PaletteButtons" groups=["UIButtons"]]
margin_left = 256.0 margin_left = 104.0
margin_right = 278.0 margin_right = 126.0
margin_bottom = 22.0 margin_bottom = 22.0
rect_min_size = Vector2( 22, 22 ) rect_min_size = Vector2( 22, 22 )
hint_tooltip = "Edit currently selected palette" hint_tooltip = "Edit currently selected palette"
@ -60,13 +58,10 @@ margin_bottom = 11.0
size_flags_horizontal = 0 size_flags_horizontal = 0
size_flags_vertical = 0 size_flags_vertical = 0
texture = ExtResource( 2 ) texture = ExtResource( 2 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="AddPalette" type="Button" parent="PaletteVBoxContainer/PaletteButtons" groups=["UIButtons"]] [node name="AddPalette" type="Button" parent="PaletteVBoxContainer/PaletteButtons" groups=["UIButtons"]]
margin_left = 282.0 margin_left = 130.0
margin_right = 304.0 margin_right = 152.0
margin_bottom = 22.0 margin_bottom = 22.0
rect_min_size = Vector2( 22, 22 ) rect_min_size = Vector2( 22, 22 )
hint_tooltip = "Create a new palette" hint_tooltip = "Create a new palette"
@ -87,26 +82,25 @@ margin_bottom = 11.0
size_flags_horizontal = 0 size_flags_horizontal = 0
size_flags_vertical = 0 size_flags_vertical = 0
texture = ExtResource( 3 ) texture = ExtResource( 3 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="HSeparator" type="HSeparator" parent="PaletteVBoxContainer"] [node name="HSeparator" type="HSeparator" parent="PaletteVBoxContainer"]
margin_top = 26.0 margin_top = 26.0
margin_right = 304.0 margin_right = 152.0
margin_bottom = 30.0 margin_bottom = 30.0
[node name="SwatchesContainer" type="HBoxContainer" parent="PaletteVBoxContainer"] [node name="SwatchesContainer" type="HBoxContainer" parent="PaletteVBoxContainer"]
margin_top = 34.0 margin_top = 34.0
margin_right = 304.0 margin_right = 152.0
margin_bottom = 86.0 margin_bottom = 86.0
size_flags_horizontal = 3 size_flags_horizontal = 3
size_flags_vertical = 3
[node name="ColorButtons" type="VBoxContainer" parent="PaletteVBoxContainer/SwatchesContainer"] [node name="ColorButtons" type="VBoxContainer" parent="PaletteVBoxContainer/SwatchesContainer"]
margin_right = 24.0 margin_right = 24.0
margin_bottom = 52.0 margin_bottom = 52.0
[node name="AddColor" type="Button" parent="PaletteVBoxContainer/SwatchesContainer/ColorButtons"] [node name="AddColor" type="Button" parent="PaletteVBoxContainer/SwatchesContainer/ColorButtons"]
unique_name_in_owner = true
margin_right = 24.0 margin_right = 24.0
margin_bottom = 24.0 margin_bottom = 24.0
rect_min_size = Vector2( 24, 24 ) rect_min_size = Vector2( 24, 24 )
@ -115,6 +109,7 @@ mouse_default_cursor_shape = 2
text = "+" text = "+"
[node name="DeleteColor" type="Button" parent="PaletteVBoxContainer/SwatchesContainer/ColorButtons"] [node name="DeleteColor" type="Button" parent="PaletteVBoxContainer/SwatchesContainer/ColorButtons"]
unique_name_in_owner = true
margin_top = 28.0 margin_top = 28.0
margin_right = 24.0 margin_right = 24.0
margin_bottom = 52.0 margin_bottom = 52.0
@ -124,54 +119,72 @@ mouse_default_cursor_shape = 2
text = "-" text = "-"
[node name="PaletteScroll" type="VBoxContainer" parent="PaletteVBoxContainer/SwatchesContainer"] [node name="PaletteScroll" type="VBoxContainer" parent="PaletteVBoxContainer/SwatchesContainer"]
unique_name_in_owner = true
margin_left = 28.0 margin_left = 28.0
margin_right = 304.0 margin_right = 152.0
margin_bottom = 52.0 margin_bottom = 52.0
size_flags_horizontal = 3 size_flags_horizontal = 3
script = ExtResource( 6 ) script = ExtResource( 6 )
[node name="HBoxContainer" type="HBoxContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll"] [node name="HBoxContainer" type="HBoxContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll"]
margin_right = 276.0 margin_right = 124.0
margin_bottom = 52.0
size_flags_horizontal = 3 size_flags_horizontal = 3
size_flags_vertical = 3
alignment = 1
[node name="CenterContainer" type="CenterContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer"] [node name="VBoxContainer" type="VBoxContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer"]
margin_right = 276.0 margin_right = 120.0
margin_bottom = 52.0
size_flags_horizontal = 3 size_flags_horizontal = 3
size_flags_vertical = 3
alignment = 1
[node name="HBoxContainer" type="HBoxContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/CenterContainer"] [node name="ScrollContainer" type="ScrollContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/VBoxContainer"]
margin_left = 138.0 unique_name_in_owner = true
margin_right = 138.0 margin_right = 120.0
margin_bottom = 52.0
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="PaletteGrid" type="GridContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/CenterContainer/HBoxContainer"] [node name="PaletteGrid" type="GridContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/VBoxContainer/ScrollContainer"]
columns = 8 unique_name_in_owner = true
margin_right = 120.0
margin_bottom = 52.0
size_flags_horizontal = 3
size_flags_vertical = 3
custom_constants/vseparation = 3
custom_constants/hseparation = 3
script = ExtResource( 5 ) script = ExtResource( 5 )
[node name="VScrollBar" type="VScrollBar" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/CenterContainer/HBoxContainer"] [node name="HScrollBar" type="HScrollBar" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/VBoxContainer"]
unique_name_in_owner = true
visible = false visible = false
margin_left = 4.0 margin_left = -132.0
margin_right = 16.0 margin_top = 4.0
margin_bottom = 12.0 margin_right = 118.0
margin_bottom = 16.0
step = 1.0 step = 1.0
page = 8.0 page = 8.0
custom_step = 1.0 custom_step = 1.0
[node name="MarginContainer" type="MarginContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll"] [node name="MarginContainer" type="MarginContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer"]
margin_top = 4.0 margin_left = 124.0
margin_right = 276.0 margin_right = 124.0
margin_bottom = 4.0 margin_bottom = 52.0
custom_constants/margin_right = 20 custom_constants/margin_bottom = 15
custom_constants/margin_left = 6
[node name="HScrollBar" type="HScrollBar" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/MarginContainer"] [node name="VScrollBar" type="VScrollBar" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/MarginContainer"]
unique_name_in_owner = true
visible = false visible = false
margin_left = 6.0 margin_right = 12.0
margin_right = 256.0 margin_bottom = 37.0
margin_bottom = 12.0
step = 1.0 step = 1.0
page = 8.0 page = 8.0
custom_step = 1.0 custom_step = 1.0
[node name="EditPaletteDialog" parent="." instance=ExtResource( 1 )] [node name="EditPaletteDialog" parent="." instance=ExtResource( 1 )]
unique_name_in_owner = true
margin_left = 7.0 margin_left = 7.0
margin_top = 7.0 margin_top = 7.0
margin_right = 317.0 margin_right = 317.0
@ -179,6 +192,7 @@ margin_bottom = 442.0
rect_min_size = Vector2( 250, 87.5 ) rect_min_size = Vector2( 250, 87.5 )
[node name="CreatePaletteDialog" parent="." instance=ExtResource( 4 )] [node name="CreatePaletteDialog" parent="." instance=ExtResource( 4 )]
unique_name_in_owner = true
margin_left = 7.0 margin_left = 7.0
margin_top = 7.0 margin_top = 7.0
margin_right = 317.0 margin_right = 317.0
@ -186,24 +200,28 @@ margin_bottom = 312.0
rect_min_size = Vector2( 250, 87.5 ) rect_min_size = Vector2( 250, 87.5 )
[node name="HiddenColorPickerButton" type="ColorPickerButton" parent="."] [node name="HiddenColorPickerButton" type="ColorPickerButton" parent="."]
unique_name_in_owner = true
visible = false visible = false
margin_left = 7.0 margin_left = 7.0
margin_top = 7.0 margin_top = 7.0
margin_right = 317.0 margin_right = 311.0
margin_bottom = 312.0 margin_bottom = 111.0
[connection signal="item_selected" from="PaletteVBoxContainer/PaletteButtons/PaletteSelect" to="." method="_on_PaletteSelect_item_selected"] [connection signal="item_selected" from="PaletteVBoxContainer/PaletteButtons/PaletteSelect" to="." method="_on_PaletteSelect_item_selected"]
[connection signal="pressed" from="PaletteVBoxContainer/PaletteButtons/EditPalette" to="." method="_on_EditPalette_pressed"] [connection signal="pressed" from="PaletteVBoxContainer/PaletteButtons/EditPalette" to="." method="_on_EditPalette_pressed"]
[connection signal="pressed" from="PaletteVBoxContainer/PaletteButtons/AddPalette" to="." method="_on_AddPalette_pressed"] [connection signal="pressed" from="PaletteVBoxContainer/PaletteButtons/AddPalette" to="." method="_on_AddPalette_pressed"]
[connection signal="gui_input" from="PaletteVBoxContainer/SwatchesContainer/ColorButtons/AddColor" to="." method="_on_AddColor_gui_input"] [connection signal="gui_input" from="PaletteVBoxContainer/SwatchesContainer/ColorButtons/AddColor" to="." method="_on_AddColor_gui_input"]
[connection signal="gui_input" from="PaletteVBoxContainer/SwatchesContainer/ColorButtons/DeleteColor" to="." method="_on_DeleteColor_gui_input"] [connection signal="gui_input" from="PaletteVBoxContainer/SwatchesContainer/ColorButtons/DeleteColor" to="." method="_on_DeleteColor_gui_input"]
[connection signal="gui_input" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/CenterContainer/HBoxContainer/PaletteGrid" to="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" method="_on_PaletteGrid_gui_input"] [connection signal="gui_input" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" to="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" method="_on_PaletteScroll_gui_input"]
[connection signal="swatch_double_clicked" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/CenterContainer/HBoxContainer/PaletteGrid" to="." method="_on_PaletteGrid_swatch_double_clicked"] [connection signal="resized" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" to="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" method="_on_PaletteScroll_resized"]
[connection signal="swatch_dropped" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/CenterContainer/HBoxContainer/PaletteGrid" to="." method="_on_PaletteGrid_swatch_dropped"] [connection signal="gui_input" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/VBoxContainer/ScrollContainer/PaletteGrid" to="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" method="_on_PaletteGrid_gui_input"]
[connection signal="swatch_pressed" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/CenterContainer/HBoxContainer/PaletteGrid" to="." method="_on_PaletteGrid_swatch_pressed"] [connection signal="swatch_double_clicked" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/VBoxContainer/ScrollContainer/PaletteGrid" to="." method="_on_PaletteGrid_swatch_double_clicked"]
[connection signal="value_changed" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/CenterContainer/HBoxContainer/VScrollBar" to="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" method="_on_VSlider_value_changed"] [connection signal="swatch_dropped" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/VBoxContainer/ScrollContainer/PaletteGrid" to="." method="_on_PaletteGrid_swatch_dropped"]
[connection signal="value_changed" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/MarginContainer/HScrollBar" to="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" method="_on_HSlider_value_changed"] [connection signal="swatch_pressed" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/VBoxContainer/ScrollContainer/PaletteGrid" to="." method="_on_PaletteGrid_swatch_pressed"]
[connection signal="value_changed" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/VBoxContainer/HScrollBar" to="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" method="_on_HSlider_value_changed"]
[connection signal="value_changed" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/MarginContainer/VScrollBar" to="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" method="_on_VSlider_value_changed"]
[connection signal="deleted" from="EditPaletteDialog" to="." method="_on_EditPaletteDialog_deleted"] [connection signal="deleted" from="EditPaletteDialog" to="." method="_on_EditPaletteDialog_deleted"]
[connection signal="saved" from="EditPaletteDialog" to="." method="_on_EditPaletteDialog_saved"] [connection signal="saved" from="EditPaletteDialog" to="." method="_on_EditPaletteDialog_saved"]
[connection signal="saved" from="CreatePaletteDialog" to="." method="_on_CreatePaletteDialog_saved"] [connection signal="saved" from="CreatePaletteDialog" to="." method="_on_CreatePaletteDialog_saved"]
[connection signal="color_changed" from="HiddenColorPickerButton" to="." method="_on_ColorPicker_color_changed"] [connection signal="color_changed" from="HiddenColorPickerButton" to="." method="_on_ColorPicker_color_changed"]
[connection signal="popup_closed" from="HiddenColorPickerButton" to="." method="_on_HiddenColorPickerButton_popup_closed"]

View file

@ -4,9 +4,16 @@ var scroll := Vector2.ZERO
var drag_started := false var drag_started := false
var drag_start_position := Vector2.ZERO var drag_start_position := Vector2.ZERO
onready var h_slider := $MarginContainer/HScrollBar onready var h_slider := $"%HScrollBar"
onready var v_slider := $HBoxContainer/CenterContainer/HBoxContainer/VScrollBar onready var v_slider := $"%VScrollBar"
onready var palette_grid := $HBoxContainer/CenterContainer/HBoxContainer/PaletteGrid onready var palette_grid := $"%PaletteGrid"
onready var scroll_container := $"%ScrollContainer"
func _ready() -> void:
# Hide default scollbars
scroll_container.get_h_scrollbar().rect_scale = Vector2.ZERO
scroll_container.get_v_scrollbar().rect_scale = Vector2.ZERO
func _input(event) -> void: func _input(event) -> void:
@ -18,17 +25,22 @@ func _input(event) -> void:
func set_sliders(palette: Palette, origin: Vector2) -> void: func set_sliders(palette: Palette, origin: Vector2) -> void:
h_slider.value = origin.x h_slider.value = origin.x
v_slider.value = origin.y
h_slider.max_value = palette.width h_slider.max_value = palette.width
if h_slider.max_value <= PaletteGrid.MAX_GRID_SIZE.x: h_slider.page = palette_grid.grid_size.x
h_slider.visible = false h_slider.visible = false if h_slider.max_value <= palette_grid.grid_size.x else true
else:
h_slider.visible = true v_slider.value = origin.y
v_slider.max_value = palette.height v_slider.max_value = palette.height
if v_slider.max_value <= PaletteGrid.MAX_GRID_SIZE.y: v_slider.page = palette_grid.grid_size.y
v_slider.visible = false v_slider.visible = false if v_slider.max_value <= palette_grid.grid_size.y else true
else:
v_slider.visible = true
func reset_sliders() -> void:
set_sliders(palette_grid.current_palette, palette_grid.grid_window_origin)
func resize_grid() -> void:
palette_grid.resize_grid(rect_size - Vector2(v_slider.rect_size.x, h_slider.rect_size.y))
func scroll_grid() -> void: func scroll_grid() -> void:
@ -52,9 +64,31 @@ func _on_PaletteGrid_gui_input(event) -> void:
# Keeps position where the dragging started # Keeps position where the dragging started
drag_start_position = ( drag_start_position = (
event.position event.position
+ Vector2(h_slider.value, v_slider.value) * PaletteSwatch.SWATCH_SIZE + Vector2(h_slider.value, v_slider.value) * palette_grid.swatch_size
) )
if event is InputEventMouseMotion and drag_started: if event is InputEventMouseMotion and drag_started:
h_slider.value = (drag_start_position.x - event.position.x) / PaletteSwatch.SWATCH_SIZE.x h_slider.value = (drag_start_position.x - event.position.x) / palette_grid.swatch_size.x
v_slider.value = (drag_start_position.y - event.position.y) / PaletteSwatch.SWATCH_SIZE.y v_slider.value = (drag_start_position.y - event.position.y) / palette_grid.swatch_size.y
func _on_PaletteScroll_resized() -> void:
resize_grid()
reset_sliders()
func _on_PaletteScroll_gui_input(event) -> void:
if event is InputEventMouseButton and event.pressed:
var scroll_vector = Vector2.ZERO
if event.button_index == BUTTON_WHEEL_UP:
if event.control:
palette_grid.change_swatch_size(Vector2.ONE)
else:
scroll_vector = Vector2.LEFT if event.shift else Vector2.UP
if event.button_index == BUTTON_WHEEL_DOWN:
if event.control:
palette_grid.change_swatch_size(-Vector2.ONE)
else:
scroll_vector = Vector2.RIGHT if event.shift else Vector2.DOWN
resize_grid()
set_sliders(palette_grid.current_palette, palette_grid.grid_window_origin + scroll_vector)

View file

@ -5,7 +5,6 @@ signal pressed(mouse_button)
signal double_clicked(mouse_button, position) signal double_clicked(mouse_button, position)
signal dropped(source_index, new_index) signal dropped(source_index, new_index)
const SWATCH_SIZE := Vector2(26, 26) # Required by grid sliders
const DEFAULT_COLOR := Color(0.0, 0.0, 0.0, 0.0) const DEFAULT_COLOR := Color(0.0, 0.0, 0.0, 0.0)
var index := -1 var index := -1
@ -14,27 +13,27 @@ var show_right_highlight := false
var empty := true setget set_empty var empty := true setget set_empty
func _ready() -> void: func set_swatch_size(size: Vector2) -> void:
rect_min_size = SWATCH_SIZE rect_min_size = size
rect_size = SWATCH_SIZE rect_size = size
func _draw() -> void: func _draw() -> void:
if not empty: if not empty:
# Black border around swatches with a color # Black border around swatches with a color
draw_rect(Rect2(Vector2.ZERO, SWATCH_SIZE), Color.black, false, 1) draw_rect(Rect2(Vector2.ZERO, rect_size), Color.black, false, 1)
if show_left_highlight: if show_left_highlight:
# Display outer border highlight # Display outer border highlight
draw_rect(Rect2(Vector2.ZERO, SWATCH_SIZE), Color.white, false, 1) draw_rect(Rect2(Vector2.ZERO, rect_size), Color.white, false, 1)
draw_rect(Rect2(Vector2.ONE, SWATCH_SIZE - Vector2(2, 2)), Color.black, false, 1) draw_rect(Rect2(Vector2.ONE, rect_size - Vector2(2, 2)), Color.black, false, 1)
if show_right_highlight: if show_right_highlight:
# Display inner border highlight # Display inner border highlight
var margin := SWATCH_SIZE / 4 var margin := rect_size / 4
draw_rect(Rect2(margin, SWATCH_SIZE - margin * 2), Color.black, false, 1) draw_rect(Rect2(margin, rect_size - margin * 2), Color.black, false, 1)
draw_rect( draw_rect(
Rect2(margin - Vector2.ONE, SWATCH_SIZE - margin * 2 + Vector2(2, 2)), Rect2(margin - Vector2.ONE, rect_size - margin * 2 + Vector2(2, 2)),
Color.white, Color.white,
false, false,
1 1

View file

@ -75,4 +75,5 @@ __meta__ = {
"_edit_lock_": true, "_edit_lock_": true,
"_edit_use_anchors_": false "_edit_use_anchors_": false
} }
[connection signal="gui_input" from="." to="." method="_on_PaletteSlot_gui_input"] [connection signal="gui_input" from="." to="." method="_on_PaletteSlot_gui_input"]