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 + + + + + +