168 lines
5.3 KiB
C++
168 lines
5.3 KiB
C++
// Filename: clientButtonDevice.cxx
|
|
// Created by: drose (26Jan01)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
|
|
//
|
|
// All use of this software is subject to the terms of the Panda 3d
|
|
// Software license. You should have received a copy of this license
|
|
// along with this source code; you will also find a current copy of
|
|
// the license at http://www.panda3d.org/license.txt .
|
|
//
|
|
// To contact the maintainers of this program write to
|
|
// panda3d@yahoogroups.com .
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
#include "clientButtonDevice.h"
|
|
|
|
#include <indent.h>
|
|
|
|
TypeHandle ClientButtonDevice::_type_handle;
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: ClientButtonDevice::Constructor
|
|
// Access: Protected
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
ClientButtonDevice::
|
|
ClientButtonDevice(ClientBase *client, const string &device_name):
|
|
ClientDevice(client, get_class_type(), device_name)
|
|
{
|
|
_button_events = new ButtonEventDataTransition();
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: ClientButtonDevice::set_button_state
|
|
// Access: Public
|
|
// Description: Sets the state of the indicated button index, where
|
|
// true indicates down, and false indicates up. This
|
|
// may generate a ButtonEvent if the button has an
|
|
// associated ButtonHandle. The caller should ensure
|
|
// that lock() is in effect while this call is made.
|
|
////////////////////////////////////////////////////////////////////
|
|
void ClientButtonDevice::
|
|
set_button_state(int index, bool down) {
|
|
ensure_button_index(index);
|
|
nassertv(index >= 0 && index < (int)_buttons.size());
|
|
_buttons[index]._state = down ? S_down : S_up;
|
|
|
|
ButtonHandle handle = _buttons[index]._handle;
|
|
if (handle != ButtonHandle::none()) {
|
|
_button_events->push_back(ButtonEvent(handle, down));
|
|
}
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: ClientButtonDevice::ensure_button_index
|
|
// Access: Private
|
|
// Description: Guarantees that there is a slot in the array for the
|
|
// indicated index number, by filling the array up to
|
|
// that index if necessary.
|
|
////////////////////////////////////////////////////////////////////
|
|
void ClientButtonDevice::
|
|
ensure_button_index(int index) {
|
|
nassertv(index >= 0);
|
|
|
|
_buttons.reserve(index + 1);
|
|
while ((int)_buttons.size() <= index) {
|
|
_buttons.push_back(ButtonState());
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: ClientButtonDevice::output
|
|
// Access: Public, Virtual
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
void ClientButtonDevice::
|
|
output(ostream &out) const {
|
|
out << get_type() << " " << get_device_name() << " (";
|
|
output_buttons(out);
|
|
out << ")";
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: ClientButtonDevice::write
|
|
// Access: Public, Virtual
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
void ClientButtonDevice::
|
|
write(ostream &out, int indent_level) const {
|
|
indent(out, indent_level) << get_type() << " " << get_device_name() << ":\n";
|
|
write_buttons(out, indent_level + 2);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: ClientButtonDevice::output_buttons
|
|
// Access: Public
|
|
// Description: Writes a one-line string of all of the current button
|
|
// states.
|
|
////////////////////////////////////////////////////////////////////
|
|
void ClientButtonDevice::
|
|
output_buttons(ostream &out) const {
|
|
bool any_buttons = false;
|
|
Buttons::const_iterator bi;
|
|
for (bi = _buttons.begin(); bi != _buttons.end(); ++bi) {
|
|
const ButtonState &state = (*bi);
|
|
if (state._state != S_unknown) {
|
|
if (any_buttons) {
|
|
out << ", ";
|
|
}
|
|
any_buttons = true;
|
|
out << (int)(bi - _buttons.begin()) << "=";
|
|
if (state._state == S_up) {
|
|
out << "up";
|
|
} else {
|
|
out << "down";
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!any_buttons) {
|
|
out << "no known buttons";
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: ClientButtonDevice::write_buttons
|
|
// Access: Public
|
|
// Description: Writes a multi-line description of the current button
|
|
// states.
|
|
////////////////////////////////////////////////////////////////////
|
|
void ClientButtonDevice::
|
|
write_buttons(ostream &out, int indent_level) const {
|
|
bool any_buttons = false;
|
|
Buttons::const_iterator bi;
|
|
for (bi = _buttons.begin(); bi != _buttons.end(); ++bi) {
|
|
const ButtonState &state = (*bi);
|
|
if (state._state != S_unknown) {
|
|
any_buttons = true;
|
|
|
|
indent(out, indent_level)
|
|
<< (int)(bi - _buttons.begin()) << ". ";
|
|
|
|
if (state._handle != ButtonHandle::none()) {
|
|
out << "(" << state._handle << ") ";
|
|
}
|
|
|
|
if (state._state == S_up) {
|
|
out << "up";
|
|
} else {
|
|
out << "down";
|
|
}
|
|
out << "\n";
|
|
}
|
|
}
|
|
|
|
if (!any_buttons) {
|
|
indent(out, indent_level)
|
|
<< "(no known buttons)\n";
|
|
}
|
|
}
|