/********************************************************************************
* 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

#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)
#	include <qxtglobalshortcut.h>
#else
#	include <windows.h>
#endif
#include <QThread>
#include <QDebug>
#include <QElapsedTimer>

#include "ui_facetracknoir.h"

#include "global-settings.h"
#include "tracker.h"
#include "facetracknoir/shortcuts.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"

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();

    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)
    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