95 lines
3.0 KiB
C++
95 lines
3.0 KiB
C++
#pragma once
|
|
#include <cstdint>
|
|
#include <memory_resource>
|
|
#include <span>
|
|
#include <utility>
|
|
#include <vector>
|
|
#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<Abs_Axis> domain_axis{};
|
|
std::weak_ptr<Abs_Axis> 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<Abs_Axis>, domain_axis)
|
|
/// @brief 绑定 Y 轴。
|
|
PROP(std::shared_ptr<Abs_Axis>, 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<const Marker_Item> items);
|
|
/// @brief 移动写入批量标记项。
|
|
void update_items(std::pmr::vector<Marker_Item>&& items);
|
|
/// @brief 写入容器中的批量标记项。
|
|
template <typename Items>
|
|
void update_items(const Items& items) {
|
|
update_items(std::span<const Marker_Item>(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<Renderable>, parent)
|
|
PROP_B(std::shared_ptr<Abs_Axis>, domain_axis)
|
|
PROP_B(std::shared_ptr<Abs_Axis>, 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<Renderable> parent, std::shared_ptr<Abs_Axis> domain_axis, std::shared_ptr<Abs_Axis> value_axis);
|
|
/// @brief 构建并返回标记对象。
|
|
std::shared_ptr<Marker> build();
|
|
std::shared_ptr<Renderable> parent{};
|
|
};
|
|
} // namespace renderive
|