refactor: MainWindow class into multiple items / controllers ; fix: Bug with PlaylistBrowserDialog.cpp : List item "No playlists available" was selectable

This commit is contained in:
2026-06-19 13:05:45 +02:00
parent 97166e9f4e
commit e62ab4626c
10 changed files with 573 additions and 391 deletions
+107
View File
@@ -0,0 +1,107 @@
#include "NowPlayingPanel.h"
#include "CoverArtWidget.h"
#include "engine/MusicLibrary.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QFont>
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 *right = new QVBoxLayout;
right->setSpacing(4);
right->addWidget(m_lblTitle);
right->addWidget(m_lblArtist);
right->addWidget(m_lblAlbum);
right->addLayout(seekRow);
right->addLayout(transport);
auto *hlay = new QHBoxLayout(this);
hlay->addWidget(m_cover);
hlay->addLayout(right, 1);
}
void NowPlayingPanel::updateTrack(const engine::Track *t)
{
if (!t) 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) + ")" : ""));
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::setPlaybackActive(bool playing)
{
m_btnPlay->setText(playing ? "Pause" : "Play");
}