1
0
Fork 0
mirror of https://github.com/Orama-Interactive/Pixelorama.git synced 2025-01-18 17:19:50 +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)
const PaletteSwatchScene := preload("res://src/Palette/PaletteSwatch.tscn")
# Must be integer values
const MAX_GRID_SIZE = Vector2(8, 8)
const DEFAULT_SWATCH_SIZE = Vector2(26, 26)
const MIN_SWATCH_SIZE = Vector2(8, 8)
const MAX_SWATCH_SIZE = Vector2(64, 64)
var swatches := [] # PaletteSwatch
var displayed_palette = null
var current_palette = null
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():
init_swatches()
func _ready() -> void:
swatch_size = Global.config_cache.get_value("palettes", "swatch_size", DEFAULT_SWATCH_SIZE)
func init_swatches() -> void:
columns = grid_size.x
for j in range(grid_size.y):
for i in range(grid_size.x):
var index: int = i + grid_size.x * j
func set_palette(new_palette: Palette) -> void:
# Only display valid palette objects
if not new_palette:
return
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()
swatch.index = index
swatch.color = PaletteSwatch.DEFAULT_COLOR
swatch.show_left_highlight = false
swatch.show_right_highlight = false
swatch.empty = true
swatch.connect("pressed", self, "_on_PaletteSwatch_pressed", [index])
swatch.connect("double_clicked", self, "_on_PaletteSwatch_double_clicked", [index])
swatch.index = i
init_swatch(swatch)
swatch.connect("pressed", self, "_on_PaletteSwatch_pressed", [i])
swatch.connect("double_clicked", self, "_on_PaletteSwatch_double_clicked", [i])
swatch.connect("dropped", self, "_on_PaletteSwatch_dropped")
add_child(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 display_palette(palette: Palette) -> void:
# Reset grid origin when palette changes
if displayed_palette != palette:
displayed_palette = palette
grid_window_origin = Vector2.ZERO
func init_swatch(swatch: PaletteSwatch) -> void:
swatch.color = PaletteSwatch.DEFAULT_COLOR
swatch.show_left_highlight = false
swatch.show_right_highlight = false
swatch.empty = true
swatch.set_swatch_size(swatch_size)
# Only display valid palette objects
if not palette:
return
if swatches.size() == 0:
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
func draw_palette() -> void:
for j in range(grid_size.y):
for i in range(grid_size.x):
var grid_index: int = i + grid_size.x * j
@ -76,7 +70,7 @@ func display_palette(palette: Palette) -> void:
var swatch = swatches[grid_index]
swatch.show_left_highlight = false
swatch.show_right_highlight = false
var color = palette.get_color(index)
var color = current_palette.get_color(index)
if color != null:
swatch.color = color
swatch.empty = false
@ -87,15 +81,7 @@ func display_palette(palette: Palette) -> void:
func scroll_palette(origin: Vector2) -> void:
grid_window_origin = origin
display_palette(displayed_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()
draw_palette()
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
# 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:
var palette_index = convert_grid_index_to_palette_index(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_target_index = convert_grid_index_to_palette_index(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_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 add_palette_button := $PaletteVBoxContainer/PaletteButtons/AddPalette
onready var palette_grid := find_node("PaletteGrid")
onready var palette_scroll := $PaletteVBoxContainer/SwatchesContainer/PaletteScroll
onready var palette_select := $"%PaletteSelect"
onready var palette_grid := $"%PaletteGrid"
onready var palette_scroll := $"%PaletteScroll"
onready var add_color_button := $PaletteVBoxContainer/SwatchesContainer/ColorButtons/AddColor
onready var delete_color_button := $PaletteVBoxContainer/SwatchesContainer/ColorButtons/DeleteColor
onready var add_color_button := $"%AddColor"
onready var delete_color_button := $"%DeleteColor"
onready var edit_palette_dialog := $EditPaletteDialog
onready var create_palette_dialog := $CreatePaletteDialog
onready var edit_palette_dialog := $"%EditPaletteDialog"
onready var create_palette_dialog := $"%CreatePaletteDialog"
# 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:
@ -54,7 +54,8 @@ func select_palette(palette_path: String) -> void:
if palette_id != null:
palette_select.selected = palette_id
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)
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:
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)
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)
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:
Palettes.current_palete_delete()
setup_palettes_selector()

View file

@ -9,26 +9,24 @@
[ext_resource path="res://src/Palette/PalettePanel.gd" type="Script" id=8]
[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_vertical = 0
size_flags_vertical = 3
script = ExtResource( 8 )
[node name="PaletteVBoxContainer" type="VBoxContainer" parent="."]
margin_left = 7.0
margin_top = 7.0
margin_right = 311.0
margin_bottom = 111.0
margin_right = 159.0
margin_bottom = 93.0
size_flags_horizontal = 3
[node name="PaletteButtons" type="HBoxContainer" parent="PaletteVBoxContainer"]
margin_right = 304.0
margin_right = 152.0
margin_bottom = 22.0
[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
grow_horizontal = 0
rect_min_size = Vector2( 100, 0 )
@ -38,8 +36,8 @@ size_flags_horizontal = 3
clip_text = true
[node name="EditPalette" type="Button" parent="PaletteVBoxContainer/PaletteButtons" groups=["UIButtons"]]
margin_left = 256.0
margin_right = 278.0
margin_left = 104.0
margin_right = 126.0
margin_bottom = 22.0
rect_min_size = Vector2( 22, 22 )
hint_tooltip = "Edit currently selected palette"
@ -60,13 +58,10 @@ margin_bottom = 11.0
size_flags_horizontal = 0
size_flags_vertical = 0
texture = ExtResource( 2 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="AddPalette" type="Button" parent="PaletteVBoxContainer/PaletteButtons" groups=["UIButtons"]]
margin_left = 282.0
margin_right = 304.0
margin_left = 130.0
margin_right = 152.0
margin_bottom = 22.0
rect_min_size = Vector2( 22, 22 )
hint_tooltip = "Create a new palette"
@ -87,26 +82,25 @@ margin_bottom = 11.0
size_flags_horizontal = 0
size_flags_vertical = 0
texture = ExtResource( 3 )
__meta__ = {
"_edit_use_anchors_": false
}
[node name="HSeparator" type="HSeparator" parent="PaletteVBoxContainer"]
margin_top = 26.0
margin_right = 304.0
margin_right = 152.0
margin_bottom = 30.0
[node name="SwatchesContainer" type="HBoxContainer" parent="PaletteVBoxContainer"]
margin_top = 34.0
margin_right = 304.0
margin_right = 152.0
margin_bottom = 86.0
size_flags_horizontal = 3
size_flags_vertical = 3
[node name="ColorButtons" type="VBoxContainer" parent="PaletteVBoxContainer/SwatchesContainer"]
margin_right = 24.0
margin_bottom = 52.0
[node name="AddColor" type="Button" parent="PaletteVBoxContainer/SwatchesContainer/ColorButtons"]
unique_name_in_owner = true
margin_right = 24.0
margin_bottom = 24.0
rect_min_size = Vector2( 24, 24 )
@ -115,6 +109,7 @@ mouse_default_cursor_shape = 2
text = "+"
[node name="DeleteColor" type="Button" parent="PaletteVBoxContainer/SwatchesContainer/ColorButtons"]
unique_name_in_owner = true
margin_top = 28.0
margin_right = 24.0
margin_bottom = 52.0
@ -124,54 +119,72 @@ mouse_default_cursor_shape = 2
text = "-"
[node name="PaletteScroll" type="VBoxContainer" parent="PaletteVBoxContainer/SwatchesContainer"]
unique_name_in_owner = true
margin_left = 28.0
margin_right = 304.0
margin_right = 152.0
margin_bottom = 52.0
size_flags_horizontal = 3
script = ExtResource( 6 )
[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_vertical = 3
alignment = 1
[node name="CenterContainer" type="CenterContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer"]
margin_right = 276.0
[node name="VBoxContainer" type="VBoxContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer"]
margin_right = 120.0
margin_bottom = 52.0
size_flags_horizontal = 3
size_flags_vertical = 3
alignment = 1
[node name="HBoxContainer" type="HBoxContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/CenterContainer"]
margin_left = 138.0
margin_right = 138.0
[node name="ScrollContainer" type="ScrollContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/VBoxContainer"]
unique_name_in_owner = true
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"]
columns = 8
[node name="PaletteGrid" type="GridContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/VBoxContainer/ScrollContainer"]
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 )
[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
margin_left = 4.0
margin_right = 16.0
margin_bottom = 12.0
margin_left = -132.0
margin_top = 4.0
margin_right = 118.0
margin_bottom = 16.0
step = 1.0
page = 8.0
custom_step = 1.0
[node name="MarginContainer" type="MarginContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll"]
margin_top = 4.0
margin_right = 276.0
margin_bottom = 4.0
custom_constants/margin_right = 20
custom_constants/margin_left = 6
[node name="MarginContainer" type="MarginContainer" parent="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer"]
margin_left = 124.0
margin_right = 124.0
margin_bottom = 52.0
custom_constants/margin_bottom = 15
[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
margin_left = 6.0
margin_right = 256.0
margin_bottom = 12.0
margin_right = 12.0
margin_bottom = 37.0
step = 1.0
page = 8.0
custom_step = 1.0
[node name="EditPaletteDialog" parent="." instance=ExtResource( 1 )]
unique_name_in_owner = true
margin_left = 7.0
margin_top = 7.0
margin_right = 317.0
@ -179,6 +192,7 @@ margin_bottom = 442.0
rect_min_size = Vector2( 250, 87.5 )
[node name="CreatePaletteDialog" parent="." instance=ExtResource( 4 )]
unique_name_in_owner = true
margin_left = 7.0
margin_top = 7.0
margin_right = 317.0
@ -186,24 +200,28 @@ margin_bottom = 312.0
rect_min_size = Vector2( 250, 87.5 )
[node name="HiddenColorPickerButton" type="ColorPickerButton" parent="."]
unique_name_in_owner = true
visible = false
margin_left = 7.0
margin_top = 7.0
margin_right = 317.0
margin_bottom = 312.0
margin_right = 311.0
margin_bottom = 111.0
[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/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/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="swatch_double_clicked" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/CenterContainer/HBoxContainer/PaletteGrid" to="." method="_on_PaletteGrid_swatch_double_clicked"]
[connection signal="swatch_dropped" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/CenterContainer/HBoxContainer/PaletteGrid" to="." method="_on_PaletteGrid_swatch_dropped"]
[connection signal="swatch_pressed" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/CenterContainer/HBoxContainer/PaletteGrid" to="." method="_on_PaletteGrid_swatch_pressed"]
[connection signal="value_changed" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/CenterContainer/HBoxContainer/VScrollBar" to="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" method="_on_VSlider_value_changed"]
[connection signal="value_changed" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/MarginContainer/HScrollBar" to="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" method="_on_HSlider_value_changed"]
[connection signal="gui_input" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" to="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" method="_on_PaletteScroll_gui_input"]
[connection signal="resized" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" to="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" method="_on_PaletteScroll_resized"]
[connection signal="gui_input" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/VBoxContainer/ScrollContainer/PaletteGrid" to="PaletteVBoxContainer/SwatchesContainer/PaletteScroll" method="_on_PaletteGrid_gui_input"]
[connection signal="swatch_double_clicked" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/VBoxContainer/ScrollContainer/PaletteGrid" to="." method="_on_PaletteGrid_swatch_double_clicked"]
[connection signal="swatch_dropped" from="PaletteVBoxContainer/SwatchesContainer/PaletteScroll/HBoxContainer/VBoxContainer/ScrollContainer/PaletteGrid" to="." method="_on_PaletteGrid_swatch_dropped"]
[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="saved" from="EditPaletteDialog" to="." method="_on_EditPaletteDialog_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="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_start_position := Vector2.ZERO
onready var h_slider := $MarginContainer/HScrollBar
onready var v_slider := $HBoxContainer/CenterContainer/HBoxContainer/VScrollBar
onready var palette_grid := $HBoxContainer/CenterContainer/HBoxContainer/PaletteGrid
onready var h_slider := $"%HScrollBar"
onready var v_slider := $"%VScrollBar"
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:
@ -18,17 +25,22 @@ func _input(event) -> void:
func set_sliders(palette: Palette, origin: Vector2) -> void:
h_slider.value = origin.x
v_slider.value = origin.y
h_slider.max_value = palette.width
if h_slider.max_value <= PaletteGrid.MAX_GRID_SIZE.x:
h_slider.visible = false
else:
h_slider.visible = true
h_slider.page = palette_grid.grid_size.x
h_slider.visible = false if h_slider.max_value <= palette_grid.grid_size.x else true
v_slider.value = origin.y
v_slider.max_value = palette.height
if v_slider.max_value <= PaletteGrid.MAX_GRID_SIZE.y:
v_slider.visible = false
else:
v_slider.visible = true
v_slider.page = palette_grid.grid_size.y
v_slider.visible = false if v_slider.max_value <= palette_grid.grid_size.y else 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:
@ -52,9 +64,31 @@ func _on_PaletteGrid_gui_input(event) -> void:
# Keeps position where the dragging started
drag_start_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:
h_slider.value = (drag_start_position.x - event.position.x) / PaletteSwatch.SWATCH_SIZE.x
v_slider.value = (drag_start_position.y - event.position.y) / PaletteSwatch.SWATCH_SIZE.y
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) / 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 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)
var index := -1
@ -14,27 +13,27 @@ var show_right_highlight := false
var empty := true setget set_empty
func _ready() -> void:
rect_min_size = SWATCH_SIZE
rect_size = SWATCH_SIZE
func set_swatch_size(size: Vector2) -> void:
rect_min_size = size
rect_size = size
func _draw() -> void:
if not empty:
# 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:
# Display outer border highlight
draw_rect(Rect2(Vector2.ZERO, SWATCH_SIZE), Color.white, false, 1)
draw_rect(Rect2(Vector2.ONE, SWATCH_SIZE - Vector2(2, 2)), Color.black, false, 1)
draw_rect(Rect2(Vector2.ZERO, rect_size), Color.white, false, 1)
draw_rect(Rect2(Vector2.ONE, rect_size - Vector2(2, 2)), Color.black, false, 1)
if show_right_highlight:
# Display inner border highlight
var margin := SWATCH_SIZE / 4
draw_rect(Rect2(margin, SWATCH_SIZE - margin * 2), Color.black, false, 1)
var margin := rect_size / 4
draw_rect(Rect2(margin, rect_size - margin * 2), Color.black, false, 1)
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,
false,
1

View file

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