FlightGear next
FGButton.cxx
Go to the documentation of this file.
1// FGButton.cxx -- a simple button/key wrapper class
2//
3// Written by Torsten Dreyer, started August 2009
4// Based on work from David Megginson, started May 2001.
5//
6// Copyright (C) 2009 Torsten Dreyer, Torsten (at) t3r _dot_ de
7// Copyright (C) 2001 David Megginson, david@megginson.com
8//
9// This program is free software; you can redistribute it and/or
10// modify it under the terms of the GNU General Public License as
11// published by the Free Software Foundation; either version 2 of the
12// License, or (at your option) any later version.
13//
14// This program is distributed in the hope that it will be useful, but
15// WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17// General Public License for more details.
18//
19// You should have received a copy of the GNU General Public License
20// along with this program; if not, write to the Free Software
21// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22//
23// $Id$
24
25#ifdef HAVE_CONFIG_H
26# include <config.h>
27#endif
28
29#include "FGButton.hxx"
30
31
33 : is_repeatable(false),
34 interval_sec(0),
35 delay_sec(0),
37 last_dt(0),
38 last_state(0)
39{
40}
41
43{
44 // bindings is a list of SGSharedPtr<SGBindings>
45 // no cleanup required
46}
47
48
49void FGButton::init(const SGPropertyNode* node, const std::string& name,
50 const std::string& module)
51{
52 if (node == 0) {
53 SG_LOG(SG_INPUT, SG_DEBUG, "No bindings for button " << name);
54 } else {
55 is_repeatable = node->getBoolValue("repeatable", is_repeatable);
56 // Get the bindings for the button
57 read_bindings( node, bindings, KEYMOD_NONE, module );
58 }
59}
60
61void FGButton::update( int modifiers, bool pressed, int x, int y)
62{
63 if (pressed) {
64 // The press event may be repeated.
65 if (!last_state || is_repeatable) {
66 SG_LOG( SG_INPUT, SG_DEBUG, "FGButton: Button has been pressed" );
67 for (unsigned int k = 0; k < bindings[modifiers].size(); k++) {
68 bindings[modifiers][k]->fire(x, y);
69 }
70 }
71 } else {
72 // The release event is never repeated.
73 if (last_state) {
74 SG_LOG( SG_INPUT, SG_DEBUG, "FGButton: Button has been released" );
75 for (unsigned int k = 0; k < bindings[modifiers|KEYMOD_RELEASED].size(); k++)
76 bindings[modifiers|KEYMOD_RELEASED][k]->fire(x, y);
77 }
78 }
79
80 last_state = pressed;
81}
82
83
void init(const SGPropertyNode *node, const std::string &name, const std::string &module)
Definition FGButton.cxx:49
virtual ~FGButton()
Definition FGButton.cxx:42
bool is_repeatable
Definition FGButton.hxx:38
void update(int modifiers, bool pressed, int x=-1, int y=-1)
Definition FGButton.cxx:61
int last_state
Definition FGButton.hxx:41
float interval_sec
Definition FGButton.hxx:39
float last_dt
Definition FGButton.hxx:40
float delay_sec
Definition FGButton.hxx:39
float release_delay_sec
Definition FGButton.hxx:39
binding_list_t bindings[KEYMOD_MAX]
Definition FGButton.hxx:42
static void read_bindings(const SGPropertyNode *base, binding_list_t *binding_list, int modifiers, const std::string &module)
const char * name
@ KEYMOD_NONE
Definition fg_os.hxx:24
@ KEYMOD_RELEASED
Definition fg_os.hxx:25