Initial commit, layout mockup
This commit is contained in:
82
addons/dockable_container/drag_n_drop_panel.gd
Normal file
82
addons/dockable_container/drag_n_drop_panel.gd
Normal file
@@ -0,0 +1,82 @@
|
||||
@tool
|
||||
extends Control
|
||||
|
||||
enum { MARGIN_LEFT, MARGIN_RIGHT, MARGIN_TOP, MARGIN_BOTTOM, MARGIN_CENTER }
|
||||
|
||||
const DRAW_NOTHING := -1
|
||||
const DRAW_CENTERED := -2
|
||||
const MARGIN_NONE := -1
|
||||
|
||||
var _draw_margin := DRAW_NOTHING
|
||||
var _should_split := false
|
||||
|
||||
|
||||
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: Rect2
|
||||
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
|
||||
Reference in New Issue
Block a user