|
|
@@ -0,0 +1,143 @@
|
|
|
+/**
|
|
|
+ * PANDA 3D SOFTWARE
|
|
|
+ * Copyright (c) Carnegie Mellon University. All rights reserved.
|
|
|
+ *
|
|
|
+ * All use of this software is subject to the terms of the revised BSD
|
|
|
+ * license. You should have received a copy of this license along
|
|
|
+ * with this source code in a file named "LICENSE."
|
|
|
+ *
|
|
|
+ * @file pointerThrower.cxx
|
|
|
+ * @author rdb
|
|
|
+ * @date 2021-12-22
|
|
|
+ */
|
|
|
+
|
|
|
+#include "pointerThrower.h"
|
|
|
+
|
|
|
+#include "pointerEvent.h"
|
|
|
+#include "pointerEventList.h"
|
|
|
+#include "dataNodeTransmit.h"
|
|
|
+#include "throw_event.h"
|
|
|
+#include "event.h"
|
|
|
+#include "indent.h"
|
|
|
+#include "dcast.h"
|
|
|
+
|
|
|
+using std::string;
|
|
|
+
|
|
|
+TypeHandle PointerThrower::_type_handle;
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+PointerThrower::
|
|
|
+PointerThrower(const string &name, const string &prefix) :
|
|
|
+ DataNode(name),
|
|
|
+ _down_event(prefix + "pointer-down"),
|
|
|
+ _up_event(prefix + "pointer-up"),
|
|
|
+ _move_event(prefix + "pointer-move")
|
|
|
+{
|
|
|
+ _pointer_events_input = define_input("pointer_events", PointerEventList::get_class_type());
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ */
|
|
|
+PointerThrower::
|
|
|
+~PointerThrower() {
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Adds the indicated parameter to the list of parameters that will be passed
|
|
|
+ * with each event generated by this PointerThrower.
|
|
|
+ */
|
|
|
+void PointerThrower::
|
|
|
+add_parameter(const EventParameter &obj) {
|
|
|
+ _parameters.push_back(obj);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Returns the number of parameters that have been added to the list of
|
|
|
+ * parameters to be passed with each event generated by this PointerThrower.
|
|
|
+ */
|
|
|
+int PointerThrower::
|
|
|
+get_num_parameters() const {
|
|
|
+ return _parameters.size();
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Returns the nth parameter that has been added to the list of parameters
|
|
|
+ * passed with each event generated by this PointerThrower.
|
|
|
+ */
|
|
|
+EventParameter PointerThrower::
|
|
|
+get_parameter(size_t n) const {
|
|
|
+ nassertr(n < _parameters.size(), EventParameter(0));
|
|
|
+ return _parameters[n];
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Throw all events for button events found in the data element.
|
|
|
+ */
|
|
|
+void PointerThrower::
|
|
|
+write(std::ostream &out, int indent_level) const {
|
|
|
+ DataNode::write(out, indent_level);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Generates a pointer event, if one is configured.
|
|
|
+ */
|
|
|
+void PointerThrower::
|
|
|
+do_general_event(const PointerEvent &pointer_event) {
|
|
|
+ std::string event_name;
|
|
|
+
|
|
|
+ if (pointer_event._pressure > 0.0) {
|
|
|
+ if (_active_ids.insert(pointer_event._id).second) {
|
|
|
+ event_name = _down_event;
|
|
|
+ } else {
|
|
|
+ event_name = _move_event;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (_active_ids.erase(pointer_event._id)) {
|
|
|
+ event_name = _up_event;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ // Don't generate events for inactive pointers.
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (event_name.empty()) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ PT(Event) event = new Event(event_name);
|
|
|
+
|
|
|
+ //event->add_parameter(new ParamPointerEvent(pointer_event));
|
|
|
+
|
|
|
+ for (const EventParameter ¶m : _parameters) {
|
|
|
+ event->add_parameter(param);
|
|
|
+ }
|
|
|
+
|
|
|
+ throw_event(event);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * The virtual implementation of transmit_data(). This function receives an
|
|
|
+ * array of input parameters and should generate an array of output
|
|
|
+ * parameters. The input parameters may be accessed with the index numbers
|
|
|
+ * returned by the define_input() calls that were made earlier (presumably in
|
|
|
+ * the constructor); likewise, the output parameters should be set with the
|
|
|
+ * index numbers returned by the define_output() calls.
|
|
|
+ */
|
|
|
+void PointerThrower::
|
|
|
+do_transmit_data(DataGraphTraverser *, const DataNodeTransmit &input,
|
|
|
+ DataNodeTransmit &output) {
|
|
|
+
|
|
|
+ if (input.has_data(_pointer_events_input)) {
|
|
|
+ const PointerEventList *pointer_events;
|
|
|
+ DCAST_INTO_V(pointer_events, input.get_data(_pointer_events_input).get_ptr());
|
|
|
+
|
|
|
+ int num_events = pointer_events->get_num_events();
|
|
|
+ for (int i = 0; i < num_events; i++) {
|
|
|
+ const PointerEvent &pe = pointer_events->get_event(i);
|
|
|
+ do_general_event(pe);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|