Remove the playlists tab and add a smart playlists section to the library view instead

This commit is contained in:
David Sansome 2010-11-17 20:21:04 +00:00
parent 28a9454044
commit 4750c19d00
60 changed files with 440 additions and 1303 deletions

View File

@ -131,13 +131,10 @@ set(SOURCES
smartplaylists/playlistgenerator.cpp
smartplaylists/playlistgeneratorinserter.cpp
smartplaylists/smartplaylistcontainer.cpp
smartplaylists/smartplaylistmodel.cpp
smartplaylists/smartplaylistsearch.cpp
smartplaylists/smartplaylistsearchpreview.cpp
smartplaylists/smartplaylistsearchterm.cpp
smartplaylists/smartplaylistsearchtermwidget.cpp
smartplaylists/smartplaylistview.cpp
smartplaylists/smartplaylistwizard.cpp
smartplaylists/queryplaylistgenerator.cpp
@ -293,11 +290,8 @@ set(HEADERS
smartplaylists/generatormimedata.h
smartplaylists/playlistgenerator.h
smartplaylists/playlistgeneratorinserter.h
smartplaylists/smartplaylistcontainer.h
smartplaylists/smartplaylistmodel.h
smartplaylists/smartplaylistsearchpreview.h
smartplaylists/smartplaylistsearchtermwidget.h
smartplaylists/smartplaylistview.h
smartplaylists/smartplaylistwizard.h
songinfo/artistinfoview.h
@ -380,7 +374,6 @@ set(UI
radio/magnatunedownloaddialog.ui
radio/radioviewcontainer.ui
smartplaylists/smartplaylistcontainer.ui
smartplaylists/smartplaylistsearchpreview.ui
smartplaylists/smartplaylistsearchtermwidget.ui
smartplaylists/smartplaylistwizard.ui

View File

@ -39,6 +39,7 @@ Library::Library(BackgroundThread<Database>* db_thread, TaskManager* task_manage
backend_->Init(db_thread->Worker(), kSongsTable, kDirsTable, kSubdirsTable, kFtsTable);
model_ = new LibraryModel(backend_, this);
model_->set_show_smart_playlists(true);
}
void Library::set_watcher_factory(BackgroundThreadFactory<LibraryWatcher>* factory) {

View File

@ -30,6 +30,8 @@ class LibraryItem : public SimpleTreeItem<LibraryItem> {
Type_Divider,
Type_Container,
Type_Song,
Type_PlaylistContainer,
Type_SmartPlaylist,
};
LibraryItem(SimpleTreeModel<LibraryItem>* model)
@ -39,6 +41,7 @@ class LibraryItem : public SimpleTreeItem<LibraryItem> {
int container_level;
Song metadata;
QByteArray smart_playlist_data;
};
#endif // LIBRARYITEM_H

View File

@ -21,22 +21,31 @@
#include "sqlrow.h"
#include "core/database.h"
#include "playlist/songmimedata.h"
#include "smartplaylists/generatormimedata.h"
#include "smartplaylists/playlistgenerator.h"
#include "smartplaylists/queryplaylistgenerator.h"
#include "ui/iconloader.h"
#include <QSettings>
#include <QStringList>
#include <QUrl>
#include <QMetaEnum>
#include <boost/bind.hpp>
const char* LibraryModel::kSmartPlaylistsMimeType = "application/x-clementine-smart-playlist-generator";
const char* LibraryModel::kSmartPlaylistsSettingsGroup = "SerialisedSmartPlaylists";
LibraryModel::LibraryModel(LibraryBackend* backend, QObject* parent)
: SimpleTreeModel<LibraryItem>(new LibraryItem(this), parent),
backend_(backend),
dir_model_(new LibraryDirectoryModel(backend, this)),
show_smart_playlists_(false),
artist_icon_(":/icons/22x22/x-clementine-artist.png"),
album_icon_(":/icons/22x22/x-clementine-album.png"),
no_cover_icon_(":nocover.png")
no_cover_icon_(":nocover.png"),
playlists_dir_icon_(IconLoader::Load("folder")),
playlist_icon_(IconLoader::Load("view-media-playlist"))
{
root_->lazy_loaded = true;
@ -327,6 +336,8 @@ QVariant LibraryModel::data(const LibraryItem* item, int role) const {
case Qt::DecorationRole:
switch (item->type)
case LibraryItem::Type_PlaylistContainer:
return playlists_dir_icon_;
case LibraryItem::Type_Container:
switch (container_type) {
case GroupBy_Album:
@ -337,6 +348,8 @@ QVariant LibraryModel::data(const LibraryItem* item, int role) const {
default:
break;
}
case LibraryItem::Type_SmartPlaylist:
return playlist_icon_;
default:
break;
break;
@ -412,6 +425,7 @@ void LibraryModel::Reset() {
container_nodes_[2].clear();
divider_nodes_.clear();
compilation_artist_node_ = NULL;
smart_playlist_node_ = NULL;
root_ = new LibraryItem(this);
root_->lazy_loaded = false;
@ -421,6 +435,10 @@ void LibraryModel::Reset() {
backend_->HasCompilations(query_options_))
CreateCompilationArtistNode(false, root_);
// Smart playlists?
if (show_smart_playlists_)
CreateSmartPlaylists();
// Populate top level
LazyPopulate(root_, false);
@ -708,6 +726,7 @@ Qt::ItemFlags LibraryModel::flags(const QModelIndex& index) const {
switch (IndexToItem(index)->type) {
case LibraryItem::Type_Song:
case LibraryItem::Type_Container:
case LibraryItem::Type_SmartPlaylist:
return Qt::ItemIsSelectable |
Qt::ItemIsEnabled |
Qt::ItemIsDragEnabled;
@ -723,6 +742,20 @@ QStringList LibraryModel::mimeTypes() const {
}
QMimeData* LibraryModel::mimeData(const QModelIndexList& indexes) const {
if (indexes.isEmpty())
return NULL;
// Special case: a smart playlist was dragged
if (IndexToItem(indexes.first())->type == LibraryItem::Type_SmartPlaylist) {
PlaylistGeneratorPtr generator = CreateGenerator(indexes.first());
if (!generator)
return NULL;
GeneratorMimeData* data = new GeneratorMimeData(generator);
data->setData(kSmartPlaylistsMimeType, QByteArray());
return data;
}
SongMimeData* data = new SongMimeData;
QList<QUrl> urls;
QSet<int> song_ids;
@ -834,3 +867,91 @@ LibraryModel::GroupBy& LibraryModel::Grouping::operator [](int i) {
Q_ASSERT(0);
return first;
}
void LibraryModel::CreateSmartPlaylists() {
smart_playlist_node_ = new LibraryItem(LibraryItem::Type_PlaylistContainer, root_);
smart_playlist_node_->container_level = 0;
smart_playlist_node_->sort_text = " _smart";
smart_playlist_node_->key = tr("Smart playlists");
QSettings s;
if (!s.childGroups().contains(kSmartPlaylistsSettingsGroup)) {
// No smart playlists existed in the settings, so create some defaults
s.beginGroup(kSmartPlaylistsSettingsGroup);
s.beginWriteArray("smart");
// These defines really make this section more concise
#define S SmartPlaylistSearch
#define T SmartPlaylistSearchTerm
int i = 0;
SaveDefaultGenerator(&s, i++, tr("50 random tracks"), S(
S::Type_All, S::TermList(), S::Sort_Random, T::Field_Title, 50));
SaveDefaultGenerator(&s, i++, tr("Ever played"), S(
S::Type_And, S::TermList() << T(T::Field_PlayCount, T::Op_GreaterThan, 0),
S::Sort_Random, T::Field_Title));
SaveDefaultGenerator(&s, i++, tr("Never played"), S(
S::Type_And, S::TermList() << T(T::Field_PlayCount, T::Op_Equals, 0),
S::Sort_Random, T::Field_Title));
SaveDefaultGenerator(&s, i++, tr("Last played"), S(
S::Type_All, S::TermList(), S::Sort_FieldDesc, T::Field_LastPlayed));
SaveDefaultGenerator(&s, i++, tr("Most played"), S(
S::Type_All, S::TermList(), S::Sort_FieldDesc, T::Field_PlayCount));
SaveDefaultGenerator(&s, i++, tr("Favourite tracks"), S(
S::Type_All, S::TermList(), S::Sort_FieldDesc, T::Field_Score));
SaveDefaultGenerator(&s, i++, tr("Newest tracks"), S(
S::Type_All, S::TermList(), S::Sort_FieldDesc, T::Field_DateCreated));
#undef S
#undef T
s.endArray();
s.endGroup();
}
s.beginGroup(kSmartPlaylistsSettingsGroup);
const int count = s.beginReadArray("smart");
for (int i=0 ; i<count ; ++i) {
s.setArrayIndex(i);
LibraryItem* item = new LibraryItem(LibraryItem::Type_SmartPlaylist, smart_playlist_node_);
item->display_text = s.value("name").toString();
item->key = s.value("type").toString();
item->smart_playlist_data = s.value("data").toByteArray();
item->lazy_loaded = true;
}
}
void LibraryModel::SaveDefaultGenerator(QSettings* s, int i, const QString& name,
const SmartPlaylistSearch& search) const {
boost::shared_ptr<QueryPlaylistGenerator> gen(new QueryPlaylistGenerator);
gen->set_name(name);
gen->Load(search);
SaveGenerator(s, i, boost::static_pointer_cast<PlaylistGenerator>(gen));
}
void LibraryModel::SaveGenerator(QSettings* s, int i, PlaylistGeneratorPtr generator) const {
s->setArrayIndex(i);
s->setValue("name", generator->name());
s->setValue("type", generator->type());
s->setValue("data", generator->Save());
}
PlaylistGeneratorPtr LibraryModel::CreateGenerator(const QModelIndex& index) const {
PlaylistGeneratorPtr ret;
const LibraryItem* item = IndexToItem(index);
if (!item || item->type != LibraryItem::Type_SmartPlaylist)
return ret;
ret = PlaylistGenerator::Create(item->key);
if (!ret)
return ret;
ret->set_name(item->display_text);
ret->set_library(backend());
ret->Load(item->smart_playlist_data);
return ret;
}

View File

@ -27,11 +27,15 @@
#include "core/simpletreemodel.h"
#include "core/song.h"
#include "engines/engine_fwd.h"
#include "smartplaylists/playlistgenerator_fwd.h"
#include <boost/scoped_ptr.hpp>
class LibraryDirectoryModel;
class LibraryBackend;
class SmartPlaylistSearch;
class QSettings;
class LibraryModel : public SimpleTreeModel<LibraryItem> {
Q_OBJECT
@ -41,6 +45,9 @@ class LibraryModel : public SimpleTreeModel<LibraryItem> {
LibraryModel(LibraryBackend* backend, QObject* parent = 0);
~LibraryModel();
static const char* kSmartPlaylistsMimeType;
static const char* kSmartPlaylistsSettingsGroup;
enum Role {
Role_Type = Qt::UserRole + 1,
Role_ContainerType,
@ -86,12 +93,17 @@ class LibraryModel : public SimpleTreeModel<LibraryItem> {
LibraryBackend* backend() const { return backend_; }
LibraryDirectoryModel* directory_model() const { return dir_model_; }
// Call before Init()
void set_show_smart_playlists(bool show_smart_playlists) { show_smart_playlists_ = show_smart_playlists; }
// Get information about the library
void GetChildSongs(LibraryItem* item, QList<QUrl>* urls, SongList* songs,
QSet<int>* song_ids) const;
SongList GetChildSongs(const QModelIndex& index) const;
SongList GetChildSongs(const QModelIndexList& indexes) const;
PlaylistGeneratorPtr CreateGenerator(const QModelIndex& index) const;
// QAbstractItemModel
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
Qt::ItemFlags flags(const QModelIndex& index) const;
@ -143,6 +155,12 @@ class LibraryModel : public SimpleTreeModel<LibraryItem> {
// The "Various Artists" node is an annoying special case.
LibraryItem* CreateCompilationArtistNode(bool signal, LibraryItem* parent);
// Smart playlists are shown in another top-level node
void CreateSmartPlaylists();
void SaveDefaultGenerator(QSettings* s, int i, const QString& name,
const SmartPlaylistSearch& search) const;
void SaveGenerator(QSettings* s, int i, PlaylistGeneratorPtr generator) const;
// Helpers for ItemFromQuery and ItemFromSong
LibraryItem* InitItem(GroupBy type, bool signal, LibraryItem* parent,
int container_level);
@ -168,6 +186,7 @@ class LibraryModel : public SimpleTreeModel<LibraryItem> {
private:
LibraryBackend* backend_;
LibraryDirectoryModel* dir_model_;
bool show_smart_playlists_;
QueryOptions query_options_;
Grouping group_by_;
@ -184,9 +203,14 @@ class LibraryModel : public SimpleTreeModel<LibraryItem> {
// Only applies if the first level is "artist"
LibraryItem* compilation_artist_node_;
// Only applies if smart playlists are set to on
LibraryItem* smart_playlist_node_;
QIcon artist_icon_;
QIcon album_icon_;
QIcon no_cover_icon_;
QIcon playlists_dir_icon_;
QIcon playlist_icon_;
};
Q_DECLARE_METATYPE(LibraryModel::Grouping);

View File

@ -25,6 +25,7 @@
#include "core/modelfuturewatcher.h"
#include "library/library.h"
#include "library/librarybackend.h"
#include "library/librarymodel.h"
#include "library/libraryplaylistitem.h"
#include "radio/magnatuneservice.h"
#include "radio/magnatuneplaylistitem.h"
@ -34,7 +35,6 @@
#include "radio/savedradio.h"
#include "smartplaylists/generatormimedata.h"
#include "smartplaylists/playlistgeneratorinserter.h"
#include "smartplaylists/smartplaylistmodel.h"
#include <QtDebug>
#include <QMimeData>
@ -519,7 +519,7 @@ Qt::ItemFlags Playlist::flags(const QModelIndex &index) const {
QStringList Playlist::mimeTypes() const {
return QStringList() << "text/uri-list" << kRowsMimetype
<< SmartPlaylistModel::kMimeType;
<< LibraryModel::kSmartPlaylistsMimeType;
}
Qt::DropActions Playlist::supportedDropActions() const {

View File

@ -24,8 +24,6 @@
class LibraryBackend;
class QSettings;
class PlaylistGenerator : public QObject, public boost::enable_shared_from_this<PlaylistGenerator> {
Q_OBJECT
@ -39,8 +37,13 @@ public:
void set_library(LibraryBackend* backend) { backend_ = backend; }
QString name() const { return name_; }
void set_name(const QString& name) { name_ = name; }
virtual QString type() const = 0;
virtual void Load(const QByteArray& data) = 0;
virtual QByteArray Save() const = 0;
virtual void Load(const QSettings& s) {}
virtual PlaylistItemList Generate() = 0;
signals:

View File

@ -18,7 +18,6 @@
#include "library/librarybackend.h"
#include "library/libraryplaylistitem.h"
#include <QSettings>
#include <QtDebug>
QueryPlaylistGenerator::QueryPlaylistGenerator()
@ -29,11 +28,17 @@ void QueryPlaylistGenerator::Load(const SmartPlaylistSearch& search) {
search_ = search;
}
void QueryPlaylistGenerator::Load(const QSettings& s) {
PlaylistGenerator::Load(s);
void QueryPlaylistGenerator::Load(const QByteArray& data) {
QDataStream s(data);
s >> search_;
}
QDataStream stream(s.value("search").toByteArray());
stream >> search_;
QByteArray QueryPlaylistGenerator::Save() const {
QByteArray ret;
QDataStream s(&ret, QIODevice::WriteOnly);
s << search_;
return ret;
}
PlaylistItemList QueryPlaylistGenerator::Generate() {

View File

@ -24,8 +24,12 @@ class QueryPlaylistGenerator : public PlaylistGenerator {
public:
QueryPlaylistGenerator();
QString type() const { return "Query"; }
void Load(const SmartPlaylistSearch& search);
void Load(const QSettings& s);
void Load(const QByteArray& data);
QByteArray Save() const;
PlaylistItemList Generate();
private:

View File

@ -1,72 +0,0 @@
/* This file is part of Clementine.
Clementine is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Clementine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#include "smartplaylistcontainer.h"
#include "smartplaylistmodel.h"
#include "smartplaylistwizard.h"
#include "ui_smartplaylistcontainer.h"
#include "playlist/playlistmanager.h"
#include "ui/iconloader.h"
SmartPlaylistContainer::SmartPlaylistContainer(QWidget *parent)
: QWidget(parent),
ui_(new Ui_SmartPlaylistContainer),
first_show_(true),
model_(new SmartPlaylistModel(this)),
library_(NULL),
playlist_manager_(NULL)
{
ui_->setupUi(this);
connect(ui_->view, SIGNAL(Play(QModelIndex,bool,bool)), SLOT(Play(QModelIndex,bool,bool)));
connect(ui_->view, SIGNAL(NewSmartPlaylist()), SLOT(NewSmartPlaylist()));
connect(ui_->add, SIGNAL(clicked()), SLOT(NewSmartPlaylist()));
ui_->view->setModel(model_);
}
SmartPlaylistContainer::~SmartPlaylistContainer() {
delete ui_;
}
void SmartPlaylistContainer::set_library(LibraryBackend* library) {
library_ = library;
model_->set_library(library);
}
void SmartPlaylistContainer::showEvent(QShowEvent*) {
if (!first_show_)
return;
first_show_ = false;
ui_->add->setIcon(IconLoader::Load("list-add"));
ui_->remove->setIcon(IconLoader::Load("list-remove"));
ui_->play->setIcon(IconLoader::Load("media-playback-start"));
}
void SmartPlaylistContainer::Play(const QModelIndex& index, bool as_new, bool clear) {
PlaylistGeneratorPtr generator = model_->CreateGenerator(index);
if (!generator)
return;
playlist_manager_->PlaySmartPlaylist(generator, as_new, clear);
}
void SmartPlaylistContainer::NewSmartPlaylist() {
SmartPlaylistWizard* wizard = new SmartPlaylistWizard(library_, this);
wizard->show();
}

View File

@ -1,57 +0,0 @@
/* This file is part of Clementine.
Clementine is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Clementine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef SMARTPLAYLISTCONTAINER_H
#define SMARTPLAYLISTCONTAINER_H
#include "playlistgenerator_fwd.h"
#include <QWidget>
class LibraryBackend;
class PlaylistManager;
class SmartPlaylistModel;
class Ui_SmartPlaylistContainer;
class QModelIndex;
class SmartPlaylistContainer : public QWidget {
Q_OBJECT
public:
SmartPlaylistContainer(QWidget* parent);
~SmartPlaylistContainer();
void set_library(LibraryBackend* library);
void set_playlists(PlaylistManager* playlist_manager) { playlist_manager_ = playlist_manager; }
protected:
void showEvent(QShowEvent*);
private slots:
void Play(const QModelIndex& index, bool as_new, bool clear);
void NewSmartPlaylist();
private:
Ui_SmartPlaylistContainer* ui_;
bool first_show_;
SmartPlaylistModel* model_;
LibraryBackend* library_;
PlaylistManager* playlist_manager_;
};
#endif // SMARTPLAYLISTCONTAINER_H

View File

@ -1,96 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SmartPlaylistContainer</class>
<widget class="QWidget" name="SmartPlaylistContainer">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>380</width>
<height>616</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="margin">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QToolButton" name="add">
<property name="text">
<string>New</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="remove">
<property name="text">
<string>Remove</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="play">
<property name="text">
<string>Play</string>
</property>
<property name="toolButtonStyle">
<enum>Qt::ToolButtonTextBesideIcon</enum>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="SmartPlaylistView" name="view"/>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>SmartPlaylistView</class>
<extends>QTreeView</extends>
<header>smartplaylists/smartplaylistview.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View File

@ -1,142 +0,0 @@
/* This file is part of Clementine.
Clementine is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Clementine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#include "generatormimedata.h"
#include "playlistgenerator.h"
#include "smartplaylistmodel.h"
#include "ui/iconloader.h"
#include <QSettings>
const char* SmartPlaylistModel::kSettingsGroup = "SmartPlaylists";
const char* SmartPlaylistModel::kMimeType = "application/x-clementine-smart-playlist-generator";
SmartPlaylistModel::SmartPlaylistModel(QObject* parent)
: QStandardItemModel(parent),
library_(NULL),
container_icon_(IconLoader::Load("folder")),
playlist_icon_(IconLoader::Load("view-media-playlist")),
smart_item_(CreateContainer(tr("Smart playlists"), "smart")),
dynamic_item_(CreateContainer(tr("Dynamic playlists"), "dynamic"))
{
setColumnCount(1);
invisibleRootItem()->appendRow(smart_item_);
invisibleRootItem()->appendRow(dynamic_item_);
QSettings s;
if (!s.childGroups().contains(kSettingsGroup)) {
SaveDefaults();
}
Load("smart", smart_item_);
Load("dynamic", dynamic_item_);
}
QStandardItem* SmartPlaylistModel::CreateContainer(
const QString& name, const QString& group) {
QStandardItem* ret = new QStandardItem(name);
ret->setData(Type_Container, Role_Type);
ret->setData(group, Role_ContainerGroup);
ret->setData(container_icon_, Qt::DecorationRole);
return ret;
}
void SmartPlaylistModel::Load(const char* name, QStandardItem* parent) {
QSettings s;
s.beginGroup(kSettingsGroup);
const int count = s.beginReadArray(name);
for (int i=0 ; i<count ; ++i) {
s.setArrayIndex(i);
QStandardItem* item = new QStandardItem;
item->setText(s.value("name").toString());
item->setData(s.value("type").toString(), Role_GeneratorClass);
item->setData(Type_Generator, Role_Type);
item->setData(playlist_icon_, Qt::DecorationRole);
parent->appendRow(item);
}
}
void SmartPlaylistModel::SaveDefaults() {
QSettings s;
s.beginGroup(kSettingsGroup);
int i = 0;
s.beginWriteArray("smart");
SaveDefaultQuery(&s, i++, tr("50 random tracks"), QString(), "random()", 50);
SaveDefaultQuery(&s, i++, tr("Ever played"), "playcount > 0", QString());
SaveDefaultQuery(&s, i++, tr("Last played"), QString(), "lastplayed DESC");
SaveDefaultQuery(&s, i++, tr("Most played"), QString(), "playcount DESC");
SaveDefaultQuery(&s, i++, tr("Never played"), "playcount = 0", QString());
SaveDefaultQuery(&s, i++, tr("Favourite tracks"), QString(), "rating DESC"); // TODO: use score
SaveDefaultQuery(&s, i++, tr("Newest tracks"), QString(), "ctime DESC");
s.endArray();
}
void SmartPlaylistModel::SaveDefaultQuery(QSettings* s, int i,
const QString& name, const QString& where, const QString& order, int limit) {
s->setArrayIndex(i);
s->setValue("name", name);
s->setValue("type", "Query");
if (limit != -1) s->setValue("limit", limit);
if (!where.isEmpty()) s->setValue("where", where);
if (!order.isEmpty()) s->setValue("order", order);
}
PlaylistGeneratorPtr SmartPlaylistModel::CreateGenerator(const QModelIndex& index) const {
PlaylistGeneratorPtr ret;
// Get the item
const QStandardItem* item = itemFromIndex(index);
if (!item || item->data(Role_Type).toInt() != Type_Generator)
return ret;
// Get the container that the item is in
const QStandardItem* container = itemFromIndex(index.parent());
if (!container || container->data(Role_Type).toInt() != Type_Container)
return ret;
// Open the settings in the right place
QSettings s;
s.beginGroup(kSettingsGroup);
const int count = s.beginReadArray(container->data(Role_ContainerGroup).toString());
// Check this row really exists
if (index.row() >= count)
return ret;
s.setArrayIndex(index.row());
// Create a generator of the right type
ret = PlaylistGenerator::Create(item->data(Role_GeneratorClass).toString());
if (!ret)
return ret;
// Initialise the generator
ret->set_library(library_);
ret->Load(s);
return ret;
}
QMimeData* SmartPlaylistModel::mimeData(const QModelIndexList& indexes) const {
PlaylistGeneratorPtr generator = CreateGenerator(indexes.first());
if (!generator)
return NULL;
GeneratorMimeData* data = new GeneratorMimeData(generator);
data->setData(kMimeType, QByteArray());
return data;
}

View File

@ -1,78 +0,0 @@
/* This file is part of Clementine.
Clementine is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Clementine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef SMARTPLAYLISTMODEL_H
#define SMARTPLAYLISTMODEL_H
#include "playlistgenerator_fwd.h"
#include <QStandardItemModel>
class LibraryBackend;
class QSettings;
class SmartPlaylistModel : public QStandardItemModel {
Q_OBJECT
public:
SmartPlaylistModel(QObject* parent = 0);
enum Role {
Role_Type = Qt::UserRole + 1,
Role_ContainerGroup,
Role_GeneratorClass,
RoleCount
};
enum Type {
Type_Invalid,
Type_Container,
Type_Generator,
};
static const char* kSettingsGroup;
static const char* kMimeType;
void set_library(LibraryBackend* library) { library_ = library; }
PlaylistGeneratorPtr CreateGenerator(const QModelIndex& index) const;
// QAbstractItemModel
QMimeData* mimeData(const QModelIndexList& indexes) const;
private:
void Load(const char* name, QStandardItem* parent);
void SaveDefaults();
void SaveDefaultQuery(QSettings* settings, int i, const QString& name,
const QString& where, const QString& order,
int limit = -1);
QStandardItem* CreateContainer(const QString& name, const QString& group);
private:
LibraryBackend* library_;
QIcon container_icon_;
QIcon playlist_icon_;
QStandardItem* smart_item_;
QStandardItem* dynamic_item_;
};
#endif // SMARTPLAYLISTMODEL_H

View File

@ -23,6 +23,17 @@ SmartPlaylistSearch::SmartPlaylistSearch() {
Reset();
}
SmartPlaylistSearch::SmartPlaylistSearch(
SearchType type, TermList terms, SortType sort_type,
SmartPlaylistSearchTerm::Field sort_field, int limit)
: search_type_(type),
terms_(terms),
sort_type_(sort_type),
sort_field_(sort_field),
limit_(limit)
{
}
void SmartPlaylistSearch::Reset() {
search_type_ = Type_And;
terms_.clear();

View File

@ -17,11 +17,12 @@
#ifndef SMARTPLAYLISTSEARCH_H
#define SMARTPLAYLISTSEARCH_H
#include "playlistgenerator.h"
#include "smartplaylistsearchterm.h"
class SmartPlaylistSearch {
public:
SmartPlaylistSearch();
typedef QList<SmartPlaylistSearchTerm> TermList;
// These values are persisted, so add to the end of the enum only
enum SearchType {
@ -37,10 +38,15 @@ public:
Sort_FieldDesc,
};
SmartPlaylistSearch();
SmartPlaylistSearch(SearchType type, TermList terms, SortType sort_type,
SmartPlaylistSearchTerm::Field sort_field,
int limit = PlaylistGenerator::kDefaultLimit);
bool is_valid() const;
SearchType search_type_;
QList<SmartPlaylistSearchTerm> terms_;
TermList terms_;
SortType sort_type_;
SmartPlaylistSearchTerm::Field sort_field_;
int limit_;

View File

@ -18,6 +18,16 @@
#include "playlist/playlist.h"
SmartPlaylistSearchTerm::SmartPlaylistSearchTerm()
: field_(Field_Title),
operator_(Op_Equals)
{
}
SmartPlaylistSearchTerm::SmartPlaylistSearchTerm(
Field field, Operator op, const QVariant& value)
: field_(field),
operator_(op),
value_(value)
{
}
@ -73,6 +83,7 @@ SmartPlaylistSearchTerm::Type SmartPlaylistSearchTerm::TypeOf(Field field) {
case Field_Filesize:
case Field_PlayCount:
case Field_SkipCount:
case Field_Score:
return Type_Number;
case Field_LastPlayed:
@ -137,6 +148,7 @@ QString SmartPlaylistSearchTerm::FieldColumnName(Field field) {
case Field_DateCreated: return "ctime";
case Field_DateModified:return "mtime";
case Field_Rating: return "rating";
case Field_Score: return "score";
case Field_Title: return "title";
case Field_Artist: return "artist";
case Field_Album: return "album";
@ -165,6 +177,7 @@ QString SmartPlaylistSearchTerm::FieldName(Field field) {
case Field_DateCreated: return Playlist::column_name(Playlist::Column_DateCreated);
case Field_DateModified:return Playlist::column_name(Playlist::Column_DateModified);
case Field_Rating: return Playlist::column_name(Playlist::Column_Rating);
case Field_Score: return Playlist::column_name(Playlist::Column_Score);
case Field_Title: return Playlist::column_name(Playlist::Column_Title);
case Field_Artist: return Playlist::column_name(Playlist::Column_Artist);
case Field_Album: return Playlist::column_name(Playlist::Column_Album);

View File

@ -22,8 +22,6 @@
class SmartPlaylistSearchTerm {
public:
SmartPlaylistSearchTerm();
// These values are persisted, so add to the end of the enum only
enum Field {
Field_Title = 0,
@ -43,6 +41,7 @@ public:
Field_DateCreated,
Field_DateModified,
Field_Rating,
Field_Score,
Field_PlayCount,
Field_SkipCount,
Field_LastPlayed,
@ -75,6 +74,9 @@ public:
Type_Rating,
};
SmartPlaylistSearchTerm();
SmartPlaylistSearchTerm(Field field, Operator op, const QVariant& value);
Field field_;
Operator operator_;
QVariant value_;

View File

@ -1,85 +0,0 @@
/* This file is part of Clementine.
Clementine is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Clementine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#include "smartplaylistmodel.h"
#include "smartplaylistview.h"
#include "ui/iconloader.h"
#include <QContextMenuEvent>
#include <QMenu>
SmartPlaylistView::SmartPlaylistView(QWidget* parent)
: AutoExpandingTreeView(parent),
menu_(NULL)
{
setAttribute(Qt::WA_MacShowFocusRect, false);
setHeaderHidden(true);
setAllColumnsShowFocus(true);
setDragEnabled(true);
setDragDropMode(QAbstractItemView::DragOnly);
setSelectionMode(QAbstractItemView::ExtendedSelection);
}
void SmartPlaylistView::contextMenuEvent(QContextMenuEvent* e) {
if (!menu_) {
menu_ = new QMenu(this);
load_action_ = menu_->addAction(IconLoader::Load("media-playback-start"),
tr("Load"), this, SLOT(Load()));
add_action_ = menu_->addAction(IconLoader::Load("media-playback-start"),
tr("Add to playlist"), this, SLOT(AddToPlaylist()));
add_as_new_action_ = menu_->addAction(IconLoader::Load("view-media-playlist"),
tr("Add as new playlist..."), this, SLOT(AddAsNewPlaylist()));
menu_->addSeparator();
new_smart_action_ = menu_->addAction(IconLoader::Load("list-add"),
tr("New smart playlist..."), this, SIGNAL(NewSmartPlaylist()));
new_folder_action_ = menu_->addAction(IconLoader::Load("folder-new"),
tr("New folder..."), this, SLOT(NewFolder()));
remove_action_ = menu_->addAction(IconLoader::Load("list-remove"),
tr("Remove"), this, SLOT(Remove()));
}
menu_index_ = indexAt(e->pos());
const SmartPlaylistModel::Type type = SmartPlaylistModel::Type(
menu_index_.data(SmartPlaylistModel::Role_Type).toInt());
const bool is_generator = type == SmartPlaylistModel::Type_Generator;
load_action_->setEnabled(is_generator);
add_action_->setEnabled(is_generator);
add_as_new_action_->setEnabled(is_generator);
menu_->popup(e->globalPos());
}
void SmartPlaylistView::Load() {
if (menu_index_.isValid())
emit Play(menu_index_, false, true);
}
void SmartPlaylistView::AddToPlaylist() {
if (menu_index_.isValid())
emit Play(menu_index_, false, false);
}
void SmartPlaylistView::AddAsNewPlaylist() {
if (menu_index_.isValid())
emit Play(menu_index_, true, false);
}
void SmartPlaylistView::NewFolder() {
}
void SmartPlaylistView::Remove() {
}

View File

@ -1,57 +0,0 @@
/* This file is part of Clementine.
Clementine is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Clementine is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef SMARTPLAYLISTVIEW_H
#define SMARTPLAYLISTVIEW_H
#include "widgets/autoexpandingtreeview.h"
class QAction;
class QMenu;
class SmartPlaylistView : public AutoExpandingTreeView {
Q_OBJECT
public:
SmartPlaylistView(QWidget* parent = 0);
signals:
void Play(const QModelIndex& index, bool as_new, bool clear);
void NewSmartPlaylist();
protected:
void contextMenuEvent(QContextMenuEvent*);
private slots:
void Load();
void AddToPlaylist();
void AddAsNewPlaylist();
void NewFolder();
void Remove();
private:
QMenu* menu_;
QAction* load_action_;
QAction* add_action_;
QAction* add_as_new_action_;
QAction* new_smart_action_;
QAction* new_folder_action_;
QAction* remove_action_;
QModelIndex menu_index_;
};
#endif // SMARTPLAYLISTVIEW_H

View File

@ -173,9 +173,6 @@ msgstr ""
msgid "Add another stream..."
msgstr ""
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "أضف مجلد..."
@ -735,9 +732,6 @@ msgstr ""
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr ""
@ -1329,18 +1323,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr ""
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1513,9 +1498,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr ""

View File

@ -174,9 +174,6 @@ msgstr ""
msgid "Add another stream..."
msgstr "Добавяне на друг поток..."
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Добавяне на папка..."
@ -736,9 +733,6 @@ msgstr ""
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr ""
@ -1334,18 +1328,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr ""
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr "Нови песни"
@ -1518,9 +1503,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Поп"

View File

@ -180,9 +180,6 @@ msgstr "Afegeix acció"
msgid "Add another stream..."
msgstr "Afegir un altre fluxe..."
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Afegir directori..."
@ -754,9 +751,6 @@ msgstr "Arrossegueu per canviar de posició"
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Editar etiqueta \"%1\"..."
@ -1357,18 +1351,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr "Llista de reproducció nova"
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr "Cançons noves"
@ -1543,9 +1528,6 @@ msgstr "Buscar llista de reproducció"
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Pop"

View File

@ -175,9 +175,6 @@ msgstr "Přidat činnost"
msgid "Add another stream..."
msgstr "Přidat další proud..."
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Přidat adresář..."
@ -737,9 +734,6 @@ msgstr "Přemístit přetažením"
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Upravit tag\"%1\"..."
@ -1334,18 +1328,9 @@ msgstr "Nikdy"
msgid "Never played"
msgstr ""
msgid "New"
msgstr "Nové"
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr "Nový seznam skladeb"
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1518,9 +1503,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr "Seznamy skladeb"
msgid "Pop"
msgstr "Pop"
@ -2348,6 +2330,12 @@ msgstr "zastavit"
msgid "track %1"
msgstr "stopa %1"
#~ msgid "Playlists"
#~ msgstr "Seznamy skladeb"
#~ msgid "New"
#~ msgstr "Nové"
#~ msgid "&Hide tray icon"
#~ msgstr "S&krýt ikonu v systémovém panelu"

View File

@ -173,9 +173,6 @@ msgstr ""
msgid "Add another stream..."
msgstr ""
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr ""
@ -735,9 +732,6 @@ msgstr ""
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr ""
@ -1329,18 +1323,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr ""
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1513,9 +1498,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr ""

View File

@ -175,9 +175,6 @@ msgstr ""
msgid "Add another stream..."
msgstr "Tilføj endnu en stream..."
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Tilføj mappe..."
@ -737,9 +734,6 @@ msgstr "Træk for at skifte position"
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Redigér mærke \"%1\"..."
@ -1335,18 +1329,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr ""
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1519,9 +1504,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Pop"

View File

@ -179,9 +179,6 @@ msgstr "Aktion hinzufügen"
msgid "Add another stream..."
msgstr "Stream hinzufügen..."
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Verzeichnis hinzufügen..."
@ -755,9 +752,6 @@ msgstr "Klicken und ziehen um die Position zu ändern"
msgid "Drive letter"
msgstr "Laufwerksbuchstabe"
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "%1 bearbeiten"
@ -1360,18 +1354,9 @@ msgstr "Niemals"
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr "Neue Wiedergabeliste"
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr "Neue Titel"
@ -1546,9 +1531,6 @@ msgstr "Wiedergabeliste durchsuchen"
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Pop"

View File

@ -185,9 +185,6 @@ msgstr "Προσθήκη ενέργειας"
msgid "Add another stream..."
msgstr "Προσθήκη άλλης ροής..."
msgid "Add as new playlist..."
msgstr "Προσθήκη ως νέα λίστα..."
msgid "Add directory..."
msgstr "Προσθήκη καταλόγου..."
@ -765,9 +762,6 @@ msgstr "Σύρετε για μετακίνηση"
msgid "Drive letter"
msgstr "Γράμμα δίσκου"
msgid "Dynamic playlists"
msgstr "Δυναμικές λίστες"
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Τροποποίηση ετικέτας \"%1\"..."
@ -1371,18 +1365,9 @@ msgstr "Ποτέ"
msgid "Never played"
msgstr "Ποτέ δεν έπαιξαν"
msgid "New"
msgstr "Νέο"
msgid "New folder..."
msgstr "Νέος φάκελος..."
msgid "New playlist"
msgstr "Νέα λίστα"
msgid "New smart playlist..."
msgstr "Νέα έξυπνη λίστα..."
msgid "New songs"
msgstr "Νέα τραγούδια"
@ -1559,9 +1544,6 @@ msgstr "Αναζήτηση στη λίστα αναπαραγωγής"
msgid "Playlist type"
msgstr "Τύπος λίστας αναπαραγωγής"
msgid "Playlists"
msgstr "Λίστες αναπαραγωγής"
msgid "Pop"
msgstr "Pop"
@ -2420,6 +2402,24 @@ msgstr "διακοπή"
msgid "track %1"
msgstr "κομμάτι %1"
#~ msgid "Playlists"
#~ msgstr "Λίστες αναπαραγωγής"
#~ msgid "Add as new playlist..."
#~ msgstr "Προσθήκη ως νέα λίστα..."
#~ msgid "Dynamic playlists"
#~ msgstr "Δυναμικές λίστες"
#~ msgid "New"
#~ msgstr "Νέο"
#~ msgid "New folder..."
#~ msgstr "Νέος φάκελος..."
#~ msgid "New smart playlist..."
#~ msgstr "Νέα έξυπνη λίστα..."
#~ msgid ""
#~ "A song will be included in the playlist if it matches all of these "
#~ "conditions."

View File

@ -173,9 +173,6 @@ msgstr ""
msgid "Add another stream..."
msgstr "Add another stream..."
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Add directory..."
@ -737,9 +734,6 @@ msgstr "Drag to reposition"
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Edit tag \"%1\"..."
@ -1333,18 +1327,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr "New playlist"
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1518,9 +1503,6 @@ msgstr "Playlist search"
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Pop"

View File

@ -173,9 +173,6 @@ msgstr ""
msgid "Add another stream..."
msgstr "Add another stream..."
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Add directory..."
@ -735,9 +732,6 @@ msgstr "Drag to reposition"
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Edit tag \"%1\"..."
@ -1331,18 +1325,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr ""
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1515,9 +1500,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Pop"

View File

@ -173,9 +173,6 @@ msgstr "Aldoni agon"
msgid "Add another stream..."
msgstr "Aldoni plian fluon..."
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Aldoni dosierujon..."
@ -735,9 +732,6 @@ msgstr ""
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr ""
@ -1329,18 +1323,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr ""
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1513,9 +1498,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr ""

View File

@ -185,9 +185,6 @@ msgstr "Añadir acción"
msgid "Add another stream..."
msgstr "Añadir un flujo de radio..."
msgid "Add as new playlist..."
msgstr "Agregar como una nueva lista de reproducción"
msgid "Add directory..."
msgstr "Añadir directorio..."
@ -763,9 +760,6 @@ msgstr "Arrastrar para reposicionar"
msgid "Drive letter"
msgstr "Letra de unidad"
msgid "Dynamic playlists"
msgstr "Lista de reproducción dinámica"
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Editar etiqueta \"%1\"..."
@ -1369,18 +1363,9 @@ msgstr "Nunca"
msgid "Never played"
msgstr "Nunca reproducidos"
msgid "New"
msgstr "Nuevo"
msgid "New folder..."
msgstr "Nueva carpeta"
msgid "New playlist"
msgstr "Nueva lista de reproducción"
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr "Nuevas canciones"
@ -1557,9 +1542,6 @@ msgstr "Búsqueda en la lista"
msgid "Playlist type"
msgstr "Tipo de lista de reproducción"
msgid "Playlists"
msgstr "Listas de reproducción"
msgid "Pop"
msgstr "Pop"
@ -2412,6 +2394,21 @@ msgstr "detener"
msgid "track %1"
msgstr "Pista %1"
#~ msgid "Playlists"
#~ msgstr "Listas de reproducción"
#~ msgid "Add as new playlist..."
#~ msgstr "Agregar como una nueva lista de reproducción"
#~ msgid "Dynamic playlists"
#~ msgstr "Lista de reproducción dinámica"
#~ msgid "New"
#~ msgstr "Nuevo"
#~ msgid "New folder..."
#~ msgstr "Nueva carpeta"
#~ msgid "Artist A-Z"
#~ msgstr "Artista A-Z"

View File

@ -173,9 +173,6 @@ msgstr ""
msgid "Add another stream..."
msgstr ""
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr ""
@ -735,9 +732,6 @@ msgstr "Lohista asukoha muutmiseks"
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Muuda silti \"%1\"..."
@ -1331,18 +1325,9 @@ msgstr "Mitte kunagi"
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr "Uus esitusnimekiri"
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1515,9 +1500,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr ""

View File

@ -174,9 +174,6 @@ msgstr ""
msgid "Add another stream..."
msgstr "Lisää toinen virta..."
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Lisää kansio..."
@ -736,9 +733,6 @@ msgstr ""
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Muokkaa %1:en tagia"
@ -1332,18 +1326,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr "Uusi soittolista"
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1516,9 +1501,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Pop"

View File

@ -180,9 +180,6 @@ msgstr "Ajouter une action"
msgid "Add another stream..."
msgstr "Ajouter un autre flux..."
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Ajouter un répertoire..."
@ -758,9 +755,6 @@ msgstr "Déplacer pour repositionner"
msgid "Drive letter"
msgstr "Lettre du lecteur"
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Modifer le tag « %1 »..."
@ -1368,18 +1362,9 @@ msgstr "Jamais"
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr "Nouvelle liste de lecture"
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr "Nouvelles musiques"
@ -1556,9 +1541,6 @@ msgstr "Rechercher dans la liste de lecture"
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Pop"

View File

@ -174,9 +174,6 @@ msgstr "Engadir acción"
msgid "Add another stream..."
msgstr "Adicionar outra stream..."
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Adicionar directório..."
@ -740,9 +737,6 @@ msgstr "Arraste para posicionar"
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Editar a tag \"%1\"..."
@ -1336,18 +1330,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr ""
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1520,9 +1505,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Pop"

View File

@ -182,9 +182,6 @@ msgstr "Esemény felvétele"
msgid "Add another stream..."
msgstr "Új adatfolyam hozzáadása"
msgid "Add as new playlist..."
msgstr "Hozzáadás új lejátszási listaként..."
msgid "Add directory..."
msgstr "Mappa hozzáadása"
@ -758,9 +755,6 @@ msgstr "Fogja meg az áthelyezéshez"
msgid "Drive letter"
msgstr "Meghajtó azonosító"
msgid "Dynamic playlists"
msgstr "Dinamikus lejátszási listák"
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "\"%1\" információ módosítása..."
@ -1364,18 +1358,9 @@ msgstr "Soha"
msgid "Never played"
msgstr "Sohasem játszott"
msgid "New"
msgstr "Új"
msgid "New folder..."
msgstr "Új könyvtár..."
msgid "New playlist"
msgstr "Új lejátszási lista"
msgid "New smart playlist..."
msgstr "Új intelligens lejátszási lista..."
msgid "New songs"
msgstr "Új számok"
@ -1550,9 +1535,6 @@ msgstr "Keresés a lejátszási listán"
msgid "Playlist type"
msgstr "Lejátszási lista típus"
msgid "Playlists"
msgstr "Lejátszási listák"
msgid "Pop"
msgstr "Pop"
@ -2405,6 +2387,24 @@ msgstr "leállítás"
msgid "track %1"
msgstr "%1. szám"
#~ msgid "Playlists"
#~ msgstr "Lejátszási listák"
#~ msgid "Add as new playlist..."
#~ msgstr "Hozzáadás új lejátszási listaként..."
#~ msgid "Dynamic playlists"
#~ msgstr "Dinamikus lejátszási listák"
#~ msgid "New"
#~ msgstr "Új"
#~ msgid "New folder..."
#~ msgstr "Új könyvtár..."
#~ msgid "New smart playlist..."
#~ msgstr "Új intelligens lejátszási lista..."
#~ msgid ""
#~ "A song will be included in the playlist if it matches all of these "
#~ "conditions."

View File

@ -184,9 +184,6 @@ msgstr "Aggiungi azione"
msgid "Add another stream..."
msgstr "Aggiungi un altro flusso..."
msgid "Add as new playlist..."
msgstr "Aggiungi come nuova scaletta..."
msgid "Add directory..."
msgstr "Aggiungi cartella..."
@ -762,9 +759,6 @@ msgstr "Trascina per riposizionare"
msgid "Drive letter"
msgstr "Lettera del dispositivo"
msgid "Dynamic playlists"
msgstr "Scalette dinamiche"
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Modifica tag \"%1\"..."
@ -1372,18 +1366,9 @@ msgstr "Mai"
msgid "Never played"
msgstr "Mai riprodotte"
msgid "New"
msgstr "Nuovo"
msgid "New folder..."
msgstr "Nuova cartella..."
msgid "New playlist"
msgstr "Nuova scaletta"
msgid "New smart playlist..."
msgstr "Nuova scaletta veloce..."
msgid "New songs"
msgstr "Nuovi brani"
@ -1559,9 +1544,6 @@ msgstr "Ricerca nella scaletta"
msgid "Playlist type"
msgstr "Tipo di scaletta"
msgid "Playlists"
msgstr "Scalette"
msgid "Pop"
msgstr "Pop"
@ -2420,6 +2402,24 @@ msgstr "ferma"
msgid "track %1"
msgstr "traccia %1"
#~ msgid "Playlists"
#~ msgstr "Scalette"
#~ msgid "Add as new playlist..."
#~ msgstr "Aggiungi come nuova scaletta..."
#~ msgid "Dynamic playlists"
#~ msgstr "Scalette dinamiche"
#~ msgid "New"
#~ msgstr "Nuovo"
#~ msgid "New folder..."
#~ msgstr "Nuova cartella..."
#~ msgid "New smart playlist..."
#~ msgstr "Nuova scaletta veloce..."
#~ msgid ""
#~ "A song will be included in the playlist if it matches all of these "
#~ "conditions."

View File

@ -179,9 +179,6 @@ msgstr "アクションの追加"
msgid "Add another stream..."
msgstr "別のストリームの追加..."
msgid "Add as new playlist..."
msgstr "新しいプレイリストとして追加..."
msgid "Add directory..."
msgstr "ディレクトリの追加..."
@ -752,9 +749,6 @@ msgstr "位置を変更するにはドラッグします"
msgid "Drive letter"
msgstr "ドライブ文字"
msgid "Dynamic playlists"
msgstr "ダイナミック プレイリスト"
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "タグ \"%1\" の編集..."
@ -1355,18 +1349,9 @@ msgstr "しない"
msgid "Never played"
msgstr "再生されたことがない"
msgid "New"
msgstr "新規"
msgid "New folder..."
msgstr "新しいフォルダー..."
msgid "New playlist"
msgstr "新しいプレイリスト"
msgid "New smart playlist..."
msgstr "新しいスマート プレイリスト..."
msgid "New songs"
msgstr "新しい曲"
@ -1541,9 +1526,6 @@ msgstr "プレイリスト検索"
msgid "Playlist type"
msgstr "プレイリストの種類"
msgid "Playlists"
msgstr "プレイリスト"
msgid "Pop"
msgstr "Pop"
@ -2389,6 +2371,24 @@ msgstr "停止"
msgid "track %1"
msgstr "トラック %1"
#~ msgid "Playlists"
#~ msgstr "プレイリスト"
#~ msgid "Add as new playlist..."
#~ msgstr "新しいプレイリストとして追加..."
#~ msgid "Dynamic playlists"
#~ msgstr "ダイナミック プレイリスト"
#~ msgid "New"
#~ msgstr "新規"
#~ msgid "New folder..."
#~ msgstr "新しいフォルダー..."
#~ msgid "New smart playlist..."
#~ msgstr "新しいスマート プレイリスト..."
#~ msgid ""
#~ "A song will be included in the playlist if it matches all of these "
#~ "conditions."

View File

@ -173,9 +173,6 @@ msgstr ""
msgid "Add another stream..."
msgstr ""
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr ""
@ -735,9 +732,6 @@ msgstr ""
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr ""
@ -1331,18 +1325,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr ""
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1515,9 +1500,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Поп"

View File

@ -174,9 +174,6 @@ msgstr ""
msgid "Add another stream..."
msgstr ""
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr ""
@ -736,9 +733,6 @@ msgstr ""
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr ""
@ -1330,18 +1324,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr ""
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1514,9 +1499,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr ""

View File

@ -177,9 +177,6 @@ msgstr ""
msgid "Add another stream..."
msgstr "Legg til enda en strøm..."
msgid "Add as new playlist..."
msgstr "Legg til som ny spilleliste..."
msgid "Add directory..."
msgstr "Legg til katalog..."
@ -747,9 +744,6 @@ msgstr "Dra for å endre posisjon"
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Endre merkelapp \"%1\"..."
@ -1344,18 +1338,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr "Ny spilleliste"
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1528,9 +1513,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Pop"
@ -2359,6 +2341,9 @@ msgstr "stopp"
msgid "track %1"
msgstr "spor %1"
#~ msgid "Add as new playlist..."
#~ msgstr "Legg til som ny spilleliste..."
#~ msgid ""
#~ "A song will be included in the playlist if it matches all of these "
#~ "conditions."

View File

@ -178,9 +178,6 @@ msgstr "Actie toevoegen"
msgid "Add another stream..."
msgstr "Noge een radiostream toevoegen..."
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Map toevoegen..."
@ -754,9 +751,6 @@ msgstr "Sleep om te verplaatsen"
msgid "Drive letter"
msgstr "Stationsletter"
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Tag \"%1\" bewerken..."
@ -1359,18 +1353,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr "Nieuwe afspeellijst"
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr "Nieuwe liedjes"
@ -1547,9 +1532,6 @@ msgstr "Zoeken in afspeellijst"
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Pop"

View File

@ -173,9 +173,6 @@ msgstr ""
msgid "Add another stream..."
msgstr ""
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr ""
@ -735,9 +732,6 @@ msgstr ""
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr ""
@ -1329,18 +1323,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr ""
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1513,9 +1498,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Pop"

View File

@ -182,9 +182,6 @@ msgstr "Dodaj akcje"
msgid "Add another stream..."
msgstr "Dodaj następny strumień..."
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Dodaj katalog..."
@ -755,9 +752,6 @@ msgstr "Przeciągnij aby zmienić pozycję"
msgid "Drive letter"
msgstr "Litera dysku"
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Edytuj znacznik \"%1\"..."
@ -1357,18 +1351,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr "Nowa lista odtwarzania"
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr "Nowe utwory"
@ -1544,9 +1529,6 @@ msgstr "Przeszukuj listę odtwarzania"
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Pop"

View File

@ -183,9 +183,6 @@ msgstr "Adicionar uma acção"
msgid "Add another stream..."
msgstr "Adicionar outra emissão..."
msgid "Add as new playlist..."
msgstr "Adicionar como nova lista de reprodução..."
msgid "Add directory..."
msgstr "Adicionar diretório..."
@ -761,9 +758,6 @@ msgstr "Arraste para posicionar"
msgid "Drive letter"
msgstr "Letra da unidade"
msgid "Dynamic playlists"
msgstr "Listas de reprodução dinâmicas"
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Editar marca \"%1\"..."
@ -1368,18 +1362,9 @@ msgstr "Nunca"
msgid "Never played"
msgstr "Nunca reproduzidas"
msgid "New"
msgstr "Nova"
msgid "New folder..."
msgstr "Nova pasta..."
msgid "New playlist"
msgstr "Nova lista de reprodução"
msgid "New smart playlist..."
msgstr "Nova lista de reprodução inteligente..."
msgid "New songs"
msgstr "Novas músicas"
@ -1555,9 +1540,6 @@ msgstr "Pesquisa na lista de reprodução"
msgid "Playlist type"
msgstr "Tipo de lista de reprodução"
msgid "Playlists"
msgstr "Listas de reprodução"
msgid "Pop"
msgstr "Pop"
@ -2411,6 +2393,24 @@ msgstr "parar"
msgid "track %1"
msgstr "faixa %1"
#~ msgid "Playlists"
#~ msgstr "Listas de reprodução"
#~ msgid "Add as new playlist..."
#~ msgstr "Adicionar como nova lista de reprodução..."
#~ msgid "Dynamic playlists"
#~ msgstr "Listas de reprodução dinâmicas"
#~ msgid "New"
#~ msgstr "Nova"
#~ msgid "New folder..."
#~ msgstr "Nova pasta..."
#~ msgid "New smart playlist..."
#~ msgstr "Nova lista de reprodução inteligente..."
#~ msgid ""
#~ "A song will be included in the playlist if it matches all of these "
#~ "conditions."

View File

@ -177,9 +177,6 @@ msgstr "Adicionar ação"
msgid "Add another stream..."
msgstr "Adicionar outro canal..."
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Adicionar diretório"
@ -747,9 +744,6 @@ msgstr "Arraste para reposicionar"
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Editar marcador \"%1\"..."
@ -1346,18 +1340,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr "Nova lista de reprodução"
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1532,9 +1517,6 @@ msgstr "Procurar lista de reprodução"
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Pop"

View File

@ -173,9 +173,6 @@ msgstr ""
msgid "Add another stream..."
msgstr "Adaugă alt flux..."
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Adaugă director..."
@ -735,9 +732,6 @@ msgstr "Trage pentru a repoziționa"
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr ""
@ -1330,18 +1324,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr ""
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1514,9 +1499,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Pop"

View File

@ -177,9 +177,6 @@ msgstr "Добавить действие"
msgid "Add another stream..."
msgstr "Добавить другое потоковое вещание..."
msgid "Add as new playlist..."
msgstr "Добавить как новый плейлист…"
msgid "Add directory..."
msgstr "Добавить папку"
@ -751,9 +748,6 @@ msgstr "Тащите для перемещения"
msgid "Drive letter"
msgstr "Буква диска"
msgid "Dynamic playlists"
msgstr "Динамические плейлисты"
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Редактировать тег \"%1\"..."
@ -1352,18 +1346,9 @@ msgstr "Никогда"
msgid "Never played"
msgstr "Никогда не прослушивались"
msgid "New"
msgstr "Новые"
msgid "New folder..."
msgstr "Новая папка..."
msgid "New playlist"
msgstr "Новый список воспроизведения"
msgid "New smart playlist..."
msgstr "Новый умный плейлист…"
msgid "New songs"
msgstr "Новые композиции"
@ -1538,9 +1523,6 @@ msgstr "Поиск по списку воспроизведения"
msgid "Playlist type"
msgstr "Тип плейлиста"
msgid "Playlists"
msgstr "Плейлисты"
msgid "Pop"
msgstr "Pop"
@ -2392,6 +2374,24 @@ msgstr "Остановить"
msgid "track %1"
msgstr "композиция %1"
#~ msgid "Playlists"
#~ msgstr "Плейлисты"
#~ msgid "Add as new playlist..."
#~ msgstr "Добавить как новый плейлист…"
#~ msgid "Dynamic playlists"
#~ msgstr "Динамические плейлисты"
#~ msgid "New"
#~ msgstr "Новые"
#~ msgid "New folder..."
#~ msgstr "Новая папка..."
#~ msgid "New smart playlist..."
#~ msgstr "Новый умный плейлист…"
#~ msgid ""
#~ "A song will be included in the playlist if it matches all of these "
#~ "conditions."

View File

@ -182,9 +182,6 @@ msgstr "Pridať akciu"
msgid "Add another stream..."
msgstr "Pridať ďalší stream..."
msgid "Add as new playlist..."
msgstr "Pridať nový inteligentný playlist"
msgid "Add directory..."
msgstr "Pridať priečinok..."
@ -754,9 +751,6 @@ msgstr "Pretiahnite na iné miesto"
msgid "Drive letter"
msgstr "Písmeno jednotky"
msgid "Dynamic playlists"
msgstr "Dynamické playlisty"
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Upraviť tag \"%1\"..."
@ -1357,18 +1351,9 @@ msgstr "Nikdy"
msgid "Never played"
msgstr "Nikdy nehrané"
msgid "New"
msgstr "Nové"
msgid "New folder..."
msgstr "Nový priečinok..."
msgid "New playlist"
msgstr "Nový playlist"
msgid "New smart playlist..."
msgstr "Nový inteligentný playlist..."
msgid "New songs"
msgstr "Nové piesne"
@ -1542,9 +1527,6 @@ msgstr "Hľadanie v playliste"
msgid "Playlist type"
msgstr "Typ playlistu"
msgid "Playlists"
msgstr "Playlisty"
msgid "Pop"
msgstr "Pop"
@ -2396,6 +2378,24 @@ msgstr "zastaviť"
msgid "track %1"
msgstr "skladba %1"
#~ msgid "Playlists"
#~ msgstr "Playlisty"
#~ msgid "Add as new playlist..."
#~ msgstr "Pridať nový inteligentný playlist"
#~ msgid "Dynamic playlists"
#~ msgstr "Dynamické playlisty"
#~ msgid "New"
#~ msgstr "Nové"
#~ msgid "New folder..."
#~ msgstr "Nový priečinok..."
#~ msgid "New smart playlist..."
#~ msgstr "Nový inteligentný playlist..."
#~ msgid ""
#~ "A song will be included in the playlist if it matches all of these "
#~ "conditions."

View File

@ -181,9 +181,6 @@ msgstr "Dodaj dejanje"
msgid "Add another stream..."
msgstr "Dodaj še en pretok ..."
msgid "Add as new playlist..."
msgstr "Kot nov seznam predvajanja ..."
msgid "Add directory..."
msgstr "Dodaj mapo ..."
@ -756,9 +753,6 @@ msgstr "Povlecite za spremembo položaja"
msgid "Drive letter"
msgstr "Črka pogona"
msgid "Dynamic playlists"
msgstr "Dinamični seznami predvajanja"
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Uredi oznako \"%1\" ..."
@ -1359,18 +1353,9 @@ msgstr "Nikoli"
msgid "Never played"
msgstr "Nikoli predvajano"
msgid "New"
msgstr "Novo"
msgid "New folder..."
msgstr "Nova mapa ..."
msgid "New playlist"
msgstr "Nov seznam predvajanja"
msgid "New smart playlist..."
msgstr "Nov pametni seznam predvajanja"
msgid "New songs"
msgstr "Nove skladbe"
@ -1545,9 +1530,6 @@ msgstr "Iskanje po seznamu predvajanja"
msgid "Playlist type"
msgstr "Vrsta seznama predvajanja"
msgid "Playlists"
msgstr "Seznami predvajanja"
msgid "Pop"
msgstr "Pop"
@ -2398,6 +2380,24 @@ msgstr "zaustavi"
msgid "track %1"
msgstr "skladba %1"
#~ msgid "Playlists"
#~ msgstr "Seznami predvajanja"
#~ msgid "Add as new playlist..."
#~ msgstr "Kot nov seznam predvajanja ..."
#~ msgid "Dynamic playlists"
#~ msgstr "Dinamični seznami predvajanja"
#~ msgid "New"
#~ msgstr "Novo"
#~ msgid "New folder..."
#~ msgstr "Nova mapa ..."
#~ msgid "New smart playlist..."
#~ msgstr "Nov pametni seznam predvajanja"
#~ msgid ""
#~ "A song will be included in the playlist if it matches all of these "
#~ "conditions."

View File

@ -174,9 +174,6 @@ msgstr ""
msgid "Add another stream..."
msgstr "Додај још један ток"
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Додај фасциклу"
@ -738,9 +735,6 @@ msgstr "Одвуците га где желите"
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Уреди ознаку \"%1\"..."
@ -1335,18 +1329,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr "Нова листа нумера"
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1519,9 +1504,6 @@ msgstr "Претрага листе нумера"
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr "Поп"

View File

@ -179,9 +179,6 @@ msgstr "Lägg till åtgärd"
msgid "Add another stream..."
msgstr "Lägg till en annan ström..."
msgid "Add as new playlist..."
msgstr "Lägg till som ny spellista..."
msgid "Add directory..."
msgstr "Lägg till katalog..."
@ -755,9 +752,6 @@ msgstr "Dra för att ändra position"
msgid "Drive letter"
msgstr "Enhetsbeteckning"
msgid "Dynamic playlists"
msgstr "Dynamiska spellistor"
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Redigera tagg \"%1\"..."
@ -1356,18 +1350,9 @@ msgstr "Aldrig"
msgid "Never played"
msgstr "Aldrig spelade"
msgid "New"
msgstr "Ny"
msgid "New folder..."
msgstr "Ny mapp..."
msgid "New playlist"
msgstr "Ny spellista"
msgid "New smart playlist..."
msgstr "Ny smart spellista..."
msgid "New songs"
msgstr "Nya låtar"
@ -1540,9 +1525,6 @@ msgstr "Sök i spellista"
msgid "Playlist type"
msgstr "Spellistetyp"
msgid "Playlists"
msgstr "Spellistor"
msgid "Pop"
msgstr "Pop"
@ -2393,6 +2375,24 @@ msgstr "stoppa"
msgid "track %1"
msgstr "spår %1"
#~ msgid "Playlists"
#~ msgstr "Spellistor"
#~ msgid "Add as new playlist..."
#~ msgstr "Lägg till som ny spellista..."
#~ msgid "Dynamic playlists"
#~ msgstr "Dynamiska spellistor"
#~ msgid "New"
#~ msgstr "Ny"
#~ msgid "New folder..."
#~ msgstr "Ny mapp..."
#~ msgid "New smart playlist..."
#~ msgstr "Ny smart spellista..."
#~ msgid ""
#~ "A song will be included in the playlist if it matches all of these "
#~ "conditions."

View File

@ -178,9 +178,6 @@ msgstr "Eylem ekle"
msgid "Add another stream..."
msgstr "Başka bir yayın ekle..."
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "Dizin ekle..."
@ -750,9 +747,6 @@ msgstr "Yeniden konumlandırmak için sürükleyin"
msgid "Drive letter"
msgstr "Sürücü harfi"
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "\"%1\" etiketini düzenle..."
@ -1354,18 +1348,9 @@ msgstr "Hiçbir zaman"
msgid "Never played"
msgstr ""
msgid "New"
msgstr "Yeni"
msgid "New folder..."
msgstr "Yeni klasör..."
msgid "New playlist"
msgstr "Yeni çalma listesi"
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr "Yeni şarkılar"
@ -1540,9 +1525,6 @@ msgstr "Çalma listesinde ara"
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr "Çalma Listeleri"
msgid "Pop"
msgstr "Pop"
@ -2385,6 +2367,15 @@ msgstr "durdur"
msgid "track %1"
msgstr "parça %1"
#~ msgid "Playlists"
#~ msgstr "Çalma Listeleri"
#~ msgid "New"
#~ msgstr "Yeni"
#~ msgid "New folder..."
#~ msgstr "Yeni klasör..."
#~ msgid "Options"
#~ msgstr "Seçenekler"

View File

@ -164,9 +164,6 @@ msgstr ""
msgid "Add another stream..."
msgstr ""
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr ""
@ -726,9 +723,6 @@ msgstr ""
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr ""
@ -1320,18 +1314,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr ""
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1504,9 +1489,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr ""

View File

@ -181,9 +181,6 @@ msgstr "Додати дію"
msgid "Add another stream..."
msgstr "Додати інший потік..."
msgid "Add as new playlist..."
msgstr "Додати новий список відтворення..."
msgid "Add directory..."
msgstr "Додати каталог..."
@ -755,9 +752,6 @@ msgstr "Перетягніть, щоб змінити розташування"
msgid "Drive letter"
msgstr "Літера диска"
msgid "Dynamic playlists"
msgstr "Динамічні списки відтворення"
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr "Змінити позначку \"%1\"..."
@ -1358,18 +1352,9 @@ msgstr "Ніколи"
msgid "Never played"
msgstr "Ніколи не відтворені"
msgid "New"
msgstr "Нові"
msgid "New folder..."
msgstr "Нова тека..."
msgid "New playlist"
msgstr "Новий список відтворення"
msgid "New smart playlist..."
msgstr "Новий «розумний» список відтворення"
msgid "New songs"
msgstr "Нові композиції"
@ -1544,9 +1529,6 @@ msgstr "Пошук списку відтворення"
msgid "Playlist type"
msgstr "Тип списку відтворення"
msgid "Playlists"
msgstr "Списки відтворення"
msgid "Pop"
msgstr "Поп"
@ -2392,6 +2374,24 @@ msgstr "зупинити"
msgid "track %1"
msgstr "доріжка %1"
#~ msgid "Playlists"
#~ msgstr "Списки відтворення"
#~ msgid "Add as new playlist..."
#~ msgstr "Додати новий список відтворення..."
#~ msgid "Dynamic playlists"
#~ msgstr "Динамічні списки відтворення"
#~ msgid "New"
#~ msgstr "Нові"
#~ msgid "New folder..."
#~ msgstr "Нова тека..."
#~ msgid "New smart playlist..."
#~ msgstr "Новий «розумний» список відтворення"
#~ msgid ""
#~ "A song will be included in the playlist if it matches all of these "
#~ "conditions."

View File

@ -173,9 +173,6 @@ msgstr ""
msgid "Add another stream..."
msgstr "添加其他流媒体"
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "添加目录"
@ -735,9 +732,6 @@ msgstr "拖拽以重新定位"
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr ""
@ -1331,18 +1325,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr "新建播放列表"
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1515,9 +1500,6 @@ msgstr ""
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr ""

View File

@ -178,9 +178,6 @@ msgstr ""
msgid "Add another stream..."
msgstr "加入其它的網路串流"
msgid "Add as new playlist..."
msgstr ""
msgid "Add directory..."
msgstr "匯入目錄..."
@ -740,9 +737,6 @@ msgstr "拖曳以重新定位"
msgid "Drive letter"
msgstr ""
msgid "Dynamic playlists"
msgstr ""
#, qt-format
msgid "Edit tag \"%1\"..."
msgstr ""
@ -1335,18 +1329,9 @@ msgstr ""
msgid "Never played"
msgstr ""
msgid "New"
msgstr ""
msgid "New folder..."
msgstr ""
msgid "New playlist"
msgstr "新增播放清單"
msgid "New smart playlist..."
msgstr ""
msgid "New songs"
msgstr ""
@ -1519,9 +1504,6 @@ msgstr "播放清單搜尋"
msgid "Playlist type"
msgstr ""
msgid "Playlists"
msgstr ""
msgid "Pop"
msgstr ""

View File

@ -53,7 +53,6 @@
#include "radio/radioview.h"
#include "radio/radioviewcontainer.h"
#include "radio/savedradio.h"
#include "smartplaylists/smartplaylistcontainer.h"
#include "songinfo/artistinfoview.h"
#include "songinfo/songinfoview.h"
#include "transcoder/transcodedialog.h"
@ -139,7 +138,6 @@ MainWindow::MainWindow(Engine::Type engine, QWidget *parent)
devices_(NULL),
library_view_(new LibraryViewContainer(this)),
file_view_(new FileView(this)),
smart_playlist_view_(new SmartPlaylistContainer(this)),
radio_view_(new RadioViewContainer(this)),
device_view_(new DeviceView(this)),
song_info_view_(new SongInfoView(this)),
@ -183,7 +181,6 @@ MainWindow::MainWindow(Engine::Type engine, QWidget *parent)
// Add tabs to the fancy tab widget
ui_->tabs->AddTab(library_view_, IconLoader::Load("folder-sound"), tr("Library"));
ui_->tabs->AddTab(file_view_, IconLoader::Load("document-open"), tr("Files"));
ui_->tabs->AddTab(smart_playlist_view_, IconLoader::Load("view-media-playlist"), tr("Playlists"));
ui_->tabs->AddTab(radio_view_, QIcon(":last.fm/icon_radio.png"), tr("Internet"));
ui_->tabs->AddTab(device_view_, IconLoader::Load("multimedia-player-ipod-mini-blue"), tr("Devices"));
ui_->tabs->AddSpacer();
@ -433,10 +430,6 @@ MainWindow::MainWindow(Engine::Type engine, QWidget *parent)
connect(devices_->connected_devices_model(), SIGNAL(IsEmptyChanged(bool)),
playlist_copy_to_device_, SLOT(setDisabled(bool)));
// Smart playlists connections
smart_playlist_view_->set_library(library_->backend());
smart_playlist_view_->set_playlists(playlists_);
// Radio connections
connect(radio_model_, SIGNAL(StreamError(QString)), SLOT(ShowErrorDialog(QString)));
connect(radio_model_, SIGNAL(AsyncLoadFinished(PlaylistItem::SpecialLoadResult)), player_, SLOT(HandleSpecialLoad(PlaylistItem::SpecialLoadResult)));
@ -660,6 +653,14 @@ void MainWindow::LibrarySongsDoubleClicked(const SongList &songs) {
AddLibrarySongsToPlaylist(autoclear_playlist_, songs);
}
void MainWindow::AddSmartPlaylistToPlaylist(bool clear_first, PlaylistGeneratorPtr gen) {
if (clear_first)
playlists_->ClearCurrent();
const bool play_now = player_->GetState() != Engine::Playing;
playlists_->current()->InsertSmartPlaylist(gen, -1, play_now);
}
void MainWindow::AddLibrarySongsToPlaylist(bool clear_first, const SongList &songs) {
if (clear_first)
playlists_->ClearCurrent();
@ -834,6 +835,15 @@ void MainWindow::AddLibraryItemToPlaylist(bool clear_first, const QModelIndexLis
source_indexes << index;
}
// Special case: is the first item a smart playlist?
if (!source_indexes.isEmpty() &&
source_indexes.first().data(LibraryModel::Role_Type).toInt() ==
LibraryItem::Type_SmartPlaylist) {
AddSmartPlaylistToPlaylist(
clear_first, library_->model()->CreateGenerator(source_indexes.first()));
return;
}
AddLibrarySongsToPlaylist(clear_first, library_->model()->GetChildSongs(source_indexes));
}

View File

@ -57,7 +57,6 @@ class QueueManager;
class RadioItem;
class RadioModel;
class RadioViewContainer;
class SmartPlaylistContainer;
class Song;
class SongInfoBase;
class SongInfoView;
@ -199,6 +198,7 @@ class MainWindow : public QMainWindow, public PlatformInterface {
void AddFilesToPlaylist(bool clear_first, const QList<QUrl>& urls);
void AddLibraryItemToPlaylist(bool clear_first, const QModelIndexList& indexes);
void AddLibrarySongsToPlaylist(bool clear_first, const SongList& songs);
void AddSmartPlaylistToPlaylist(bool clear_first, PlaylistGeneratorPtr gen);
void AddDeviceSongsToPlaylist(bool clear_first, const SongList& songs);
void AddUrls(bool play_now, const QList<QUrl>& urls);
void ConnectInfoView(SongInfoBase* view);
@ -225,7 +225,6 @@ class MainWindow : public QMainWindow, public PlatformInterface {
LibraryViewContainer* library_view_;
FileView* file_view_;
SmartPlaylistContainer* smart_playlist_view_;
RadioViewContainer* radio_view_;
DeviceView* device_view_;
SongInfoView* song_info_view_;