#include "NowPlayingPanel.h" #include "CoverArtWidget.h" #include "engine/MusicLibrary.h" #include #include #include NowPlayingPanel::NowPlayingPanel(QWidget *parent) : QGroupBox("Now Playing", parent) , m_cover(new CoverArtWidget) { buildLayout(); connect(m_btnPlay, &QPushButton::clicked, this, &NowPlayingPanel::playPauseClicked); connect(m_btnPrev, &QPushButton::clicked, this, &NowPlayingPanel::prevClicked); connect(m_btnNext, &QPushButton::clicked, this, &NowPlayingPanel::nextClicked); connect(m_seekBar, &QSlider::sliderPressed, this, [this]{ m_seekDragging = true; }); connect(m_seekBar, &QSlider::sliderReleased, this, [this]{ m_seekDragging = false; emit seekRequested(m_seekBar->value() / 1000.0); }); connect(m_volSlider, &QSlider::valueChanged, this, &NowPlayingPanel::volumeChanged); } void NowPlayingPanel::buildLayout() { m_cover->setFixedSize(130, 130); QFont boldF = m_lblTitle->font(); boldF.setBold(true); boldF.setPointSizeF(11); m_lblTitle->setFont(boldF); m_seekBar->setRange(0, 1000); m_seekBar->setValue(0); m_volSlider->setRange(0, 100); m_volSlider->setValue(80); m_volSlider->setFixedWidth(90); auto *seekRow = new QHBoxLayout; seekRow->addWidget(m_seekBar); seekRow->addWidget(m_lblTime); auto *btns = new QHBoxLayout; btns->setSpacing(3); btns->addWidget(m_btnPrev); btns->addWidget(m_btnPlay); btns->addWidget(m_btnNext); btns->addSpacing(8); btns->addWidget(m_chkShuffle); btns->addWidget(m_chkRepeat); auto *transport = new QHBoxLayout; transport->addLayout(btns); transport->addStretch(); transport->addWidget(new QLabel("Volume:")); transport->addWidget(m_volSlider); auto *metaRow = new QHBoxLayout; metaRow->setSpacing(8); metaRow->addWidget(new QLabel("Sample rate:")); metaRow->addWidget(m_lblSampleRate); metaRow->addWidget(new QLabel("Bits/Sample:")); metaRow->addWidget(m_lblBitsPerSample); metaRow->addWidget(new QLabel("Codec:")); metaRow->addWidget(m_lblCodec); metaRow->addStretch(); auto *right = new QVBoxLayout; right->setSpacing(4); right->addWidget(m_lblTitle); right->addWidget(m_lblArtist); right->addWidget(m_lblAlbum); right->addLayout(metaRow); right->addLayout(seekRow); right->addLayout(transport); auto *hlay = new QHBoxLayout(this); hlay->addWidget(m_cover); hlay->addLayout(right, 1); } void NowPlayingPanel::clearAudioInfo() { m_lblSampleRate->setText("-"); m_lblBitsPerSample->setText("-"); m_lblCodec->setText("-"); } void NowPlayingPanel::updateTrack(const engine::Track *t) { if (!t) { clearAudioInfo(); return; } m_cover->setTrack(t); m_lblTitle->setText(t->displayTitle()); m_lblArtist->setText(t->artist); m_lblAlbum->setText(t->album + (t->year > 0 ? " (" + QString::number(t->year) + ")" : "")); clearAudioInfo(); m_seekBar->setValue(0); m_btnPlay->setText("Pause"); } void NowPlayingPanel::updatePosition(qint64 posFrames, qint64 totalFrames, float sampleRate) { auto fmt = [](qint64 s) { return QString("%1:%2").arg(s / 60).arg(s % 60, 2, 10, QChar('0')); }; qint64 posSec = (sampleRate > 0) ? qint64(posFrames / sampleRate) : 0; qint64 totSec = (sampleRate > 0 && totalFrames > 0) ? qint64(totalFrames / sampleRate) : 0; m_lblTime->setText(fmt(posSec) + " / " + fmt(totSec)); if (!m_seekDragging && totalFrames > 0) m_seekBar->setValue(int(posFrames * 1000 / totalFrames)); } void NowPlayingPanel::updateAudioInfo(int sampleRate, int bitsPerSample, const QString &codec) { m_lblSampleRate->setText(sampleRate > 0 ? QString("%1 Hz").arg(sampleRate) : "-"); m_lblBitsPerSample->setText(bitsPerSample > 0 ? QString("%1").arg(bitsPerSample) : "-"); m_lblCodec->setText(!codec.isEmpty() ? codec : "-"); } void NowPlayingPanel::setPlaybackActive(bool playing) { m_btnPlay->setText(playing ? "Pause" : "Play"); }