aboutsummaryrefslogblamecommitdiff
path: root/src/plugins/General/statusicon/statusiconpopupwidget.cpp
blob: ab1530bd48e27e57e1eaec96f5cee970a152d02a (plain) (tree)














































































































































































































                                                                                                       
#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();
}