@@ -23,60 +23,11 @@ static var dragable_dropped: Signal = (func():
2323
2424signal grabbed (position )
2525signal dropped (zone , position )
26- signal clicked
27-
28- # Embedded Windows are placed on layer 1024. CanvasItems on layers 1025 and higher appear in front of embedded windows.
29- # (https://docs.godotengine.org/en/stable/classes/class_canvaslayer.html#description)
30- const EMBEDDED_WINDOWS_LAYER = 1024
3126
3227static var _grabbed_dragable : CtrlDragable = null
3328static var _grab_offset : Vector2
3429
35- var drag_preview : Control
36- var _preview_canvas_layer := CanvasLayer .new ()
37- var drag_z_index := 1
38- var enabled : bool = true
39- var _show_queued := false
40- var _clicked := false
41- var _click_position := Vector2 .ZERO
42-
43-
44- static func grab (dragable : CtrlDragable ) -> void :
45- _grabbed_dragable = dragable
46- _grab_offset = dragable .get_grab_position ()
47-
48- dragable .mouse_filter = Control .MOUSE_FILTER_IGNORE
49- dragable .grabbed .emit (_grab_offset )
50- dragable_grabbed .emit (dragable , _grab_offset )
51- dragable .drag_start ()
52-
53-
54- static func release () -> void :
55- _drop (null )
56-
57-
58- static func release_on (zone : CtrlDropZone ) -> void :
59- _drop (zone )
60-
61-
62- static func _drop (zone : CtrlDropZone ) -> void :
63- var grabbed_dragable := _grabbed_dragable
64- grabbed_dragable .mouse_filter = Control .MOUSE_FILTER_PASS
65- var local_drop_position := Vector2 .ZERO
66- if zone != null :
67- local_drop_position = zone .get_drop_position ()
68- else :
69- local_drop_position = _grabbed_dragable .get_drop_position ()
70-
71- _grabbed_dragable = null
72- _grab_offset = Vector2 .ZERO
73- grabbed_dragable .drag_end ()
74- grabbed_dragable .dropped .emit (zone , local_drop_position )
75- dragable_dropped .emit (grabbed_dragable , zone , local_drop_position )
76-
77-
78- func get_drop_position () -> Vector2 :
79- return get_local_mouse_position () - (get_grab_offset () / get_global_transform ().get_scale ())
30+ var _enabled : bool = true
8031
8132
8233static func get_grabbed_dragable () -> CtrlDragable :
@@ -87,91 +38,41 @@ static func get_grab_offset() -> Vector2:
8738 return _grab_offset
8839
8940
90- func get_grab_position () -> Vector2 :
91- return get_local_mouse_position () * get_global_transform ().get_scale ()
92-
93-
94- func drag_start () -> void :
95- if ! is_instance_valid (drag_preview ):
96- return
97-
98- drag_preview .mouse_filter = Control .MOUSE_FILTER_IGNORE
99- drag_preview .global_position = _get_global_preview_position ()
100- get_viewport ().add_child (_preview_canvas_layer )
101- _preview_canvas_layer .add_child (drag_preview )
102- # Make sure the preview is drawn above the embedded windows
103- _preview_canvas_layer .layer = EMBEDDED_WINDOWS_LAYER + 1
104- hide ()
41+ static func get_grab_offset_local_to (control : Control ) -> Vector2 :
42+ return CtrlDragable .get_grab_offset () / control .get_global_transform ().get_scale ()
10543
10644
107- func _get_global_preview_position () -> Vector2 :
108- return get_global_mouse_position () - _grab_offset
45+ func _get_drag_data (at_position : Vector2 ):
46+ if ! _enabled :
47+ return null
10948
49+ _grabbed_dragable = self
50+ _grab_offset = at_position * get_global_transform ().get_scale ()
51+ dragable_grabbed .emit (_grabbed_dragable , _grab_offset )
52+ grabbed .emit (_grab_offset )
11053
111- func drag_end () -> void :
112- if ! is_instance_valid (drag_preview ):
113- return
54+ var preview = Control .new ()
55+ var sub_preview = create_preview ()
56+ sub_preview .position = - get_grab_offset ()
57+ preview .add_child (sub_preview )
58+ set_drag_preview (preview )
59+ return self
11460
115- _preview_canvas_layer .remove_child (drag_preview )
116- _preview_canvas_layer .get_parent ().remove_child (_preview_canvas_layer )
117- drag_preview .mouse_filter = Control .MOUSE_FILTER_PASS
118- # HACK: Queue the show() call for later to avoid glitching
119- _queue_show ()
12061
121-
122- func _queue_show () -> void :
123- _show_queued = true
124-
125-
126- func _notification (what ) -> void :
127- if what == NOTIFICATION_PREDELETE && is_instance_valid (_preview_canvas_layer ):
128- _preview_canvas_layer .queue_free ()
129-
130-
131- func _process (_delta ) -> void :
132- if is_instance_valid (drag_preview ) && is_instance_valid (drag_preview .get_parent ()):
133- drag_preview .scale = get_global_transform ().get_scale ()
134- drag_preview .global_position = _get_global_preview_position ()
135- if _show_queued :
136- _show_queued = false
137- show ()
138-
139-
140- func _gui_input (event : InputEvent ) -> void :
141- if ! enabled :
142- return
143-
144- if event is InputEventMouseMotion :
145- _handle_mouse_motion (event as InputEventMouseMotion )
146- elif event is InputEventMouseButton :
147- _handle_mouse_button (event as InputEventMouseButton )
148-
149-
150- func _handle_mouse_motion (event : InputEventMouseMotion ) -> void :
151- var deadzone_radius = ProjectSettings .get_setting ("gloot/item_dragging_deadzone_radius" , 8.0 )
152- if _clicked && (get_local_mouse_position () - _click_position ).length () > deadzone_radius :
153- _clicked = false
154- grab (self )
155-
156-
157- func _handle_mouse_button (event : InputEventMouseButton ) -> void :
158- if event .button_index != MOUSE_BUTTON_LEFT :
159- return
160-
161- if event .is_pressed ():
162- _clicked = true
163- _click_position = get_local_mouse_position ()
164- clicked .emit ()
165- else :
166- _clicked = false
62+ func create_preview () -> Control :
63+ return null
16764
16865
16966func activate () -> void :
170- enabled = true
67+ _enabled = true
17168
17269
17370func deactivate () -> void :
174- enabled = false
71+ _enabled = false
72+
73+
74+ func is_active () -> bool :
75+ return _enabled
17576
17677
17778func is_dragged () -> bool :
0 commit comments