#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 updateEveryEdit = true; bool immutable = false; InputManager::TextInputProperties textInputProps; std::function onEdit; std::function onEnter; std::function onSelect; std::function onDeselect; }; struct TextEditData { TextEditData(unsigned initTextboxInputID, const std::shared_ptr& initTextBox, const std::shared_ptr& initCursor): textboxInputID(initTextboxInputID), userInput(initTextBox, initCursor, nullptr) {} unsigned textboxInputID; RichTextUserInput userInput; }; template class TextBox : public Element { public: TextBox(GUIManager& gui); void layout(const Clay_ElementId& id, const TextBoxData& userInfo); virtual void clay_draw(SkCanvas* canvas, UpdateInputData& io, Clay_RenderCommand* command, bool skiaAA) override; virtual void input_paste_callback(const CustomEvents::PasteEventData& 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; ~TextBox(); private: void after_text_input_callback(); void init_textbox(UpdateInputData& io); void reset_textbox_text(); bool update_data(); bool is_selected() const; bool isHeld = false; std::optional edit; std::optional oldData; TextBoxData userInfo; std::shared_ptr textbox; std::shared_ptr cur; }; }