71 lines
2.2 KiB
GDScript
71 lines
2.2 KiB
GDScript
@tool
|
|
extends PopupPanel
|
|
|
|
signal value_changed(value : Vector2, meta_name : String, point_idx : int)
|
|
|
|
var x_pos_input : EditorSpinSlider
|
|
var y_pos_input : EditorSpinSlider
|
|
var meta_name := CurvedLines2D.META_NAME_HOVER_POINT_IDX
|
|
var point_idx : int = 0
|
|
var _dragging := false
|
|
var _drag_start := Vector2.ZERO
|
|
|
|
func _enter_tree() -> void:
|
|
visible = false
|
|
x_pos_input = _mk_input()
|
|
y_pos_input = _mk_input()
|
|
%XPosInputContainer.add_child(x_pos_input)
|
|
%YPosInputContainer.add_child(y_pos_input)
|
|
if not x_pos_input.value_changed.is_connected(_on_value_changed):
|
|
x_pos_input.value_changed.connect(_on_value_changed)
|
|
if not y_pos_input.value_changed.is_connected(_on_value_changed):
|
|
y_pos_input.value_changed.connect(_on_value_changed)
|
|
|
|
|
|
func _on_button_pressed() -> void:
|
|
hide()
|
|
|
|
|
|
func _on_value_changed(_v : Variant = null):
|
|
value_changed.emit(Vector2(x_pos_input.value, y_pos_input.value), meta_name, point_idx)
|
|
|
|
|
|
func popup_with_value(metadata : Dictionary, snapped : bool, snap_step : float):
|
|
point_idx = metadata['point_idx']
|
|
meta_name = metadata['meta_name']
|
|
x_pos_input.set_value_no_signal(metadata['global_pos'].x)
|
|
y_pos_input.set_value_no_signal(metadata['global_pos'].y)
|
|
if snapped:
|
|
x_pos_input.step = snap_step
|
|
y_pos_input.step = snap_step
|
|
else:
|
|
x_pos_input.step = 0.001
|
|
y_pos_input.step = 0.001
|
|
_on_value_changed()
|
|
popup_centered()
|
|
|
|
|
|
func _mk_input() -> EditorSpinSlider:
|
|
var num_input := EditorSpinSlider.new()
|
|
num_input.suffix = "px"
|
|
num_input.hide_slider = true
|
|
num_input.value = 0.0
|
|
num_input.editing_integer = false
|
|
num_input.allow_lesser = true
|
|
num_input.allow_greater = true
|
|
num_input.step = 0.001
|
|
return num_input
|
|
|
|
|
|
func _on_label_gui_input(event: InputEvent) -> void:
|
|
if event is InputEventMouseButton and event.button_index == MOUSE_BUTTON_LEFT:
|
|
if Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT):
|
|
if not _dragging:
|
|
_dragging = true
|
|
_drag_start = EditorInterface.get_base_control().get_local_mouse_position()
|
|
else:
|
|
_dragging = false
|
|
if event is InputEventMouseMotion and _dragging:
|
|
position += Vector2i(EditorInterface.get_base_control().get_local_mouse_position() - _drag_start)
|
|
_drag_start = EditorInterface.get_base_control().get_local_mouse_position()
|