Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/trunk/src/core/InputBuffer.cc @ 1362

Last change on this file since 1362 was 1349, checked in by rgrieder, 16 years ago
  • merged input branch back to trunk
File size: 5.6 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Fabian 'x3n' Landau
24 *   Co-authors:
25 *      Reto Grieder
26 *
27 */
28
29#include "InputBuffer.h"
30
31#include <iostream>
32
33#include "util/Clipboard.h"
34#include "CoreIncludes.h"
35#include "ConfigValueIncludes.h"
36
37namespace orxonox
38{
39  InputBuffer::InputBuffer(const std::string allowedChars) :
40    buffer_(""),
41    allowedChars_(allowedChars),
42    lastKey_(KeyCode::Unassigned),
43    timeSinceKeyPressed_(0.0f),
44    timeSinceKeyRepeated_(0.0f),
45    keysToRepeat_(0)
46  {
47    RegisterObject(InputBuffer);
48    setConfigValues();
49  }
50
51  void InputBuffer::setConfigValues()
52  {
53    SetConfigValue(keyRepeatDeleay_, 0.4).description("Key repeat deleay of the input buffer");
54    SetConfigValue(keyRepeatTime_, 0.022).description("Key repeat time of the input buffer");
55    if (keyRepeatDeleay_ < 0.0)
56    {
57      ResetConfigValue(keyRepeatDeleay_);
58    }
59    if (keyRepeatTime_ < 0.0)
60    {
61      ResetConfigValue(keyRepeatTime_);
62    }
63  }
64  /*
65  void InputBuffer::registerListener(InputBufferListener* listener, void (InputBufferListener::*function)(), bool bOnlySingleInput)
66  {
67    struct InputBufferListenerTuple newListener = {listener, function, true, bOnlySingleInput, ' '};
68    listeners_.insert(listeners_.end(), newListener);
69  }
70
71  void InputBuffer::registerListener(InputBufferListener* listener, void (InputBufferListener::*function)(), char char_, bool bOnlySingleInput)
72  {
73    struct InputBufferListenerTuple newListener = {listener, function, false, bOnlySingleInput, char_};
74    listeners_.insert(listeners_.end(), newListener);
75  }
76  */
77  void InputBuffer::set(const std::string& input)
78  {
79    buffer_ = "";
80    append(input);
81  }
82
83  void InputBuffer::append(const std::string& input)
84  {
85    for (unsigned int i = 0; i < input.size(); i++)
86    {
87      if (charIsAllowed(input[i]))
88        buffer_ += input[i];
89
90      updated(input[i], false);
91    }
92    updated();
93  }
94
95  void InputBuffer::append(const char& input)
96  {
97    if (charIsAllowed(input))
98      buffer_ += input;
99
100    updated(input, true);
101  }
102
103  void InputBuffer::clear()
104  {
105    buffer_ = "";
106    updated();
107  }
108
109  void InputBuffer::removeLast()
110  {
111    buffer_ = buffer_.substr(0, buffer_.size() - 1);
112    updated();
113  }
114
115  void InputBuffer::updated()
116  {
117    for (std::list<InputBufferListenerTuple>::iterator it = listeners_.begin(); it != listeners_.end(); ++it)
118    {
119      if ((*it).bListenToAllChanges_)
120        (*(*it).listener_.*(*it).function_)();
121    }
122  }
123
124  void InputBuffer::updated(const char& update, bool bSingleInput)
125  {
126    for (std::list<InputBufferListenerTuple>::iterator it = listeners_.begin(); it != listeners_.end(); ++it)
127    {
128      if (((*it).bListenToAllChanges_ || ((*it).char_ == update)) && (!(*it).bOnlySingleInput_ || bSingleInput))
129        (*(*it).listener_.*(*it).function_)();
130    }
131  }
132
133  bool InputBuffer::charIsAllowed(const char& input)
134  {
135    if (allowedChars_ == "")
136      return true;
137    else
138      return (allowedChars_.find(input) != std::string::npos);
139  }
140
141
142  void InputBuffer::processKey(const KeyEvent &evt)
143  {
144    if (evt.isModifierDown(KeyboardModifier::Ctrl))
145    {
146      if (evt.key == KeyCode::V)
147        append(fromClipboard());
148      else if (evt.key == KeyCode::C)
149        toClipboard(buffer_);
150      else if (evt.key == KeyCode::X)
151      {
152        toClipboard(buffer_);
153        clear();
154      }
155    }
156    else if (evt.isModifierDown(KeyboardModifier::Shift))
157    {
158      if (evt.key == KeyCode::Insert)
159      {
160        append(fromClipboard());
161      }
162      else if (evt.key == KeyCode::Delete)
163      {
164        toClipboard(buffer_);
165        clear();
166      }
167    }
168    //std::string input = keyboard_->getAsString(e.key);
169    /*if (input.size() >= 1)
170    append(input[0]);*/
171
172    append((char)evt.text);
173  }
174
175  /**
176  * This tick() function is called by the InputManager if the InputBuffer is active.
177  * @param dt Delta time
178  */
179  void InputBuffer::tick(float dt)
180  {
181    timeSinceKeyPressed_ += dt;
182    if (keysToRepeat_ < 10 && timeSinceKeyPressed_ > keyRepeatDeleay_)
183    {
184      // initial time out has gone by, start repeating keys
185      while (timeSinceKeyPressed_ - timeSinceKeyRepeated_ > keyRepeatTime_)
186      {
187        timeSinceKeyRepeated_ += keyRepeatTime_;
188        keysToRepeat_++;
189      }
190    }
191  }
192
193  void InputBuffer::keyPressed(const KeyEvent &evt)
194  {
195    lastKey_ = evt.key;
196    timeSinceKeyPressed_ = 0.0;
197    timeSinceKeyRepeated_ = keyRepeatDeleay_;
198    keysToRepeat_ = 0;
199
200    processKey(evt);
201  }
202
203  void InputBuffer::keyHeld(const KeyEvent& evt)
204  {
205    if (evt.key == lastKey_)
206    {
207      while (keysToRepeat_)
208      {
209        processKey(evt);
210        keysToRepeat_--;
211      }
212    }
213  }
214
215}
Note: See TracBrowser for help on using the repository browser.