TGUI  0.9-dev
EditBox.hpp
1
2//
3// TGUI - Texus' Graphical User Interface
4// Copyright (C) 2012-2021 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 const EditBoxRenderer* getRenderer() const;
125
126
133 void setSize(const Layout2d& size) override;
134 using Widget::setSize;
135
136
144 void setEnabled(bool enabled) override;
145
146
160 void setText(const String& text);
161
162
169 const String& getText() const;
170
171
180 void setDefaultText(const String& text);
181
182
191 const String& getDefaultText() const;
192
193
203 void selectText(std::size_t start = 0, std::size_t length = String::npos);
204
205
213
214
222 void setTextSize(unsigned int textSize) override;
223
224
231 unsigned int getTextSize() const override;
232
233
246 void setPasswordCharacter(char32_t passwordChar);
247
248
256 char32_t getPasswordCharacter() const;
257
258
267 void setMaximumCharacters(unsigned int maxChars);
268
269
279 unsigned int getMaximumCharacters() const;
280
281
288 void setAlignment(Alignment alignment);
289
290
298
299
309 void limitTextWidth(bool limitWidth = true);
310
311
318 bool isTextWidthLimited() const;
319
320
330 void setReadOnly(bool readOnly = true);
331
332
342 bool isReadOnly() const;
343
344
351 void setCaretPosition(std::size_t charactersBeforeCaret);
352
353
360 std::size_t getCaretPosition() const;
361
362
379 bool setInputValidator(const String& regex = U".*");
380
381
388 const String& getInputValidator() const;
389
390
398 void setSuffix(const String& suffix);
399
400
406 const String& getSuffix() const;
407
408
417 void setFocused(bool focused) override;
418
419
424 bool isMouseOnWidget(Vector2f pos) const override;
425
426
430 void leftMousePressed(Vector2f pos) override;
431
435 void mouseMoved(Vector2f pos) override;
436
440 void keyPressed(const Event::KeyEvent& event) override;
441
445 void textEntered(char32_t key) override;
446
447
455 void draw(BackendRenderTarget& target, RenderStates states) const override;
456
457
459 protected:
460
470 Signal& getSignal(String signalName) override;
471
472
479 void rendererChanged(const String& property) override;
480
481
485 std::unique_ptr<DataIO::Node> save(SavingRenderersMap& renderers) const override;
486
487
491 void load(const std::unique_ptr<DataIO::Node>& node, const LoadingRenderersMap& renderers) override;
492
493
495 // Returns the total width that the text is going to take
497 float getFullTextWidth() const;
498
499
501 // Returns the size without the borders
503 Vector2f getInnerSize() const;
504
505
507 // Returns the width of the edit box minus the padding.
509 float getVisibleEditBoxWidth() const;
510
511
513 // This function will search after which character the caret should be placed. It will not change the caret position.
515 std::size_t findCaretPosition(float posX);
516
517
519 // Removes the selected characters. This function is called when pressing backspace, delete or a letter while there were
520 // some characters selected.
522 void deleteSelectedCharacters();
523
524
526 // Recalculates the position of the texts.
528 void recalculateTextPositions();
529
530
532 // Updates the internal texts after SelStart or SelEnd changed.
534 void updateSelection();
535
536
538 // Update the color of the Text objects
540 void updateTextColor();
541
542
544 // Update auto-sized text
546 void updateTextSize();
547
548
550 // This function is called every frame with the time passed since the last frame.
552 bool updateTime(Duration elapsedTime) override;
553
554
556 // Makes a copy of the widget
558 Widget::Ptr clone() const override
559 {
560 return std::make_shared<EditBox>(*this);
561 }
562
563
565 private:
566
568 // Handles "Backspace" key press
570 void backspaceKeyPressed();
571
573 // Handles "Delete" key press
575 void deleteKeyPressed();
576
578 // Handles "Ctrl+C" key press (or equivalent on macOS)
580 void copySelectedTextToClipboard();
581
583 // Handles "Ctrl+X" key press (or equivalent on macOS)
585 void cutSelectedTextToClipboard();
586
588 // Handles "Ctrl+V" key press (or equivalent on macOS)
590 void pasteTextFromClipboard();
591
593 // Handles "ArrowLeft" key press
595 void moveCaretLeft(bool shiftPressed);
596
598 // Handles "ArrowRight" key press
600 void moveCaretRight(bool shiftPressed);
601
603 // Handles "Ctrl+ArrowLeft" key press (or equivalent on macOS)
605 void moveCaretWordBegin();
606
608 // Handles "Ctrl+ArrowRight" key press (or equivalent on macOS)
610 void moveCaretWordEnd();
611
612
614 public:
615
616 SignalString onTextChange = {"TextChanged"};
617 SignalString onReturnKeyPress = {"ReturnKeyPressed"};
618 SignalString onReturnOrUnfocus = {"ReturnOrUnfocused"};
619
620
622 protected:
623
624 // Is the caret visible or not?
625 bool m_caretVisible = true;
626
627 // When this boolean is true then you can no longer add text when the EditBox is full.
628 // Changing it to false will allow you to scroll the text (default).
629 // You can change the boolean with the limitTextWidth(bool) function.
630 bool m_limitTextWidth = false;
631
632 bool m_readOnly = false;
633
634 // The text inside the edit box
635 String m_text;
636 String m_displayedText; // Same as m_text unless a password char is set
637
638 String m_regexString = U".*";
639 std::wregex m_regex = std::wregex{m_regexString.toWideString()};
640
641 // The text alignment
642 Alignment m_textAlignment = Alignment::Left;
643
644 // The selection
645 std::size_t m_selChars = 0;
646 std::size_t m_selStart = 0;
647 std::size_t m_selEnd = 0;
648
649 // The password character
650 char32_t m_passwordChar = '\0';
651
652 // The maximum allowed characters.
653 // Zero by default, meaning no limit.
654 unsigned int m_maxChars = 0;
655
656 // When the text width is not limited, you can scroll the edit box and only a part will be visible.
657 unsigned int m_textCropPosition = 0;
658
659 // The rectangle behind the selected text
660 FloatRect m_selectedTextBackground;
661
662 // The blinking caret
663 FloatRect m_caret = {0, 0, 1, 0};
664
665 // Is there a possibility that the user is going to double click?
666 bool m_possibleDoubleClick = false;
667
668 // We need three texts for drawing + one for the default text + one more for calculations.
669 Text m_textBeforeSelection;
670 Text m_textSelection;
671 Text m_textAfterSelection;
672 Text m_defaultText;
673 Text m_textFull;
674 Text m_textSuffix;
675
676 Sprite m_sprite;
677 Sprite m_spriteHover;
678 Sprite m_spriteDisabled;
679 Sprite m_spriteFocused;
680
681 // Cached renderer properties
682 Borders m_bordersCached;
683 Padding m_paddingCached;
684 Color m_borderColorCached;
685 Color m_borderColorHoverCached;
686 Color m_borderColorDisabledCached;
687 Color m_borderColorFocusedCached;
688 Color m_backgroundColorCached;
689 Color m_backgroundColorHoverCached;
690 Color m_backgroundColorDisabledCached;
691 Color m_backgroundColorFocusedCached;
692 Color m_caretColorCached;
693 Color m_caretColorHoverCached;
694 Color m_caretColorFocusedCached;
695 Color m_selectedTextBackgroundColorCached;
696
697
699 };
700
702}
703
705
706#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.
unsigned int getTextSize() const override
Returns the character size of the text.
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.
Definition: EditBox.hpp:558
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.
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.
void setTextSize(unsigned int textSize) override
Changes the character size of the text.
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:262
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