TGUI  0.9.1
EditBox.hpp
1 //
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 
37 namespace 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 
97  static EditBox::Ptr create();
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(BackendRenderTargetBase& 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.
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 setReadOnly(bool readOnly=true)
Makes the edit box read-only or make it writable again.
EditBoxRenderer * getRenderer()
Returns the renderer, which gives access to functions that determine how the widget is displayed.
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.
Signal & getSignal(String signalName) override
Retrieves a signal based on its name.
Alignment
The text alignment.
Definition: EditBox.hpp:57
const String & getText() const
Returns the text inside the edit box. This text is not affected by the password character.
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 & getDefaultText() const
Returns the default text of the edit box. This is the text drawn when the edit box is empty.
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.
bool setInputValidator(const String &regex=U".*")
Defines how the text input should look like.
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 & getInputValidator() const
Returns the regex to which the text is matched.
void setEnabled(bool enabled) override
Enables or disables the widget.
EditBoxRenderer * getSharedRenderer()
Returns the renderer, which gives access to functions that determine how the widget is displayed.
void setSize(const Layout2d &size) override
Changes the size of the edit box.
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 draw(BackendRenderTargetBase &target, RenderStates states) const override
Draw the widget to a render target.
const String & getSuffix() const
Returns the suffix currently displayed on the right side of the edit box.
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:74
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