#pragma once #include "Element.hpp" #include "../../RichText/TextBox.hpp" #include #include #include "../../FontData.hpp" #include "../../InputManager.hpp" #include "../../RichTextUserInput.hpp" namespace GUIStuff { template struct TextBoxData { T* data = nullptr; std::function(const std::string&)> fromStr; std::function toStr; bool singleLine = true; bool immutable = false; InputManager::TextInputProperties textInputProps; std::string emptyText; std::function onEdit; std::function onEnter; std::function onSelect; std::function onDeselect; }; template class TextBox : public Element { public: TextBox(GUIManager& gui); void layout(const Clay_ElementId& id, const TextBoxData& userInfo); void select(); virtual void update() override; virtual void deselect() override; virtual void clay_draw(SkCanvas* canvas, UpdateInputData& io, Clay_RenderCommand* command, bool skiaAA) override; virtual void input_paste_callback(const CustomEvents::PasteEvent& paste) override; virtual void input_text_key_callback(const InputManager::KeyCallbackArgs& key) override; virtual void input_text_callback(const InputManager::TextCallbackArgs& text) override; virtual void input_mouse_button_callback(const InputManager::MouseButtonCallbackArgs& button) override; virtual void input_mouse_motion_callback(const InputManager::MouseMotionCallbackArgs& motion) override; virtual std::optional get_text_box_start_info() override; ~TextBox(); private: void populate_empty_textbox(); void after_text_input_callback(); void init_textbox(UpdateInputData& io); void reset_textbox_text(); bool update_data(); bool is_selected() const; struct OldDisplayData { bool isSelected = false; std::string textboxStr; RichText::TextBox::Cursor cur; } oldDD; bool isEmptyText = false; bool isHeld = false; std::unique_ptr edit; std::optional oldData; std::string oldEmptyText; TextBoxData userInfo; std::shared_ptr textbox; std::shared_ptr cur; }; }