#include <QStringList>

#include "slideitem.h"

#include "slidemodel.h"
#include "treeitem.h"
#include "vymmodel.h"

uint SlideItem::idLastSlide=0;    // make instance

SlideItem::SlideItem(const QVector<QVariant> &data, SlideItem *parent, SlideModel *sm )
{
    parentItem = parent;
    itemData = data;
    idLastSlide++;
    slideID=idLastSlide;
    treeItemID=-1;
    zoomFactor=-1;
    duration=2000;
    easingCurve.setType (QEasingCurve::OutQuint);

    if (sm)
	model=sm;
    else
	model=parent->getModel();

    if (data.isEmpty()) itemData.append(QVariant("empty"));
}

SlideItem::~SlideItem()
{
    qDeleteAll(childItems);
}

SlideModel* SlideItem::getModel()
{
    return model;
}

uint SlideItem::getID()
{
    return slideID;
}

SlideItem *SlideItem::child(int number)
{
    return childItems.value(number);
}

int SlideItem::childCount() const
{
    return childItems.count();
}

int SlideItem::childNumber() const
{
    if (parentItem)
        return parentItem->childItems.indexOf(const_cast<SlideItem*>(this));

    return 0;
}

int SlideItem::columnCount() const
{
    return itemData.count();
}

QVariant SlideItem::data(int column) const
{
    return itemData.value(column);
}

int SlideItem::row() const
{
    if (parentItem)
        return parentItem->childItems.indexOf(const_cast<SlideItem*>(this));

    return 0;
}

void SlideItem::insertItem (int pos, SlideItem *si)
{
    if (pos<0) pos=0;
    if (pos>childItems.count() ) pos=childItems.count();
    childItems.insert (pos,si);
    si->parentItem=this;
}

void SlideItem::removeItem (int pos)
{
    // Remove, but don't delete (needed for relinking)
    if (pos<0 || pos > childItems.size()-1)
	qWarning ("TreeItem::removeChild tried to remove non existing item?!");
    else
	childItems.removeAt (pos);
}

bool SlideItem::insertChildren(int position, int count, int columns)
{
    if (position < 0 || position > childItems.size())
        return false;

    for (int row = 0; row < count; ++row) {
        QVector<QVariant> data(columns);
        SlideItem *item = new SlideItem(data, this);
        childItems.insert(position, item);
    }

    return true;
}

bool SlideItem::insertColumns(int position, int columns)
{
    if (position < 0 || position > itemData.size())
        return false;

    for (int column = 0; column < columns; ++column)
        itemData.insert(position, QVariant());

    foreach (SlideItem *child, childItems)
        child->insertColumns(position, columns);

    return true;
}

SlideItem *SlideItem::parent()
{
    return parentItem;
}

bool SlideItem::removeChildren(int position, int count)
{
    if (position < 0 || position + count > childItems.size())
        return false;

    for (int row = 0; row < count; ++row)
        delete childItems.takeAt(position);

    return true;
}

bool SlideItem::removeColumns(int position, int columns)
{
    if (position < 0 || position + columns > itemData.size())
        return false;

    for (int column = 0; column < columns; ++column)
        itemData.remove(position);

    foreach (SlideItem *child, childItems)
        child->removeColumns(position, columns);

    return true;
}

bool SlideItem::setData(int column, const QVariant &value)
{
    if (column < 0 || column >= itemData.size())
        return false;

    itemData[column] = value;
    return true;
}

void SlideItem::setName (const QString &n)
{
    setData ( 0, QVariant (n) );
}

QString SlideItem::getName ()
{
    return data(0).toString();
}

void SlideItem::setTreeItem (TreeItem *ti)
{
    if (ti) 
	treeItemID=ti->getID();
    else
	qWarning()<<"SlideItem::setTreeItem no ID!";
}

int SlideItem::getTreeItemID()
{
    return treeItemID;
}

void SlideItem::setInScript (const QString &s)
{
    inScript=s;
}

QString SlideItem::getInScript()
{
    return inScript;
}

void SlideItem::setOutScript (const QString &s)
{
    outScript=s;
}

QString SlideItem::getOutScript()
{
    return outScript;
}

void SlideItem::setZoomFactor (const qreal &zf)
{
    zoomFactor=zf;
}

qreal SlideItem::getZoomFactor()
{
    return zoomFactor;
}

void SlideItem::setRotationAngle (const qreal &zf)
{
    rotationAngle=zf;
}

qreal SlideItem::getRotationAngle()
{
    return rotationAngle;
}

void SlideItem::setDuration (const int  &d)
{
    duration=d;
}

int SlideItem::getDuration()
{
    return duration;
}

void SlideItem::setEasingCurve (const QEasingCurve &c)
{
    easingCurve=c;
}

QEasingCurve SlideItem::getEasingCurve()
{
    return easingCurve;
}

QString SlideItem::saveToDir()
{
    QString att_ins, att_outs;
    if (inScript.isEmpty()) 
    {
	att_ins=attribut ("inScript",QString("select(\"%1\")").arg(model->getVymModel()->getSelectString (treeItemID ) ) );
    } else
	att_ins=attribut ("inScript",inScript );
    if (!outScript.isEmpty()) att_outs=attribut ("outScript",outScript );

    return singleElement ("slide",
	attribut ("name",data(0).toString() ) +
	attribut ("zoom",QString().setNum ( zoomFactor) ) +
	attribut ("rotation",QString().setNum ( rotationAngle ) ) +
	attribut ("duration",QString().setNum ( duration ) ) +
	attribut ("curve",QString().setNum ( easingCurve.type() ) ) +
	attribut ("mapitem",model->getVymModel()->getSelectString (treeItemID ) ) +
	att_ins +
	att_outs
	);
}

