#include "statusiconpopupwidget.h" #include "qmmp/soundcore.h" #include #include #include #include #include #include #include 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("" + title + ""); 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("Nothing is playing"); 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(); }