Add shuffle and repeat options. These don't do anything yet.

Updates issue #20
This commit is contained in:
David Sansome 2010-03-08 14:08:54 +00:00
parent 427e24dece
commit c9ddf09869
11 changed files with 326 additions and 0 deletions

View File

@ -66,5 +66,9 @@
<file>download.png</file>
<file>zoom-in.png</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>
</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

View File

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

View File

@ -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();

View File

@ -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_;

107
src/shufflerepeatwidget.cpp Normal file
View File

@ -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();
}

56
src/shufflerepeatwidget.h Normal file
View File

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

151
src/shufflerepeatwidget.ui Normal file
View File

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