Panda3D
Loading...
Searching...
No Matches
mouseInterfaceNode.cxx
Go to the documentation of this file.
1/**
2 * PANDA 3D SOFTWARE
3 * Copyright (c) Carnegie Mellon University. All rights reserved.
4 *
5 * All use of this software is subject to the terms of the revised BSD
6 * license. You should have received a copy of this license along
7 * with this source code in a file named "LICENSE."
8 *
9 * @file mouseInterfaceNode.cxx
10 * @author drose
11 * @date 2004-06-11
12 */
13
14#include "trackball.h"
15#include "buttonEvent.h"
16#include "buttonEventList.h"
17#include "dataNodeTransmit.h"
18#include "mouseData.h"
19
20TypeHandle MouseInterfaceNode::_type_handle;
21
22/**
23 *
24 */
25MouseInterfaceNode::
26MouseInterfaceNode(const std::string &name) :
27 DataNode(name)
28{
29 _button_events_input = define_input("button_events", ButtonEventList::get_class_type());
30}
31
32/**
33 *
34 */
35MouseInterfaceNode::
36~MouseInterfaceNode() {
37}
38
39/**
40 * Indicates that the indicated button must be in the required state (either
41 * up or down) in order for this particular MouseInterfaceNode to do anything.
42 * For instance, this may be called to make a Trackball object respect mouse
43 * input only when the control key is held down.
44 */
46require_button(const ButtonHandle &button, bool is_down) {
47 _required_buttons_mask.add_button(button);
48 _required_buttons_state.set_button_list(_required_buttons_mask);
49 _current_button_state.set_button_list(_required_buttons_mask);
50
51 _required_buttons_mask.button_down(button);
52 if (is_down) {
53 _required_buttons_state.button_down(button);
54 } else {
55 _required_buttons_state.button_up(button);
56 }
57}
58
59/**
60 * Removes any requirement on the indicated button set by an earlier call to
61 * require_button().
62 */
64clear_button(const ButtonHandle &button) {
65 _required_buttons_mask.button_up(button);
66 _required_buttons_state.button_up(button);
67
68 // The _required_buttons_mask and state must always keep the buttons that
69 // are listed in _watched_buttons.
70
71 if (!_watched_buttons.has_button(button)) {
72 _required_buttons_mask.remove_button(button);
73 _required_buttons_state.set_button_list(_required_buttons_mask);
74 _current_button_state.set_button_list(_required_buttons_mask);
75 }
76}
77
78/**
79 * Removes all requirements on buttons set by an earlier call to
80 * require_button().
81 */
84 _required_buttons_mask.all_buttons_up();
85 _required_buttons_state.all_buttons_up();
86
87 _required_buttons_mask.set_button_list(_watched_buttons);
88 _required_buttons_state.set_button_list(_watched_buttons);
89 _current_button_state.set_button_list(_watched_buttons);
90}
91
92/**
93 * Indicates that the derived class would like to know the state of the given
94 * button.
95 */
96void MouseInterfaceNode::
97watch_button(const ButtonHandle &button) {
98 _watched_buttons.add_button(button);
99
100 // We also add the button to _required_buttons_mask and
101 // _required_buttons_state, but it's left 'up' in these two.
102 _required_buttons_mask.add_button(button);
103 _required_buttons_state.set_button_list(_required_buttons_mask);
104 _current_button_state.set_button_list(_required_buttons_mask);
105}
106
107/**
108 * Gets the button events from the data graph and updates the ModifierButtons
109 * objects appropriately.
110 *
111 * Sets required_buttons_match to true if the required combination of buttons
112 * are being held down, or false otherwise.
113 *
114 * The return value is the list of button events processed this frame, or NULL
115 * if there are no button events.
116 */
117const ButtonEventList *MouseInterfaceNode::
118check_button_events(const DataNodeTransmit &input,
119 bool &required_buttons_match) {
120 const ButtonEventList *button_events = nullptr;
121
122 if (input.has_data(_button_events_input)) {
123 DCAST_INTO_R(button_events, input.get_data(_button_events_input).get_ptr(), nullptr);
124 button_events->update_mods(_current_button_state);
125 }
126
127 required_buttons_match =
128 (_current_button_state & _required_buttons_mask) == _required_buttons_state;
129
130 return button_events;
131}
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
Records a set of button events that happened recently.
void update_mods(ModifierButtons &mods) const
Updates the indicated ModifierButtons object with all of the button up/down transitions indicated in ...
A ButtonHandle represents a single button from any device, including keyboard buttons and mouse butto...
Encapsulates the data generated from (or sent into) any particular DataNode.
const EventParameter & get_data(int index) const
Extracts the data for the indicated index, if it has been stored, or the empty parameter if it has no...
bool has_data(int index) const
Returns true if the indicated parameter has been stored, false otherwise.
The fundamental type of node for the data graph.
Definition dataNode.h:52
TypedWritableReferenceCount * get_ptr() const
Retrieves a pointer to the actual value stored in the parameter.
bool add_button(ButtonHandle button)
Adds the indicated button to the set of buttons that will be monitored for upness and downness.
bool remove_button(ButtonHandle button)
Removes the indicated button from the set of buttons being monitored.
bool button_up(ButtonHandle button)
Records that a particular button has been released.
void set_button_list(const ModifierButtons &other)
Sets the list of buttons to watch to be the same as that of the other ModifierButtons object.
bool has_button(ButtonHandle button) const
Returns true if the indicated button is in the set of buttons being monitored, false otherwise.
bool button_down(ButtonHandle button)
Records that a particular button has been pressed.
void all_buttons_up()
Marks all monitored buttons as being in the "up" state.
void clear_button(const ButtonHandle &button)
Removes any requirement on the indicated button set by an earlier call to require_button().
void clear_all_buttons()
Removes all requirements on buttons set by an earlier call to require_button().
void require_button(const ButtonHandle &button, bool is_down)
Indicates that the indicated button must be in the required state (either up or down) in order for th...
TypeHandle is the identifier used to differentiate C++ class types.
Definition typeHandle.h:81
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.