Skip to content

Commit b6e1555

Browse files
authored
Merge pull request #204 from peter-kish/dev_v2.4.8
GLoot 2.4.8
2 parents 3a4fdb6 + bade1cc commit b6e1555

File tree

10 files changed

+101
-238
lines changed

10 files changed

+101
-238
lines changed

addons/gloot/plugin.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
name="GLoot"
44
description="A universal inventory system for the Godot game engine"
55
author="Peter Kish"
6-
version="2.4.7"
6+
version="2.4.8"
77
script="gloot.gd"

addons/gloot/ui/ctrl_dragable.gd

Lines changed: 24 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -23,60 +23,11 @@ static var dragable_dropped: Signal = (func():
2323

2424
signal grabbed(position)
2525
signal 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

3227
static var _grabbed_dragable: CtrlDragable = null
3328
static 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

8233
static 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

16966
func activate() -> void:
170-
enabled = true
67+
_enabled = true
17168

17269

17370
func deactivate() -> void:
174-
enabled = false
71+
_enabled = false
72+
73+
74+
func is_active() -> bool:
75+
return _enabled
17576

17677

17778
func is_dragged() -> bool:

addons/gloot/ui/ctrl_drop_zone.gd

Lines changed: 9 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -4,49 +4,6 @@ extends Control
44
signal dragable_dropped(dragable, position)
55

66
const CtrlDragable = preload("res://addons/gloot/ui/ctrl_dragable.gd")
7-
const CtrlDropZone = preload("res://addons/gloot/ui/ctrl_drop_zone.gd")
8-
9-
var _mouse_inside := false
10-
static var _drop_event: Dictionary = {}
11-
12-
13-
func _process(_delta) -> void:
14-
if _drop_event.is_empty():
15-
return
16-
17-
if _drop_event.zone == null:
18-
CtrlDragable.release()
19-
else:
20-
if _drop_event.zone != self:
21-
return
22-
_drop_event.zone.dragable_dropped.emit(CtrlDragable.get_grabbed_dragable(), get_drop_position())
23-
CtrlDragable.release_on(self)
24-
25-
_drop_event = {}
26-
27-
28-
func _input(event: InputEvent) -> void:
29-
if !(event is InputEventMouseButton):
30-
return
31-
32-
var mb_event: InputEventMouseButton = event
33-
if mb_event.is_pressed() || mb_event.button_index != MOUSE_BUTTON_LEFT:
34-
return
35-
36-
if CtrlDragable.get_grabbed_dragable() == null:
37-
return
38-
39-
if _mouse_inside:
40-
_drop_event = {zone = self}
41-
elif _drop_event.is_empty():
42-
_drop_event = {zone = null}
43-
44-
45-
func get_drop_position() -> Vector2:
46-
# This check prevents some assertions when get_local_mouse_position() is called while get_viewport() is null.
47-
if get_viewport() == null:
48-
return Vector2.ZERO
49-
return get_local_mouse_position() - (CtrlDragable.get_grab_offset() / get_global_transform().get_scale())
507

518

529
func activate() -> void:
@@ -55,14 +12,19 @@ func activate() -> void:
5512

5613
func deactivate() -> void:
5714
mouse_filter = Control.MOUSE_FILTER_IGNORE
58-
_mouse_inside = false
5915

6016

6117
func is_active() -> bool:
6218
return (mouse_filter != Control.MOUSE_FILTER_IGNORE)
6319

6420

65-
func _ready() -> void:
66-
mouse_entered.connect(func(): _mouse_inside = true)
67-
mouse_exited.connect(func(): _mouse_inside = false)
21+
func _can_drop_data(at_position: Vector2, data) -> bool:
22+
return data is CtrlDragable
23+
24+
25+
func _drop_data(at_position: Vector2, data) -> void:
26+
var local_offset := CtrlDragable.get_grab_offset_local_to(self)
27+
dragable_dropped.emit(data, at_position - local_offset)
28+
CtrlDragable.dragable_dropped.emit(data, self, at_position - local_offset)
29+
6830

addons/gloot/ui/ctrl_inventory_grid_basic.gd

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,11 @@ func _ready() -> void:
117117
_queue_refresh()
118118

119119

120+
func _notification(what: int) -> void:
121+
if what == NOTIFICATION_DRAG_END:
122+
_ctrl_drop_zone.deactivate()
123+
124+
120125
func _connect_inventory_signals() -> void:
121126
if !is_instance_valid(inventory):
122127
return

addons/gloot/ui/ctrl_inventory_grid_ex.gd

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ signal item_mouse_exited(item)
1212

1313
const Verify = preload("res://addons/gloot/core/verify.gd")
1414
const CtrlInventoryGridBasic = preload("res://addons/gloot/ui/ctrl_inventory_grid_basic.gd")
15+
const CtrlInventoryItemRect = preload("res://addons/gloot/ui/ctrl_inventory_item_rect.gd")
1516
const CtrlDragable = preload("res://addons/gloot/ui/ctrl_dragable.gd")
1617

1718

@@ -271,6 +272,11 @@ func _ready() -> void:
271272
_queue_refresh()
272273

273274

275+
func _notification(what: int) -> void:
276+
if what == NOTIFICATION_DRAG_END:
277+
_fill_background(field_style, PriorityPanel.StylePriority.LOW)
278+
279+
274280
func _update_size() -> void:
275281
custom_minimum_size = _ctrl_inventory_grid_basic.size
276282
size = _ctrl_inventory_grid_basic.size
@@ -330,10 +336,13 @@ func _highlight_grabbed_item(style: StyleBox):
330336
_fill_background(field_style, PriorityPanel.StylePriority.LOW)
331337
return
332338

339+
_fill_background(field_style, PriorityPanel.StylePriority.LOW)
340+
333341
var grabbed_item_coords := _ctrl_inventory_grid_basic.get_field_coords(global_grabbed_item_pos + (field_dimensions / 2))
334342
var item_size := inventory.get_item_size(grabbed_item)
335343
var rect := Rect2i(grabbed_item_coords, item_size)
336-
_fill_background(field_style, PriorityPanel.StylePriority.LOW)
344+
if !Rect2i(Vector2i.ZERO, inventory.size).encloses(rect):
345+
return
337346
_set_rect_background(rect, style, PriorityPanel.StylePriority.LOW)
338347

339348

@@ -370,7 +379,7 @@ func _get_global_grabbed_item() -> InventoryItem:
370379

371380
func _get_global_grabbed_item_local_pos() -> Vector2:
372381
if CtrlDragable.get_grabbed_dragable():
373-
return get_local_mouse_position() - CtrlDragable.get_grab_offset()
382+
return get_local_mouse_position() - CtrlDragable.get_grab_offset_local_to(self)
374383
return Vector2(-1, -1)
375384

376385

0 commit comments

Comments
 (0)