Blob Blame Raw
#pragma once

#ifndef TRENDERERP_INCLUDE
#define TRENDERERP_INCLUDE

#include <QObject>
#include <QMetaType>

#include "trenderer.h"

//=============================================================================================

//! This is a private class used to convey the TRenderer::startRendering
//! methods into Qt queued slots. This is necessary since these methods implicitly
//! perform event processing, which could cause trouble in case they are invoked from
//! events which must respect a strict ordering.
//! \n \n
//! For example, suppose that a render must be invoked upon a mousePressEvent,
//! and that such event must have been completely processed before the corrispondant
//! mouseReleaseEvent is invoked - calling the startRendering method *directly* by
//! the mousePressEvent may cause the mouseReleaseEvent to be processed before the
//! former's end.
class TRendererStartInvoker : public QObject
{
	Q_OBJECT

public:
	struct StartInvokerRenderData {
		unsigned long m_renderId;
		const RenderDataVector *m_renderDataVector;
	};

public:
	TRendererStartInvoker()
	{
		qRegisterMetaType<StartInvokerRenderData>("StartInvokerRenderData");

		connect(this, SIGNAL(startRender(TRendererImp *, StartInvokerRenderData)),
				this, SLOT(doStartRender(TRendererImp *, StartInvokerRenderData)),
				Qt::QueuedConnection);
	}
	~TRendererStartInvoker() {}

	static TRendererStartInvoker *instance()
	{
		static TRendererStartInvoker theInstance;
		return &theInstance;
	}

	void emitStartRender(TRendererImp *renderer, StartInvokerRenderData rd);

	Q_SIGNALS :

		void
		startRender(TRendererImp *, StartInvokerRenderData);

public Q_SLOTS:

	void doStartRender(TRendererImp *, StartInvokerRenderData rd);
};

#endif //TRENDERERP_INCLUDE