Files
Qt-Music-Player/src/windows/playerWindow/playerWindow.cpp

100 lines
2.6 KiB
C++
Raw Normal View History

#include "playerWindow.h"
#include <QVBoxLayout>
#include <QFileInfo>
#include <QCloseEvent>
#include "src/data/cleanerScripts.h"
PlayerWindow::PlayerWindow(const AlbumData& item, QWidget* parent)
: QWidget(parent), item_(item)
{
setWindowTitle("Now Playing");
resize(350, 500);
QVBoxLayout* layout = new QVBoxLayout(this);
// Album artwork
spinningArt_ = new SpinningAlbumArt(item.imagePath, 250);
layout->addWidget(spinningArt_, 0, Qt::AlignCenter);
// Track label
trackLabel_ = new QLabel("Track");
trackLabel_->setAlignment(Qt::AlignCenter);
trackLabel_->setStyleSheet("font-size: 14px; font-weight: 500;");
layout->addWidget(trackLabel_);
// Track list widget
trackList_ = new TrackListWidget(item_.audioFiles, this);
layout->addWidget(trackList_);
// Audio backend
player_ = new QMediaPlayer(this);
audio_ = new QAudioOutput(this);
player_->setAudioOutput(audio_);
// Spin album art based on playback
connect(player_, &QMediaPlayer::playbackStateChanged, this,
[this](QMediaPlayer::PlaybackState st){
if (st == QMediaPlayer::PlayingState)
spinningArt_->start();
else
spinningArt_->stop();
});
// When a track finishes, auto-play next
connect(player_, &QMediaPlayer::mediaStatusChanged, this,
[this](QMediaPlayer::MediaStatus st){
if (st == QMediaPlayer::EndOfMedia)
handleTrackFinished();
});
// When a track is clicked
connect(trackList_, &TrackListWidget::trackSelected, this,
[this](int i){
index_ = i;
playTrack(index_);
});
// Start with track 0
playTrack(index_);
}
void PlayerWindow::playTrack(int idx)
{
if (idx < 0 || idx >= item_.audioFiles.size())
return;
index_ = idx;
QString filePath = item_.audioFiles[idx];
QString fileName = QFileInfo(filePath).fileName();
QString title = cleanTrackTitle(fileName);
trackLabel_->setText(QString("Track %1: %2").arg(idx + 1).arg(title));
player_->setSource(QUrl::fromLocalFile(filePath));
player_->play();
// Highlight in the list
trackList_->setCurrentRow(idx);
}
void PlayerWindow::handleTrackFinished()
{
int nextIndex = index_ + 1;
if (nextIndex >= item_.audioFiles.size()) {
close();
return;
}
playTrack(nextIndex);
}
void PlayerWindow::closeEvent(QCloseEvent* event)
{
if (player_)
player_->stop();
QWidget::closeEvent(event);
}