#include <QDebug>
#include <QByteArray>
#include <QColor>
#include <QToolTip>
#include "byteLoggerModel.h"

CByteLoggerModel::CByteLoggerModel(QObject *parent) :
	QAbstractListModel(parent)
{
	m_byteData = new QByteArray;
}


int CByteLoggerModel::rowCount(const QModelIndex &parent) const
{
	return (m_byteData->count() / m_NumOfColumns);
}


int CByteLoggerModel::columnCount(const QModelIndex &parent) const
{
    return m_NumOfColumns;
}


void CByteLoggerModel::append(const QByteArray &a)
{
	m_byteData->append(a);
	// scroll zum Ende ?

	// erzwinge neu darstellen aller Views
	reset();

}


QVariant CByteLoggerModel::data(const QModelIndex &index, int role) const
{
    if(!index.isValid())
        return QVariant();
    /* TODO: Prüfung von row und column implementieren! */
    if(index.row() >= m_byteData->size())
        return QVariant();
    if(index.column() >= m_byteData->size())
        return QVariant();

    QByteArray value;
    value.append(m_byteData->at(index.column() + (index.row() * m_NumOfColumns)));

    if(role == Qt::DisplayRole)
    {
        return value.toHex().toUpper();
    }
    else if(role == Qt::TextAlignmentRole)
    {
        return int(Qt::AlignHCenter | Qt::AlignVCenter);
    }
    else if(role == Qt::TextColorRole)
    {
    	return QColor(40,40,40);
    }
    else if(role == Qt::ToolTipRole)
    {
    	QString str;
    	str.append("Decimal: ").append(QByteArray::number((unsigned char)value.at(0))).append("\n");
    	str.append("ASCII  : ").append(value.at(0)).append("\n");
    	str.append("Binary : ").append(QByteArray::number((unsigned char)value.at(0), 2));
    	return str;
    }
    if(role==Qt::BackgroundRole)
    {
    	if(value.at(0) == 107)
    	{
    		return QColor(255,113,113,100);
    	}
    	else
    	{
    		return QColor(113,255,113,100);
    	}
    }
    else
    {
        return QVariant();
    }
}


void CByteLoggerModel::setNumOfColumns(int columns)
{
	m_NumOfColumns = columns;
	/* update all views */
	reset();
}
