TGUI  0.10-beta
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 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
227 void setPasswordCharacter(char32_t passwordChar);
228
229
237 char32_t getPasswordCharacter() const;
238
239
248 void setMaximumCharacters(unsigned int maxChars);
249
250
260 unsigned int getMaximumCharacters() const;
261
262
269 void setAlignment(Alignment alignment);
270
271
279
280
290 void limitTextWidth(bool limitWidth = true);
291
292
299 bool isTextWidthLimited() const;
300
301
311 void setReadOnly(bool readOnly = true);
312
313
323 bool isReadOnly() const;
324
325
332 void setCaretPosition(std::size_t charactersBeforeCaret);
333
334
341 std::size_t getCaretPosition() const;
342
343
360 bool setInputValidator(const String& regex = U".*");
361
362
369 const String& getInputValidator() const;
370
371
379 void setSuffix(const String& suffix);
380
381
387 const String& getSuffix() const;
388
389
398 void setFocused(bool focused) override;
399
400
405 bool isMouseOnWidget(Vector2f pos) const override;
406
407
411 void leftMousePressed(Vector2f pos) override;
412
416 void mouseMoved(Vector2f pos) override;
417
421 void keyPressed(const Event::KeyEvent& event) override;
422
426 void textEntered(char32_t key) override;
427
428
436 void draw(BackendRenderTarget& target, RenderStates states) const override;
437
438
440 protected:
441
451 Signal& getSignal(String signalName) override;
452
453
460 void rendererChanged(const String& property) override;
461
462
466 std::unique_ptr<DataIO::Node> save(SavingRenderersMap& renderers) const override;
467
468
472 void load(const std::unique_ptr<DataIO::Node>& node, const LoadingRenderersMap& renderers) override;
473
474
478 void updateTextSize() override;
479
480
482 // Returns the total width that the text is going to take
484 float getFullTextWidth() const;
485
486
488 // Returns the size without the borders
490 Vector2f getInnerSize() const;
491
492
494 // Returns the width of the edit box minus the padding.
496 float getVisibleEditBoxWidth() const;
497
498
500 // This function will search after which character the caret should be placed. It will not change the caret position.
502 std::size_t findCaretPosition(float posX);
503
504
506 // Removes the selected characters. This function is called when pressing backspace, delete or a letter while there were
507 // some characters selected.
509 void deleteSelectedCharacters();
510
511
513 // Recalculates the position of the texts.
515 void recalculateTextPositions();
516
517
519 // Updates the internal texts after SelStart or SelEnd changed.
521 void updateSelection();
522
523
525 // Update the color of the Text objects
527 void updateTextColor();
528
529
531 // This function is called every frame with the time passed since the last frame.
533 bool updateTime(Duration elapsedTime) override;
534
535
537 // Makes a copy of the widget
539 Widget::Ptr clone() const override;
540
541
543 private:
544
546 // Handles "Backspace" key press
548 void backspaceKeyPressed();
549
551 // Handles "Delete" key press
553 void deleteKeyPressed();
554
556 // Handles "Ctrl+C" key press (or equivalent on macOS)
558 void copySelectedTextToClipboard();
559
561 // Handles "Ctrl+X" key press (or equivalent on macOS)
563 void cutSelectedTextToClipboard();
564
566 // Handles "Ctrl+V" key press (or equivalent on macOS)
568 void pasteTextFromClipboard();
569
571 // Handles "ArrowLeft" key press
573 void moveCaretLeft(bool shiftPressed);
574
576 // Handles "ArrowRight" key press
578 void moveCaretRight(bool shiftPressed);
579
581 // Handles "Ctrl+ArrowLeft" key press (or equivalent on macOS)
583 void moveCaretWordBegin();
584
586 // Handles "Ctrl+ArrowRight" key press (or equivalent on macOS)
588 void moveCaretWordEnd();
589
590
592 public:
593
594 SignalString onTextChange = {"TextChanged"};
595 SignalString onReturnKeyPress = {"ReturnKeyPressed"};
596 SignalString onReturnOrUnfocus = {"ReturnOrUnfocused"};
597
598
600 protected:
601
602 // Is the caret visible or not?
603 bool m_caretVisible = true;
604
605 // When this boolean is true then you can no longer add text when the EditBox is full.
606 // Changing it to false will allow you to scroll the text (default).
607 // You can change the boolean with the limitTextWidth(bool) function.
608 bool m_limitTextWidth = false;
609
610 bool m_readOnly = false;
611
612 // The text inside the edit box
613 String m_text;
614 String m_displayedText; // Same as m_text unless a password char is set
615
616 String m_regexString = U".*";
617 std::wregex m_regex;
618
619 // The text alignment
620 Alignment m_textAlignment = Alignment::Left;
621
622 // The selection
623 std::size_t m_selChars = 0;
624 std::size_t m_selStart = 0;
625 std::size_t m_selEnd = 0;
626
627 // The password character
628 char32_t m_passwordChar = '\0';
629
630 // The maximum allowed characters.
631 // Zero by default, meaning no limit.
632 unsigned int m_maxChars = 0;
633
634 // When the text width is not limited, you can scroll the edit box and only a part will be visible.
635 unsigned int m_textCropPosition = 0;
636
637 // The rectangle behind the selected text
638 FloatRect m_selectedTextBackground;
639
640 // The blinking caret
641 FloatRect m_caret = {0, 0, 1, 0};
642
643 // Is there a possibility that the user is going to double click?
644 bool m_possibleDoubleClick = false;
645
646 // We need three texts for drawing + one for the default text + one more for calculations.
647 Text m_textBeforeSelection;
648 Text m_textSelection;
649 Text m_textAfterSelection;
650 Text m_defaultText;
651 Text m_textFull;
652 Text m_textSuffix;
653
654 Sprite m_sprite;
655 Sprite m_spriteHover;
656 Sprite m_spriteDisabled;
657 Sprite m_spriteFocused;
658
659 // Cached renderer properties
660 Borders m_bordersCached;
661 Padding m_paddingCached;
662 Color m_borderColorCached;
663 Color m_borderColorHoverCached;
664 Color m_borderColorDisabledCached;
665 Color m_borderColorFocusedCached;
666 Color m_backgroundColorCached;
667 Color m_backgroundColorHoverCached;
668 Color m_backgroundColorDisabledCached;
669 Color m_backgroundColorFocusedCached;
670 Color m_caretColorCached;
671 Color m_caretColorHoverCached;
672 Color m_caretColorFocusedCached;
673 Color m_selectedTextBackgroundColorCached;
674
675
677 };
678
680}
681
683
684#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