#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" namespace renderive { struct Marker_Private; /// @brief 标记绘制模式。 enum class Marker_Mode : std::uint8_t { /// @brief 点标记。 Point, /// @brief 垂直线标记。 Domain_Line, /// @brief 水平线标记。 Value_Line, /// @brief 十字光标标记。 Crosshair }; /// @brief 单标记构造属性。 struct Marker_Prop { std::weak_ptr domain_axis{}; std::weak_ptr value_axis{}; PointF position{}; double radius = 2.0; Pen pen = Pen{Color::white()}; Brush brush = Brush{}; Marker_Mode mode = Marker_Mode::Point; }; /// @brief 批量标记项。 struct Marker_Item { PointF position{}; double radius = 2.0; Pen pen = Pen{Color::white()}; Brush brush = Brush{}; Marker_Mode mode = Marker_Mode::Point; }; /// @brief 按坐标轴绘制点、线或十字标记的图元。 class LIB_DECL Marker : 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(double, radius) /// @brief 标记画笔。 PROP(Pen, pen) /// @brief 点标记填充刷。 PROP(Brush, brush) /// @brief 标记绘制模式。 PROP(Marker_Mode, mode) /// @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 创建标记图元。 Marker(); private: Marker_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 Marker::Builder : Marker_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(double, radius) PROP_B(Pen, pen) PROP_B(Brush, brush) PROP_B(Marker_Mode, mode) /// @brief 创建标记构造器。 Builder(std::shared_ptr parent, std::shared_ptr domain_axis, std::shared_ptr value_axis); /// @brief 构建并返回标记对象。 std::shared_ptr build(); std::shared_ptr parent{}; }; } // namespace renderive