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 000000000..18ff34218
Binary files /dev/null and b/data/media-playlist-repeat-off.png differ
diff --git a/data/media-playlist-repeat.png b/data/media-playlist-repeat.png
new file mode 100644
index 000000000..d8b87646b
Binary files /dev/null and b/data/media-playlist-repeat.png differ
diff --git a/data/media-playlist-shuffle-off.png b/data/media-playlist-shuffle-off.png
new file mode 100644
index 000000000..210e876b0
Binary files /dev/null and b/data/media-playlist-shuffle-off.png differ
diff --git a/data/media-playlist-shuffle.png b/data/media-playlist-shuffle.png
new file mode 100644
index 000000000..d2ecee978
Binary files /dev/null and b/data/media-playlist-shuffle.png differ
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index ea0fbbece..596670b3a 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -55,6 +55,7 @@ set(CLEMENTINE-SOURCES
albumcoverloader.cpp
m3uparser.cpp
playlistmanager.cpp
+ shufflerepeatwidget.cpp
)
# Header files that have Q_OBJECT in
@@ -103,6 +104,7 @@ set(CLEMENTINE-MOC-HEADERS
albumcoverloader.h
m3uparser.h
playlistmanager.h
+ shufflerepeatwidget.h
)
# UI files
@@ -122,6 +124,7 @@ set(CLEMENTINE-UI
addstreamdialog.ui
shortcutsdialog.ui
albumcovermanager.ui
+ shufflerepeatwidget.ui
)
# Resource files
diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp
index e851677c5..a89f2537b 100644
--- a/src/mainwindow.cpp
+++ b/src/mainwindow.cpp
@@ -22,6 +22,7 @@
#include "albumcovermanager.h"
#include "m3uparser.h"
#include "playlistmanager.h"
+#include "shufflerepeatwidget.h"
#include "qxtglobalshortcut.h"
@@ -50,6 +51,7 @@ MainWindow::MainWindow(QNetworkAccessManager* network, QWidget *parent)
tray_icon_(new SystemTrayIcon(this)),
osd_(new OSD(tray_icon_, this)),
track_slider_(new TrackSlider(this)),
+ shuffle_repeat_widget_(new ShuffleRepeatWidget(this)),
edit_tag_dialog_(new EditTagDialog(this)),
multi_loading_indicator_(new MultiLoadingIndicator(this)),
library_config_dialog_(new LibraryConfigDialog(this)),
@@ -264,6 +266,7 @@ MainWindow::MainWindow(QNetworkAccessManager* network, QWidget *parent)
ui_.analyzer->set_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
+
+
+
+
+
+