Add icon's to songs in playlist
[groove] / playlist.cpp
index fbcf8f4..57f17b6 100644 (file)
 #include "playlist.h"
 
 playlist::playlist(QObject *parent) :
-    QObject(parent)
+    QAbstractTableModel(parent)
 {
    manager = new QNetworkAccessManager();
    this->currentdownloaditem = -1;
    pList = new QList<songElement *>;
-   this->currentplayingitem =-1;
+   this->currentplayingitem = -1;
+   this->currentSkeyItem = -1;
+   this->reply = NULL;
+   icon = new QIcon(":/groove/icons/general_forward.png");
 }
+
+//Implemented model class information
+QVariant playlist::data(const QModelIndex &index, int role) const
+{
+    QVariant dat;
+    playlist* play = (playlist *)index.model();
+    if(play->existAt(index.row()))
+    {
+        if (!index.isValid())
+            return QVariant();
+        if (role == Qt::TextAlignmentRole) {
+            return int(Qt::AlignLeft | Qt::AlignVCenter);
+        } else if (role == Qt::DecorationRole) {
+            switch(index.column())
+            {
+            case sName:
+                if(play->currentplaying()==index.row())
+                    dat = QVariant(*play->icon);
+                else
+                    dat = QVariant();
+                break;
+            default:
+                dat = QVariant();
+            }
+        } else if (role == Qt::DisplayRole) {
+            switch(index.column())
+            {
+            case sName:
+                dat = QVariant(*play->pList->at(index.row())->name);
+                break;
+            case sID:
+                dat = QVariant(*play->pList->at(index.row())->songId);
+                break;
+            case sKey:
+                dat = QVariant(*play->pList->at(index.row())->streamkey);
+                break;
+            case sDownloaded:
+                dat = QVariant(play->pList->at(index.row())->downloaded);
+                break;
+            case sReady:
+                dat = QVariant(play->pList->at(index.row())->bufferready);
+                break;
+            case sURL:
+                dat = QVariant(play->pList->at(index.row())->server->toString());
+                break;
+            case sPlayed:
+                dat = QVariant(play->pList->at(index.row())->played);
+                break;
+            default:
+                dat = QVariant();
+            }
+        } else
+            dat = QVariant();
+    }
+    else
+        dat = QVariant();
+    return dat;
+}
+int playlist::rowCount(const QModelIndex &) const
+{
+    return pList->size();
+}
+int playlist::columnCount(const QModelIndex &) const
+{
+    return PLAYLISTENUMS;
+}
+
+
+QList<playlist::songElement *>* playlist::getList()
+{
+    return pList;
+}
+
 void playlist::markPlayed(int position)
 {
-    pList->at(position)->played = true;
-    this->freeMemory(position);
+    if(0 <= position && position < pList->size())
+    {
+        pList->at(position)->played = true;
+        this->freeMemory(position);
+    }
 }
 void playlist::freeMemory(int position)
 {
-   pList->at(position)->buffer->~QBuffer();
+   pList->at(position)->downloaded = false;
+   pList->at(position)->bufferready = false;
+   delete pList->at(position)->buffer;
    pList->at(position)->buffer = new QBuffer();
 }
+bool playlist::existAt(int position)
+{
+    if(position < 0)
+        return false;
+    return (pList->size() > position);
+}
 
 int playlist::currentplaying()
 {
@@ -25,17 +112,22 @@ int playlist::currentplaying()
 }
 bool playlist::bReady(int b)
 {
-    return pList->at(b)->bufferready;
+    if(pList->size() > b)
+        return pList->at(b)->bufferready;
+    else
+        return false;
 }
 void playlist::setBufferRdy(int b)
 {
     pList->at(b)->bufferready = true;
 }
-bool playlist::setCurrentPlaying(int position)
+void playlist::setCurrentPlaying(int position)
 {
-    if(pList->size() > position)
+    if(this->existAt(position))
     {
         this->currentplayingitem = position;
+        if(!pList->at(position)->downloaded && this->currentdownloaditem != this->currentplayingitem)
+            this->beginDownload(position);
         /*if(pList->at(position)->bufferready == false &&)
         {
             if(!pList->at(position)->downloaded)
@@ -44,10 +136,17 @@ bool playlist::setCurrentPlaying(int position)
         else
             emit this->bufferReady(position);
         */
-        return true;
+        return;
     }
     else
-        return false;
+    {
+    if(position == -1)
+        {
+        this->currentplayingitem = -1;
+    }
+    else
+        return;
+    }
 }
 QIODevice * playlist::getBuffer(int position)
 {
@@ -63,14 +162,25 @@ void playlist::beginDownload(int position)
     qDebug() << pList->at(currentdownloaditem)->server;
     req.setHeader(req.ContentTypeHeader,QVariant("application/x-www-form-urlencoded"));
     if(reply)
-        reply->~QNetworkReply();
+    {
+        reply->disconnect();
+        reply->deleteLater();
+    }
     reply = manager->post(req,QString("streamKey=" + pList->at(this->currentdownloaditem)->streamkey->toAscii()).toAscii());
     pList->at(this->currentdownloaditem)->buffer->open(QBuffer::ReadWrite | QBuffer::Truncate);
     connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(downloadSlot(qint64,qint64)));
     connect(reply,SIGNAL(finished()),this,SLOT(networkReplyFinish()));
     connect(this,SIGNAL(downloadComplete(int)),this,SLOT(downloadDone(int)));
+    connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(getNError(QNetworkReply::NetworkError)));
     startStreamT = QTime::currentTime();
 }
+void playlist::getNError(QNetworkReply::NetworkError error)
+{
+    qDebug() << "Network Error (if this is 99 then it will retry" << error;
+    if(error == QNetworkReply::UnknownNetworkError && this->currentdownloaditem != -1)
+        beginDownload(this->currentdownloaditem);
+
+}
 
 void playlist::setGscom(gscom *comm)
 {
@@ -79,19 +189,21 @@ void playlist::setGscom(gscom *comm)
 }
 void playlist::skeyFound()
 {
-    emit this->unfreeze();
+    emit this->freeze(false);
     pList->at(this->currentSkeyItem)->streamkey = new QString(gs->streamID);
     pList->at(this->currentSkeyItem)->server = new QUrl(gs->sku);
     if(this->currentdownloaditem == -1)
         this->beginDownload(this->currentSkeyItem);
     else
         if(this->currentplaying() == this->currentSkeyItem)
-            this->beginDownload(this->currentplayingitem);
+            this->beginDownload(this->currentSkeyItem);
+    this->currentSkeyItem = -1;
 }
 
-int playlist::addSong(QStandardItem *item)
+int playlist::addSong(QStandardItem *item, QString name)
 {
     playlist::songElement *newelement = new playlist::songElement;
+    newelement->name = new QString(name);
     newelement->buffer = new QBuffer();
     newelement->downloaded =false;
     newelement->songId = new QString(item->text());
@@ -102,13 +214,15 @@ int playlist::addSong(QStandardItem *item)
     newelement->type = playlist::EStream;
     pList->append(newelement);
     gs->getSong(item->text());
-    emit this->freeze();
+    emit this->rowsInserted(QModelIndex(),pList->size(),pList->size());
+    this->currentSkeyItem = pList->size()-1;
+    emit this->freeze(true);
     return pList->size()-1;
 }
 
 void playlist::downloadDone(int position)
 {
-    if(pList->size() < position+1)
+    if(this->existAt(position+1) && this->currentSkeyItem == -1 && !pList->at(position+1)->downloaded && this->currentdownloaditem != position+1)
         beginDownload(position+1);
     else
         this->currentdownloaditem = -1;
@@ -123,10 +237,17 @@ void playlist::networkReplyFinish()
         QNetworkRequest req;
         req.setUrl(url.toUrl());
         qDebug() << url;
+        if(reply)
+        {
+            reply->disconnect();
+            reply->deleteLater();
+        }
         reply = manager->get(req);
         startStreamT = QTime::currentTime();
         //connect(reply,SIGNAL(finished()),this,SLOT(start()));
         connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(downloadSlot(qint64,qint64)));
+        connect(reply,SIGNAL(finished()),this,SLOT(networkReplyFinish()));
+        connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),this,SLOT(getNError(QNetworkReply::NetworkError)));
     }
 }
 
@@ -136,18 +257,23 @@ void playlist::downloadSlot(qint64 b, qint64 t)
     if(t != 0)
     {
         emit this->downloadProgress(this->currentdownloaditem,b,t);
-        pList->at(this->currentdownloaditem)->buffer->buffer().append(reply->readAll());
-        if ( b >= t*0.05 && !pList->at(currentdownloaditem)->bufferready && b/(startStreamT.msecsTo(QTime::currentTime()) + 1)*100/1024 >= 10)
+        if(existAt(this->currentdownloaditem))
         {
-            this->setBufferRdy(this->currentdownloaditem);
-            emit this->bufferReady(this->currentdownloaditem);
+            pList->at(this->currentdownloaditem)->buffer->buffer().append(reply->readAll());
+            //qDebug() << !pList->at(this->currentdownloaditem)->bufferready << this->currentdownloaditem;
+            if ( b >= t*0.05 && !pList->at(this->currentdownloaditem)->bufferready)
+                //if(!pList->at(currentdownloaditem)->bufferready && b/(startStreamT.msecsTo(QTime::currentTime()) + 1)*100/1024 >= 10)
+            {
+                this->setBufferRdy(this->currentdownloaditem);
+                emit this->bufferReady(this->currentdownloaditem);
 
-            qDebug() << "Buffer Ready";
-        }
-        if (b==t)
-        {
+                qDebug() << "Buffer Ready";
+            }
+            if (b==t)
+            {
             emit this->downloadComplete(this->currentdownloaditem);
             //emit this->bufferReady(this->currentdownloaditem);
+            }
         }
     }
 }