aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/General/statusicon/statusiconpopupwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/General/statusicon/statusiconpopupwidget.cpp')
-rw-r--r--src/plugins/General/statusicon/statusiconpopupwidget.cpp207
1 files changed, 207 insertions, 0 deletions
diff --git a/src/plugins/General/statusicon/statusiconpopupwidget.cpp b/src/plugins/General/statusicon/statusiconpopupwidget.cpp
new file mode 100644
index 000000000..ab1530bd4
--- /dev/null
+++ b/src/plugins/General/statusicon/statusiconpopupwidget.cpp
@@ -0,0 +1,207 @@
+#include "statusiconpopupwidget.h"
+#include "qmmp/soundcore.h"
+
+#include <QLabel>
+#include <QTimer>
+#include <QPixmap>
+#include <QFileInfo>
+#include <QApplication>
+#include <QDesktopWidget>
+#include <QSpacerItem>
+
+StatusIconPopupWidget::StatusIconPopupWidget(QWidget * parent)
+ : QFrame(parent)
+{
+ setWindowFlags(Qt::X11BypassWindowManagerHint |
+ Qt::WindowStaysOnTopHint | Qt::Dialog | Qt::FramelessWindowHint);
+ setFrameStyle(QFrame::StyledPanel | QFrame::Plain);
+ setLineWidth(0);
+
+ setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
+ gLayout = new QGridLayout(this);
+ m_lblTitle = new QLabel();
+ m_lblArtist = new QLabel();
+ m_lblAlbum = new QLabel();
+ m_lblTime = new QLabel();
+ m_spacer = new QSpacerItem(20,0,QSizePolicy::Expanding,QSizePolicy::Expanding);
+ m_cover = new CoverWidget();
+
+ m_cover->setMinimumSize(100,100);
+ m_cover->setMaximumSize(100,100);
+
+ gLayout->addWidget(m_cover,0,0,5,1);
+ gLayout->addWidget(m_lblTitle,0,1);
+ gLayout->addWidget(m_lblArtist,1,1);
+ gLayout->addWidget(m_lblAlbum,2,1);
+ gLayout->addWidget(m_lblTime,3,1);
+ setLayout(gLayout);
+
+ m_timer = new QTimer(this);
+ m_timer->setSingleShot(TRUE);
+ m_timer->stop();
+
+ gLayout->addItem(m_spacer,4,1,1,1);
+ gLayout->setHorizontalSpacing(15);
+
+ connect(m_timer,SIGNAL(timeout()),SLOT(deleteLater()));
+ connect(SoundCore::instance(),SIGNAL(metaDataChanged()),this,SLOT(updateMetaData()));
+ connect(SoundCore::instance(),SIGNAL(elapsedChanged(qint64)),this,SLOT(updateTime(qint64)));
+ connect(SoundCore::instance(),SIGNAL(stateChanged(Qmmp::State)),this,SLOT(updateMetaData()));
+
+ setVisible(FALSE);
+}
+
+StatusIconPopupWidget::~StatusIconPopupWidget()
+{
+}
+
+void StatusIconPopupWidget::mousePressEvent(QMouseEvent *)
+{
+ deleteLater();
+}
+
+void StatusIconPopupWidget::updateMetaData()
+{
+ SoundCore *core = SoundCore::instance();
+ if(core->state() == Qmmp::Playing)
+ {
+ QString title = core->metaData(Qmmp::TITLE);
+ QString artist = core->metaData(Qmmp::ARTIST);
+ QString album = core->metaData(Qmmp::ALBUM);
+
+ if(title.isEmpty())
+ {
+ title = QFileInfo(core->metaData(Qmmp::URL)).completeBaseName();
+ if(m_splitFileName && title.contains("-"))
+ {
+ artist = title.section('-',0,0).trimmed();
+ title = title.section('-',1,1).trimmed();
+ }
+ }
+
+ m_lblTitle->setText("<b>" + title + "</b>");
+
+ if(!artist.isEmpty())
+ {
+ m_lblArtist->setText(artist);
+ m_lblArtist->setVisible(TRUE);
+ }
+ else
+ {
+ m_lblArtist->setVisible(FALSE);
+ }
+
+ if(!album.isEmpty())
+ {
+ m_lblAlbum->setText(album);
+ m_lblAlbum->setVisible(TRUE);
+ }
+ else
+ {
+ m_lblAlbum->setVisible(FALSE);
+ }
+
+ QPixmap cover = Decoder::findCover(core->metaData(Qmmp::URL));
+ if(cover.isNull())
+ {
+ m_cover->setPixmap(QPixmap(":/empty_cover.png"));
+ m_cover->setVisible(TRUE);
+ }
+ else
+ {
+ m_cover->setPixmap(cover);
+ m_cover->setVisible(TRUE);
+ }
+ m_lblTime->setVisible(TRUE);
+ m_totalTime = totalTimeString();
+ setVisible(TRUE);
+ }
+ else
+ {
+ m_cover->setVisible(FALSE);
+ m_lblAlbum->setVisible(FALSE);
+ m_lblArtist->setVisible(FALSE);
+ m_lblTime->setVisible(FALSE);
+ m_lblTitle->setText("<b>Nothing is playing</b>");
+ setVisible(FALSE); //
+ }
+ qApp->processEvents();
+ resize(sizeHint());
+ qApp->processEvents();
+ if(isVisible())
+ updatePosition(m_lastTrayX,m_lastTrayY);
+}
+
+void StatusIconPopupWidget::updateTime(qint64 elapsed)
+{
+ int second = elapsed / 1000;
+ int minute = second / 60;
+ int hour = minute / 60;
+
+ SoundCore * core = SoundCore::instance();
+
+ if(core->totalTime() > 3600000)
+ {
+ m_lblTime->setText(QString("%1:%2:%3").arg(hour,2,10,QChar('0')).arg(minute%60,2,10,QChar('0'))
+ .arg(second%60,2,10,QChar('0')) + "/" + m_totalTime);
+ return;
+ }
+ m_lblTime->setText(QString("%1:%2").arg(minute%60,2,10,QChar('0')).arg(second%60,2,10,QChar('0')) +
+ "/" + m_totalTime);
+}
+
+QString StatusIconPopupWidget::totalTimeString()
+{
+ SoundCore * core = SoundCore::instance();
+
+ int second = core->totalTime() / 1000;
+ int minute = second / 60;
+ int hour = minute / 60;
+
+ if(core->totalTime() > 3600000)
+ {
+ return QString("%1:%2:%3").arg(hour,2,10,QChar('0')).arg(minute%60,2,10,QChar('0'))
+ .arg(second%60,2,10,QChar('0'));
+ }
+ return QString("%1:%2").arg(minute%60,2,10,QChar('0')).arg(second%60,2,10,QChar('0'));
+}
+
+void StatusIconPopupWidget::updatePosition(int trayx, int trayy)
+{
+ QRect screenGeometry = QApplication::desktop()->availableGeometry();
+ int xpos = 0;
+ int ypos = 0;
+
+ xpos = screenGeometry.x() + trayx -5;
+ if(xpos + width() > screenGeometry.width())
+ xpos = screenGeometry.width() - width() -5;
+
+ if(trayy < screenGeometry.y()) //tray on top of screen
+ {
+ ypos = screenGeometry.y() + 5;
+ }
+
+ if(trayy > screenGeometry.y()) //tray on bottom
+ {
+ ypos = screenGeometry.y() + screenGeometry.height() - height() -5;
+ }
+ move(xpos,ypos);
+ return;
+}
+
+void StatusIconPopupWidget::showInfo(int x, int y, int delay, bool splitFileName)
+{
+ m_timer->stop();
+ m_timer->setInterval(delay);
+ m_lastTrayX = x;
+ m_lastTrayY = y;
+ m_splitFileName = splitFileName;
+ updateMetaData();
+ qApp->processEvents();
+ updatePosition(x,y);
+ qApp->processEvents();
+ show();
+ m_timer->start();
+}
+
+