Refine large map edge navigation
This commit is contained in:
@@ -120,7 +120,11 @@ func _check_edge_scroll_velocity_curve(scene, view_rect: Rect2, failures: Array[
|
||||
"_edge_scroll_pressure",
|
||||
"_edge_scroll_speed_for_pressure",
|
||||
"_edge_scroll_activation_rect",
|
||||
"_edge_scroll_next_offset"
|
||||
"_edge_scroll_next_offset",
|
||||
"_edge_scroll_active_sides",
|
||||
"_edge_scroll_cue_strip_width",
|
||||
"_edge_scroll_cue_fill_color",
|
||||
"_edge_scroll_cue_line_color"
|
||||
]:
|
||||
if not scene.has_method(method_name):
|
||||
failures.append("missing edge-scroll helper: %s" % method_name)
|
||||
@@ -150,6 +154,26 @@ func _check_edge_scroll_velocity_curve(scene, view_rect: Rect2, failures: Array[
|
||||
if top_left.length() > max_edge_speed + 0.01:
|
||||
failures.append("corner edge scroll should cap diagonal speed: %.2f > %.2f" % [top_left.length(), max_edge_speed])
|
||||
|
||||
var idle_sides: Dictionary = scene._edge_scroll_active_sides(view_rect.get_center(), view_rect)
|
||||
if bool(idle_sides.get("left", false)) or bool(idle_sides.get("right", false)) or bool(idle_sides.get("up", false)) or bool(idle_sides.get("down", false)):
|
||||
failures.append("edge cue sides should stay idle away from the frame: %s" % str(idle_sides))
|
||||
var left_active_sides: Dictionary = scene._edge_scroll_active_sides(Vector2(view_rect.position.x + 2.0, view_rect.get_center().y), view_rect)
|
||||
if not bool(left_active_sides.get("left", false)) or bool(left_active_sides.get("right", false)):
|
||||
failures.append("left edge cue should activate only the left side: %s" % str(left_active_sides))
|
||||
var right_active_sides: Dictionary = scene._edge_scroll_active_sides(Vector2(view_rect.end.x - 2.0, view_rect.get_center().y), view_rect)
|
||||
if not bool(right_active_sides.get("right", false)) or bool(right_active_sides.get("left", false)):
|
||||
failures.append("right edge cue should activate only the right side: %s" % str(right_active_sides))
|
||||
if float(scene._edge_scroll_cue_strip_width(true)) <= float(scene._edge_scroll_cue_strip_width(false)):
|
||||
failures.append("active edge cue should draw a wider response strip")
|
||||
var active_fill: Color = scene._edge_scroll_cue_fill_color(true)
|
||||
var idle_fill: Color = scene._edge_scroll_cue_fill_color(false)
|
||||
if active_fill.a <= idle_fill.a:
|
||||
failures.append("active edge cue fill should be brighter than idle fill")
|
||||
var active_line: Color = scene._edge_scroll_cue_line_color(true)
|
||||
var idle_line: Color = scene._edge_scroll_cue_line_color(false)
|
||||
if active_line.a <= idle_line.a:
|
||||
failures.append("active edge cue line should be brighter than idle line")
|
||||
|
||||
var near_outside_left: Vector2 = scene._edge_scroll_velocity_for_position(view_rect.position - Vector2(4.0, 0.0), view_rect)
|
||||
if near_outside_left.x <= 0.0:
|
||||
failures.append("edge scroll should continue when the mouse slightly crosses the left map edge: %s" % str(near_outside_left))
|
||||
@@ -199,7 +223,10 @@ func _check_minimap_navigation_contract(failures: Array[String]) -> void:
|
||||
"_minimap_cell_rect",
|
||||
"_minimap_view_rect",
|
||||
"_board_scroll_offset_for_minimap_position",
|
||||
"_scroll_board_to_minimap_position"
|
||||
"_scroll_board_to_minimap_position",
|
||||
"_handle_minimap_mouse_button",
|
||||
"_handle_minimap_mouse_motion",
|
||||
"_is_minimap_visible"
|
||||
]:
|
||||
if not scene.has_method(method_name):
|
||||
failures.append("missing minimap helper: %s" % method_name)
|
||||
@@ -245,6 +272,33 @@ func _check_minimap_navigation_contract(failures: Array[String]) -> void:
|
||||
scene._scroll_board_to_minimap_position(map_rect.get_center())
|
||||
if scene.board_scroll_offset.distance_squared_to(center_offset) > 0.01:
|
||||
failures.append("minimap scroll action should apply the calculated center offset: %s vs %s" % [str(scene.board_scroll_offset), str(center_offset)])
|
||||
|
||||
scene.board_scroll_offset = Vector2.ZERO
|
||||
var drag_start := map_rect.position + Vector2(map_rect.size.x * 0.35, map_rect.size.y * 0.35)
|
||||
var drag_end := map_rect.end
|
||||
var press := InputEventMouseButton.new()
|
||||
press.button_index = MOUSE_BUTTON_LEFT
|
||||
press.pressed = true
|
||||
press.position = drag_start
|
||||
if not scene._handle_minimap_mouse_button(press):
|
||||
failures.append("minimap press inside the map body should be consumed")
|
||||
if not scene.minimap_dragging:
|
||||
failures.append("minimap press inside the map body should start dragging")
|
||||
var drag_motion := InputEventMouseMotion.new()
|
||||
drag_motion.position = drag_end
|
||||
var expected_drag_offset: Vector2 = scene._board_scroll_offset_for_minimap_position(drag_end)
|
||||
if not scene._handle_minimap_mouse_motion(drag_motion):
|
||||
failures.append("minimap drag motion should be consumed while dragging")
|
||||
if scene.board_scroll_offset.distance_squared_to(expected_drag_offset) > 0.01:
|
||||
failures.append("minimap drag should keep recentering the tactical viewport: %s vs %s" % [str(scene.board_scroll_offset), str(expected_drag_offset)])
|
||||
var release := InputEventMouseButton.new()
|
||||
release.button_index = MOUSE_BUTTON_LEFT
|
||||
release.pressed = false
|
||||
release.position = drag_end
|
||||
if not scene._handle_minimap_mouse_button(release):
|
||||
failures.append("minimap release should be consumed after dragging")
|
||||
if scene.minimap_dragging:
|
||||
failures.append("minimap release should end dragging")
|
||||
scene.free()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user