open_toontown_panda3d/panda/src/tform/mouseInterfaceNode.cxx

152 lines
5.7 KiB
C++

// Filename: mouseInterfaceNode.cxx
// Created by: drose (11Jun04)
//
////////////////////////////////////////////////////////////////////
//
// 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."
//
////////////////////////////////////////////////////////////////////
#include "trackball.h"
#include "buttonEvent.h"
#include "buttonEventList.h"
#include "dataNodeTransmit.h"
#include "mouseData.h"
TypeHandle MouseInterfaceNode::_type_handle;
////////////////////////////////////////////////////////////////////
// Function: MouseInterfaceNode::Constructor
// Access: Public
// Description:
////////////////////////////////////////////////////////////////////
MouseInterfaceNode::
MouseInterfaceNode(const string &name) :
DataNode(name)
{
_button_events_input = define_input("button_events", ButtonEventList::get_class_type());
}
////////////////////////////////////////////////////////////////////
// Function: MouseInterfaceNode::Destructor
// Access: Public, Virtual
// Description:
////////////////////////////////////////////////////////////////////
MouseInterfaceNode::
~MouseInterfaceNode() {
}
////////////////////////////////////////////////////////////////////
// Function: MouseInterfaceNode::require_button
// Access: Published
// Description: 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);
}
}
////////////////////////////////////////////////////////////////////
// Function: MouseInterfaceNode::clear_button
// Access: Published
// Description: 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);
}
}
////////////////////////////////////////////////////////////////////
// Function: MouseInterfaceNode::clear_all_button
// Access: Published
// Description: 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);
}
////////////////////////////////////////////////////////////////////
// Function: MouseInterfaceNode::watch_button
// Access: Protected
// Description: 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);
}
////////////////////////////////////////////////////////////////////
// Function: MouseInterfaceNode::check_button_events
// Access: Protected
// Description: 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 = NULL;
if (input.has_data(_button_events_input)) {
DCAST_INTO_R(button_events, input.get_data(_button_events_input).get_ptr(), false);
button_events->update_mods(_current_button_state);
}
required_buttons_match =
(_current_button_state & _required_buttons_mask) == _required_buttons_state;
return button_events;
}