mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-02 01:44:06 -04:00
global event handler
This commit is contained in:
parent
ffb5bfdc66
commit
dcc8d1d552
@ -22,6 +22,9 @@
|
||||
|
||||
TypeHandle EventHandler::_type_handle;
|
||||
|
||||
EventHandler *EventHandler::_global_event_handler = 0;
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: EventHandler::Constructor
|
||||
// Access: Public
|
||||
@ -54,6 +57,7 @@ process_events() {
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void EventHandler::
|
||||
dispatch_event(const CPT_Event &event) {
|
||||
nassertv(!event.is_null());
|
||||
// Is the event name defined in the hook table? It will be if
|
||||
// anyone has ever assigned a hook to this particular event name.
|
||||
Hooks::const_iterator hi;
|
||||
@ -66,10 +70,11 @@ dispatch_event(const CPT_Event &event) {
|
||||
|
||||
Functions::const_iterator fi;
|
||||
for (fi = copy_functions.begin(); fi != copy_functions.end(); ++fi) {
|
||||
if (event_cat.is_spam())
|
||||
if (event_cat.is_spam()) {
|
||||
event_cat->spam() << "calling callback 0x" << (void*)(*fi)
|
||||
<< " for event '" << event->get_name() << "'"
|
||||
<< endl;
|
||||
}
|
||||
(*fi)(event);
|
||||
}
|
||||
}
|
||||
@ -107,11 +112,9 @@ write(ostream &out) const {
|
||||
if ((*hi).first < (*cbhi).first) {
|
||||
write_hook(out, *hi);
|
||||
++hi;
|
||||
|
||||
} else if ((*cbhi).first < (*hi).first) {
|
||||
write_cbhook(out, *cbhi);
|
||||
++cbhi;
|
||||
|
||||
} else {
|
||||
write_hook(out, *hi);
|
||||
write_cbhook(out, *cbhi);
|
||||
@ -144,9 +147,12 @@ write(ostream &out) const {
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool EventHandler::
|
||||
add_hook(const string &event_name, EventFunction *function) {
|
||||
if (event_cat.is_debug())
|
||||
if (event_cat.is_debug()) {
|
||||
event_cat.debug() << "adding hook for event '" << event_name
|
||||
<< "' with function 0x" << (void*)function << endl;
|
||||
}
|
||||
assert(!event_name.empty());
|
||||
assert(function);
|
||||
return _hooks[event_name].insert(function).second;
|
||||
}
|
||||
|
||||
@ -164,6 +170,8 @@ add_hook(const string &event_name, EventFunction *function) {
|
||||
bool EventHandler::
|
||||
add_hook(const string &event_name, EventCallbackFunction *function,
|
||||
void *data) {
|
||||
assert(!event_name.empty());
|
||||
assert(function);
|
||||
return _cbhooks[event_name].insert(CallbackFunction(function, data)).second;
|
||||
}
|
||||
|
||||
@ -175,6 +183,7 @@ add_hook(const string &event_name, EventCallbackFunction *function,
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool EventHandler::
|
||||
has_hook(const string &event_name) const {
|
||||
assert(!event_name.empty());
|
||||
Hooks::const_iterator hi;
|
||||
hi = _hooks.find(event_name);
|
||||
if (hi != _hooks.end()) {
|
||||
@ -204,6 +213,8 @@ has_hook(const string &event_name) const {
|
||||
////////////////////////////////////////////////////////////////////
|
||||
bool EventHandler::
|
||||
remove_hook(const string &event_name, EventFunction *function) {
|
||||
assert(!event_name.empty());
|
||||
assert(function);
|
||||
return _hooks[event_name].erase(function) != 0;
|
||||
}
|
||||
|
||||
@ -219,6 +230,8 @@ remove_hook(const string &event_name, EventFunction *function) {
|
||||
bool EventHandler::
|
||||
remove_hook(const string &event_name, EventCallbackFunction *function,
|
||||
void *data) {
|
||||
assert(!event_name.empty());
|
||||
assert(function);
|
||||
return _cbhooks[event_name].erase(CallbackFunction(function, data)) != 0;
|
||||
}
|
||||
|
||||
@ -234,6 +247,17 @@ remove_all_hooks() {
|
||||
_cbhooks.clear();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: EventHandler::make_global_event_handler
|
||||
// Access: Protected, Static
|
||||
// Description:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void EventHandler::
|
||||
make_global_event_handler(EventQueue *queue) {
|
||||
assert(queue);
|
||||
_global_event_handler = new EventHandler(queue);
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: EventHandler::write_hook
|
||||
|
@ -39,7 +39,8 @@ class EventQueue;
|
||||
//
|
||||
// This class is not necessary when the hooks are
|
||||
// detected and processed entirely by the scripting
|
||||
// language, e.g. via Scheme hooks.
|
||||
// language, e.g. via Scheme hooks or the messenger
|
||||
// in Python.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
class EXPCL_PANDAEXPRESS EventHandler : public TypedObject {
|
||||
public:
|
||||
@ -56,6 +57,8 @@ PUBLISHED:
|
||||
|
||||
void write(ostream &out) const;
|
||||
|
||||
INLINE static EventHandler *get_global_event_handler(EventQueue *queue);
|
||||
|
||||
public:
|
||||
bool add_hook(const string &event_name, EventFunction *function);
|
||||
bool add_hook(const string &event_name, EventCallbackFunction *function,
|
||||
@ -79,6 +82,9 @@ protected:
|
||||
CallbackHooks _cbhooks;
|
||||
EventQueue &_queue;
|
||||
|
||||
static EventHandler *_global_event_handler;
|
||||
static void make_global_event_handler(EventQueue *queue);
|
||||
|
||||
private:
|
||||
void write_hook(ostream &out, const Hooks::value_type &hook) const;
|
||||
void write_cbhook(ostream &out, const CallbackHooks::value_type &hook) const;
|
||||
@ -102,4 +108,6 @@ private:
|
||||
static TypeHandle _type_handle;
|
||||
};
|
||||
|
||||
#include "eventHandler.I"
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user