/*
    QGL GLWidget
    Ivan Pelipenko peri4ko@yandex.ru

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#ifndef GLWIDGET_H
#define GLWIDGET_H

#include "qglengine_core_export.h"

#include <QWidget>


class QGLView;
class ObjectBase;
class Scene;
class Renderer;

class QGLENGINE_CORE_EXPORT GLWidget: public QWidget {
	Q_OBJECT
	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(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_; }
	Renderer * renderer();
	Scene * scene();

	QColor backColor() const;
	qreal lineWidth() const;
	qreal FOV() const;
	qreal depthStart() 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(ObjectBase * o);
	QByteArray saveCamera();
	void restoreCamera(const QByteArray & ba);

public slots:
	void stop();
	void start(float freq = 0.0);
	void setLineWidth(const qreal & arg);
	void setFOV(const qreal & arg);
	void setDepthStart(const qreal & 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;
};

#endif // GLWIDGET_H
