-
Notifications
You must be signed in to change notification settings - Fork 224
/
Copy pathclick_handling.dm
121 lines (96 loc) · 3.56 KB
/
click_handling.dm
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
Custom click handling
*/
#define SETUP_CLICK_HANDLERS \
if(!click_handlers) { \
click_handlers = new(); \
click_handlers += new/datum/click_handler/default(src) \
}
/mob
var/list/click_handlers
/mob/Destroy()
QDEL_NULL(status_markers)
QDEL_NULL_LIST(click_handlers)
. = ..()
var/global/const/CLICK_HANDLER_NONE = BITFLAG(0)
var/global/const/CLICK_HANDLER_REMOVE_ON_MOB_LOGOUT = BITFLAG(1)
var/global/const/CLICK_HANDLER_REMOVE_IF_NOT_TOP = BITFLAG(2)
var/global/const/CLICK_HANDLER_ALL = (CLICK_HANDLER_NONE|CLICK_HANDLER_REMOVE_ON_MOB_LOGOUT|CLICK_HANDLER_REMOVE_IF_NOT_TOP)
/datum/click_handler
var/mob/user
var/flags = 0
/datum/click_handler/New(var/mob/user)
..()
src.user = user
if(flags & (CLICK_HANDLER_REMOVE_ON_MOB_LOGOUT))
events_repository.register(/decl/observ/logged_out, user, src, TYPE_PROC_REF(/datum/click_handler, OnMobLogout))
/datum/click_handler/Destroy()
if(flags & (CLICK_HANDLER_REMOVE_ON_MOB_LOGOUT))
events_repository.unregister(/decl/observ/logged_out, user, src, TYPE_PROC_REF(/datum/click_handler, OnMobLogout))
user = null
. = ..()
/datum/click_handler/proc/Enter()
return
/datum/click_handler/proc/Exit()
return
/datum/click_handler/proc/OnMobLogout()
user.RemoveClickHandler(src)
/datum/click_handler/proc/OnClick(var/atom/A, var/params)
return
/datum/click_handler/proc/OnDblClick(var/atom/A, var/params)
return
/datum/click_handler/default/OnClick(var/atom/A, var/params)
user.ClickOn(A, params)
/datum/click_handler/default/OnDblClick(var/atom/A, var/params)
user.DblClickOn(A, params)
/mob/proc/GetClickHandler(var/datum/click_handler/popped_handler)
SETUP_CLICK_HANDLERS
return click_handlers[1]
// Returns TRUE if the given click handler was removed, otherwise FALSE
/mob/proc/RemoveClickHandler(var/datum/click_handler/click_handler)
if(!click_handlers)
return FALSE
if(ispath(click_handler)) // If we were given a path instead of an instance, find the first matching instance by type
// No removing of the default click handler
if(click_handler == /datum/click_handler/default)
return FALSE
click_handler = get_instance_of_strict_type(click_handlers, click_handler)
if(!click_handler)
return FALSE
. = (click_handler in click_handlers)
if(!.)
return
var/was_top = click_handlers[1] == click_handler
if(was_top)
click_handler.Exit()
click_handlers.Remove(click_handler)
qdel(click_handler)
if(!was_top)
return
click_handler = click_handlers[1]
if(click_handler)
click_handler.Enter()
// Returns TRUE if the given click handler type was NOT previously the top click handler but now is
/mob/proc/PushClickHandler(var/datum/click_handler/new_click_handler_type)
// No manipulation of the default click handler
if(new_click_handler_type == /datum/click_handler/default)
return FALSE
if((initial(new_click_handler_type.flags) & CLICK_HANDLER_REMOVE_ON_MOB_LOGOUT) && !client)
return FALSE
SETUP_CLICK_HANDLERS
var/datum/click_handler/click_handler = click_handlers[1]
if(click_handler.type == new_click_handler_type)
return FALSE // If the top click handler is already the same as the desired one, bow out
click_handler.Exit()
if(click_handler.flags & CLICK_HANDLER_REMOVE_IF_NOT_TOP)
click_handlers.Remove(click_handler)
qdel(click_handler)
click_handler = get_instance_of_strict_type(click_handlers, click_handler)
if(click_handler)
click_handlers.Remove(click_handler)
else
click_handler = new new_click_handler_type(src)
click_handlers.Insert(1, click_handler) // Insert new handlers first
click_handler.Enter()
return TRUE
#undef SETUP_CLICK_HANDLERS