You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
2.0 KiB
71 lines
2.0 KiB
tool |
|
extends ScrollContainer |
|
|
|
# store last attempts since godot sometimes misses drop events |
|
var _is_drag_receiving = false |
|
var _last_event_button_drop_attempt = '' |
|
var _mouse_exited = false |
|
|
|
# todo, getting timeline like this is prone to fail someday |
|
onready var timeline_editor = get_parent() |
|
|
|
func _ready(): |
|
connect("mouse_entered", self, '_on_mouse_entered') |
|
connect("mouse_exited", self, '_on_mouse_exited') |
|
connect("gui_input", self, '_on_gui_input') |
|
|
|
|
|
func can_drop_data(position, data): |
|
if data != null and data is Dictionary and data.has("source"): |
|
if data["source"] == "EventButton": |
|
if _last_event_button_drop_attempt.empty(): |
|
timeline_editor.create_drag_and_drop_event(data["event_id"]) |
|
_is_drag_receiving = true |
|
_last_event_button_drop_attempt = data["event_id"] |
|
return true |
|
return false |
|
|
|
|
|
func cancel_drop(): |
|
_is_drag_receiving = false |
|
_last_event_button_drop_attempt = '' |
|
timeline_editor.cancel_drop_event() |
|
|
|
|
|
func drop_data(position, data): |
|
# add event |
|
if (data["source"] == "EventButton"): |
|
timeline_editor.drop_event() |
|
_is_drag_receiving = false |
|
_last_event_button_drop_attempt = '' |
|
|
|
|
|
func _on_mouse_exited(): |
|
if _is_drag_receiving and not _mouse_exited: |
|
var preview_label = Label.new() |
|
preview_label.text = "Cancel" |
|
set_drag_preview(preview_label) |
|
_mouse_exited = true |
|
|
|
|
|
func _on_mouse_entered(): |
|
if _is_drag_receiving and _mouse_exited: |
|
var preview_label = Label.new() |
|
preview_label.text = "Insert Event" |
|
set_drag_preview(preview_label) |
|
_mouse_exited = false |
|
|
|
|
|
func _input(event): |
|
if (event is InputEventMouseButton and is_visible_in_tree() and event.button_index == BUTTON_LEFT): |
|
if (_mouse_exited and _is_drag_receiving): |
|
cancel_drop() |
|
|
|
|
|
func _on_gui_input(event): |
|
# godot sometimes misses drop events |
|
if (event is InputEventMouseButton and event.button_index == BUTTON_LEFT): |
|
if (_is_drag_receiving): |
|
if (_last_event_button_drop_attempt != ''): |
|
drop_data(Vector2.ZERO, { "source": "EventButton", "event_id": _last_event_button_drop_attempt} ) |
|
_is_drag_receiving = false
|
|
|