#pragma once // ReSharper disable once CppUnusedIncludeDirective #include "pre.hpp" #include "ui/control.hpp" namespace cru::ui::controls { class TextControl : public NoChildControl { protected: TextControl( const Microsoft::WRL::ComPtr& init_text_format, const Microsoft::WRL::ComPtr& init_brush ); public: TextControl(const TextControl& other) = delete; TextControl(TextControl&& other) = delete; TextControl& operator=(const TextControl& other) = delete; TextControl& operator=(TextControl&& other) = delete; ~TextControl() override = default; String GetText() const { return text_; } void SetText(const String& text); Microsoft::WRL::ComPtr GetBrush() const { return brush_; } void SetBrush(const Microsoft::WRL::ComPtr& brush); Microsoft::WRL::ComPtr GetTextFormat() const { return text_format_; } void SetTextFormat(const Microsoft::WRL::ComPtr& text_format); bool IsSelectable() const { return is_selectable_; } std::optional GetSelectedRange() const { return selected_range_; } void SetSelectedRange(std::optional text_range); void ClearSelection() { SetSelectedRange(std::nullopt); } protected: void SetSelectable(bool is_selectable); Size OnMeasureContent(const Size& available_size, const AdditionalMeasureInfo&) override final; virtual void RequestChangeCaretPosition(unsigned position); void OnRectChange(const Rect& old_rect, const Rect& new_rect) override; private: void OnTextChangedCore(const String& old_text, const String& new_text); void RecreateTextLayout(); // param point is the mouse point relative to this control. void UpdateCursor(const std::optional& point); private: String text_; Microsoft::WRL::ComPtr brush_; Microsoft::WRL::ComPtr selection_brush_; Microsoft::WRL::ComPtr text_format_; protected: Microsoft::WRL::ComPtr text_layout_; private: bool is_selectable_ = false; bool is_selecting_ = false; unsigned mouse_down_position_ = 0; std::optional selected_range_ = std::nullopt; }; }