#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QWidget>


class QGLView;
class GLRendererBase;
class GLObjectBase;

class GLWidget: public QWidget {
	Q_OBJECT
	Q_PROPERTY(QColor backColor READ backColor WRITE setBackColor)
	Q_PROPERTY(qreal lineWidth READ lineWidth WRITE setLineWidth)
	Q_PROPERTY(qreal FOV READ FOV WRITE setFOV)
	Q_PROPERTY(qreal depthStart READ depthStart WRITE setDepthStart)
	Q_PROPERTY(qreal depthEnd READ depthEnd WRITE setDepthEnd)
	Q_PROPERTY(QColor ambientColor READ ambientColor WRITE setAmbientColor)
	Q_PROPERTY(bool grabMouse READ isGrabMouseEnabled WRITE setGrabMouseEnabled)
	Q_PROPERTY(bool mouseRotate READ isMouseRotateEnabled WRITE setMouseRotateEnabled)
	Q_PROPERTY(bool mouseSelection READ isMouseSelectionEnabled WRITE setMouseSelectionEnabled)
	Q_PROPERTY(bool cameraOrbit READ isCameraOrbit WRITE setCameraOrbit)
	Q_PROPERTY(bool hoverHalo READ isHoverHaloEnabled WRITE setHoverHaloEnabled)
	Q_PROPERTY(QColor hoverHaloColor READ hoverHaloColor WRITE setHoverHaloColor)
	Q_PROPERTY(qreal hoverHaloFillAlpha READ hoverHaloFillAlpha WRITE setHoverHaloFillAlpha)
	Q_PROPERTY(bool selectionHalo READ isSelectionHaloEnabled WRITE setSelectionHaloEnabled)
	Q_PROPERTY(QColor selectionHaloColor READ selectionHaloColor WRITE setSelectionHaloColor)
	Q_PROPERTY(qreal selectionHaloFillAlpha READ selectionHaloFillAlpha WRITE setSelectionHaloFillAlpha)

public:
	explicit GLWidget(QWidget * parent = nullptr);
	QGLView * view() { return view_; }

	QColor backColor() const;
	qreal lineWidth() const;
	qreal FOV() const;
	qreal depthStart() const;
	qreal depthEnd() const;
	QColor ambientColor() const;
	bool isLightEnabled() const;
	bool isGrabMouseEnabled() const;
	bool isMouseRotateEnabled() const;
	bool isMouseSelectionEnabled() const;
	bool isCameraOrbit() const;
	bool isHoverHaloEnabled() const;
	QColor hoverHaloColor() const;
	qreal hoverHaloFillAlpha() const;
	bool isSelectionHaloEnabled() const;
	QColor selectionHaloColor() const;
	qreal selectionHaloFillAlpha() const;

	void addObject(GLObjectBase * o);
	QByteArray saveCamera();
	void restoreCamera(const QByteArray & ba);

public slots:
	void stop();
	void start(float freq = 60.0, GLRendererBase * r = nullptr);
	void setBackColor(const QColor & c);
	void setLineWidth(const qreal & arg);
	void setFOV(const qreal & arg);
	void setDepthStart(const qreal & arg);
	void setDepthEnd(const qreal & arg);
	void setAmbientColor(const QColor & arg);
	void setLightEnabled(const bool & arg);
	void setGrabMouseEnabled(const bool & arg);
	void setMouseRotateEnabled(const bool & arg);
	void setMouseSelectionEnabled(const bool & arg);
	void setCameraOrbit(const bool & arg);
	void setHoverHaloEnabled(const bool & arg);
	void setHoverHaloColor(const QColor & arg);
	void setHoverHaloFillAlpha(const qreal & arg);
	void setSelectionHaloEnabled(const bool & arg);
	void setSelectionHaloColor(const QColor & arg);
	void setSelectionHaloFillAlpha(const qreal & arg);

private slots:
	void viewDoubleClicked();

private:
	QWidget * container;
	QGLView * view_;
	QLayout * lay;

signals:
};

#endif // GLWIDGET_H
