15 #include "modifierButtons.h"
38 _button_list(copy._button_list),
60 if (_button_list == other._button_list) {
63 _state &= other._state;
71 for (
int i = 0; i < num_buttons; i++) {
73 _state &= ~((BitmaskType)1 << i);
89 if (_button_list == other._button_list) {
92 _state |= other._state;
100 for (
int i = 0; i < num_buttons; i++) {
124 if (_button_list != other._button_list) {
128 BitmaskType new_state = 0;
130 for (
int i = 0; i < num_buttons; i++) {
132 new_state |= ((BitmaskType)1 << i);
139 _button_list = other._button_list;
154 if (_button_list == other._button_list) {
157 return (_state == other._state);
169 for (i = 0; i < (int)_button_list.size(); i++) {
171 if (!other.
is_down(_button_list[i])) {
183 int num_other_down = 0;
184 for (i = 0; i < num_other_buttons; i++) {
190 return (num_down == num_other_down);
206 static const int max_buttons =
sizeof(BitmaskType) * 8;
208 if ((
int)_button_list.size() >= max_buttons) {
218 modify_button_list();
219 _button_list.push_back(button);
233 for (bi = _button_list.begin(); bi != _button_list.end(); ++bi) {
260 for (
int i = 0; i < (int)_button_list.size(); i++) {
261 if (button == _button_list[i]) {
262 modify_button_list();
263 _button_list.erase(_button_list.begin() + i);
267 BitmaskType mask = ((BitmaskType)1 << i);
268 BitmaskType below = mask - 1;
269 BitmaskType above = (~below) & (~mask);
271 _state = ((_state & above) >> 1) | (_state & below);
291 for (
int i = 0; i < (int)_button_list.size(); i++) {
292 if (button.
matches(_button_list[i])) {
293 _state |= ((BitmaskType)1 << i);
313 for (
int i = 0; i < (int)_button_list.size(); i++) {
314 if (button.
matches(_button_list[i])) {
315 _state &= ~((BitmaskType)1 << i);
332 for (
int i = 0; i < (int)_button_list.size(); i++) {
333 if (button.
matches(_button_list[i])) {
334 return ((_state & ((BitmaskType)1 << i)) != 0);
351 for (
int i = 0; i < (int)_button_list.size(); i++) {
352 if ((_state & ((BitmaskType)1 << i)) != 0) {
353 prefix += _button_list[i].get_name();
370 for (
int i = 0; i < (int)_button_list.size(); i++) {
371 if ((_state & ((BitmaskType)1 << i)) != 0) {
372 out <<
" " << _button_list[i];
387 out <<
"ModifierButtons:\n";
388 for (
int i = 0; i < (int)_button_list.size(); i++) {
389 out <<
" " << _button_list[i];
390 if ((_state & ((BitmaskType)1 << i)) != 0) {
409 void ModifierButtons::
410 modify_button_list() {
411 if (_button_list.get_ref_count() > 1) {
418 _button_list.v() = old_list.v();
422 nassertv(_button_list.get_ref_count() == 1);