#pragma once
#include "render_2D/export.h"
#include <QColor>
#include <QEvent>
#include <QPaintEvent>
#include <QString>
#include <QWidget>
#include <memory>
namespace renderive {
struct Abs_Plot_Private;
class Latency_Eager_Plot;
class Explicit_Plot;
class LIB_DECL Abs_Plot : public QWidget {
    Q_OBJECT
public:
    virtual void init();
    [[nodiscard]] QColor background_color() const;
    [[nodiscard]] Scene2D* scene() const;
    [[nodiscard]] std::shared_ptr<Renderable> root_renderable() const;
    [[nodiscard]] std::shared_ptr<Renderable> create_renderable_node(
        const std::shared_ptr<Renderable>& parent, const QString& object_name = {}) const;
    void set_background_color(const QColor& color);
    void remove_renderable(const std::shared_ptr<Renderable>& renderable);
    ~Abs_Plot() override;
protected:
    explicit Abs_Plot(Abs_Plot_Private* private_data);
    void start_render_timer();
    void stop_render_timer();
    void update_render_interval();
    bool event(QEvent* event) final;
    void paintEvent(QPaintEvent* event) final;
    Abs_Plot_Private* d{};
};
} // namespace renderive
