forked from vlang/ui
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathui_extra_event_mngr.v
94 lines (87 loc) · 2.51 KB
/
ui_extra_event_mngr.v
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
82
83
84
85
86
87
88
89
90
91
92
93
94
module ui
// Managing mouse (down) events for widgets
struct EventMngr {
mut:
receivers map[string][]Widget
point_inside map[string][]Widget
}
pub fn (mut em EventMngr) add_receiver(widget Widget, evt_types []string) {
for evt_type in evt_types {
// BUG: 'widget in em.receivers[events.on_mouse_down]' is failing
// WORKAROUND with id
if widget.id !in em.receivers[evt_type].map(it.id) {
em.receivers[events.on_mouse_down] << widget
$if evt_mngr ? {
println('add receiver $widget.id for $evt_type')
}
}
// sort it
em.sorted_receivers(evt_type)
}
}
pub fn (mut em EventMngr) rm_receiver(widget Widget, evt_types []string) {
for evt_type in evt_types {
// BUG: ind := em.mouse_down_receivers.index(widget)
// WORKAROUND with id
ind := em.receivers[evt_type].map(it.id).index(widget.id)
if ind >= 0 {
em.receivers[evt_type].delete(ind)
}
// sort it
em.sorted_receivers(evt_type)
}
}
pub fn (mut em EventMngr) point_inside_receivers(e MouseEvent, evt_type string) {
// TODO first sort mouse_down_receivers by order, z_index and hidden
em.point_inside[evt_type].clear()
for mut w in em.receivers[evt_type] {
$if evt_mngr ? {
println('point_inside_receivers: $w.id !$w.hidden && ${w.point_inside(e.x,
e.y)}')
}
if !w.hidden && w.point_inside(e.x, e.y) {
em.point_inside[evt_type] << w
}
}
$if evt_mngr ? {
println('em.point_inside[$evt_type] = ${em.point_inside[evt_type].map(it.id)}')
}
}
fn (mut em EventMngr) sorted_receivers(evt_type string) {
mut sw := []SortedWidget{}
mut sorted := []Widget{}
$if ser ? {
println('(Z_INDEX) em.receivers[$evt_type]: ')
for i, ch in em.receivers[evt_type] {
id := ch.id()
print('($i)[$id -> $ch.z_index] ')
}
println('\n')
}
for i, child in em.receivers[evt_type] {
sw << SortedWidget{i, child}
}
sw.sort_with_compare(compare_sorted_widget)
for child in sw {
sorted << child.w
}
em.receivers[evt_type] = sorted.reverse()
$if ser ? {
println('(SORTED) em.receivers[evt_type]: ')
for i, ch in em.receivers[evt_type] {
id := ch.id()
print('($i)[$id -> $ch.z_index] ')
}
println('\n')
}
}
pub fn (w Window) is_top_widget(widget Widget, evt_type string) bool {
pi := w.evt_mngr.point_inside[evt_type]
$if evt_mngr ? {
println('is_top_widget $widget.id ? ${pi.len >= 1 && pi.first().id == widget.id} with pi = ${pi.map(it.id)}')
}
return pi.len >= 1 && pi.first().id == widget.id
}
pub fn (w Window) point_inside_receivers(evt_type string) []string {
return w.evt_mngr.point_inside[evt_type].map(it.id)
}