From c9ddf09869a283cdcf3de0484c3c6fd751b99eaf Mon Sep 17 00:00:00 2001 From: David Sansome Date: Mon, 8 Mar 2010 14:08:54 +0000 Subject: [PATCH] Add shuffle and repeat options. These don't do anything yet. Updates issue #20 --- data/data.qrc | 4 + data/media-playlist-repeat-off.png | Bin 0 -> 625 bytes data/media-playlist-repeat.png | Bin 0 -> 744 bytes data/media-playlist-shuffle-off.png | Bin 0 -> 839 bytes data/media-playlist-shuffle.png | Bin 0 -> 492 bytes src/CMakeLists.txt | 3 + src/mainwindow.cpp | 3 + src/mainwindow.h | 2 + src/shufflerepeatwidget.cpp | 107 ++++++++++++++++++++ src/shufflerepeatwidget.h | 56 +++++++++++ src/shufflerepeatwidget.ui | 151 ++++++++++++++++++++++++++++ 11 files changed, 326 insertions(+) create mode 100644 data/media-playlist-repeat-off.png create mode 100644 data/media-playlist-repeat.png create mode 100644 data/media-playlist-shuffle-off.png create mode 100644 data/media-playlist-shuffle.png create mode 100644 src/shufflerepeatwidget.cpp create mode 100644 src/shufflerepeatwidget.h create mode 100644 src/shufflerepeatwidget.ui diff --git a/data/data.qrc b/data/data.qrc index f3c96e51e..576fc8c30 100644 --- a/data/data.qrc +++ b/data/data.qrc @@ -66,5 +66,9 @@ download.png zoom-in.png schema-3.sql + media-playlist-repeat.png + media-playlist-shuffle.png + media-playlist-repeat-off.png + media-playlist-shuffle-off.png diff --git a/data/media-playlist-repeat-off.png b/data/media-playlist-repeat-off.png new file mode 100644 index 0000000000000000000000000000000000000000..18ff342189e63ee012586e36b7723e7a767ec254 GIT binary patch literal 625 zcmV-%0*?KOP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L00FxI00FxJI_%@(00007bV*G`2igM& z4G%K9@)^ni00HqyL_t(I%Vm>6Zrd;rMc7K zi=bI_XD41HTGXORkzK?TS%V>HB`j zIscZ;X7f`-zNsp+*$n3#-g}&LG)+U(G+1j#9gjzzpP%Xb9ufJYz@n5wDTQGeNGZ|x zJt-wrb!?)le13ki-EJwRpsJ|qT<`AgPvF-EPOr%L~IWQ0wC2 zg4fqqbh%tgN{PqE$I6Yh7ND{cV`Q3-_nxb(D-MSP8bT<5tk-J*Do#p?!{I>Nwx}wl z6hwsie9mgMqHSA_$0Pdj@j=&h?DzW-p*E;)L}a|T*3$Pq-g`m_XpE5%0{i`beDO50 zGaM1YIfsahlL;Z9#u!$s6}PvySZl{Hr$N^5pyHKM$T<^Z{Av(F;OXfJ5gB=_T@m^3 zYK&pMUSo_wMTE9(xxT)xvmITi>KRt8QVNU3;%jR4Va}PHGbtrfN~6txt4^b0DL{;o zx3{;E+geN0G-t_AL#=@V=x(coO9xw6IHE$q@1wI3Ac1z_e&;t_JmYrPZP)79Phc%rTG)7DyaXhWoSC3GXC|5RUiMx-kG}f)n>(i`H$Oy3G6a$Y z5++F!k|Y60l9bu=`g&S=_8)Zn?!AYS-i!!_p)w4Wp^gkgrPQE!!6S$;+?{Ef`R&(V z*zflszX;&9%p@~uYh%$$=APD8Vh&0vloCV)+wG3WPc~$N#Xv;75}$tZk$>^|XG9b{ z95=_@Fc~t@*2ZSD;rFvY=<5m+07r+1{Q37o;^gE+muuzQA1^UWTq4|nq-ApTVr5=e zq_=QDf}2x0VH$@^@d3xCldl-KPPABGa=zFLPo7K;UZ*|A`A$J z;=+|2jshT_Y|fW|H~*CTuNvl#yW#G*J8q7dkc1>M6M#%ucRMbgKJB`F_ud2G0l+v8 zHq^n!ar9xRR%^8gmr0VOo=NYSz4z?B=We(AUYQAiqza6{2#ml01Yke|7GMS@U=Lhp a=JG#P|M$fgwr&3a0000Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L00FxI00FxJI_%@(00007bV*G`2igM& z4Gx9u8k?#Dpv?EUd4rto*dP zx@tvH#O>`Z&1RG9>ubv8GD}NKjK||%k|c*mM@Q33EP&bB+4aF-@N*o;8Gx;=EsDh= z=jZ37X-X7DD5cO^d!y0l?b_Pf$E&L=J?$W$&;KH&{6;Co+}s?F;}8S^QcB9@GJAV_ z93LNZd3lL#+oWmQvn=cP)6-KW0D>U+RVn2urBF&yC={@5d-~3qnHiRsm+ANWY;JC% zwdUgDBJOlLzga;LM8G>^3={PGeSF_1lgR)erKHp8Fc=JYe0-!*sZgucvh8-eD8exO z!5H)7#C-yQD2lKw>-DFjwMI(Gcs$0ktjCNH;yVD>b=ltD{v3@E7-Q&myX5nEEX$(X z?eg&OK)c=M>FEjI_Zbd{entop2q74c$L#Fvkjv$!Zc<7bjRyDk_Y8+alu`&G*x%o0 zcXtI5@!fed_i4)VT1ad%%1ZvXt^~&-31BtwZ1UDHe+eAvilbLrR$@ zNz!VyT7Oon)jxpoSKIi7+d>FC48!jo$H^IEvPqJBdU<(i0ndN}^p{fs=0Ebxag%ob RE#?3K002ovPDHLkV1lH8l+^$L literal 0 HcmV?d00001 diff --git a/data/media-playlist-shuffle.png b/data/media-playlist-shuffle.png new file mode 100644 index 0000000000000000000000000000000000000000..d2ecee9782c4c1f53ec4d0e9d7460785469e94ea GIT binary patch literal 492 zcmVMzCV_|S* zE^l&Yo9;Xs0004NNklnq~{KoQW z;c@7*`E~ka)hB55lUN$~E3i$TA(Bi|VC8+Wx&*u>lR5^t;Ft~?nP83uX5MG4062Fs zDiukQrj=Q4*kqJRa&Kc%4eW1|2!Lk4#kTjEx2e^(2Ed)5ihhv|Wl@ zbf_Xq1tFC(N#NsA{Vd+CL!7(Q?E46DvaHid=C|XaX$aOd%}*0000set_engine(player_->GetEngine()); // Statusbar widgets + ui_.statusBar->addPermanentWidget(shuffle_repeat_widget_); ui_.statusBar->addPermanentWidget(track_slider_); ui_.statusBar->addWidget(multi_loading_indicator_); multi_loading_indicator_->hide(); diff --git a/src/mainwindow.h b/src/mainwindow.h index 92332f7d3..7fd35dc4e 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -25,6 +25,7 @@ class About; class AddStreamDialog; class ShortcutsDialog; class AlbumCoverManager; +class ShuffleRepeatWidget; class QSortFilterProxyModel; class SystemTrayIcon; @@ -107,6 +108,7 @@ class MainWindow : public QMainWindow { SystemTrayIcon* tray_icon_; OSD* osd_; TrackSlider* track_slider_; + ShuffleRepeatWidget* shuffle_repeat_widget_; EditTagDialog* edit_tag_dialog_; MultiLoadingIndicator* multi_loading_indicator_; LibraryConfigDialog* library_config_dialog_; diff --git a/src/shufflerepeatwidget.cpp b/src/shufflerepeatwidget.cpp new file mode 100644 index 000000000..c012b708c --- /dev/null +++ b/src/shufflerepeatwidget.cpp @@ -0,0 +1,107 @@ +#include "shufflerepeatwidget.h" + +#include +#include +#include +#include + +const char* ShuffleRepeatWidget::kSettingsGroup = "ShuffleRepeat"; + +ShuffleRepeatWidget::ShuffleRepeatWidget(QWidget *parent) + : QWidget(parent), + repeat_menu_(new QMenu(this)), + shuffle_menu_(new QMenu(this)), + loading_(false), + repeat_mode_(Repeat_Off), + shuffle_mode_(Shuffle_Off) +{ + ui_.setupUi(this); + + QActionGroup* repeat_group = new QActionGroup(this); + repeat_group->addAction(ui_.action_repeat_off); + repeat_group->addAction(ui_.action_repeat_track); + repeat_group->addAction(ui_.action_repeat_album); + repeat_group->addAction(ui_.action_repeat_playlist); + repeat_menu_->addActions(repeat_group->actions()); + ui_.repeat->setMenu(repeat_menu_); + + QActionGroup* shuffle_group = new QActionGroup(this); + shuffle_group->addAction(ui_.action_shuffle_off); + shuffle_group->addAction(ui_.action_shuffle_all); + shuffle_group->addAction(ui_.action_shuffle_album); + shuffle_menu_->addActions(shuffle_group->actions()); + ui_.shuffle->setMenu(shuffle_menu_); + + connect(repeat_group, SIGNAL(triggered(QAction*)), SLOT(RepeatActionTriggered(QAction*))); + connect(shuffle_group, SIGNAL(triggered(QAction*)), SLOT(ShuffleActionTriggered(QAction*))); + + Load(); +} + +void ShuffleRepeatWidget::Load() { + QSettings s; + s.beginGroup(kSettingsGroup); + + loading_ = true; // Stops these setter functions calling Save() + SetShuffleMode(ShuffleMode(s.value("shuffle_mode", Shuffle_Off).toInt())); + SetRepeatMode(RepeatMode(s.value("repeat_mode", Repeat_Off).toInt())); + loading_ = false; +} + +void ShuffleRepeatWidget::Save() { + if (loading_) return; + + QSettings s; + s.beginGroup(kSettingsGroup); + + s.setValue("shuffle_mode", shuffle_mode_); + s.setValue("repeat_mode", repeat_mode_); +} + +void ShuffleRepeatWidget::RepeatActionTriggered(QAction* action) { + RepeatMode mode = Repeat_Off; + if (action == ui_.action_repeat_track) mode = Repeat_Track; + if (action == ui_.action_repeat_album) mode = Repeat_Album; + if (action == ui_.action_repeat_playlist) mode = Repeat_Playlist; + + SetRepeatMode(mode); +} + +void ShuffleRepeatWidget::ShuffleActionTriggered(QAction* action) { + ShuffleMode mode = Shuffle_Off; + if (action == ui_.action_shuffle_all) mode = Shuffle_All; + if (action == ui_.action_shuffle_album) mode = Shuffle_Album; + + SetShuffleMode(mode); +} + +void ShuffleRepeatWidget::SetRepeatMode(RepeatMode mode) { + ui_.repeat->setChecked(mode != Repeat_Off); + + switch(mode) { + case Repeat_Off: ui_.action_repeat_off->setChecked(true); break; + case Repeat_Track: ui_.action_repeat_track->setChecked(true); break; + case Repeat_Album: ui_.action_repeat_album->setChecked(true); break; + case Repeat_Playlist: ui_.action_repeat_playlist->setChecked(true); break; + } + + if (mode != repeat_mode_) + emit RepeatModeChanged(mode); + repeat_mode_ = mode; + Save(); +} + +void ShuffleRepeatWidget::SetShuffleMode(ShuffleMode mode) { + ui_.shuffle->setChecked(mode != Shuffle_Off); + + switch (mode) { + case Shuffle_Off: ui_.action_shuffle_off->setChecked(true); break; + case Shuffle_All: ui_.action_shuffle_all->setChecked(true); break; + case Shuffle_Album: ui_.action_shuffle_album->setChecked(true); break; + } + + if (mode != shuffle_mode_) + emit ShuffleModeChanged(mode); + shuffle_mode_ = mode; + Save(); +} diff --git a/src/shufflerepeatwidget.h b/src/shufflerepeatwidget.h new file mode 100644 index 000000000..fad7c5ad2 --- /dev/null +++ b/src/shufflerepeatwidget.h @@ -0,0 +1,56 @@ +#ifndef SHUFFLEREPEATWIDGET_H +#define SHUFFLEREPEATWIDGET_H + +#include + +class QMenu; + +#include "ui_shufflerepeatwidget.h" + +class ShuffleRepeatWidget : public QWidget { + Q_OBJECT + + public: + ShuffleRepeatWidget(QWidget *parent = 0); + + enum RepeatMode { + Repeat_Off = 0, + Repeat_Track = 1, + Repeat_Album = 2, + Repeat_Playlist = 3, + }; + enum ShuffleMode { + Shuffle_Off = 0, + Shuffle_All = 1, + Shuffle_Album = 2, + }; + + static const char* kSettingsGroup; + + void Load(); + void Save(); + + public slots: + void SetRepeatMode(RepeatMode mode); + void SetShuffleMode(ShuffleMode mode); + + signals: + void RepeatModeChanged(RepeatMode mode); + void ShuffleModeChanged(ShuffleMode mode); + + private slots: + void RepeatActionTriggered(QAction*); + void ShuffleActionTriggered(QAction*); + + private: + Ui::ShuffleRepeatWidget ui_; + + QMenu* repeat_menu_; + QMenu* shuffle_menu_; + + bool loading_; + RepeatMode repeat_mode_; + ShuffleMode shuffle_mode_; +}; + +#endif // SHUFFLEREPEATWIDGET_H diff --git a/src/shufflerepeatwidget.ui b/src/shufflerepeatwidget.ui new file mode 100644 index 000000000..c7ac65770 --- /dev/null +++ b/src/shufflerepeatwidget.ui @@ -0,0 +1,151 @@ + + + ShuffleRepeatWidget + + + + 0 + 0 + 62 + 37 + + + + QToolButton, QToolButton:hover, QToolButton:pressed { + border: 0px; + background: transparent; +} + +#line { + margin: 3px 0px 3px 0px; +} + + + + 0 + + + 0 + + + + + Repeat + + + + :/media-playlist-repeat-off.png + :/media-playlist-repeat.png:/media-playlist-repeat-off.png + + + + 16 + 16 + + + + true + + + QToolButton::InstantPopup + + + + + + + Shuffle + + + + :/media-playlist-shuffle-off.png + :/media-playlist-shuffle.png:/media-playlist-shuffle-off.png + + + + 16 + 16 + + + + true + + + QToolButton::InstantPopup + + + + + + + Qt::Vertical + + + + + + + true + + + true + + + Don't repeat + + + + + true + + + Repeat track + + + + + true + + + Repeat album + + + + + true + + + Repeat playlist + + + + + true + + + true + + + Don't shuffle + + + + + true + + + Shuffle by album + + + + + true + + + Shuffle all + + + + + +