/*
 * Countours.h
 *
 *  Created on: 26.12.2010
 *      Author: dgrat
 */

#ifndef COUNTOURS_H_
#define COUNTOURS_H_

#include <QtGui>
#include <opencv/cv.h>
#include <opencv/highgui.h>

class DisplayThread;

class CViewerPrivate : public QWidget {
	Q_OBJECT
public:
        CViewerPrivate(QWidget *parent = 0) : QWidget(parent) {
		m_pContour = NULL;
		m_pArtImg = NULL;
		m_pImg = NULL;
		pContourStorage = NULL;
	}

	IplImage *GetImg() {
		if(m_pArtImg)
			return m_pArtImg;
		else return NULL;
	}

	int GetNrColonies() {
		return m_iNrColonies;
	}

public 	slots:
	void slSetImg(IplImage *pImg);
	void slChangeConfig(int iVal1, int iVal2);

signals:
	void siImageChanged();

private:
	IplImage *m_pImg, *m_pArtImg;
	CvSeq* m_pContour;
	CvMemStorage* pContourStorage;
	int m_iNrColonies;
};

class ContourViewer : public CViewerPrivate {
	Q_OBJECT
friend class DisplayThread;
public:
	ContourViewer(QWidget *parent = 0);
	virtual ~ContourViewer();

public slots:
	void slDisplayImage();

	int GetBiasU() {
		return m_MaxSizeSl.value();
	}
	int GetBiasD() {
		return m_MinSizeSl.value();
	}

protected:
	QSlider m_MinSizeSl, m_MaxSizeSl;
	QLabel *m_pNrColLbl;
	QLabel *m_pImageLbl;
	QImage m_QImg;

private:
	QLabel *m_lblMin, *m_lblMax;
	QSpinBox m_MinSizeSB, m_MaxSizeSB;
	DisplayThread *m_pDispThread;
};


/*
 * THREAD
 */
/*
class DisplayThread : public QThread {
	Q_OBJECT
private:
	bool restart;
	QMutex mutex;
	QWaitCondition condition;

	int m_iMin;
	int m_iMax;
	CViewerPrivate *m_pParent;

signals:
	void ImageProcessed(QImage, const QString &);
public slots:
	void slChangeMax(int val);
	void slChangeMin(int val);
	void SetConfig(int iMin, int iMax);
public:
	DisplayThread(CViewerPrivate *pPriv, int iMin, int iMax);
	void run();
};

class DisplayThread : public QThread {
private:
	int m_iMin;
	int m_iMax;
	ContourViewer *m_pParent;

public:
	DisplayThread(ContourViewer *pPriv) : m_pParent(pPriv) {
		assert( pPriv != NULL );

		m_iMin = 0;
		m_iMax = 0;
	}

	void SetConfig(int iMin, int iMax) {
		m_iMin = iMin;
		m_iMax = iMax;
	}

	void run() {
		m_pParent->slChangeConfig(m_iMin, m_iMax );
		m_pParent->m_QImg = QImage( (const uchar *)m_pParent->GetImg()->imageData,
									m_pParent->GetImg()->width,
									m_pParent->GetImg()->height,
									QImage::Format_RGB888);

		m_pParent->m_pImageLbl->setPixmap(QPixmap::fromImage(m_pParent->m_QImg));
		if(m_pParent->GetNrColonies() > 0) {
			m_pParent->m_pNrColLbl->setText(QString::number(m_pParent->GetNrColonies()) + " surfaces");
		}
	}
};
*/
#endif /* COUNTOURS_H_ */
