// Copyright (c) 2021 - 2022 kio@little-bat.de
// BSD-2-Clause license
// https://opensource.org/licenses/BSD-2-Clause

#pragma once
#include "kio/kio.h"
#include "NVPtr.h"
#include <QPainter>
#include <QRect>
#include <QPoint>
#include <QPen>
#include <QBrush>
#include <QFont>
#include <QTransform>
#include <mutex>


namespace gterm
{


////////////////////////////////////////////////////////////


using DrawingCommand = std::function<void(QPainter&)>;
static_assert (sizeof(DrawingCommand) == 32, "");		// just to know the size


////////////////////////////////////////////////////////////


class DrawingPipeline : public std::vector<DrawingCommand>
{
	Q_DISABLE_COPY_MOVE(DrawingPipeline)

public:
	DrawingPipeline() = default;
	~DrawingPipeline() = default;

	void append (DrawingCommand&& cmd) { push_back(std::move(cmd)); }
	void append (const DrawingCommand& cmd) { push_back(cmd); }
	DrawingPipeline& operator<< (const DrawingCommand& cmd) { push_back(cmd); return *this; }
	DrawingPipeline& operator<< (DrawingCommand&& cmd) { push_back(std::move(cmd)); return *this; }

	void purge() { this->clear(); }

	void run (QPainter& p) const
	{
		for (auto cmd : *this) { if (cmd) cmd(p); }
	}
};


////////////////////////////////////////////////////////////


} // namespace































