mirror of
https://github.com/Orama-Interactive/Pixelorama.git
synced 2025-03-15 07:45:19 +00:00
Everything seems to be working on my end, but further testing is required. I also added static typing to some dictionaries.
200 lines
6.7 KiB
GDScript
200 lines
6.7 KiB
GDScript
extends GridContainer
|
|
|
|
# We should use pre defined initial grid colors instead of random colors
|
|
const INITIAL_GRID_COLORS := [
|
|
Color.BLACK,
|
|
Color.WHITE,
|
|
Color.YELLOW,
|
|
Color.GREEN,
|
|
Color.BLUE,
|
|
Color.GRAY,
|
|
Color.ORANGE,
|
|
Color.PINK,
|
|
Color.SIENNA,
|
|
Color.CORAL,
|
|
]
|
|
|
|
var grid_preferences: Array[GridPreference] = [
|
|
GridPreference.new("grid_type", "GridType", "selected", Global.GridTypes.CARTESIAN),
|
|
GridPreference.new("grid_size", "GridSizeValue", "value", Vector2i(2, 2)),
|
|
GridPreference.new("isometric_grid_size", "IsometricGridSizeValue", "value", Vector2i(16, 8)),
|
|
GridPreference.new("grid_offset", "GridOffsetValue", "value", Vector2i.ZERO),
|
|
GridPreference.new("grid_draw_over_tile_mode", "GridDrawOverTileMode", "button_pressed", false),
|
|
GridPreference.new("grid_color", "GridColor", "color", Color.BLACK),
|
|
]
|
|
|
|
var grid_selected: int = 0:
|
|
set(key):
|
|
grid_selected = key
|
|
for child: BaseButton in grids_select_container.get_children():
|
|
if child.get_index() == grid_selected:
|
|
child.self_modulate = Color.WHITE
|
|
else:
|
|
child.self_modulate = Color.DIM_GRAY
|
|
var grids: Dictionary = Global.config_cache.get_value(
|
|
"preferences", "grids", {0: create_default_properties()}
|
|
)
|
|
if grids.has(key):
|
|
update_pref_ui(grids[key])
|
|
|
|
@onready var grids_select_container: HFlowContainer = $GridsSelectContainer
|
|
|
|
|
|
class GridPreference:
|
|
var prop_name: String
|
|
var node_path: String
|
|
var value_type: String
|
|
var default_value
|
|
|
|
func _init(
|
|
_prop_name: String,
|
|
_node_path: String,
|
|
_value_type: String,
|
|
_default_value = null,
|
|
_require_restart := false
|
|
) -> void:
|
|
prop_name = _prop_name
|
|
node_path = _node_path
|
|
value_type = _value_type
|
|
if _default_value != null:
|
|
default_value = _default_value
|
|
|
|
|
|
func _ready() -> void:
|
|
var grids = Global.config_cache.get_value(
|
|
"preferences", "grids", {0: create_default_properties()}
|
|
)
|
|
Global.config_cache.set_value("preferences", "grids", grids)
|
|
$GridsCount.value = grids.size()
|
|
if grids.size() == 1:
|
|
add_remove_select_button(0)
|
|
for pref in grid_preferences:
|
|
if not has_node(pref.node_path):
|
|
continue
|
|
var node := get_node(pref.node_path)
|
|
var restore_default_button := RestoreDefaultButton.new()
|
|
restore_default_button.pressed.connect(
|
|
_on_grid_pref_value_changed.bind(pref.default_value, pref, restore_default_button)
|
|
)
|
|
restore_default_button.setting_name = pref.prop_name
|
|
restore_default_button.value_type = pref.value_type
|
|
restore_default_button.default_value = pref.default_value
|
|
restore_default_button.node = node
|
|
|
|
var node_position := node.get_index()
|
|
node.get_parent().add_child(restore_default_button)
|
|
node.get_parent().move_child(restore_default_button, node_position)
|
|
|
|
match pref.value_type:
|
|
"button_pressed":
|
|
node.toggled.connect(_on_grid_pref_value_changed.bind(pref, restore_default_button))
|
|
"value":
|
|
node.value_changed.connect(
|
|
_on_grid_pref_value_changed.bind(pref, restore_default_button)
|
|
)
|
|
"color":
|
|
node.get_picker().presets_visible = false
|
|
node.color_changed.connect(
|
|
_on_grid_pref_value_changed.bind(pref, restore_default_button)
|
|
)
|
|
"selected":
|
|
node.item_selected.connect(
|
|
_on_grid_pref_value_changed.bind(pref, restore_default_button)
|
|
)
|
|
grid_selected = 0
|
|
|
|
|
|
func _on_grid_pref_value_changed(value, pref: GridPreference, button: RestoreDefaultButton) -> void:
|
|
var grids: Dictionary = Global.config_cache.get_value(
|
|
"preferences", "grids", {0: create_default_properties()}
|
|
)
|
|
if grids.has(grid_selected): # Failsafe (Always true)
|
|
var grid_info: Dictionary = grids[grid_selected]
|
|
var prop := pref.prop_name
|
|
grid_info[prop] = value
|
|
grids[grid_selected] = grid_info
|
|
Global.update_grids(grids)
|
|
var default_value = pref.default_value
|
|
var disable: bool = Global.grids[grid_selected].get(prop) == default_value
|
|
if typeof(value) == TYPE_COLOR:
|
|
disable = value.is_equal_approx(default_value)
|
|
disable_restore_default_button(button, disable)
|
|
Global.config_cache.set_value("preferences", "grids", grids)
|
|
|
|
|
|
func _on_grids_count_value_changed(value: float) -> void:
|
|
var new_grids: Dictionary = Global.config_cache.get_value(
|
|
"preferences", "grids", {0: create_default_properties()}
|
|
)
|
|
var last_grid_idx = int(value - 1)
|
|
if last_grid_idx >= grids_select_container.get_child_count():
|
|
# Add missing grids
|
|
for key in range(grids_select_container.get_child_count(), value):
|
|
if not new_grids.has(key):
|
|
var new_grid := create_default_properties()
|
|
if new_grids.has(key - 1): # Failsafe
|
|
var last_grid = new_grids[key - 1]
|
|
# This small bit of code is there to make ui look a little neater
|
|
# Reasons:
|
|
# - Usually user intends to make the next grid twice the size.
|
|
# - Having all grids being same size initially may cause confusion for some
|
|
# users when they try to change color of a middle grid not seeing it's changing
|
|
# (due to being covered by grids above it).
|
|
if (
|
|
new_grid.has("grid_size")
|
|
and new_grid.has("isometric_grid_size")
|
|
and new_grid.has("grid_color")
|
|
):
|
|
new_grid["grid_size"] = last_grid["grid_size"] * 2
|
|
new_grid["isometric_grid_size"] = last_grid["isometric_grid_size"] * 2
|
|
if key < INITIAL_GRID_COLORS.size():
|
|
new_grid["grid_color"] = INITIAL_GRID_COLORS[key]
|
|
new_grids[key] = new_grid
|
|
add_remove_select_button(key)
|
|
else:
|
|
# Remove extra grids
|
|
for key: int in range(value, new_grids.size()):
|
|
new_grids.erase(key)
|
|
add_remove_select_button(key, true)
|
|
grid_selected = min(grid_selected, last_grid_idx)
|
|
Global.update_grids(new_grids)
|
|
Global.config_cache.set_value("preferences", "grids", new_grids)
|
|
|
|
|
|
func create_default_properties() -> Dictionary:
|
|
var grid_info := {}
|
|
for pref in grid_preferences:
|
|
grid_info[pref.prop_name] = pref.default_value
|
|
return grid_info
|
|
|
|
|
|
func disable_restore_default_button(button: RestoreDefaultButton, disable: bool) -> void:
|
|
button.disabled = disable
|
|
if disable:
|
|
button.mouse_default_cursor_shape = Control.CURSOR_ARROW
|
|
button.tooltip_text = ""
|
|
else:
|
|
button.mouse_default_cursor_shape = Control.CURSOR_POINTING_HAND
|
|
button.tooltip_text = "Restore default value"
|
|
|
|
|
|
func add_remove_select_button(grid_idx: int, remove := false):
|
|
if not remove:
|
|
var select_button = Button.new()
|
|
select_button.text = str(grid_idx)
|
|
grids_select_container.add_child(select_button)
|
|
select_button.pressed.connect(func(): grid_selected = grid_idx)
|
|
else:
|
|
if grid_idx < grids_select_container.get_child_count():
|
|
grids_select_container.get_child(grid_idx).queue_free()
|
|
|
|
|
|
func update_pref_ui(grid_data: Dictionary):
|
|
for pref in grid_preferences:
|
|
var key = pref.prop_name
|
|
if grid_data.has(key):
|
|
var node := get_node(pref.node_path)
|
|
node.set(pref.value_type, grid_data[key])
|
|
if pref.value_type == "color":
|
|
# the signal doesn't seem to be emitted automatically
|
|
node.color_changed.emit(grid_data[key])
|