forked from stepmania/stepmania
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathScreenTextEntry.h
201 lines (173 loc) · 6.34 KB
/
ScreenTextEntry.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
#ifndef SCREEN_TEXT_ENTRY_H
#define SCREEN_TEXT_ENTRY_H
#include "ScreenWithMenuElements.h"
#include "BitmapText.h"
#include "RageSound.h"
#include "ThemeMetric.h"
#include "InputEventPlus.h"
/** @brief The list of possible keyboard rows. */
enum KeyboardRow
{
R1,
R2,
R3,
R4,
R5,
R6,
R7,
KEYBOARD_ROW_SPECIAL,
NUM_KeyboardRow,
KeyboardRow_Invalid
};
/** @brief A special foreach loop for the KeyboardRow enum. */
#define FOREACH_KeyboardRow( i ) FOREACH_ENUM( KeyboardRow, i )
/** @brief The maximum number of keys per row. */
const int KEYS_PER_ROW = 13;
/** @brief The list of very special keys inside some rows. */
enum KeyboardRowSpecialKey
{
SPACEBAR=2, /**< The space bar key. */
BACKSPACE=5, /**< The backspace key. */
CANCEL=8,
DONE=11
};
/** @brief Displays a text entry box over the top of another screen. */
class ScreenTextEntry : public ScreenWithMenuElements
{
public:
static void SetTextEntrySettings(
std::string sQuestion,
std::string sInitialAnswer,
int iMaxInputLength,
bool(*Validate)(const std::string &sAnswer,std::string &sErrorOut) = nullptr,
void(*OnOK)(const std::string &sAnswer) = nullptr,
void(*OnCancel)() = nullptr,
bool bPassword = false,
bool (*ValidateAppend)(const std::string &sAnswerBeforeChar, std::string &sAppend) = nullptr,
std::string (*FormatAnswerForDisplay)(const std::string &sAnswer) = nullptr
);
static void TextEntry(
ScreenMessage smSendOnPop,
std::string sQuestion,
std::string sInitialAnswer,
int iMaxInputLength,
bool(*Validate)(const std::string &sAnswer,std::string &sErrorOut) = nullptr,
void(*OnOK)(const std::string &sAnswer) = nullptr,
void(*OnCancel)() = nullptr,
bool bPassword = false,
bool (*ValidateAppend)(const std::string &sAnswerBeforeChar, std::string &sAppend) = nullptr,
std::string (*FormatAnswerForDisplay)(const std::string &sAnswer) = nullptr
);
static void Password(
ScreenMessage smSendOnPop,
const std::string &sQuestion,
void(*OnOK)(const std::string &sPassword) = nullptr,
void(*OnCancel)() = nullptr )
{
TextEntry( smSendOnPop, sQuestion, "", 255, nullptr, OnOK, OnCancel, true );
}
struct TextEntrySettings {
TextEntrySettings(): smSendOnPop(), sQuestion(""),
sInitialAnswer(""), iMaxInputLength(0),
bPassword(false), Validate(), OnOK(), OnCancel(),
ValidateAppend(), FormatAnswerForDisplay() { }
ScreenMessage smSendOnPop;
std::string sQuestion;
std::string sInitialAnswer;
int iMaxInputLength;
/** @brief Is there a password involved with this setting?
*
* This parameter doesn't have to be used. */
bool bPassword;
LuaReference Validate; // (std::string sAnswer, std::string sErrorOut; optional)
LuaReference OnOK; // (std::string sAnswer; optional)
LuaReference OnCancel; // (optional)
LuaReference ValidateAppend; // (std::string sAnswerBeforeChar, std::string sAppend; optional)
LuaReference FormatAnswerForDisplay; // (std::string sAnswer; optional)
// see BitmapText.cpp Attribute::FromStack() and
// OptionRowHandler.cpp LoadInternal() for ideas on how to implement the
// main part, and ImportOption() from OptionRowHandler.cpp for functions.
void FromStack( lua_State *L );
};
void LoadFromTextEntrySettings( const TextEntrySettings &settings );
static bool FloatValidate( const std::string &sAnswer, std::string &sErrorOut );
static bool IntValidate( const std::string &sAnswer, std::string &sErrorOut );
virtual void Init();
virtual void BeginScreen();
virtual void Update( float fDelta );
virtual bool Input( const InputEventPlus &input );
static std::string s_sLastAnswer;
static bool s_bCancelledLast;
// Lua
virtual void PushSelf( lua_State *L );
protected:
void TryAppendToAnswer( std::string s );
void BackspaceInAnswer();
virtual void TextEnteredDirectly() { }
virtual void End( bool bCancelled );
private:
virtual bool MenuStart( const InputEventPlus &input );
virtual bool MenuBack( const InputEventPlus &input );
void UpdateAnswerText();
std::wstring m_sAnswer;
bool m_bShowAnswerCaret;
// todo: allow Left/Right to change caret location -aj
//int m_iCaretLocation;
BitmapText m_textQuestion;
BitmapText m_textAnswer;
RageSound m_sndType;
RageSound m_sndBackspace;
RageTimer m_timerToggleCursor;
};
/** @brief Displays a text entry box and keyboard over the top of another screen. */
class ScreenTextEntryVisual: public ScreenTextEntry
{
public:
~ScreenTextEntryVisual();
void Init();
void BeginScreen();
protected:
void MoveX( int iDir );
void MoveY( int iDir );
void PositionCursor();
virtual void TextEnteredDirectly();
virtual bool MenuLeft( const InputEventPlus &input );
virtual bool MenuRight( const InputEventPlus &input );
virtual bool MenuUp( const InputEventPlus &input );
virtual bool MenuDown( const InputEventPlus &input );
virtual bool MenuStart( const InputEventPlus &input );
int m_iFocusX;
KeyboardRow m_iFocusY;
AutoActor m_sprCursor;
BitmapText *m_ptextKeys[NUM_KeyboardRow][KEYS_PER_ROW];
RageSound m_sndChange;
ThemeMetric<float> ROW_START_X;
ThemeMetric<float> ROW_START_Y;
ThemeMetric<float> ROW_END_X;
ThemeMetric<float> ROW_END_Y;
};
#endif
/*
* (c) 2001-2004 Chris Danford
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/