Support for album art, various UI improvements
authordruid23 <usr@dru-id.co.uk>
Fri, 20 Aug 2010 00:48:52 +0000 (01:48 +0100)
committerdruid23 <usr@dru-id.co.uk>
Fri, 20 Aug 2010 00:48:52 +0000 (01:48 +0100)
modified:   main.cpp
modified:   playermainwindow.cpp
modified:   playermainwindow.h
modified:   playermainwindow.ui
modified:   playlistmainwindow.cpp
modified:   playlistmainwindow.h

main.cpp
playermainwindow.cpp
playermainwindow.h
playermainwindow.ui
playlistmainwindow.cpp
playlistmainwindow.h

index ec6ea7f..8828564 100644 (file)
--- a/main.cpp
+++ b/main.cpp
@@ -43,8 +43,12 @@ int main(int argc, char *argv[])
 
 
   PlayerMainWindow * mainwindow = new PlayerMainWindow;
-//
-   mainwindow->showMaximized();
+
+  mainwindow->setAttribute(Qt::WA_Maemo5LandscapeOrientation, true);
+  //mainwindow->setAttribute(Qt::WA_Maemo5PortraitOrientation, true);
+  //mainwindow->setAttribute(Qt::WA_Maemo5AutoOrientation, true);
+
+  mainwindow->showMaximized();
 
     return a.exec();
 }
index 22e6218..1157c66 100644 (file)
@@ -17,6 +17,7 @@
   */
   #include <QDebug>
   #include <QTime>
+  #include <QtGui>
   #include "playermainwindow.h"
   #include "ui_playermainwindow.h"
   #include "configdialog.h"
@@ -41,6 +42,8 @@
       mVolume = 100;
       mMuted = false;
 
+      mIsLandscape = true;
+
       ui->playlistButton->setIcon(QIcon::fromTheme("notes_bullets"));
       ui->browseButton->setIcon(QIcon::fromTheme("filemanager_media_folder"));
 
       ui->volUp->setIcon(QIcon::fromTheme("statusarea_volumelevel4"));
       ui->volMute->setIcon(QIcon::fromTheme("statusarea_volume_mute"));
 
+      ui->labelArtPortrait->setVisible(false);
+      ui->labelArtLandscape->setVisible(false);
+
+      ui->labelTitle->setTextFormat(Qt::RichText);
+      ui->labelArtist->setTextFormat(Qt::RichText);
+      ui->labelAlbum->setTextFormat(Qt::RichText);
+
 
   #if defined(Q_WS_S60) || defined(Q_WS_MAEMO_5)
+
       mPlayListMainWindow->setParent(this);
       mPlayListMainWindow->setAttribute(Qt::WA_Maemo5StackedWindow);
-      mPlayListMainWindow->setAttribute(Qt::WA_Maemo5LandscapeOrientation,true);
-      mPlayListMainWindow->setAttribute(Qt::WA_Maemo5LandscapeOrientation,true);
       setAttribute(Qt::WA_Maemo5StackedWindow);
       mPlayListMainWindow->setWindowFlags(mPlayListMainWindow->windowFlags() | Qt::Window);
 
       mBrowserMainWindow->setParent(this);
       mBrowserMainWindow->setAttribute(Qt::WA_Maemo5StackedWindow);
-      mBrowserMainWindow->setAttribute(Qt::WA_Maemo5LandscapeOrientation,true);
-      mBrowserMainWindow->setAttribute(Qt::WA_Maemo5LandscapeOrientation,true);
       setAttribute(Qt::WA_Maemo5StackedWindow);
       mBrowserMainWindow->setWindowFlags(mBrowserMainWindow->windowFlags() | Qt::Window);
 
+      connect(QApplication::desktop(), SIGNAL(resized(int)), this, SLOT(orientationChanged()));
+
   #endif
 
       connect(mTimer,SIGNAL(timeout()),this,SLOT(askStatus()));
       connect(ui->volMute,SIGNAL(clicked()),this,SLOT(volMute()));
       connect(ui->slider,SIGNAL(sliderMoved(int)),this,SLOT(slide(int)));
 
-             showConfig();
+      connect(mPlayListMainWindow, SIGNAL(idUpdated(int,bool,QString)), this, SLOT(playlistIdUpdated(int, bool, QString)));
+
+
+      // check if last used connection is still valid or showConfig
+      QSettings settings;
+      QString last_ip = AccountDialog::currentIp();
+      if (!last_ip.isNull() && !last_ip.isEmpty()) {
+          QTcpSocket * socket = new QTcpSocket;
+          if(last_ip.contains(":"))
+          {
+              QStringList hostSplit = last_ip.split(":");
+              QString ip   = hostSplit.at(0);
+              QString port = hostSplit.at(1);
+              socket->connectToHost(ip,port.toInt());
+          }
+          else {
+              socket->connectToHost(last_ip,8080);
+          }
+          if (!socket->waitForConnected(1000)) {
+                 showConfig();
+             }
+          else {
+              mIp= last_ip;
+
+             mPlayListMainWindow->init();
+             mBrowserMainWindow->init();
+             mTimer->start(5000);
+             askStatus();
+          }
+          delete socket;
+      }
+      else {
+        showConfig();
+      }
 
 
   }
       }
   }
 
+  void PlayerMainWindow::orientationChanged() {
+      QRect screenGeometry = QApplication::desktop()->screenGeometry();
+      mIsLandscape = (screenGeometry.width() > screenGeometry.height());
+      if (mHasImage) {
+          if (mIsLandscape) {
+              ui->labelArtPortrait->setVisible(false);
+              ui->labelArtLandscape->setVisible(true);
+          }
+          else {
+              ui->labelArtLandscape->setVisible(false);
+              ui->labelArtPortrait->setVisible(true);
+          }
+      }
+      else {
+          ui->labelArtLandscape->setVisible(false);
+          ui->labelArtPortrait->setVisible(false);
+      }
+  }
+
   void PlayerMainWindow::playpause()
   {
       // NB. There is no guarentee that our current state is the real current state.
       // Still this is probably better than nothing and our next real poll will set us straight again.
       if (PAUSED == mCurrentStatus.state) {
         mCurrentStatus.state = PLAYING;
-        qDebug() << "pause() from PAUSED";
         pause();
         updateUiWithCurrentStatus();
       }
       else if (PLAYING == mCurrentStatus.state) {
         mCurrentStatus.state = PAUSED;
-        qDebug() << "pause() from PLAYING";
         pause();
         updateUiWithCurrentStatus();
       }
         // could be STOP or UNKNOWN, either way there is no guarentee we will enter a playing state next.
         // So don't update the current state or UI
         // Ideally we would try to find a way to check the current state again but this could lead to an infinite loop!
-        qDebug() << "play() from " << ((STOP == mCurrentStatus.state) ? "STOP" : "UNKNOWN");
         play();
       }
   }
       QDomNode infoNode =  docElem.namedItem("information");
       QDomNode metaInfoNode =  infoNode.namedItem("meta-information");
       QString title = metaInfoNode.namedItem("title").toElement().text().replace("\\\\", "\\");
+      // if it's a file style title fix it up
+      if (40 < title.length()) {
+          if (0 < title.lastIndexOf("\\")) {
+              title = title.right(title.length() - (title.lastIndexOf("\\") + 1));
+          }
+          else if (0 < title.lastIndexOf("/")) {
+              title = title.right(title.length() - (title.lastIndexOf("/") + 1));
+          }
+      }
       QString artist = metaInfoNode.namedItem("artist").toElement().text();
       QString album = metaInfoNode.namedItem("album").toElement().text();
       QString now_playing = metaInfoNode.namedItem("now_playing").toElement().text();
       if (mCurrentStatus.position >= 0 && mCurrentStatus.position <= 100)
           ui->slider->setValue(mCurrentStatus.position);
 
-      ui->label->setText(mCurrentStatus.title);
+      ui->labelTitle->setText(mCurrentStatus.title);
+      ui->labelArtist->setText(mCurrentStatus.artist);
+      ui->labelAlbum->setText(mCurrentStatus.album);
 
       if (PLAYING == mCurrentStatus.state) {
           ui->playpauseButton->setIcon(QIcon::fromTheme("camera_video_pause"));
           // potential actions:
           //   rebuild display layout
           //   retrieve album art
+          mHasImage = false;
+          mPlayListMainWindow->requestPlayList();
       }
       // Update the buttons on the playlist window
       if (NULL != this->mPlayListMainWindow) {
         this->mPlayListMainWindow->updateUiWithCurrentStatus(& mCurrentStatus);
       }
+
+  }
+  void PlayerMainWindow::playlistIdUpdated(int id, bool hasart, QString extension) {
+      if (hasart) {
+          getCoverArt(id);
+      }
+      else {
+          ui->labelArtLandscape->setVisible(false);
+          ui->labelArtPortrait->setVisible(false);
+          // could use a default graphic here!
+          // setCoverArtFromPixmap();
+      }
+  }
+  void PlayerMainWindow::readReady() {
+    QNetworkReply * reply = qobject_cast<QNetworkReply*>(sender());
+    // append to buffer
+    mResponse += reply->readAll();
+  }
+  void PlayerMainWindow::finished(QNetworkReply * reply) {
+    // now we can call setCoverArt to process the full buffers
+    this->setCoverArt(mResponse);
+    // only interested in finished signals
+    disconnect(mNetManager,SIGNAL(finished(QNetworkReply *)),this,SLOT(finished(QNetworkReply *)));
+  }
+  void PlayerMainWindow::getCoverArt(int id) {
+    mResponse.clear();
+    QNetworkReply * reply =  mNetManager->get(QNetworkRequest(QUrl("http://"+mIp+"/art?id=" + QString::number(id))));
+    connect(reply,SIGNAL(readyRead()),this,SLOT(readReady()));
+    connect(mNetManager,SIGNAL(finished(QNetworkReply *)),this,SLOT(finished(QNetworkReply *)));
+
+  }
+  void PlayerMainWindow::setCoverArt(const QByteArray data) {
+    QPixmap* image = new QPixmap();
+    if (image->loadFromData(data)) {
+        mHasImage = true;
+        ui->labelArtLandscape->setPixmap(image->scaledToHeight(120, Qt::SmoothTransformation));
+        ui->labelArtPortrait->setPixmap(image->scaledToHeight(310, Qt::SmoothTransformation));
+        if (mIsLandscape) {
+            ui->labelArtPortrait->setVisible(false);
+            ui->labelArtLandscape->setVisible(true);
+        }
+        else {
+            ui->labelArtLandscape->setVisible(false);
+            ui->labelArtPortrait->setVisible(true);
+        }
+    }
+    else {
+        ui->labelArtPortrait->setVisible(false);
+        ui->labelArtLandscape->setVisible(false);
+    }
+  }
+  void PlayerMainWindow::setCoverArtFromPixmap(QPixmap image) {
+    mHasImage = true;
+    ui->labelArtLandscape->setPixmap(image.scaledToHeight(120, Qt::SmoothTransformation));
+    ui->labelArtPortrait->setPixmap(image.scaledToHeight(310, Qt::SmoothTransformation));
+    if (mIsLandscape) {
+        ui->labelArtPortrait->setVisible(false);
+        ui->labelArtLandscape->setVisible(true);
+    }
+    else {
+        ui->labelArtLandscape->setVisible(false);
+        ui->labelArtPortrait->setVisible(true);
+    }
   }
 
index 4ab0541..8389002 100644 (file)
@@ -52,6 +52,13 @@ public slots:
     void volMute();
     void slide(int value);
     void updateUiWithCurrentStatus();
+    void setCoverArt(const QByteArray data);
+    void setCoverArtFromPixmap(QPixmap image);
+    void getCoverArt(int id);
+    void finished(QNetworkReply * reply);
+    void readReady();
+    void orientationChanged();
+    void playlistIdUpdated(int id, bool hasart, QString extension);
 
 
 protected slots:
@@ -70,6 +77,9 @@ private:
     int mVolume;
     int mMuted;
     VlcStatus mCurrentStatus;
+    QByteArray mResponse;
+    bool mIsLandscape;
+    bool mHasImage;
 
 };
 
index 4f91409..6251e68 100644 (file)
   <widget class="QWidget" name="centralwidget">
    <layout class="QVBoxLayout" name="verticalLayout">
     <item>
-     <widget class="QLabel" name="label">
+     <widget class="QLabel" name="labelArtPortrait">
       <property name="minimumSize">
        <size>
-        <width>0</width>
-        <height>200</height>
-       </size>
+        <width>380</width>
+        <height>340</height>
+       </size>s
       </property>
-      <property name="text">
-       <string>Information</string>
+      <property name="maximumSize">
+       <size>
+        <width>380</width>
+        <height>340</height>
+       </size>
       </property>
       <property name="alignment">
-       <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+       <set>Qt::AlignHCenter|Qt::AlignTrailing|Qt::AlignVCenter</set>
       </property>
      </widget>
     </item>
     <item>
+     <layout class="QHBoxLayout" name="horizontalLayoutDetails">
+      <item>
+        <layout class="QVBoxLayout" name="verticalLayoutDetails">
+          <item>
+            <widget class="QLabel" name="labelTitle">
+              <property name="minimumSize">
+              <size>
+                <width>0</width>
+                <height>30</height>
+              </size>
+              </property>
+              <property name="text">
+              <string>Information</string>
+              </property>
+              <property name="alignment">
+              <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+              </property>
+            </widget>
+          </item>
+          <item>
+            <widget class="QLabel" name="labelArtist">
+              <property name="minimumSize">
+              <size>
+                <width>0</width>
+                <height>30</height>
+              </size>
+              </property>
+              <property name="text">
+              <string>Information</string>
+              </property>
+              <property name="alignment">
+              <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+              </property>
+            </widget>
+          </item>
+          <item>
+            <widget class="QLabel" name="labelAlbum">
+              <property name="minimumSize">
+              <size>
+                <width>0</width>
+                <height>30</height>
+              </size>
+              </property>
+              <property name="text">
+              <string>Information</string>
+              </property>
+              <property name="alignment">
+              <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+              </property>
+            </widget>
+          </item>
+        </layout>
+      </item>
+      <item>
+       <widget class="QLabel" name="labelArtLandscape">
+        <property name="minimumSize">
+        <size>
+          <width>140</width>
+          <height>140</height>
+        </size>
+        </property>
+        <property name="maximumSize">
+        <size>
+          <width>140</width>
+          <height>140</height>
+        </size>
+        </property>
+        <property name="alignment">
+        <set>Qt::AlignHCenter|Qt::AlignTrailing|Qt::AlignVCenter</set>
+        </property>
+       </widget>
+      </item>
+     </layout>
+    </item>
+    <item>
+     <spacer name="verticalSpacer">
+      <property name="orientation">
+       <enum>Qt::Vertical</enum>
+      </property>
+      <property name="sizeHint" stdset="0">
+       <size>
+        <width>20</width>
+        <height>100</height>
+       </size>
+      </property>
+     </spacer>
+    </item>
+    <item>
      <layout class="QHBoxLayout" name="horizontalLayoutTime">
       <item>
        <widget class="QLabel" name="timeLabel">
      </widget>
     </item>
     <item>
-     <spacer name="verticalSpacer">
-      <property name="orientation">
-       <enum>Qt::Vertical</enum>
-      </property>
-      <property name="sizeHint" stdset="0">
-       <size>
-        <width>20</width>
-        <height>230</height>
-       </size>
-      </property>
-     </spacer>
-    </item>
-    <item>
      <layout class="QHBoxLayout" name="horizontalLayout">
       <item>
        <widget class="QToolButton" name="previousButton">
index 4114ca5..4ce67a7 100644 (file)
@@ -164,6 +164,10 @@ void PlayListMainWindow::parseXmlPlayList() {
   QDomNodeList nodes = docElem.elementsByTagName("node");
   int depth = 0;
 
+  int currentLeafId = 0;
+  bool hasArt = false;
+  QString extension = "";
+
   int ct = nodes.count();
   for (int idx = 0; idx < ct; ++idx) {
     QDomNode node = nodes.at(idx);
@@ -205,6 +209,12 @@ void PlayListMainWindow::parseXmlPlayList() {
                     it->type = "leaf";
                     current = item.attributes().namedItem("current").nodeValue();
                     it->playing = (0 < current.length());
+                    if (it->playing) {
+                        currentLeafId = it->id;
+                        QString art = item.toElement().namedItem("art_url").toElement().text();
+                        hasArt = (!art.isNull() && !art.isEmpty());
+                        extension = getExtension(it->path, NULL);
+                    }
                     this->mContents->append(*it);
                     delete it;
                   }
@@ -226,8 +236,10 @@ void PlayListMainWindow::parseXmlPlayList() {
 
   mResponse.clear();
 
+  emit this->idUpdated(currentLeafId, hasArt, extension);
   this->updateList();
 
+
 }
 
 QString PlayListMainWindow::getExtension(QString path, QString extension) {
index 369c464..e6dee7b 100644 (file)
@@ -57,6 +57,9 @@ protected slots:
     void parseXmlPlayList();
     void updateList();
 
+signals:
+    void idUpdated(int id, bool hasArt, QString extension);
+
 protected:
     void changeEvent(QEvent *e);
     VlcPlayListElementSimple getElementFromText(QString text);