Merged 15170:15635 from trunk (no conflicts or even merges)
[blender.git] / source / gameengine / GameLogic / SCA_KeyboardSensor.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  * Sensor for keyboard input
29  */
30
31 #ifndef __KX_KEYBOARDSENSOR
32 #define __KX_KEYBOARDSENSOR
33
34 #include "SCA_ISensor.h"
35 #include "BoolValue.h"
36 #include <list>
37
38 /**
39  * The keyboard sensor listens to the keyboard, and passes on events
40  * on selected keystrokes. It has an alternate mode in which it logs
41  * keypresses to a property. Note that these modes are not mutually
42  * exclusive.  */
43 class SCA_KeyboardSensor : public SCA_ISensor
44 {
45         Py_Header;
46         class SCA_KeyboardManager*      m_pKeyboardMgr;
47
48
49         /**
50          * the key this sensor is sensing for
51          */
52         int                                                     m_hotkey;
53         short int                                       m_qual,m_qual2;
54         short int                                       m_val;
55         /**
56          * If this toggle is true, all incoming key events generate a
57          * response.
58          */
59         bool                                            m_bAllKeys;
60
61         /**
62          * The name of the property to which logged text is appended. If
63          * this property is not defined, no logging takes place.
64          */
65         STR_String      m_targetprop;
66         /**
67          * The property that indicates whether or not to log text when in
68          * loggin mode. If the property equals 0, no loggin is done. For
69          * all other values, logging is active. Logging can only become
70          * active if there is a property to log to. Logging is independant
71          * from hotkey settings. */
72         STR_String      m_toggleprop;
73
74         /**
75          * Log the keystrokes from the current input buffer.
76          */
77         void LogKeystrokes(void);
78         
79         /**
80          * Adds this key-code to the target prop.
81          */
82         void AddToTargetProp(int keyIndex);
83
84         /**
85          * Determine whether this character can be printed. We cannot use
86          * the library functions here, because we need to test our own
87          * keycodes. */
88         bool IsPrintable(int keyIndex);
89
90         /**
91          * Transform keycodes to something printable.
92          */
93         char ToCharacter(int keyIndex, bool shifted);
94
95         /**
96          * Tests whether this is a delete key.
97          */     
98         bool IsDelete(int keyIndex);
99
100         /**
101          * Tests whether shift is pressed.
102          */
103         bool IsShifted(void);
104         
105 public:
106         SCA_KeyboardSensor(class SCA_KeyboardManager* keybdmgr,
107                                            short int hotkey,
108                                            short int qual,
109                                            short int qual2,
110                                            bool bAllKeys,
111                                            const STR_String& targetProp,
112                                            const STR_String& toggleProp,
113                                            SCA_IObject* gameobj,
114                                            PyTypeObject* T=&Type );
115         virtual ~SCA_KeyboardSensor();
116         virtual CValue* GetReplica();
117         virtual void Init();
118
119
120         short int GetHotkey();
121         virtual bool Evaluate(CValue* event);
122         virtual bool IsPositiveTrigger();
123         bool    TriggerOnAllKeys();
124
125         /* --------------------------------------------------------------------- */
126         /* Python interface ---------------------------------------------------- */
127         /* --------------------------------------------------------------------- */
128
129         virtual PyObject* _getattr(const STR_String& attr);
130
131
132         PyObject* PySetAllMode(PyObject* self, 
133                                PyObject* args, 
134                                PyObject* kwds);
135         static PyObject* sPySetAllMode(PyObject* self, 
136                                        PyObject* args, 
137                                        PyObject* kwds);
138         
139         /** 1. GetKey : check which key this sensor looks at */
140         KX_PYMETHOD_DOC(SCA_KeyboardSensor,GetKey);
141         /** 2. SetKey: change the key to look at */
142         KX_PYMETHOD_DOC(SCA_KeyboardSensor,SetKey);
143         /** 3. GetHold1 : set the first bucky bit */
144         KX_PYMETHOD_DOC(SCA_KeyboardSensor,GetHold1);
145         /** 4. SetHold1: change the first bucky bit */
146         KX_PYMETHOD_DOC(SCA_KeyboardSensor,SetHold1);
147         /** 5. GetHold2 : set the second bucky bit */
148         KX_PYMETHOD_DOC(SCA_KeyboardSensor,GetHold2);
149         /** 6. SetHold2: change the second bucky bit */
150         KX_PYMETHOD_DOC(SCA_KeyboardSensor,SetHold2);
151         /** 9. GetPressedKeys: */
152         KX_PYMETHOD_DOC(SCA_KeyboardSensor,GetPressedKeys); 
153         /** 9. GetCurrrentlyPressedKeys: */
154         KX_PYMETHOD_DOC(SCA_KeyboardSensor,GetCurrentlyPressedKeys); 
155 };
156
157 #endif //__KX_KEYBOARDSENSOR
158