DDNet documentation
Loading...
Searching...
No Matches
lineinput.h
Go to the documentation of this file.
1/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
2/* If you are missing that file, acquire a complete release at teeworlds.com. */
3#ifndef GAME_CLIENT_LINEINPUT_H
4#define GAME_CLIENT_LINEINPUT_H
5
6#include <base/vmath.h>
7
8#include <engine/client.h>
9#include <engine/graphics.h>
10#include <engine/input.h>
11#include <engine/textrender.h>
12
13#include <game/client/ui_rect.h>
14
15#include <string>
16
18{
19 NONE = 0,
23};
24
25// line input helper
27{
28public:
30 {
31 bool m_Selecting = false;
32 vec2 m_PressMouse = vec2(0.0f, 0.0f);
33 vec2 m_ReleaseMouse = vec2(0.0f, 0.0f);
34 vec2 m_Offset = vec2(0.0f, 0.0f);
35 };
36
37 typedef std::function<void(const char *pLine)> FClipboardLineCallback;
38 typedef std::function<const char *(char *pCurrentText, size_t NumChars)> FDisplayTextCallback;
39 typedef std::function<bool()> FCalculateOffsetCallback;
40
41private:
46
47 static IClient *Client() { return ms_pClient; }
48 static IGraphics *Graphics() { return ms_pGraphics; }
49 static IInput *Input() { return ms_pInput; }
51
54
57
58 char *m_pStr = nullptr; // explicitly set to nullptr outside of constructor, so SetBuffer works in this case
59 size_t m_MaxSize;
60 size_t m_MaxChars;
61 size_t m_Len;
62 size_t m_NumChars;
63
67
73
75 std::string m_StarsBuffer;
76 const char *m_pEmptyText;
83
85
86 void UpdateStrData();
92 static void MoveCursor(EMoveDirection Direction, bool MoveWord, const char *pStr, size_t MaxSize, size_t *pCursorPos);
93 static void SetCompositionWindowPosition(vec2 Anchor, float LineHeight);
94
95 void OnActivate();
96 void OnDeactivate();
97
98public:
99 static void Init(IClient *pClient, IGraphics *pGraphics, IInput *pInput, ITextRender *pTextRender)
100 {
101 ms_pClient = pClient;
102 ms_pGraphics = pGraphics;
103 ms_pInput = pInput;
104 ms_pTextRender = pTextRender;
105 }
106 static void RenderCandidates();
107
109
111 {
112 SetBuffer(nullptr, 0, 0);
113 }
114
115 CLineInput(char *pStr, size_t MaxSize)
116 {
117 SetBuffer(pStr, MaxSize);
118 }
119
120 CLineInput(char *pStr, size_t MaxSize, size_t MaxChars)
121 {
122 SetBuffer(pStr, MaxSize, MaxChars);
123 }
124
125 void SetBuffer(char *pStr, size_t MaxSize) { SetBuffer(pStr, MaxSize, MaxSize); }
126 void SetBuffer(char *pStr, size_t MaxSize, size_t MaxChars);
127
128 void Clear();
129 void Set(const char *pString);
130 void SetRange(const char *pString, size_t Begin, size_t End);
131 void Insert(const char *pString, size_t Begin);
132 void Append(const char *pString);
133
134 const char *GetString() const { return m_pStr; }
135 const char *GetDisplayedString();
136 size_t GetMaxSize() const { return m_MaxSize; }
137 size_t GetMaxChars() const { return m_MaxChars; }
138 size_t GetLength() const { return m_Len; }
139 size_t GetNumChars() const { return m_NumChars; }
140 bool IsEmpty() const { return GetLength() == 0; }
141
142 size_t GetCursorOffset() const { return m_CursorPos; }
143 void SetCursorOffset(size_t Offset);
144 size_t GetSelectionStart() const { return m_SelectionStart; }
145 size_t GetSelectionEnd() const { return m_SelectionEnd; }
147 bool HasSelection() const { return GetSelectionLength() > 0; }
148 void SetSelection(size_t Start, size_t End);
151 {
154 }
155
156 size_t OffsetFromActualToDisplay(size_t ActualOffset);
157 size_t OffsetFromDisplayToActual(size_t DisplayOffset);
158
159 // used either for vertical or horizontal scrolling
160 float GetScrollOffset() const { return m_ScrollOffset; }
161 void SetScrollOffset(float ScrollOffset) { m_ScrollOffset = ScrollOffset; }
163 void SetScrollOffsetChange(float ScrollOffsetChange) { m_ScrollOffsetChange = ScrollOffsetChange; }
164
165 vec2 GetCaretPosition() const { return m_CaretPosition; } // only updated while the input is active
166
167 bool IsHidden() const { return m_Hidden; }
168 void SetHidden(bool Hidden) { m_Hidden = Hidden; }
169
170 const char *GetEmptyText() const { return m_pEmptyText; }
171 void SetEmptyText(const char *pText) { m_pEmptyText = pText; }
172
173 void SetClipboardLineCallback(const FClipboardLineCallback &pfnClipboardLineCallback) { m_pfnClipboardLineCallback = pfnClipboardLineCallback; }
174 void SetDisplayTextCallback(const FDisplayTextCallback &pfnDisplayTextCallback) { m_pfnDisplayTextCallback = pfnDisplayTextCallback; }
175 void SetCalculateOffsetCallback(const FCalculateOffsetCallback &pfnCalculateOffsetCallback) { m_pfnCalculateOffsetCallback = pfnCalculateOffsetCallback; }
176
177 bool ProcessInput(const IInput::CEvent &Event);
179 {
180 const bool Changed = m_WasChanged;
181 m_WasChanged = false;
182 return Changed;
183 }
185 {
186 const bool Changed = m_WasCursorChanged;
187 m_WasCursorChanged = false;
188 return Changed;
189 }
190
191 STextBoundingBox Render(const CUIRect *pRect, float FontSize, int Align, bool Changed, float LineWidth, float LineSpacing, const std::vector<STextColorSplit> &vColorSplits = {});
193
194 const void *GetClearButtonId() const { return &m_ClearButtonId; }
195
196 bool IsActive() const { return GetActiveInput() == this; }
197 void Activate(EInputPriority Priority);
198 void Deactivate() const;
199};
200
201template<size_t MaxSize, size_t MaxChars = MaxSize>
203{
204 char m_aBuffer[MaxSize];
205
206public:
208 CLineInput()
209 {
210 m_aBuffer[0] = '\0';
211 SetBuffer(m_aBuffer, MaxSize, MaxChars);
212 }
213};
214
216{
217public:
218 CLineInputNumber() = default;
219
221 {
222 SetInteger(Number);
223 }
224
225 CLineInputNumber(float Number)
226 {
227 SetFloat(Number);
228 }
229
230 void SetInteger(int Number, int Base = 10, int HexPrefix = 6);
231 int GetInteger(int Base = 10) const;
232
233 void SetInteger64(int64_t Number, int Base = 10, int HexPrefix = 6);
234 int64_t GetInteger64(int Base = 10) const;
235
236 void SetFloat(float Number);
237 float GetFloat() const;
238};
239
240#endif
CLineInputBuffered()
Definition lineinput.h:207
char m_aBuffer[MaxSize]
Definition lineinput.h:204
CLineInputNumber(int Number)
Definition lineinput.h:220
void SetFloat(float Number)
Definition lineinput.cpp:720
int64_t GetInteger64(int Base=10) const
Definition lineinput.cpp:715
CLineInputNumber(float Number)
Definition lineinput.h:225
int GetInteger(int Base=10) const
Definition lineinput.cpp:692
CLineInputNumber()=default
void SetInteger(int Number, int Base=10, int HexPrefix=6)
Definition lineinput.cpp:674
void SetInteger64(int64_t Number, int Base=10, int HexPrefix=6)
Definition lineinput.cpp:697
float GetFloat() const
Definition lineinput.cpp:728
std::function< const char *(char *pCurrentText, size_t NumChars)> FDisplayTextCallback
Definition lineinput.h:38
static ITextRender * ms_pTextRender
Definition lineinput.h:45
void Activate(EInputPriority Priority)
Definition lineinput.cpp:641
char * m_pStr
Definition lineinput.h:58
bool m_WasRendered
Definition lineinput.h:82
void Set(const char *pString)
Definition lineinput.cpp:56
size_t GetSelectionEnd() const
Definition lineinput.h:145
FClipboardLineCallback m_pfnClipboardLineCallback
Definition lineinput.h:77
bool m_WasChanged
Definition lineinput.h:80
std::string m_StarsBuffer
Definition lineinput.h:75
const char * GetDisplayedString()
Definition lineinput.cpp:119
static IInput * Input()
Definition lineinput.h:49
CLineInput(char *pStr, size_t MaxSize, size_t MaxChars)
Definition lineinput.h:120
bool ProcessInput(const IInput::CEvent &Event)
Definition lineinput.cpp:191
bool IsActive() const
Definition lineinput.h:196
void SetHidden(bool Hidden)
Definition lineinput.h:168
size_t GetSelectionLength() const
Definition lineinput.h:146
static ITextRender * TextRender()
Definition lineinput.h:50
size_t GetSelectionStart() const
Definition lineinput.h:144
size_t m_MaxSize
Definition lineinput.h:59
size_t m_CursorPos
Definition lineinput.h:64
size_t m_MaxChars
Definition lineinput.h:60
size_t m_NumChars
Definition lineinput.h:62
static IClient * Client()
Definition lineinput.h:47
vec2 m_CaretPosition
Definition lineinput.h:70
static CLineInput * ms_pActiveInput
Definition lineinput.h:52
size_t GetCursorOffset() const
Definition lineinput.h:142
void SetEmptyText(const char *pText)
Definition lineinput.h:171
size_t OffsetFromActualToDisplay(size_t ActualOffset)
Definition lineinput.cpp:177
float GetScrollOffset() const
Definition lineinput.h:160
void Insert(const char *pString, size_t Begin)
Definition lineinput.cpp:100
size_t m_SelectionStart
Definition lineinput.h:65
SMouseSelection m_MouseSelection
Definition lineinput.h:71
const void * GetClearButtonId() const
Definition lineinput.h:194
bool WasCursorChanged()
Definition lineinput.h:184
static CLineInput * GetActiveInput()
Definition lineinput.h:108
void SetScrollOffsetChange(float ScrollOffsetChange)
Definition lineinput.h:163
void Clear()
Definition lineinput.cpp:50
static EInputPriority ms_ActiveInputPriority
Definition lineinput.h:53
void Deactivate() const
Definition lineinput.cpp:654
static IGraphics * ms_pGraphics
Definition lineinput.h:43
bool m_Hidden
Definition lineinput.h:74
bool IsEmpty() const
Definition lineinput.h:140
EMoveDirection
Definition lineinput.h:88
@ FORWARD
Definition lineinput.h:89
@ REWIND
Definition lineinput.h:90
static IGraphics * Graphics()
Definition lineinput.h:48
CLineInput()
Definition lineinput.h:110
static float ms_CompositionLineHeight
Definition lineinput.h:56
void UpdateStrData()
Definition lineinput.cpp:110
void OnActivate()
Definition lineinput.cpp:663
void Append(const char *pString)
Definition lineinput.cpp:105
void SetCursorOffset(size_t Offset)
Definition lineinput.cpp:161
size_t GetMaxChars() const
Definition lineinput.h:137
bool WasChanged()
Definition lineinput.h:178
void SetScrollOffset(float ScrollOffset)
Definition lineinput.h:161
size_t GetNumChars() const
Definition lineinput.h:139
STextBoundingBox Render(const CUIRect *pRect, float FontSize, int Align, bool Changed, float LineWidth, float LineSpacing, const std::vector< STextColorSplit > &vColorSplits={})
Definition lineinput.cpp:412
static void SetCompositionWindowPosition(vec2 Anchor, float LineHeight)
Definition lineinput.cpp:633
static void RenderCandidates()
Definition lineinput.cpp:548
std::function< bool()> FCalculateOffsetCallback
Definition lineinput.h:39
size_t m_SelectionEnd
Definition lineinput.h:66
bool m_WasCursorChanged
Definition lineinput.h:81
const char * GetString() const
Definition lineinput.h:134
float m_ScrollOffsetChange
Definition lineinput.h:69
size_t GetLength() const
Definition lineinput.h:138
const char * m_pEmptyText
Definition lineinput.h:76
const char * GetEmptyText() const
Definition lineinput.h:170
void SetCalculateOffsetCallback(const FCalculateOffsetCallback &pfnCalculateOffsetCallback)
Definition lineinput.h:175
bool HasSelection() const
Definition lineinput.h:147
void SetRange(const char *pString, size_t Begin, size_t End)
Definition lineinput.cpp:63
void SetSelection(size_t Start, size_t End)
Definition lineinput.cpp:167
SMouseSelection * GetMouseSelection()
Definition lineinput.h:192
static void Init(IClient *pClient, IGraphics *pGraphics, IInput *pInput, ITextRender *pTextRender)
Definition lineinput.h:99
bool IsHidden() const
Definition lineinput.h:167
static void MoveCursor(EMoveDirection Direction, bool MoveWord, const char *pStr, size_t MaxSize, size_t *pCursorPos)
Definition lineinput.cpp:131
void OnDeactivate()
Definition lineinput.cpp:668
size_t m_LastCompositionCursorPos
Definition lineinput.h:72
static vec2 ms_CompositionWindowPosition
Definition lineinput.h:55
CLineInput(char *pStr, size_t MaxSize)
Definition lineinput.h:115
float m_ScrollOffset
Definition lineinput.h:68
size_t OffsetFromDisplayToActual(size_t DisplayOffset)
Definition lineinput.cpp:184
static IInput * ms_pInput
Definition lineinput.h:44
static IClient * ms_pClient
Definition lineinput.h:42
void SetClipboardLineCallback(const FClipboardLineCallback &pfnClipboardLineCallback)
Definition lineinput.h:173
char m_ClearButtonId
Definition lineinput.h:84
void SetDisplayTextCallback(const FDisplayTextCallback &pfnDisplayTextCallback)
Definition lineinput.h:174
void SelectAll()
Definition lineinput.h:150
std::function< void(const char *pLine)> FClipboardLineCallback
Definition lineinput.h:37
size_t m_Len
Definition lineinput.h:61
float GetScrollOffsetChange() const
Definition lineinput.h:162
void SetBuffer(char *pStr, size_t MaxSize)
Definition lineinput.h:125
FDisplayTextCallback m_pfnDisplayTextCallback
Definition lineinput.h:78
vec2 GetCaretPosition() const
Definition lineinput.h:165
FCalculateOffsetCallback m_pfnCalculateOffsetCallback
Definition lineinput.h:79
size_t GetMaxSize() const
Definition lineinput.h:136
void SelectNothing()
Definition lineinput.h:149
Definition ui_rect.h:12
Definition client.h:42
Definition graphics.h:240
Definition input.h:22
Definition input.h:18
Definition textrender.h:194
EInputPriority
Definition lineinput.h:18
@ CONSOLE
Definition lineinput.h:22
@ UI
Definition lineinput.h:20
@ CHAT
Definition menus_settings_controls.h:19
Direction
Definition nameplates.cpp:211
Definition lineinput.h:30
vec2 m_PressMouse
Definition lineinput.h:32
bool m_Selecting
Definition lineinput.h:31
vec2 m_Offset
Definition lineinput.h:34
vec2 m_ReleaseMouse
Definition lineinput.h:33
Definition textrender.h:87
vector2_base< float > vec2
Definition vmath.h:168