move key iteration to KeyHelper

This commit is contained in:
Teatov 2025-08-04 01:36:22 +10:00
parent 012fae3b3a
commit 3db3d07029
2 changed files with 78 additions and 62 deletions

View File

@ -180,7 +180,7 @@ func _generate_key(
func _iterate_keys(
iter_function: Callable,
iter_func: Callable,
layout_rows: Array[Array],
current_keys: Dictionary[Vector2i, Array] = {}
) -> void:
@ -188,20 +188,9 @@ func _iterate_keys(
for row: Array[KeyProps] in layout_rows:
_set_row_key_scales_with_gaps(row)
var pos: Vector2 = Vector2.ZERO
var pivot := Vector2.ZERO
var angle: float = 0
var rect: Rect2 = Rect2(0, 0, 0, 0)
for row: Array[KeyProps] in layout_rows:
var result := _iterate_row(
iter_function, row, pos, pivot, angle, rect, current_keys
)
pos = result[0]
pos.y += 1 + key_gap
pivot = result[1]
angle = result[2]
rect = result[3]
var rect := KeyHelper.iterate_keys(
iter_func, layout_rows, key_size, key_gap, current_keys
)
layout_size_changed.emit(rect)
_rect_mesh.scale = Vector3(rect.size.x, 1, rect.size.y)
@ -209,53 +198,6 @@ func _iterate_keys(
_rect_mesh.position.z = rect.position.x + rect.size.y / 2 - rect.get_center().y
func _iterate_row(
iter_function: Callable,
row: Array[KeyProps],
pos: Vector2,
pivot: Vector2,
angle: float,
rect: Rect2,
current_keys: Dictionary[Vector2i, Array]
) -> Array[Variant]:
pos.x = pivot.x
for key_props in row:
if key_props.has_angle():
angle = -deg_to_rad(key_props.angle)
if key_props.has_pivot_x():
pivot.x = key_props.pivot_x
if key_props.has_pivot_y():
pivot.y = key_props.pivot_y
if key_props.has_pivot_x() or key_props.has_pivot_y():
pos = pivot
var key_pos := Vector3(pos.x + key_size / 2, 0, pos.y + key_size / 2)
key_pos.x += (
(key_size * key_props.width - key_size) / 2 + key_size * key_props.x
)
key_pos.z += key_props.y * key_size
key_pos = KeyHelper.get_rotated_key_pos(key_pos, pivot, angle)
iter_function.call(key_props, key_pos, angle, current_keys)
if pos.x < rect.position.x:
rect.position.x = pos.x
if pos.y < rect.position.y:
rect.position.y = pos.y
pos.x += key_props.width * key_size + key_props.x * key_size + key_gap
pos.y += key_props.y * key_size
if pos.x - key_gap > rect.end.x:
rect.end.x = pos.x - key_gap
if pos.y + key_size * key_props.height > rect.end.y:
rect.end.y = pos.y + key_size * key_props.height
return [pos, pivot, angle, rect]
func _set_row_key_scales_with_gaps(row: Array[KeyProps]) -> void:
for key_props in row:
key_props.width = _get_scale_with_gaps(key_props.width)

View File

@ -64,3 +64,77 @@ static func get_rotated_key_pos(
) -> Vector3:
var pivot_pos := Vector3(pivot.x, 0, pivot.y)
return (key_pos - pivot_pos).rotated(Vector3.UP, angle) + pivot_pos
static func iterate_keys(
iter_func: Callable,
layout_rows: Array[Array],
key_size: float = 1,
key_gap: float = 0,
current_keys: Dictionary[Vector2i, Array] = {}
) -> Rect2:
var pos: Vector2 = Vector2.ZERO
var pivot := Vector2.ZERO
var angle: float = 0
var rect: Rect2 = Rect2(0, 0, 0, 0)
for row: Array[KeyProps] in layout_rows:
var result := _iterate_row(
iter_func, row, pos, pivot, angle, rect, key_size, key_gap, current_keys
)
pos = result[0]
pos.y += 1 + key_gap
pivot = result[1]
angle = result[2]
rect = result[3]
return rect
static func _iterate_row(
iter_func: Callable,
row: Array[KeyProps],
pos: Vector2,
pivot: Vector2,
angle: float,
rect: Rect2,
key_size: float,
key_gap: float,
current_keys: Dictionary[Vector2i, Array]
) -> Array[Variant]:
pos.x = pivot.x
for key_props in row:
if key_props.has_angle():
angle = -deg_to_rad(key_props.angle)
if key_props.has_pivot_x():
pivot.x = key_props.pivot_x
if key_props.has_pivot_y():
pivot.y = key_props.pivot_y
if key_props.has_pivot_x() or key_props.has_pivot_y():
pos = pivot
var key_pos := Vector3(pos.x + key_size / 2, 0, pos.y + key_size / 2)
key_pos.x += (
(key_size * key_props.width - key_size) / 2 + key_size * key_props.x
)
key_pos.z += key_props.y * key_size
key_pos = KeyHelper.get_rotated_key_pos(key_pos, pivot, angle)
iter_func.call(key_props, key_pos, angle, current_keys)
if pos.x < rect.position.x:
rect.position.x = pos.x
if pos.y < rect.position.y:
rect.position.y = pos.y
pos.x += key_props.width * key_size + key_props.x * key_size + key_gap
pos.y += key_props.y * key_size
if pos.x - key_gap > rect.end.x:
rect.end.x = pos.x - key_gap
if pos.y + key_size * key_props.height > rect.end.y:
rect.end.y = pos.y + key_size * key_props.height
return [pos, pivot, angle, rect]