Add shuffle and repeat options. These don't do anything yet.
Updates issue #20
This commit is contained in:
parent
427e24dece
commit
c9ddf09869
|
@ -66,5 +66,9 @@
|
||||||
<file>download.png</file>
|
<file>download.png</file>
|
||||||
<file>zoom-in.png</file>
|
<file>zoom-in.png</file>
|
||||||
<file>schema-3.sql</file>
|
<file>schema-3.sql</file>
|
||||||
|
<file>media-playlist-repeat.png</file>
|
||||||
|
<file>media-playlist-shuffle.png</file>
|
||||||
|
<file>media-playlist-repeat-off.png</file>
|
||||||
|
<file>media-playlist-shuffle-off.png</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 625 B |
Binary file not shown.
After Width: | Height: | Size: 744 B |
Binary file not shown.
After Width: | Height: | Size: 839 B |
Binary file not shown.
After Width: | Height: | Size: 492 B |
|
@ -55,6 +55,7 @@ set(CLEMENTINE-SOURCES
|
||||||
albumcoverloader.cpp
|
albumcoverloader.cpp
|
||||||
m3uparser.cpp
|
m3uparser.cpp
|
||||||
playlistmanager.cpp
|
playlistmanager.cpp
|
||||||
|
shufflerepeatwidget.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
# Header files that have Q_OBJECT in
|
# Header files that have Q_OBJECT in
|
||||||
|
@ -103,6 +104,7 @@ set(CLEMENTINE-MOC-HEADERS
|
||||||
albumcoverloader.h
|
albumcoverloader.h
|
||||||
m3uparser.h
|
m3uparser.h
|
||||||
playlistmanager.h
|
playlistmanager.h
|
||||||
|
shufflerepeatwidget.h
|
||||||
)
|
)
|
||||||
|
|
||||||
# UI files
|
# UI files
|
||||||
|
@ -122,6 +124,7 @@ set(CLEMENTINE-UI
|
||||||
addstreamdialog.ui
|
addstreamdialog.ui
|
||||||
shortcutsdialog.ui
|
shortcutsdialog.ui
|
||||||
albumcovermanager.ui
|
albumcovermanager.ui
|
||||||
|
shufflerepeatwidget.ui
|
||||||
)
|
)
|
||||||
|
|
||||||
# Resource files
|
# Resource files
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "albumcovermanager.h"
|
#include "albumcovermanager.h"
|
||||||
#include "m3uparser.h"
|
#include "m3uparser.h"
|
||||||
#include "playlistmanager.h"
|
#include "playlistmanager.h"
|
||||||
|
#include "shufflerepeatwidget.h"
|
||||||
|
|
||||||
#include "qxtglobalshortcut.h"
|
#include "qxtglobalshortcut.h"
|
||||||
|
|
||||||
|
@ -50,6 +51,7 @@ MainWindow::MainWindow(QNetworkAccessManager* network, QWidget *parent)
|
||||||
tray_icon_(new SystemTrayIcon(this)),
|
tray_icon_(new SystemTrayIcon(this)),
|
||||||
osd_(new OSD(tray_icon_, this)),
|
osd_(new OSD(tray_icon_, this)),
|
||||||
track_slider_(new TrackSlider(this)),
|
track_slider_(new TrackSlider(this)),
|
||||||
|
shuffle_repeat_widget_(new ShuffleRepeatWidget(this)),
|
||||||
edit_tag_dialog_(new EditTagDialog(this)),
|
edit_tag_dialog_(new EditTagDialog(this)),
|
||||||
multi_loading_indicator_(new MultiLoadingIndicator(this)),
|
multi_loading_indicator_(new MultiLoadingIndicator(this)),
|
||||||
library_config_dialog_(new LibraryConfigDialog(this)),
|
library_config_dialog_(new LibraryConfigDialog(this)),
|
||||||
|
@ -264,6 +266,7 @@ MainWindow::MainWindow(QNetworkAccessManager* network, QWidget *parent)
|
||||||
ui_.analyzer->set_engine(player_->GetEngine());
|
ui_.analyzer->set_engine(player_->GetEngine());
|
||||||
|
|
||||||
// Statusbar widgets
|
// Statusbar widgets
|
||||||
|
ui_.statusBar->addPermanentWidget(shuffle_repeat_widget_);
|
||||||
ui_.statusBar->addPermanentWidget(track_slider_);
|
ui_.statusBar->addPermanentWidget(track_slider_);
|
||||||
ui_.statusBar->addWidget(multi_loading_indicator_);
|
ui_.statusBar->addWidget(multi_loading_indicator_);
|
||||||
multi_loading_indicator_->hide();
|
multi_loading_indicator_->hide();
|
||||||
|
|
|
@ -25,6 +25,7 @@ class About;
|
||||||
class AddStreamDialog;
|
class AddStreamDialog;
|
||||||
class ShortcutsDialog;
|
class ShortcutsDialog;
|
||||||
class AlbumCoverManager;
|
class AlbumCoverManager;
|
||||||
|
class ShuffleRepeatWidget;
|
||||||
|
|
||||||
class QSortFilterProxyModel;
|
class QSortFilterProxyModel;
|
||||||
class SystemTrayIcon;
|
class SystemTrayIcon;
|
||||||
|
@ -107,6 +108,7 @@ class MainWindow : public QMainWindow {
|
||||||
SystemTrayIcon* tray_icon_;
|
SystemTrayIcon* tray_icon_;
|
||||||
OSD* osd_;
|
OSD* osd_;
|
||||||
TrackSlider* track_slider_;
|
TrackSlider* track_slider_;
|
||||||
|
ShuffleRepeatWidget* shuffle_repeat_widget_;
|
||||||
EditTagDialog* edit_tag_dialog_;
|
EditTagDialog* edit_tag_dialog_;
|
||||||
MultiLoadingIndicator* multi_loading_indicator_;
|
MultiLoadingIndicator* multi_loading_indicator_;
|
||||||
LibraryConfigDialog* library_config_dialog_;
|
LibraryConfigDialog* library_config_dialog_;
|
||||||
|
|
|
@ -0,0 +1,107 @@
|
||||||
|
#include "shufflerepeatwidget.h"
|
||||||
|
|
||||||
|
#include <QMenu>
|
||||||
|
#include <QActionGroup>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QtDebug>
|
||||||
|
|
||||||
|
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();
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
#ifndef SHUFFLEREPEATWIDGET_H
|
||||||
|
#define SHUFFLEREPEATWIDGET_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
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
|
|
@ -0,0 +1,151 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>ShuffleRepeatWidget</class>
|
||||||
|
<widget class="QWidget" name="ShuffleRepeatWidget">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>62</width>
|
||||||
|
<height>37</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">QToolButton, QToolButton:hover, QToolButton:pressed {
|
||||||
|
border: 0px;
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
#line {
|
||||||
|
margin: 3px 0px 3px 0px;
|
||||||
|
}</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="margin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="repeat">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Repeat</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset>
|
||||||
|
<normaloff>:/media-playlist-repeat-off.png</normaloff>
|
||||||
|
<normalon>:/media-playlist-repeat.png</normalon>:/media-playlist-repeat-off.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>16</width>
|
||||||
|
<height>16</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="popupMode">
|
||||||
|
<enum>QToolButton::InstantPopup</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QToolButton" name="shuffle">
|
||||||
|
<property name="toolTip">
|
||||||
|
<string>Shuffle</string>
|
||||||
|
</property>
|
||||||
|
<property name="icon">
|
||||||
|
<iconset>
|
||||||
|
<normaloff>:/media-playlist-shuffle-off.png</normaloff>
|
||||||
|
<normalon>:/media-playlist-shuffle.png</normalon>:/media-playlist-shuffle-off.png</iconset>
|
||||||
|
</property>
|
||||||
|
<property name="iconSize">
|
||||||
|
<size>
|
||||||
|
<width>16</width>
|
||||||
|
<height>16</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="popupMode">
|
||||||
|
<enum>QToolButton::InstantPopup</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="Line" name="line">
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Vertical</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
<action name="action_repeat_off">
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Don't repeat</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="action_repeat_track">
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Repeat track</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="action_repeat_album">
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Repeat album</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="action_repeat_playlist">
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Repeat playlist</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="action_shuffle_off">
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Don't shuffle</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="action_shuffle_album">
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Shuffle by album</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
<action name="action_shuffle_all">
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Shuffle all</string>
|
||||||
|
</property>
|
||||||
|
</action>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
Loading…
Reference in New Issue