58 lines
1.4 KiB
GDScript
58 lines
1.4 KiB
GDScript
extends Control
|
|
|
|
onready var map_menu = $menu/menubar/MapMenu.get_popup()
|
|
onready var map_node = $map
|
|
|
|
const MAP_SCALE_MAX = 8
|
|
const MAP_SCALE_MIN = 0.25
|
|
|
|
func _ready():
|
|
pass
|
|
|
|
# Prevent input handler from running when other dialogs/actions are focused
|
|
var input_lock = false
|
|
|
|
# Drag variables
|
|
var dragging = false
|
|
var view_origin = Vector2.ZERO
|
|
var mouse_origin = Vector2.ZERO
|
|
|
|
func _input(ev: InputEvent):
|
|
if input_lock:
|
|
return
|
|
|
|
if ev is InputEventMouseMotion:
|
|
if dragging:
|
|
map_node.position = view_origin - (mouse_origin - ev.global_position)
|
|
else:
|
|
# Map cursor location to grid
|
|
var mouse_offset = ev.global_position - map_node.global_position
|
|
|
|
|
|
if ev is InputEventMouseButton:
|
|
var mouse = ev as InputEventMouseButton
|
|
if mouse.pressed:
|
|
match ev.button_index:
|
|
BUTTON_WHEEL_UP:
|
|
# Zoom in
|
|
if map_node.scale.x < MAP_SCALE_MAX:
|
|
if map_node.scale.x < 1:
|
|
map_node.scale *= 2
|
|
else:
|
|
map_node.scale += Vector2.ONE
|
|
BUTTON_WHEEL_DOWN:
|
|
# Zoom out
|
|
if map_node.scale.x > MAP_SCALE_MIN:
|
|
if map_node.scale.x <= 1:
|
|
map_node.scale /= 2
|
|
else:
|
|
map_node.scale -= Vector2.ONE
|
|
BUTTON_MIDDLE:
|
|
view_origin = map_node.position
|
|
mouse_origin = ev.global_position
|
|
dragging = true
|
|
else:
|
|
match ev.button_index:
|
|
BUTTON_MIDDLE:
|
|
dragging = false
|
|
map_node.position = view_origin - (mouse_origin - ev.global_position)
|