/********************************************************************************
* FaceTrackNoIR		This program is a private project of the some enthusiastic	*
*					gamers from Holland, who don't like to pay much for			*
*					head-tracking.												*
*																				*
* Copyright (C) 2010	Wim Vriend (Developing)									*
*						Ron Hendriks (Researching and Testing)					*
*																				*
* Homepage																		*
*																				*
* This program is free software; you can redistribute it and/or modify it		*
* under the terms of the GNU 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 General Public License for	*
* more details.																	*
*																				*
* You should have received a copy of the GNU General Public License along		*
* with this program; if not, see <http://www.gnu.org/licenses/>.				*
*********************************************************************************/

#ifndef FaceTrackNoIR_H
#define FaceTrackNoIR_H

#undef FTNOIR_PROTOCOL_BASE_LIB
#undef FTNOIR_TRACKER_BASE_LIB
#undef FTNOIR_FILTER_BASE_LIB
#define FTNOIR_PROTOCOL_BASE_EXPORT Q_DECL_IMPORT
#define FTNOIR_TRACKER_BASE_EXPORT Q_DECL_IMPORT
#define FTNOIR_FILTER_BASE_EXPORT Q_DECL_IMPORT

#include <QtGui/QMainWindow>
#include <QApplication>
#include <QFileDialog>
#include <QListView>
#include <QPainter>
#include <QWidget>
#include <QDialog>
#include <QUrl>
#include <QList>
#include <QKeySequence>
#include <QtGui>
#include <QString>
#if !defined(_WIN32) && !defined(__WIN32)
#	include <qxtglobalshortcut.h>
#else
#	include <windows.h>
#endif
#include <QThread>
#include <QDebug>
#include <QElapsedTimer>

#include "ui_facetracknoir.h"

#include "ftnoir_protocol_base/ftnoir_protocol_base.h"
#include "ftnoir_tracker_base/ftnoir_tracker_base.h"
#include "ftnoir_filter_base/ftnoir_filter_base.h"

#include "global-settings.h"
#include "tracker.h"
#include "facetracknoir/curve-config.h"

class Tracker;				// pre-define class to avoid circular includes
class FaceTrackNoIR;

class KeybindingWorker;

class FaceTrackNoIR : public QMainWindow, IDynamicLibraryProvider
{
	Q_OBJECT

public:
	FaceTrackNoIR(QWidget *parent = 0, Qt::WFlags flags = 0);
	~FaceTrackNoIR();

	void updateSettings();						// Update the settings (let Tracker read INI-file).

    QFrame *get_video_widget();					// Get a pointer to the video-widget, to use in the DLL
    Tracker *tracker;
    void bindKeyboardShortcuts();
    DynamicLibrary* current_tracker1() {
        return dlopen_trackers.value(ui.iconcomboTrackerSource->currentIndex(), (DynamicLibrary*) NULL);
    }
    DynamicLibrary* current_tracker2() {
        return dlopen_trackers.value(ui.cbxSecondTrackerSource->currentIndex() - 1, (DynamicLibrary*) NULL);
    }
    DynamicLibrary* current_protocol() {
        return dlopen_protocols.value(ui.iconcomboProtocol->currentIndex(), (DynamicLibrary*) NULL);
    }
    DynamicLibrary* current_filter() {
        return dlopen_filters.value(ui.iconcomboFilter->currentIndex(), (DynamicLibrary*) NULL);
    }
    THeadPoseDOF& axis(int idx) {
        return *pose.axes[idx];
    }

#if defined(_WIN32) || defined(__WIN32)
    Key keyCenter;
    KeybindingWorker* keybindingWorker;
#else 
    QxtGlobalShortcut* keyCenter;
#endif
public slots:
        void shortcutRecentered();

private:
    HeadPoseData pose;
	Ui::FaceTrackNoIRClass ui;
	QTimer timUpdateHeadPose;					// Timer to display headpose
	QStringList iniFileList;					// List of INI-files, that are present in the Settings folder

    ITrackerDialog* pTrackerDialog;			// Pointer to Tracker dialog instance (in DLL)
    ITrackerDialog* pSecondTrackerDialog;		// Pointer to the second Tracker dialog instance (in DLL)
    IProtocolDialog* pProtocolDialog;			// Pointer to Protocol dialog instance (in DLL)
    IFilterDialog* pFilterDialog;				// Pointer to Filter dialog instance (in DLL)

	/** Widget variables **/
	QWidget *_keyboard_shortcuts;
	QWidget *_curve_config;

	void createIconGroupBox();

	void GetCameraNameDX();
	void loadSettings();
	void setupFaceTrackNoIR();

    QList<DynamicLibrary*> dlopen_filters;
    QList<DynamicLibrary*> dlopen_trackers;
    QList<DynamicLibrary*> dlopen_protocols;

    bool looping;

private slots:
	//file menu
	void open();
	void save();
	void saveAs();
	void exit();
//		void setIcon(int index);
	void profileSelected(int index);

	void showVideoWidget();
	void showHeadPoseWidget();
	void showTrackerSettings();
	void showSecondTrackerSettings();

	void showServerControls();
	void showFilterControls();
	void showKeyboardShortcuts();
	void showCurveConfiguration();

        void setInvertAxis( Axis axis, int invert );
        void setInvertYaw(int invert) {
            setInvertAxis(Yaw, invert);
        }
        void setInvertPitch(int invert) {
            setInvertAxis(Pitch, invert);
        }        
        void setInvertRoll(int invert) {
            setInvertAxis(Roll, invert);
        }
        void setInvertX(int invert) {
            setInvertAxis(TX, invert);
        }
        void setInvertY(int invert) {
            setInvertAxis(TY, invert);
        }
        void setInvertZ(int invert) {
            setInvertAxis(TZ, invert);
        }
		void showHeadPose();

        void startTracker();
		void stopTracker();

};

#endif // FaceTrackNoIR_H