152 lines
5.7 KiB
C++
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;
|
|
}
|