#pragma once #include #include #include #include #include #include "../architecture/Renderable.h" #include "../Axis/Abs_Axis.h" #include "../base/Geometry.h" #include "../base/Memory.h" #include "../base/Style.h" #include "../base/Text.h" namespace renderive { struct Label_Private; /// @brief 单标签构造属性。 struct Label_Prop { std::weak_ptr domain_axis{}; std::weak_ptr value_axis{}; PointF position{}; PointF offset{}; std::string text; Text_Align alignment = Text_Align::Left | Text_Align::Top; Font font; Pen text_pen = Pen{Color::white()}; Brush background_brush = Brush{}; Pen border_pen = Pen{.style = Line_Style::None}; }; /// @brief 批量标签项。 struct Label_Item { PointF position{}; PointF offset{}; std::string text; Text_Align alignment = Text_Align::Left | Text_Align::Top; Font font; Pen text_pen = Pen{Color::white()}; Brush background_brush = Brush{}; Pen border_pen = Pen{.style = Line_Style::None}; }; /// @brief 按坐标轴绘制文本标签的图元。 class LIB_DECL Label : public Renderable { public: /// @brief 绑定 X 轴。 PROP(std::shared_ptr, domain_axis) /// @brief 绑定 Y 轴。 PROP(std::shared_ptr, value_axis) /// @brief 单标签坐标位置。 PROP(PointF, position) /// @brief 单标签像素偏移。 PROP(PointF, offset) /// @brief 单标签文本。 PROP(std::string, text) /// @brief 文本相对锚点对齐方式。 PROP(Text_Align, alignment) /// @brief 文本字体。 PROP(Font, font) /// @brief 文本画笔。 PROP(Pen, text_pen) /// @brief 背景填充刷。 PROP(Brush, background_brush) /// @brief 边框画笔。 PROP(Pen, border_pen) /// @brief 写入批量标签项。 void update_items(std::span items); /// @brief 移动写入批量标签项。 void update_items(std::pmr::vector&& items); /// @brief 写入容器中的批量标签项。 template void update_items(const Items& items) { update_items(std::span(items.data(), items.size())); } struct Builder; /// @brief 创建标签图元。 Label(); private: Label_Private* d(); Render_Object_Owner create_render_data() override; Render_Object_Owner create_render_state() override; Render_Object_Owner create_input_data() override; }; /// @brief 标签构造器。 struct LIB_DECL Label::Builder : Label_Prop { PROP_B(std::shared_ptr, parent) PROP_B(std::shared_ptr, domain_axis) PROP_B(std::shared_ptr, value_axis) PROP_B(PointF, position) PROP_B(PointF, offset) PROP_B(std::string, text) PROP_B(Text_Align, alignment) PROP_B(Font, font) PROP_B(Pen, text_pen) PROP_B(Brush, background_brush) PROP_B(Pen, border_pen) /// @brief 创建标签构造器。 Builder(std::shared_ptr parent, std::shared_ptr domain_axis, std::shared_ptr value_axis); /// @brief 构建并返回标签对象。 std::shared_ptr