forked from gilzoide/godot-dockable-container
-
Notifications
You must be signed in to change notification settings - Fork 0
/
drag_n_drop_panel.gd
81 lines (63 loc) · 2.09 KB
/
drag_n_drop_panel.gd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
@tool
extends Control
const DRAW_NOTHING = -1
const DRAW_CENTERED = -2
var _draw_margin = DRAW_NOTHING
var _should_split = false
const MARGIN_NONE = -1
enum {MARGIN_LEFT, MARGIN_RIGHT, MARGIN_TOP, MARGIN_BOTTOM, MARGIN_CENTER}
func _notification(what: int) -> void:
if what == NOTIFICATION_MOUSE_EXIT:
_draw_margin = DRAW_NOTHING
queue_redraw()
elif what == NOTIFICATION_MOUSE_ENTER and not _should_split:
_draw_margin = DRAW_CENTERED
queue_redraw()
func _gui_input(event: InputEvent) -> void:
if _should_split and event is InputEventMouseMotion:
_draw_margin = _find_hover_margin(event.position)
queue_redraw()
func _draw() -> void:
var rect
if _draw_margin == DRAW_NOTHING:
return
elif _draw_margin == DRAW_CENTERED:
rect = Rect2(Vector2.ZERO, size)
elif _draw_margin == MARGIN_LEFT:
rect = Rect2(0, 0, size.x * 0.5, size.y)
elif _draw_margin == MARGIN_TOP:
rect = Rect2(0, 0, size.x, size.y * 0.5)
elif _draw_margin == MARGIN_RIGHT:
var half_width = size.x * 0.5
rect = Rect2(half_width, 0, half_width, size.y)
elif _draw_margin == MARGIN_BOTTOM:
var half_height = size.y * 0.5
rect = Rect2(0, half_height, size.x, half_height)
var stylebox = get_theme_stylebox("panel", "TooltipPanel")
draw_style_box(stylebox, rect)
func set_enabled(enabled: bool, should_split: bool = true) -> void:
visible = enabled
_should_split = should_split
if enabled:
_draw_margin = DRAW_NOTHING
queue_redraw()
func get_hover_margin() -> int:
return _draw_margin
func _find_hover_margin(point: Vector2) -> int:
var half_size = size * 0.5
var left = point.distance_squared_to(Vector2(0, half_size.y))
var lesser = left
var lesser_margin = MARGIN_LEFT
var top = point.distance_squared_to(Vector2(half_size.x, 0))
if lesser > top:
lesser = top
lesser_margin = MARGIN_TOP
var right = point.distance_squared_to(Vector2(size.x, half_size.y))
if lesser > right:
lesser = right
lesser_margin = MARGIN_RIGHT
var bottom = point.distance_squared_to(Vector2(half_size.x, size.y))
if lesser > bottom:
#lesser = bottom # unused result
lesser_margin = MARGIN_BOTTOM
return lesser_margin