open_toontown_panda3d/panda/src/tform/mouseInterfaceNode.cxx

132 lines
3.8 KiB
C++

/**
* 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 mouseInterfaceNode.cxx
* @author drose
* @date 2004-06-11
*/
#include "trackball.h"
#include "buttonEvent.h"
#include "buttonEventList.h"
#include "dataNodeTransmit.h"
#include "mouseData.h"
TypeHandle MouseInterfaceNode::_type_handle;
/**
*
*/
MouseInterfaceNode::
MouseInterfaceNode(const std::string &name) :
DataNode(name)
{
_button_events_input = define_input("button_events", ButtonEventList::get_class_type());
}
/**
*
*/
MouseInterfaceNode::
~MouseInterfaceNode() {
}
/**
* Indicates that the indicated button must be in the required state (either
* up or down) in order for this particular MouseInterfaceNode to do anything.
* For instance, this may be called to make a Trackball object respect mouse
* input only when the control key is held down.
*/
void MouseInterfaceNode::
require_button(const ButtonHandle &button, bool is_down) {
_required_buttons_mask.add_button(button);
_required_buttons_state.set_button_list(_required_buttons_mask);
_current_button_state.set_button_list(_required_buttons_mask);
_required_buttons_mask.button_down(button);
if (is_down) {
_required_buttons_state.button_down(button);
} else {
_required_buttons_state.button_up(button);
}
}
/**
* Removes any requirement on the indicated button set by an earlier call to
* require_button().
*/
void MouseInterfaceNode::
clear_button(const ButtonHandle &button) {
_required_buttons_mask.button_up(button);
_required_buttons_state.button_up(button);
// The _required_buttons_mask and state must always keep the buttons that
// are listed in _watched_buttons.
if (!_watched_buttons.has_button(button)) {
_required_buttons_mask.remove_button(button);
_required_buttons_state.set_button_list(_required_buttons_mask);
_current_button_state.set_button_list(_required_buttons_mask);
}
}
/**
* Removes all requirements on buttons set by an earlier call to
* require_button().
*/
void MouseInterfaceNode::
clear_all_buttons() {
_required_buttons_mask.all_buttons_up();
_required_buttons_state.all_buttons_up();
_required_buttons_mask.set_button_list(_watched_buttons);
_required_buttons_state.set_button_list(_watched_buttons);
_current_button_state.set_button_list(_watched_buttons);
}
/**
* Indicates that the derived class would like to know the state of the given
* button.
*/
void MouseInterfaceNode::
watch_button(const ButtonHandle &button) {
_watched_buttons.add_button(button);
// We also add the button to _required_buttons_mask and
// _required_buttons_state, but it's left 'up' in these two.
_required_buttons_mask.add_button(button);
_required_buttons_state.set_button_list(_required_buttons_mask);
_current_button_state.set_button_list(_required_buttons_mask);
}
/**
* Gets the button events from the data graph and updates the ModifierButtons
* objects appropriately.
*
* Sets required_buttons_match to true if the required combination of buttons
* are being held down, or false otherwise.
*
* The return value is the list of button events processed this frame, or NULL
* if there are no button events.
*/
const ButtonEventList *MouseInterfaceNode::
check_button_events(const DataNodeTransmit &input,
bool &required_buttons_match) {
const ButtonEventList *button_events = nullptr;
if (input.has_data(_button_events_input)) {
DCAST_INTO_R(button_events, input.get_data(_button_events_input).get_ptr(), nullptr);
button_events->update_mods(_current_button_state);
}
required_buttons_match =
(_current_button_state & _required_buttons_mask) == _required_buttons_state;
return button_events;
}