SummerDay/addons/summer_day/tools/canvas/zoom.gd

61 lines
1.6 KiB
GDScript

tool
extends SummerDayTool
class_name SummerDayZoomCanvasTool
var zoom_activated := false
var initial_transform: Transform2D
var initial_mouse_position: Vector2
var is_space_pressed = false
func _init():
priority = 1
modifier_layer = 1
func _handle_global_input(event: InputEvent):
if event is InputEventKey:
if event.scancode == KEY_SPACE:
is_space_pressed = event.is_pressed()
func _check_for_use(event: InputEvent):
if event is InputEventMouseButton:
if event.button_index == BUTTON_LEFT:
if event.is_pressed() and is_space_pressed:
initial_transform = SummerDay.canvas_state.canvas_transform
initial_mouse_position = event.position
zoom_activated = true
else:
zoom_activated = false
elif event.factor != 0.0 and event.button_index >= 4:
initial_transform = SummerDay.canvas_state.canvas_transform
return true
if event is InputEventMouseMotion:
return zoom_activated
return false
func _run(event: InputEvent):
var zoom_point
var zoom_strength
if event is InputEventMouseButton:
zoom_point = event.position
zoom_strength = event.factor
if event.button_index == BUTTON_WHEEL_DOWN:
zoom_strength = -event.factor
if event is InputEventMouseMotion:
zoom_point = initial_mouse_position
zoom_strength = (event.position.x - initial_mouse_position.x) * 0.5
var canvas_transform = initial_transform
canvas_transform.origin -= zoom_point
var scale = pow(1.03, zoom_strength)
canvas_transform = canvas_transform.scaled(Vector2(scale, scale))
canvas_transform.origin += zoom_point
SummerDay.canvas_state.canvas_transform = canvas_transform