#pragma once #include "Abs_Axis.h" #include "Axis_Builder.h" #include #include namespace renderive { struct Axis_Properties : Axis_Base_Properties { Range coordinates{0.0, 20.0}; int precision = 2; bool wheel{}; bool drag{}; }; namespace detail { struct Numeric_Axis_State { Range coordinates{0.0, 20.0}; int precision = 2; bool wheel{}; bool drag{}; }; struct Axis_Interaction_State { bool dragging{}; PointF last_pointer{}; }; class LIB_DECL Axis_Control : public Abs_Axis, public Event_Handler { public: Axis_Control(Plot_Core& plot, const Axis_Properties& properties); [[nodiscard]] Range coord_range() const override; [[nodiscard]] int label_precision() const; void set_label_precision(int value); [[nodiscard]] double coord_start() const; void set_coord_start(double value); [[nodiscard]] double coord_length() const; void set_coord_length(double value); void set_coord_range(Range range); void set_use_wheel(bool value); void set_use_drag(bool value); [[nodiscard]] bool use_wheel() const; [[nodiscard]] bool use_drag() const; void handle_event(const Event& event) override; [[nodiscard]] std::string tick_label(double tick) const override; void publish() override; [[nodiscard]] std::uint64_t state_revision() const override; protected: [[nodiscard]] Numeric_Axis_State numeric_state() const; [[nodiscard]] Numeric_Axis_State render_numeric_state() const; private: struct Numeric_Base {}; struct Interaction_Base {}; using Numeric_State = Double_State_Strategy; using Interaction_State = Double_State_Strategy; Numeric_State numeric_; Interaction_State interaction_; }; } // namespace detail using Axis = Attach_Builder; } // namespace renderive