#pragma once #include #include #include "../RenderAble.h" namespace YSG { void LIB_DECL startRenderScheduler(); class RenderScheduler; struct PlotPrivate; class PerformanceShower; enum class Plot_Buffer_Acquire_Mode : std::uint8_t { Try, Wait }; class LIB_DECL Plot : public QWidget { Q_OBJECT public: bool usePerformanceShower(); void set_usePerformanceShower(bool use); virtual void init() { initLayer(); } void render(); QColor backgroundColor(); bool mFirstResize = true, mFirstPrepareData = true; void setBackgroundColor(const QColor& color) const; Plot_Buffer_Acquire_Mode paintBufferAcquireMode() const; void setPaintBufferAcquireMode(Plot_Buffer_Acquire_Mode mode); void markRenderStateDirty(); void requestRender(); struct Layer { QString mLayerName; QVector mRenderAbles; }; QString mObjectName; QList mLayerList; QString mDefaultLayerName; virtual void initLayer() { auto addLayer = [this](QString&& name) { auto layer = new Layer; layer->mLayerName = name; mLayerList.append(layer); mLayerMap[name] = layer; }; addLayer("background"); addLayer("plottable"); addLayer("axis"); addLayer("legend"); mDefaultLayerName = "plottable"; } bool isRendering(); void startRender(int refreshTimesPreSecond); void startRender() const; void pauseRender() const; Plot(); ~Plot() override; PlotPrivate *d{}; private: QHash mLayerMap; bool event(QEvent* event) final; void paintEvent(QPaintEvent* event) final; void scheduleRenderTimer(); void submitRender(); void finishRender(); void requestUpdate(const QRegion& region); void renderColor(RenderAble::ColorBuffer* color, QSize size, QColor background, std::uint64_t version); friend class RenderScheduler; friend struct RenderAble; }; }