Sparkle 0.0.1
Loading...
Searching...
No Matches
spk_text_edit.hpp
1// spk_text_edit.hpp
2#pragma once
3
4#include <functional>
5#include <string>
6
7#include "structure/container/spk_task_result.hpp"
8#include "structure/design_pattern/spk_observable_value.hpp"
9#include "structure/graphics/painter/spk_color_painter.hpp"
10#include "structure/system/event/spk_system_event.hpp"
11#include "structure/system/time/spk_duration.hpp"
12#include "structure/system/time/spk_timestamp.hpp"
13#include "structure/widget/components/spk_nine_slice_background.hpp"
14#include "structure/widget/components/spk_text_region.hpp"
15#include "structure/widget/spk_widget.hpp"
16
17namespace spk
18{
28 class TextEdit : public spk::Widget
29 {
30 public:
35 enum class ValidationState
36 {
37 Valid,
38 Invalid,
39 Undefined
40 };
41
45
49 using ValidationCallback = std::function<ValidationStatus(const std::wstring &)>;
50
59
60 private:
61 NineSliceBackground _background;
62 TextRegion _textRegion;
63 TextRegion _placeholderRegion;
64
65 spk::ColorPainter _cursorPainter;
66 spk::ColorMesh _cursorMesh;
67 spk::ColorMesh::Builder _cursorMeshBuilder;
68
69 spk::Color _cursorColor{1.0f, 1.0f, 1.0f, 1.0f};
70 size_t _cursorWidth = 2;
71 spk::Duration _cursorBlinkDuration{500, spk::TimeUnit::Millisecond};
72 bool _cursorVisible = true;
73 spk::Timestamp _lastBlinkTimestamp{};
74
75 spk::ObservableValue<std::wstring> _text;
76 std::wstring _placeholder;
77 size_t _cursorPosition = 0;
78 bool _obscured = false;
79
80 ValidationCallback _validationCallback;
81
82 private:
83 void _updateLayoutFromGeometry();
84 void _updateDisplayedText();
85 void _updateCaret();
86
87 void _refreshCursor();
88 void _resetCursorBlinkState();
89 void _updateCursorBlinkState();
90
91 ValidationStatus _validateText(const std::wstring &p_text) const;
92
93 void _applyTextNoValidation(const std::wstring &p_text, size_t p_cursorPosition);
94 ValidationStatus _applyValidatedText(const std::wstring &p_text, size_t p_cursorPosition);
95
96 protected:
100 void _onGeometryChange() override;
105 void _onPaintEvent(spk::PaintEvent &p_event) override;
106
111 void _onMouseMotionEvent(spk::MouseMotionEvent &p_event) override;
116 void _onMousePressEvent(spk::MousePressEvent &p_event) override;
121 void _onMouseReleaseEvent(spk::MouseReleaseEvent &p_event) override;
122
127 void _onGlyphEvent(spk::GlyphEvent &p_event) override;
132 void _onKeyPressEvent(spk::KeyPressEvent &p_event) override;
137 void _onFocusEvent(spk::FocusEvent &p_event) override;
138
139 public:
145 TextEdit(const std::wstring &p_name, spk::Widget *p_parent);
146
151 void setCornerSize(const spk::Vector2UInt &p_cornerSize);
156 const spk::Vector2UInt &cornerSize() const;
157
162 void setTexture(const spk::SpriteSheet *p_spriteSheet);
167 const spk::SpriteSheet *texture() const;
168
173 void setFont(spk::Font *p_font);
178 spk::Font *font() const;
179
184 void setFontSize(const spk::Font::Size &p_size);
189 const spk::Font::Size &fontSize() const;
190
196 void setColors(const spk::Color &p_glyphColor, const spk::Color &p_outlineColor);
201 const spk::Color &glyphColor() const;
206 const spk::Color &outlineColor() const;
207
212 void setPlaceholder(const std::wstring &p_placeholder);
217 const std::wstring &placeholder() const;
218
229
235 ValidationStatus checkTextValidity(const std::wstring &p_text) const;
236
241 const std::wstring &text() const;
242
248 ValidationStatus setText(const std::wstring &p_text);
249
256
262 void setAlignment(HorizontalAlignment p_horizontalAlignment, VerticalAlignment p_verticalAlignment);
263
264 // Cursor
269 void placeCursor(size_t p_position);
274 void moveCursor(int p_delta);
279 size_t cursorPosition() const;
280
281 // Misc
285 void clear();
290 void setObscured(bool p_obscured);
295 bool obscured() const;
296
301 void setCursorBlinkDuration(const spk::Duration &p_duration);
306 const spk::Duration &cursorBlinkDuration() const;
307 };
308}
Helper used to build ColorMesh instances from primitives.
Definition spk_color_painter.hpp:63
Mesh specialization for colored vertices.
Definition spk_color_painter.hpp:41
Painter that renders ColorMesh instances.
Definition spk_color_painter.hpp:169
Strongly-typed time span with cached conversions between ns/ms/s.
Definition spk_duration.hpp:15
Renders a scalable nine-slice background using a sprite sheet.
Definition spk_nine_slice_background.hpp:25
spk::TContractProvider< TType >::Contract Contract
Contract type for subscriptions.
Definition spk_observable_value.hpp:27
spk::TContractProvider< TType >::Job Job
Job type dispatched on updates.
Definition spk_observable_value.hpp:31
Wraps a value with an optional status message for task reporting.
Definition spk_task_result.hpp:21
spk::Font * font() const
Returns the font used for text rendering.
Definition spk_text_edit.cpp:487
const ValidationCallback & validationCallback() const
Returns the validation callback.
Definition spk_text_edit.cpp:541
void setColors(const spk::Color &p_glyphColor, const spk::Color &p_outlineColor)
Sets glyph and outline colors.
Definition spk_text_edit.cpp:508
TextEdit(const std::wstring &p_name, spk::Widget *p_parent)
Builds a text edit widget.
Definition spk_text_edit.cpp:188
spk::ObservableValue< std::wstring >::Contract EditionContract
Edition contract type for text changes.
Definition spk_text_edit.hpp:54
void setFontSize(const spk::Font::Size &p_size)
Sets the font size used for text rendering.
Definition spk_text_edit.cpp:492
void placeCursor(size_t p_position)
Places the cursor at a position.
Definition spk_text_edit.cpp:584
void setTexture(const spk::SpriteSheet *p_spriteSheet)
Sets the background texture.
Definition spk_text_edit.cpp:466
bool obscured() const
Returns whether text is obscured.
Definition spk_text_edit.cpp:647
void clear()
Clears the text content.
Definition spk_text_edit.cpp:618
void _onFocusEvent(spk::FocusEvent &p_event) override
Handles focus events.
Definition spk_text_edit.cpp:433
ValidationState
Validation state of the text content.
Definition spk_text_edit.hpp:36
void _onPaintEvent(spk::PaintEvent &p_event) override
Paints the text edit visuals.
Definition spk_text_edit.cpp:276
void setFont(spk::Font *p_font)
Sets the font used for text rendering.
Definition spk_text_edit.cpp:476
void _onMouseMotionEvent(spk::MouseMotionEvent &p_event) override
Handles mouse motion events.
Definition spk_text_edit.cpp:305
ValidationStatus setText(const std::wstring &p_text)
Sets the text content.
Definition spk_text_edit.cpp:556
void _onMouseReleaseEvent(spk::MouseReleaseEvent &p_event) override
Handles mouse release events.
Definition spk_text_edit.cpp:326
const spk::SpriteSheet * texture() const
Returns the background texture.
Definition spk_text_edit.cpp:471
void moveCursor(int p_delta)
Moves the cursor by a delta.
Definition spk_text_edit.cpp:598
const std::wstring & placeholder() const
Returns the placeholder text.
Definition spk_text_edit.cpp:531
const spk::Color & glyphColor() const
Returns the glyph color.
Definition spk_text_edit.cpp:514
const spk::Color & outlineColor() const
Returns the outline color.
Definition spk_text_edit.cpp:519
void setPlaceholder(const std::wstring &p_placeholder)
Sets the placeholder text.
Definition spk_text_edit.cpp:524
void _onMousePressEvent(spk::MousePressEvent &p_event) override
Handles mouse press events.
Definition spk_text_edit.cpp:317
void _onGeometryChange() override
Updates layout when geometry changes.
Definition spk_text_edit.cpp:270
size_t cursorPosition() const
Returns the cursor position.
Definition spk_text_edit.cpp:613
const spk::Font::Size & fontSize() const
Returns the font size used for text rendering.
Definition spk_text_edit.cpp:503
spk::TaskResult< ValidationState > ValidationStatus
Validation status result type.
Definition spk_text_edit.hpp:44
const spk::Duration & cursorBlinkDuration() const
Returns the cursor blink duration.
Definition spk_text_edit.cpp:658
void setObscured(bool p_obscured)
Enables or disables obscured rendering.
Definition spk_text_edit.cpp:635
void setCursorBlinkDuration(const spk::Duration &p_duration)
Sets the cursor blink duration.
Definition spk_text_edit.cpp:652
EditionContract subscribeToEdition(const EditionJob &p_job)
Subscribes to text edition notifications.
Definition spk_text_edit.cpp:571
void setAlignment(HorizontalAlignment p_horizontalAlignment, VerticalAlignment p_verticalAlignment)
Sets text alignment.
Definition spk_text_edit.cpp:576
std::function< ValidationStatus(const std::wstring &)> ValidationCallback
Validation callback signature.
Definition spk_text_edit.hpp:49
const spk::Vector2UInt & cornerSize() const
Returns background corner size.
Definition spk_text_edit.cpp:461
ValidationStatus checkTextValidity(const std::wstring &p_text) const
Checks text validity with the current callback.
Definition spk_text_edit.cpp:546
void _onKeyPressEvent(spk::KeyPressEvent &p_event) override
Handles key press events.
Definition spk_text_edit.cpp:370
void _onGlyphEvent(spk::GlyphEvent &p_event) override
Handles glyph input events.
Definition spk_text_edit.cpp:347
const std::wstring & text() const
Returns the current text.
Definition spk_text_edit.cpp:551
void setCornerSize(const spk::Vector2UInt &p_cornerSize)
Sets background corner size.
Definition spk_text_edit.cpp:454
spk::ObservableValue< std::wstring >::Job EditionJob
Edition job type for text changes.
Definition spk_text_edit.hpp:58
void setValidationCallback(ValidationCallback p_callback)
Sets the validation callback.
Definition spk_text_edit.cpp:536
Renders formatted text within a geometry region.
Definition spk_text_region.hpp:24
Point in time with conversion helpers and arithmetic with Duration.
Definition spk_timestamp.hpp:16
Base class for interactive UI elements handling focus and events.
Definition spk_widget.hpp:52
RGBA color utility storing normalized floating components.
Definition spk_color.hpp:18