From 3db3d07029012c36b52ce6d571e249d9a1c8daa0 Mon Sep 17 00:00:00 2001 From: teatov Date: Mon, 4 Aug 2025 01:36:22 +1000 Subject: [PATCH] move key iteration to `KeyHelper` --- scripts/game_keyboard.gd | 66 +++-------------------------------- scripts/key_helper.gd | 74 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 62 deletions(-) diff --git a/scripts/game_keyboard.gd b/scripts/game_keyboard.gd index bec92bd..2dd6b1d 100644 --- a/scripts/game_keyboard.gd +++ b/scripts/game_keyboard.gd @@ -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) diff --git a/scripts/key_helper.gd b/scripts/key_helper.gd index 3f35fe8..0783b5e 100644 --- a/scripts/key_helper.gd +++ b/scripts/key_helper.gd @@ -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]