#ifndef REFRESHDEFERRER_H #define REFRESHDEFERRER_H #include class CutterDockWidget; class RefreshDeferrer; using RefreshDeferrerParams = void *; using RefreshDeferrerParamsResult = void *; class RefreshDeferrerAccumulator { friend class RefreshDeferrer; public: virtual ~RefreshDeferrerAccumulator() = default; protected: virtual void accumulate(RefreshDeferrerParams params) =0; virtual void ignoreParams(RefreshDeferrerParams params) =0; virtual void clear() =0; virtual RefreshDeferrerParamsResult result() =0; }; template class ReplacingRefreshDeferrerAccumulator: public RefreshDeferrerAccumulator { private: T *value = nullptr; bool replaceIfNull; public: explicit ReplacingRefreshDeferrerAccumulator(bool replaceIfNull = true) : replaceIfNull(replaceIfNull) {} ~ReplacingRefreshDeferrerAccumulator() override { delete value; } protected: void accumulate(RefreshDeferrerParams params) override { if (!replaceIfNull && !params) { return; } delete value; value = static_cast(params); } void ignoreParams(RefreshDeferrerParams params) override { delete static_cast(params); } void clear() override { delete value; value = nullptr; } virtual RefreshDeferrerParamsResult result() override { return value; } }; class RefreshDeferrer : public QObject { Q_OBJECT private: CutterDockWidget *dockWidget = nullptr; RefreshDeferrerAccumulator *acc; bool dirty = false; public: RefreshDeferrer(RefreshDeferrerAccumulator *acc, QObject *parent = nullptr); virtual ~RefreshDeferrer(); bool attemptRefresh(RefreshDeferrerParams params); void registerFor(CutterDockWidget *dockWidget); signals: void refreshNow(const RefreshDeferrerParamsResult paramsResult); }; #endif //REFRESHDEFERRER_H