#pragma once #include "widget/OpaqueWidget.hpp" #include "ui/common.hpp" #include "event.hpp" #include "app.hpp" namespace rack { namespace ui { struct TextField : widget::OpaqueWidget { std::string text; std::string placeholder; bool multiline = false; /** The index of the text cursor */ int cursor = 0; /** The index of the other end of the selection. If nothing is selected, this is equal to `cursor`. */ int selection = 0; TextField(); void draw(const widget::DrawContext &ctx) override; void onButton(const event::Button &e) override; void onHover(const event::Hover &e) override; void onEnter(const event::Enter &e) override; void onSelect(const event::Select &e) override; void onSelectText(const event::SelectText &e) override; void onSelectKey(const event::SelectKey &e) override; /** Inserts text at the cursor, replacing the selection if necessary */ void insertText(std::string text); /** Replaces the entire text */ void setText(std::string text); void selectAll(); virtual int getTextPosition(math::Vec mousePos); }; } // namespace ui } // namespace rack