diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-10-16 15:59:23 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2009-10-16 15:59:23 +0000 |
| commit | 1837bc49ff6645be319decdafb4a896aab79f51f (patch) | |
| tree | 612ca3ad874d88a8e813cbaf103326ef7b7f4edc /src/plugins/General/statusicon/statusiconpopupwidget.cpp | |
| parent | edcf1ca68a32c85e18ac500990bd28e93e4be2e5 (diff) | |
| download | qmmp-1837bc49ff6645be319decdafb4a896aab79f51f.tar.gz qmmp-1837bc49ff6645be319decdafb4a896aab79f51f.tar.bz2 qmmp-1837bc49ff6645be319decdafb4a896aab79f51f.zip | |
added status icon popup message (patch by Artur Guzik)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@1316 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/General/statusicon/statusiconpopupwidget.cpp')
| -rw-r--r-- | src/plugins/General/statusicon/statusiconpopupwidget.cpp | 207 |
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(); +} + + |
