TGUI  1.0-alpha
EditBox.hpp
1
2//
3// TGUI - Texus' Graphical User Interface
4// Copyright (C) 2012-2022 Bruno Van de Velde (vdv_b@tgui.eu)
5//
6// This software is provided 'as-is', without any express or implied warranty.
7// In no event will the authors be held liable for any damages arising from the use of this software.
8//
9// Permission is granted to anyone to use this software for any purpose,
10// including commercial applications, and to alter it and redistribute it freely,
11// subject to the following restrictions:
12//
13// 1. The origin of this software must not be misrepresented;
14// you must not claim that you wrote the original software.
15// If you use this software in a product, an acknowledgment
16// in the product documentation would be appreciated but is not required.
17//
18// 2. Altered source versions must be plainly marked as such,
19// and must not be misrepresented as being the original software.
20//
21// 3. This notice may not be removed or altered from any source distribution.
22//
24
25#ifndef TGUI_EDIT_BOX_HPP
26#define TGUI_EDIT_BOX_HPP
27
28
29#include <TGUI/Widgets/ClickableWidget.hpp>
30#include <TGUI/Renderers/EditBoxRenderer.hpp>
31#include <TGUI/Rect.hpp>
32#include <TGUI/Text.hpp>
33#include <regex>
34
36
37namespace tgui
38{
45 class TGUI_API EditBox : public ClickableWidget
46 {
47 public:
48
49 typedef std::shared_ptr<EditBox> Ptr;
50 typedef std::shared_ptr<const EditBox> ConstPtr;
51
52
56 enum class Alignment
57 {
59 Left,
60
62 Center,
63
65 Right
66 };
67
68
72 struct Validator
73 {
74 static TGUI_API const char* All;
75 static TGUI_API const char* Int;
76 static TGUI_API const char* UInt;
77 static TGUI_API const char* Float;
78 };
79
80
88 EditBox(const char* typeName = "EditBox", bool initRenderer = true);
89
90
98
99
109
110
116 const EditBoxRenderer* getSharedRenderer() const;
117
124
125
132 void setSize(const Layout2d& size) override;
133 using Widget::setSize;
134
135
143 void setEnabled(bool enabled) override;
144
145
159 void setText(const String& text);
160
161
168 const String& getText() const;
169
170
179 void setDefaultText(const String& text);
180
181
190 const String& getDefaultText() const;
191
192
202 void selectText(std::size_t start = 0, std::size_t length = String::npos);
203
204
212
213
226 void setPasswordCharacter(char32_t passwordChar);
227
228
236 char32_t getPasswordCharacter() const;
237
238
247 void setMaximumCharacters(unsigned int maxChars);
248
249
259 unsigned int getMaximumCharacters() const;
260
261
268 void setAlignment(Alignment alignment);
269
270
278
279
289 void limitTextWidth(bool limitWidth = true);
290
291
298 bool isTextWidthLimited() const;
299
300
310 void setReadOnly(bool readOnly = true);
311
312
322 bool isReadOnly() const;
323
324
331 void setCaretPosition(std::size_t charactersBeforeCaret);
332
333
340 std::size_t getCaretPosition() const;
341
342
359 bool setInputValidator(const String& regex = U".*");
360
361
368 const String& getInputValidator() const;
369
370
378 void setSuffix(const String& suffix);
379
380
386 const String& getSuffix() const;
387
388
397 void setFocused(bool focused) override;
398
399
404 bool isMouseOnWidget(Vector2f pos) const override;
405
406
410 void leftMousePressed(Vector2f pos) override;
411
415 void mouseMoved(Vector2f pos) override;
416
420 void keyPressed(const Event::KeyEvent& event) override;
421
425 void textEntered(char32_t key) override;
426
427
435 void draw(BackendRenderTarget& target, RenderStates states) const override;
436
437
439 protected:
440
450 Signal& getSignal(String signalName) override;
451
452
459 void rendererChanged(const String& property) override;
460
461
465 std::unique_ptr<DataIO::Node> save(SavingRenderersMap& renderers) const override;
466
467
471 void load(const std::unique_ptr<DataIO::Node>& node, const LoadingRenderersMap& renderers) override;
472
473
477 void updateTextSize() override;
478
479
481 // Returns the total width that the text is going to take
483 float getFullTextWidth() const;
484
485
487 // Returns the size without the borders
489 Vector2f getInnerSize() const;
490
491
493 // Returns the width of the edit box minus the padding.
495 float getVisibleEditBoxWidth() const;
496
497
499 // This function will search after which character the caret should be placed. It will not change the caret position.
501 std::size_t findCaretPosition(float posX);
502
503
505 // Removes the selected characters. This function is called when pressing backspace, delete or a letter while there were
506 // some characters selected.
508 void deleteSelectedCharacters();
509
510
512 // Recalculates the position of the texts.
514 void recalculateTextPositions();
515
516
518 // Updates the internal texts after SelStart or SelEnd changed.
520 void updateSelection();
521
522
524 // Update the color of the Text objects
526 void updateTextColor();
527
528
530 // This function is called every frame with the time passed since the last frame.
532 bool updateTime(Duration elapsedTime) override;
533
534
536 // Makes a copy of the widget
538 Widget::Ptr clone() const override;
539
540
542 private:
543
545 // Handles "Backspace" key press
547 void backspaceKeyPressed();
548
550 // Handles "Delete" key press
552 void deleteKeyPressed();
553
555 // Handles "Ctrl+C" key press (or equivalent on macOS)
557 void copySelectedTextToClipboard();
558
560 // Handles "Ctrl+X" key press (or equivalent on macOS)
562 void cutSelectedTextToClipboard();
563
565 // Handles "Ctrl+V" key press (or equivalent on macOS)
567 void pasteTextFromClipboard();
568
570 // Handles "ArrowLeft" key press
572 void moveCaretLeft(bool shiftPressed);
573
575 // Handles "ArrowRight" key press
577 void moveCaretRight(bool shiftPressed);
578
580 // Handles "Ctrl+ArrowLeft" key press (or equivalent on macOS)
582 void moveCaretWordBegin();
583
585 // Handles "Ctrl+ArrowRight" key press (or equivalent on macOS)
587 void moveCaretWordEnd();
588
589
591 public:
592
593 SignalString onTextChange = {"TextChanged"};
594 SignalString onReturnKeyPress = {"ReturnKeyPressed"};
595 SignalString onReturnOrUnfocus = {"ReturnOrUnfocused"};
596
597
599 protected:
600
601 // Is the caret visible or not?
602 bool m_caretVisible = true;
603
604 // When this boolean is true then you can no longer add text when the EditBox is full.
605 // Changing it to false will allow you to scroll the text (default).
606 // You can change the boolean with the limitTextWidth(bool) function.
607 bool m_limitTextWidth = false;
608
609 bool m_readOnly = false;
610
611 // The text inside the edit box
612 String m_text;
613 String m_displayedText; // Same as m_text unless a password char is set
614
615 String m_regexString = U".*";
616 std::wregex m_regex;
617
618 // The text alignment
619 Alignment m_textAlignment = Alignment::Left;
620
621 // The selection
622 std::size_t m_selChars = 0;
623 std::size_t m_selStart = 0;
624 std::size_t m_selEnd = 0;
625
626 // The password character
627 char32_t m_passwordChar = '\0';
628
629 // The maximum allowed characters.
630 // Zero by default, meaning no limit.
631 unsigned int m_maxChars = 0;
632
633 // When the text width is not limited, you can scroll the edit box and only a part will be visible.
634 unsigned int m_textCropPosition = 0;
635
636 // The rectangle behind the selected text
637 FloatRect m_selectedTextBackground;
638
639 // The blinking caret
640 FloatRect m_caret = {0, 0, 1, 0};
641
642 // Is there a possibility that the user is going to double click?
643 bool m_possibleDoubleClick = false;
644
645 // We need three texts for drawing + one for the default text + one more for calculations.
646 Text m_textBeforeSelection;
647 Text m_textSelection;
648 Text m_textAfterSelection;
649 Text m_defaultText;
650 Text m_textFull;
651 Text m_textSuffix;
652
653 Sprite m_sprite;
654 Sprite m_spriteHover;
655 Sprite m_spriteDisabled;
656 Sprite m_spriteFocused;
657
658 // Cached renderer properties
659 Borders m_bordersCached;
660 Padding m_paddingCached;
661 Color m_borderColorCached;
662 Color m_borderColorHoverCached;
663 Color m_borderColorDisabledCached;
664 Color m_borderColorFocusedCached;
665 Color m_backgroundColorCached;
666 Color m_backgroundColorHoverCached;
667 Color m_backgroundColorDisabledCached;
668 Color m_backgroundColorFocusedCached;
669 Color m_caretColorCached;
670 Color m_caretColorHoverCached;
671 Color m_caretColorFocusedCached;
672 Color m_selectedTextBackgroundColorCached;
673
674
676 };
677
679}
680
682
683#endif // TGUI_EDIT_BOX_HPP
Base class for render targets.
Definition: BackendRenderTarget.hpp:48
Clickable widget.
Definition: ClickableWidget.hpp:40
Wrapper for durations.
Definition: Duration.hpp:52
Definition: EditBoxRenderer.hpp:37
Edit box widget.
Definition: EditBox.hpp:46
void setFocused(bool focused) override
Focus or unfocus the widget.
static EditBox::Ptr create()
Creates a new edit box widget.
void setReadOnly(bool readOnly=true)
Makes the edit box read-only or make it writable again.
const String & getText() const
Returns the text inside the edit box. This text is not affected by the password character.
void selectText(std::size_t start=0, std::size_t length=String::npos)
Selects text in the edit box.
void setCaretPosition(std::size_t charactersBeforeCaret)
Sets the blinking caret to after a specific character.
bool isMouseOnWidget(Vector2f pos) const override
Returns whether the mouse position (which is relative to the parent widget) lies on top of the widget...
Widget::Ptr clone() const override
Makes a copy of the widget if you don't know its exact type.
void rendererChanged(const String &property) override
Function called when one of the properties of the renderer is changed.
Alignment
The text alignment.
Definition: EditBox.hpp:57
bool isTextWidthLimited() const
Checks if the text width is limited to the size of the edit box.
void setMaximumCharacters(unsigned int maxChars)
Changes the character limit.
void updateTextSize() override
Called when the text size is changed (either by setTextSize or via the renderer)
char32_t getPasswordCharacter() const
Returns the password character.
void setText(const String &text)
Changes the text of the editbox.
const String & getInputValidator() const
Returns the regex to which the text is matched.
void limitTextWidth(bool limitWidth=true)
Should the text width be limited or should you be able to type even if the edit box is full?
std::size_t getCaretPosition() const
Returns after which character the blinking cursor is currently located.
void draw(BackendRenderTarget &target, RenderStates states) const override
Draw the widget to a render target.
bool setInputValidator(const String &regex=U".*")
Defines how the text input should look like.
std::unique_ptr< DataIO::Node > save(SavingRenderersMap &renderers) const override
Saves the widget as a tree node in order to save it to a file.
void setAlignment(Alignment alignment)
Changes the text alignment.
unsigned int getMaximumCharacters() const
Returns the character limit.
std::shared_ptr< const EditBox > ConstPtr
Shared constant widget pointer.
Definition: EditBox.hpp:50
static EditBox::Ptr copy(EditBox::ConstPtr editBox)
Makes a copy of another edit box.
void setSuffix(const String &suffix)
Places a suffix at the right side of the edit box.
String getSelectedText() const
Returns the text that you currently have selected. This text is not affected by the password characte...
Alignment getAlignment() const
Gets the current text alignment.
const String & getSuffix() const
Returns the suffix currently displayed on the right side of the edit box.
void setEnabled(bool enabled) override
Enables or disables the widget.
void setSize(const Layout2d &size) override
Changes the size of the edit box.
const String & getDefaultText() const
Returns the default text of the edit box. This is the text drawn when the edit box is empty.
Signal & getSignal(String signalName) override
Retrieves a signal based on its name.
EditBoxRenderer * getSharedRenderer()
Returns the renderer, which gives access to functions that determine how the widget is displayed.
EditBoxRenderer * getRenderer()
Returns the renderer, which gives access to functions that determine how the widget is displayed.
std::shared_ptr< EditBox > Ptr
Shared widget pointer.
Definition: EditBox.hpp:49
void setPasswordCharacter(char32_t passwordChar)
Sets a password character.
bool isReadOnly() const
Checks if the edit box read-only or writable.
void load(const std::unique_ptr< DataIO::Node > &node, const LoadingRenderersMap &renderers) override
Loads the widget from a tree of nodes.
void setDefaultText(const String &text)
Changes the default text of the editbox. This is the text drawn when the edit box is empty.
Class to store the position or size of a widget.
Definition: Layout.hpp:284
Signal to which the user can subscribe to get callbacks from.
Definition: Signal.hpp:58
Wrapper class to store strings.
Definition: String.hpp:79
std::shared_ptr< Widget > Ptr
Shared widget pointer.
Definition: Widget.hpp:73
virtual void setSize(const Layout2d &size)
Changes the size of the widget.
Namespace that contains all TGUI functions and classes.
Definition: AbsoluteOrRelativeValue.hpp:36
Predefined input validators.
Definition: EditBox.hpp:73
static TGUI_API const char * All
Accept any input.
Definition: EditBox.hpp:74
static TGUI_API const char * Float
Accept decimal numbers.
Definition: EditBox.hpp:77
static TGUI_API const char * Int
Accept negative and positive integers.
Definition: EditBox.hpp:75
static TGUI_API const char * UInt
Accept only positive integers.
Definition: EditBox.hpp:76
KeyPressed event parameters.
Definition: Event.hpp:167
States used for drawing.
Definition: RenderStates.hpp:39