I forgot what I did, but I made the shuffle button work

This commit is contained in:
Crylia
2024-03-27 02:23:39 +01:00
parent 1c3f67364d
commit 8070db4d5f
5 changed files with 171 additions and 198 deletions

View File

@@ -28,7 +28,7 @@ else()
endif() endif()
find_library(SDL_MIXER_LIBRARY NAMES SDL2_mixer SDL3_mixer) find_library(SDL_MIXER_LIBRARY NAMES SDL2_mixer SDL3_mixer)
include_directories(${SDL2_INCLUDE_DIRS}) include_directories(${SDL_INCLUDE_DIRS})
find_package(PkgConfig REQUIRED) find_package(PkgConfig REQUIRED)
pkg_check_modules(LIBAV REQUIRED IMPORTED_TARGET pkg_check_modules(LIBAV REQUIRED IMPORTED_TARGET

View File

@@ -19,7 +19,7 @@ public:
} }
private: private:
MusicPlayer( ); MusicPlayer( ) { }
// 0 no shuffle, 1 shuffling // 0 no shuffle, 1 shuffling
int shuffle = 0; int shuffle = 0;
@@ -96,7 +96,9 @@ public:
Song* GetCurrentlyPlaying( ); Song* GetCurrentlyPlaying( );
void SetShuffle(bool shuffle) { this->shuffle = shuffle; } void SetShuffle(bool shuffle) { this->shuffle = shuffle; }
bool GetShuffle( ) { return shuffle; }
void SetLoop(Loop loop) { this->loop = loop; } void SetLoop(Loop loop) { this->loop = loop; }
Loop GetLoop( ) { return loop; }
void AddSongToQueue(Song* song); void AddSongToQueue(Song* song);
void RemoveSongFromQueue(Song* song); void RemoveSongFromQueue(Song* song);

View File

@@ -7,6 +7,7 @@ void MainWidget::setupMainWidget( ) {
setLayout(ol); setLayout(ol);
QVBoxLayout* vbox = new QVBoxLayout( ); QVBoxLayout* vbox = new QVBoxLayout( );
floatingControlls = new FloatingControls(this);
vbox->addWidget(floatingControlls, 0, Qt::AlignBottom); vbox->addWidget(floatingControlls, 0, Qt::AlignBottom);
QHBoxLayout* hbox = new QHBoxLayout( ); QHBoxLayout* hbox = new QHBoxLayout( );
@@ -50,8 +51,7 @@ MainWidget::MainWidget(QWidget* parent)
pageNav(new PageNavModule(this)), pageNav(new PageNavModule(this)),
playlistNav(new PlaylistNavModule(this)), playlistNav(new PlaylistNavModule(this)),
playlistPage(new PlaylistPage(this)), playlistPage(new PlaylistPage(this)),
homePage(new HomePage(this)), homePage(new HomePage(this)) {
floatingControlls(new FloatingControls(this)) {
setupMainWidget( ); setupMainWidget( );
} }

View File

@@ -31,141 +31,149 @@ static QPushButton* makeSongControlButton(QString name, QSize size = QSize(36, 3
FloatingControls::FloatingControls(QWidget* parent) : FloatingControls::FloatingControls(QWidget* parent) :
QFrame(parent), QFrame(parent),
volume(100), fullscreen(false),
albumArtPath("default.png"), songRepeat(NONE) {
fullscreen(false), shuffle(false),
playPause(false), #pragma region Frame setup
songRepeat(NONE),
artist("Artist"),
songName("Song") {
this->setFixedHeight(100); this->setFixedHeight(100);
this->setObjectName("main"); this->setObjectName("main");
this->setStyleSheet(R"( this->setStyleSheet(R"(
QFrame#main{ QFrame#main{
background-color:rgba(40, 40 ,40, 0.3); background-color:rgba(40, 40 ,40, 0.8);
border: 4px solid #414141; border: 4px solid #414141;
border-radius: 12px; border-radius: 12px;
margin: 0px 10px 10px 10px; margin: 0px 10px 10px 10px;
} }
)"); )");
applyShadow(this); applyShadow(this);
#pragma endregion
/* Main Layout to store the Left Center and right controls */ /* Main Layout to store the Left Center and right controls */
QHBoxLayout* mainLayout = new QHBoxLayout(this); QHBoxLayout* mainLayout = new QHBoxLayout(this);
/* Left side Icon, Artist and Song info */ /* Left side Icon, Artist and Song info */
QHBoxLayout* leftLayout = new QHBoxLayout( ); QHBoxLayout* leftLayout = new QHBoxLayout( );
leftLayout->setSpacing(10); leftLayout->setSpacing(10);
leftLayout->setAlignment(Qt::AlignLeft); leftLayout->setAlignment(Qt::AlignLeft);
// Album Art #pragma region Album Art
QLabel* albumArt = new QLabel( ); m_albumArt = new QLabel( );
albumArt->setObjectName("albumArt"); m_albumArt->setObjectName("m_albumArt");
albumArt->setAlignment(Qt::AlignCenter); m_albumArt->setAlignment(Qt::AlignCenter);
albumArt->setStyleSheet(R"( m_albumArt->setStyleSheet(R"(
QLabel#albumArt{ QLabel#m_albumArt{
border: 0px;
}
)");
/* connect(m_albumArt, &QLabel::pixmapChanged, ()[ ] {
m_albumArt->setStyleSheet(R"(
QLabel#m_albumArt{
border: 4px solid #414141; border: 4px solid #414141;
border-radius: 8px; border-radius: 8px;
} }
)"); )");
}); */
leftLayout->addWidget(m_albumArt);
#pragma endregion
//albumArt->setPixmap(); #pragma region Artist and Song name layout
leftLayout->addWidget(albumArt);
// Artist and Song name layout
QVBoxLayout* artistSongLayout = new QVBoxLayout( ); QVBoxLayout* artistSongLayout = new QVBoxLayout( );
QLabel* artist = new QLabel("");
artist->setMinimumWidth(50); #pragma region Artist Label
connect(this, &FloatingControls::artistChanged, artist, &QLabel::setText); m_artist = new QLabel( );
artist->setObjectName("artist"); m_artist->setMinimumWidth(50);
artist->setStyleSheet(R"( m_artist->setObjectName("m_artist");
m_artist->setStyleSheet(R"(
QLabel#artist{ QLabel#artist{
font-size: 16px; font-size: 16px;
font-weight: bold; font-weight: bold;
color: #E1E1E1; color: #E1E1E1;
} }
)"); )");
#pragma endregion
QLabel* songName = new QLabel( ); #pragma region Song Title
songName->setMinimumWidth(50); m_title = new QLabel( );
QFontMetrics metrics(songName->font( )); m_title->setMinimumWidth(50);
songName->setText(metrics.elidedText("", Qt::ElideRight, songName->width( ))); m_title->setObjectName("m_title");
m_title->setStyleSheet(R"(
connect(this, &FloatingControls::songNameChanged, songName, &QLabel::setText);
songName->setObjectName("title");
songName->setStyleSheet(R"(
QLabel#songName{ QLabel#songName{
font-size: 14px; font-size: 14px;
color: #D7D7D7; color: #D7D7D7;
} }
)"); )");
artistSongLayout->addWidget(artist); #pragma endregion
artistSongLayout->addWidget(songName);
leftLayout->addLayout(artistSongLayout); artistSongLayout->addWidget(m_artist);
artistSongLayout->addWidget(m_title);
leftLayout->addLayout(artistSongLayout);
#pragma endregion
#pragma region Center layout to store the song controls and pos bar
/* Center layout to store the song controls and pos bar */
QVBoxLayout* centerLayout = new QVBoxLayout( ); QVBoxLayout* centerLayout = new QVBoxLayout( );
centerLayout->setAlignment(Qt::AlignCenter); centerLayout->setAlignment(Qt::AlignCenter);
mainLayout->setStretchFactor(leftLayout, 1);
mainLayout->setStretchFactor(centerLayout, 0.1);
QHBoxLayout* songControlsLayout = new QHBoxLayout( ); QHBoxLayout* songControlsLayout = new QHBoxLayout( );
songControlsLayout->setAlignment(Qt::AlignCenter | Qt::AlignBottom); songControlsLayout->setAlignment(Qt::AlignCenter | Qt::AlignBottom);
QString buttonNames[5] = { "shuffle", "prevSong", "play", "nextSong", "songRepeat" }; #pragma region Create Control Buttons
QString col = "#D7D7D7"; m_shuffle = makeSongControlButton("shuffle", QSize(36, 36), "#757575");
for (int i = 0; i < 5; i++) { connect(m_shuffle, &QPushButton::clicked, [this]( ) {
if (buttonNames[i] == "shuffle" || buttonNames[i] == "songRepeat") setShuffle(!musicPlayer.GetShuffle( ));
col = "#CC79AB"; });
else songControlsLayout->addWidget(m_shuffle);
col = "#D7D7D7"; m_skipPrev = makeSongControlButton("prevSong", QSize(36, 36), "#D7D7D7");
QPushButton* pb = makeSongControlButton(buttonNames[i], QSize(36, 36), col); songControlsLayout->addWidget(m_skipPrev);
if (buttonNames[i] == "play") { m_playPause = makeSongControlButton("play", QSize(36, 36), "#D7D7D7");
songControlsLayout->addWidget(m_playPause);
} m_skipNext = makeSongControlButton("nextSong", QSize(36, 36), "#D7D7D7");
songControlsLayout->addWidget(pb); songControlsLayout->addWidget(m_skipNext);
} m_loop = makeSongControlButton("songRepeat", QSize(36, 36), "#757575");
songControlsLayout->addWidget(m_loop);
#pragma endregion
centerLayout->addLayout(songControlsLayout); centerLayout->addLayout(songControlsLayout);
QHBoxLayout* songScrollerLayout = new QHBoxLayout( ); QHBoxLayout* songScrollerLayout = new QHBoxLayout( );
songScrollerLayout->setAlignment(Qt::AlignCenter | Qt::AlignTop); songScrollerLayout->setAlignment(Qt::AlignCenter | Qt::AlignTop);
// Song timestamp #pragma region Song Position
QLabel* songTimestamp = new QLabel("00:00"); m_songPos = new QLabel("-:--");
songTimestamp->setObjectName("songTimestamp"); m_songPos->setObjectName("m_songPos");
songTimestamp->setStyleSheet(R"( m_songPos->setStyleSheet(R"(
QLabel#songTimestamp{ QLabel#m_songPos{
font-size: 14px; font-size: 14px;
color: #D7D7D7; color: #D7D7D7;
} }
)"); )");
songTimestamp->setAlignment(Qt::AlignRight); m_songPos->setAlignment(Qt::AlignRight);
#pragma endregion
// Song duration #pragma region Song Duration
QLabel* songDuration = new QLabel("00:00"); m_songDur = new QLabel("-:--");
songDuration->setObjectName("songDuration"); m_songDur->setObjectName("m_songDur");
songDuration->setStyleSheet(R"( m_songDur->setStyleSheet(R"(
QLabel#songDuration{ QLabel#m_songDur{
font-size: 14px; font-size: 14px;
color: #D7D7D7; color: #D7D7D7;
} }
)"); )");
#pragma endregion
// Song duration slider #pragma region Song Progress Bar
QSlider* songDurationSlider = new QSlider(Qt::Horizontal); m_songProgress = new QSlider(Qt::Horizontal);
songDurationSlider->setObjectName("songDurationSlider"); m_songProgress->setObjectName("m_songProgress");
songDurationSlider->setRange(0, 100); m_songProgress->setRange(0, 100);
songDurationSlider->setValue(50); m_songProgress->setValue(50);
songDurationSlider->setFixedHeight(28); m_songProgress->setFixedHeight(28);
songDurationSlider->setStyleSheet(R"( m_songProgress->setStyleSheet(R"(
QSlider#songDurationSlider::groove:horizontal{ QSlider#m_songProgress::groove:horizontal{
border-radius: 4px; border-radius: 4px;
height: 8px; height: 8px;
background: #414141; background: #414141;
} }
QSlider#songDurationSlider::handle:horizontal{ QSlider#m_songProgress::handle:horizontal{
background: #78AB70; background: #78AB70;
border: 4px solid #414141; border: 4px solid #414141;
width: 14px; width: 14px;
@@ -174,69 +182,52 @@ FloatingControls::FloatingControls(QWidget* parent) :
border-radius: 10px; border-radius: 10px;
padding: -8px 0; padding: -8px 0;
} }
QSlider#songDurationSlider::sub-page:horizontal{ QSlider#m_songProgress::sub-page:horizontal{
background: #78AB70; background: #78AB70;
border-radius: 4px; border-radius: 4px;
height: 8px; height: 8px;
} }
)"); )");
songDurationSlider->setCursor(Qt::PointingHandCursor); m_songProgress->setCursor(Qt::PointingHandCursor);
#pragma endregion
connect(songDurationSlider, &QSlider::sliderReleased, [this, songDurationSlider]( ) { songScrollerLayout->addWidget(m_songPos);
songScrollerLayout->addWidget(m_songProgress);
}); songScrollerLayout->addWidget(m_songDur);
songScrollerLayout->addWidget(songTimestamp);
songScrollerLayout->addWidget(songDurationSlider);
songScrollerLayout->addWidget(songDuration);
QTimer* timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, [this, songTimestamp, songDurationSlider]( ) {
int sec = 0;
songTimestamp->setText(
QTime(
0,
sec / 60,
sec % 60
).toString("mm:ss"));
songDurationSlider->setValue(sec);
//std::cout << songTimestamp->text( ).toStdString( ) << std::endl;
});
timer->start(1000);
centerLayout->addLayout(songScrollerLayout); centerLayout->addLayout(songScrollerLayout);
/* Right side layout to store the volume and fullscreen controls */ #pragma endregion
#pragma region Right side layout to store the volume and fullscreen controls
QHBoxLayout* rightLayout = new QHBoxLayout( ); QHBoxLayout* rightLayout = new QHBoxLayout( );
rightLayout->setAlignment(Qt::AlignRight); rightLayout->setAlignment(Qt::AlignRight);
//Volume icon #pragma region Volume Icon
QLabel* volumeIcon = new QLabel( ); m_volumeIcon = new QLabel( );
volumeIcon->setAlignment(Qt::AlignRight | Qt::AlignVCenter); m_volumeIcon->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
volumeIcon->setObjectName("volumeIcon"); m_volumeIcon->setObjectName("m_volumeIcon");
volumeIcon->setPixmap(RenderSvg(":icons/volume-high.svg", 36, 36).scaled(QSize(24, 24), Qt::IgnoreAspectRatio)); m_volumeIcon->setPixmap(RenderSvg(":icons/volume-high.svg", 36, 36).scaled(QSize(24, 24), Qt::IgnoreAspectRatio));
QGraphicsColorizeEffect* colorize = new QGraphicsColorizeEffect( ); QGraphicsColorizeEffect* colorize = new QGraphicsColorizeEffect( );
colorize->setColor(QColor("#78AB70")); colorize->setColor(QColor("#78AB70"));
colorize->setStrength(1); colorize->setStrength(1);
volumeIcon->setGraphicsEffect(colorize); m_volumeIcon->setGraphicsEffect(colorize);
rightLayout->addWidget(volumeIcon); rightLayout->addWidget(m_volumeIcon);
#pragma endregion
//Volume slider #pragma region Volume Slider
QSlider* VolumeSlider = new QSlider(Qt::Horizontal); m_volumeSlider = new QSlider(Qt::Horizontal);
VolumeSlider->setObjectName("volumeSlider"); m_volumeSlider->setObjectName("m_volumeSlider");
VolumeSlider->setRange(0, 128); m_volumeSlider->setRange(0, 128);
VolumeSlider->setValue(50); m_volumeSlider->setValue(50);
VolumeSlider->setFixedHeight(28); m_volumeSlider->setFixedHeight(28);
VolumeSlider->setStyleSheet(R"( m_volumeSlider->setStyleSheet(R"(
QSlider#volumeSlider::groove:horizontal{ QSlider#m_volumeSlider::groove:horizontal{
border-radius: 4px; border-radius: 4px;
height: 8px; height: 8px;
background: #414141; background: #414141;
} }
QSlider#volumeSlider::handle:horizontal{ QSlider#m_volumeSlider::handle:horizontal{
background: #78AB70; background: #78AB70;
border: 4px solid #414141; border: 4px solid #414141;
width: 14px; width: 14px;
@@ -245,33 +236,30 @@ FloatingControls::FloatingControls(QWidget* parent) :
border-radius: 10px; border-radius: 10px;
padding: -8px 0; padding: -8px 0;
} }
QSlider#volumeSlider::sub-page:horizontal{ QSlider#m_volumeSlider::sub-page:horizontal{
background: #78AB70; background: #78AB70;
border-radius: 4px; border-radius: 4px;
height: 8px; height: 8px;
} }
)"); )");
VolumeSlider->setCursor(Qt::PointingHandCursor); m_volumeSlider->setCursor(Qt::PointingHandCursor);
#pragma endregion
connect(VolumeSlider, &QSlider::valueChanged, [this, VolumeSlider]( ) { rightLayout->addWidget(m_volumeSlider);
});
rightLayout->addWidget(VolumeSlider); #pragma region Fullscreen Button
m_fullscreen = new QPushButton( );
//Fullscreen button m_fullscreen->setObjectName("m_fullscreen");
QPushButton* FullscreenToggle = new QPushButton( ); m_fullscreen->setStyleSheet(R"(
FullscreenToggle->setObjectName("fullscreenToggle"); QPushButton#m_fullscreen{
FullscreenToggle->setStyleSheet(R"(
QPushButton#fullscreenToggle{
background: transparent; background: transparent;
border: 4px solid #414141; border: 4px solid #414141;
border-radius: 8px; border-radius: 8px;
margin-right: 14px;
} }
)"); )");
FullscreenToggle->setFixedSize(50, 36); m_fullscreen->setFixedSize(36, 36);
FullscreenToggle->setCursor(Qt::PointingHandCursor); m_fullscreen->setCursor(Qt::PointingHandCursor);
connect(FullscreenToggle, &QPushButton::clicked, [ ]( ) { connect(m_fullscreen, &QPushButton::clicked, [ ]( ) {
QMainWindow* mw = (QMainWindow*)QApplication::activeWindow( ); QMainWindow* mw = (QMainWindow*)QApplication::activeWindow( );
if (mw->isFullScreen( )) if (mw->isFullScreen( ))
mw->showNormal( ); mw->showNormal( );
@@ -279,7 +267,6 @@ FloatingControls::FloatingControls(QWidget* parent) :
mw->showFullScreen( ); mw->showFullScreen( );
}); });
QLabel* FullscreenLabel = new QLabel( ); QLabel* FullscreenLabel = new QLabel( );
FullscreenLabel->setFixedSize(36, 24);
FullscreenLabel->setObjectName("fullscreenLabel"); FullscreenLabel->setObjectName("fullscreenLabel");
FullscreenLabel->setPixmap(QPixmap(":icons/arrow-expand.svg").scaled(QSize(24, 24), Qt::IgnoreAspectRatio)); FullscreenLabel->setPixmap(QPixmap(":icons/arrow-expand.svg").scaled(QSize(24, 24), Qt::IgnoreAspectRatio));
@@ -287,13 +274,19 @@ FloatingControls::FloatingControls(QWidget* parent) :
FullscreenLayout->setAlignment(Qt::AlignCenter); FullscreenLayout->setAlignment(Qt::AlignCenter);
FullscreenLayout->addWidget(FullscreenLabel); FullscreenLayout->addWidget(FullscreenLabel);
QGraphicsColorizeEffect* colorize2 = new QGraphicsColorizeEffect( ); FullscreenLabel->setGraphicsEffect([ ]( ) {
colorize2->setColor(QColor("#83BFC8")); QGraphicsColorizeEffect* color = new QGraphicsColorizeEffect( );
colorize2->setStrength(1); color->setColor(QColor("#83BFC8"));
FullscreenLabel->setGraphicsEffect(colorize2); color->setStrength(1);
FullscreenToggle->setLayout(FullscreenLayout); return color;
}());
m_fullscreen->setLayout(FullscreenLayout);
#pragma endregion
rightLayout->addWidget(FullscreenToggle); rightLayout->addWidget(m_fullscreen);
rightLayout->addSpacing(14);
#pragma endregion
mainLayout->addLayout(leftLayout, 0); mainLayout->addLayout(leftLayout, 0);
mainLayout->addLayout(centerLayout, 1); mainLayout->addLayout(centerLayout, 1);
@@ -306,3 +299,12 @@ FloatingControls::FloatingControls(QWidget* parent) :
} }
FloatingControls::~FloatingControls( ) { } FloatingControls::~FloatingControls( ) { }
void FloatingControls::setShuffle(bool shuffle) {
musicPlayer.SetShuffle(shuffle);
QGraphicsColorizeEffect* colorize = new QGraphicsColorizeEffect( );
musicPlayer.GetShuffle( ) ? colorize->setColor(QColor("#CE93D8")) : colorize->setColor(QColor("#757575"));
colorize->setStrength(1);
m_shuffle->setGraphicsEffect(colorize);
}

View File

@@ -28,70 +28,39 @@ class FloatingControls : public QFrame {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString artist READ getArtist WRITE setArtist NOTIFY artistChanged)
Q_PROPERTY(QString songName READ getSongName WRITE setSongName NOTIFY songNameChanged)
Q_PROPERTY(int songPos READ getSongPos WRITE setSongPos NOTIFY songPosChanged)
public: public:
QString getArtist( ) const {
return artist;
}
void setArtist(QString artist) {
if (this->artist == artist)
return;
this->artist = artist;
emit artistChanged(artist);
}
QString getSongName( ) const {
return songName;
}
void setSongName(QString songName) {
if (this->songName == songName)
return;
this->songName = songName;
emit songNameChanged(songName);
}
int getSongPos( ) const {
return songPos;
}
void setSongPos(int pos) {
if (this->songPos == pos)
return;
this->songPos = pos;
emit songPosChanged(pos);
}
void togglePlayPause( ) {
this->playPause = !this->playPause;
}
bool GetPlayPause( ) {
return this->playPause;
}
FloatingControls(QWidget* parent = nullptr); FloatingControls(QWidget* parent = nullptr);
~FloatingControls( ); ~FloatingControls( );
signals:
void artistChanged(QString artist);
void songNameChanged(QString songName);
void songPosChanged(int songPos);
private: private:
QString artist; MusicPlayer& musicPlayer = MusicPlayer::getInstance( );
QString songName;
QLabel* m_artist;
QLabel* m_title;
QLabel* m_album;
QLabel* m_albumArt;
QLabel* m_volume;
QLabel* m_volumeIcon;
QLabel* m_songPos;
QLabel* m_songDur;
QPushButton* m_playPause;
QPushButton* m_shuffle;
QPushButton* m_loop;
QPushButton* m_skipNext;
QPushButton* m_skipPrev;
QPushButton* m_fullscreen;
QSlider* m_songProgress;
QSlider* m_volumeSlider;
QString albumArtPath;
int volume;
bool fullscreen; bool fullscreen;
bool shuffle;
bool playPause;
Repeat songRepeat; Repeat songRepeat;
QPixmap albumArt;
int songPos; private slots:
int songLength; void setShuffle(bool shuffle);
}; };