Refactor the smart playlist wizard to move all query-specific parts into a separate class

This commit is contained in:
David Sansome 2010-11-18 21:13:43 +00:00
parent 1f267881fe
commit 753b144752
48 changed files with 718 additions and 792 deletions

View File

@ -132,11 +132,13 @@ set(SOURCES
smartplaylists/generator.cpp smartplaylists/generator.cpp
smartplaylists/generatorinserter.cpp smartplaylists/generatorinserter.cpp
smartplaylists/querygenerator.cpp smartplaylists/querygenerator.cpp
smartplaylists/querywizardplugin.cpp
smartplaylists/search.cpp smartplaylists/search.cpp
smartplaylists/searchpreview.cpp smartplaylists/searchpreview.cpp
smartplaylists/searchterm.cpp smartplaylists/searchterm.cpp
smartplaylists/searchtermwidget.cpp smartplaylists/searchtermwidget.cpp
smartplaylists/wizard.cpp smartplaylists/wizard.cpp
smartplaylists/wizardplugin.cpp
songinfo/artistinfoview.cpp songinfo/artistinfoview.cpp
songinfo/collapsibleinfoheader.cpp songinfo/collapsibleinfoheader.cpp
@ -290,9 +292,11 @@ set(HEADERS
smartplaylists/generator.h smartplaylists/generator.h
smartplaylists/generatorinserter.h smartplaylists/generatorinserter.h
smartplaylists/generatormimedata.h smartplaylists/generatormimedata.h
smartplaylists/querywizardplugin.h
smartplaylists/searchpreview.h smartplaylists/searchpreview.h
smartplaylists/searchtermwidget.h smartplaylists/searchtermwidget.h
smartplaylists/wizard.h smartplaylists/wizard.h
smartplaylists/wizardplugin.h
songinfo/artistinfoview.h songinfo/artistinfoview.h
songinfo/collapsibleinfoheader.h songinfo/collapsibleinfoheader.h
@ -374,9 +378,10 @@ set(UI
radio/magnatunedownloaddialog.ui radio/magnatunedownloaddialog.ui
radio/radioviewcontainer.ui radio/radioviewcontainer.ui
smartplaylists/querysearchpage.ui
smartplaylists/querysortpage.ui
smartplaylists/searchpreview.ui smartplaylists/searchpreview.ui
smartplaylists/searchtermwidget.ui smartplaylists/searchtermwidget.ui
smartplaylists/wizard.ui
songinfo/lyricsettings.ui songinfo/lyricsettings.ui

View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SmartPlaylistQuerySearchPage</class>
<widget class="QWidget" name="SmartPlaylistQuerySearchPage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Search mode</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QComboBox" name="type">
<item>
<property name="text">
<string>Match every search term (AND)</string>
</property>
</item>
<item>
<property name="text">
<string>Match one or more search terms (OR)</string>
</property>
</item>
<item>
<property name="text">
<string>Don't use search terms (include all songs)</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="terms_group">
<property name="title">
<string>Search terms</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5"/>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,117 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SmartPlaylistQuerySortPage</class>
<widget class="QWidget" name="SmartPlaylistQuerySortPage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>723</width>
<height>335</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Sorting</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0" colspan="2">
<widget class="QRadioButton" name="random">
<property name="text">
<string>Put songs in a random order</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="field">
<property name="text">
<string>Sort songs by</string>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QComboBox" name="field_value"/>
</item>
<item>
<widget class="QComboBox" name="order"/>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Limits</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0" colspan="2">
<widget class="QRadioButton" name="limit_none">
<property name="text">
<string>Show all the songs</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="limit_limit">
<property name="text">
<string>Only show the first</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="limit_value">
<property name="suffix">
<string> songs</string>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="value">
<number>15</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="smart_playlists::SearchPreview" name="preview" native="true"/>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>smart_playlists::SearchPreview</class>
<extends>QWidget</extends>
<header>smartplaylists/searchpreview.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,223 @@
/* 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 "querywizardplugin.h"
#include "searchtermwidget.h"
#include "ui_querysearchpage.h"
#include "ui_querysortpage.h"
#include <QWizardPage>
namespace smart_playlists {
QueryWizardPlugin::QueryWizardPlugin(LibraryBackend* library, QObject* parent)
: WizardPlugin(library, parent),
search_page_(NULL)
{
}
QueryWizardPlugin::~QueryWizardPlugin() {
}
QString QueryWizardPlugin::name() const {
return tr("Library search");
}
QString QueryWizardPlugin::description() const {
return tr("Find songs in your library that match the criteria you specify.");
}
int QueryWizardPlugin::CreatePages(QWizard* wizard) {
// Create the UI
search_page_ = new SearchPage(wizard);
QWizardPage* sort_page = new QWizardPage(wizard);
sort_ui_.reset(new Ui_SmartPlaylistQuerySortPage);
sort_ui_->setupUi(sort_page);
sort_ui_->limit_value->setValue(Generator::kDefaultLimit);
connect(search_page_->ui_->type, SIGNAL(currentIndexChanged(int)), SLOT(SearchTypeChanged()));
// Create the new search term widget
search_page_->new_term_ = new SearchTermWidget(library_, search_page_);
search_page_->new_term_->SetActive(false);
connect(search_page_->new_term_, SIGNAL(Clicked()), SLOT(AddSearchTerm()));
// Add an empty initial term
search_page_->layout_ = static_cast<QVBoxLayout*>(search_page_->ui_->terms_group->layout());
search_page_->layout_->addWidget(search_page_->new_term_);
AddSearchTerm();
// Add the preview widget at the bottom of the search terms page
QVBoxLayout* terms_page_layout = static_cast<QVBoxLayout*>(search_page_->layout());
terms_page_layout->addStretch();
search_page_->preview_ = new SearchPreview(search_page_);
search_page_->preview_->set_library(library_);
terms_page_layout->addWidget(search_page_->preview_);
// Add sort field texts
for (int i=0 ; i<SearchTerm::FieldCount ; ++i) {
const SearchTerm::Field field = SearchTerm::Field(i);
const QString field_name = SearchTerm::FieldName(field);
sort_ui_->field_value->addItem(field_name);
}
connect(sort_ui_->field_value, SIGNAL(currentIndexChanged(int)), SLOT(UpdateSortOrder()));
UpdateSortOrder();
// Set the sort and limit radio buttons back to their defaults - they would
// have been changed by setupUi
sort_ui_->random->setChecked(true);
sort_ui_->limit_none->setChecked(true);
// Set up the preview widget that's already at the bottom of the sort page
sort_ui_->preview->set_library(library_);
// Configure the page text
search_page_->setTitle(tr("Search terms"));
search_page_->setSubTitle(tr("A song will be included in the playlist if it matches these conditions."));
sort_page->setTitle(tr("Search options"));
sort_page->setSubTitle(tr("Choose how the playlist is sorted and how many songs it will contain."));
sort_page->setFinalPage(true);
// Add the pages
const int first_page = wizard->addPage(search_page_);
wizard->addPage(sort_page);
return first_page;
}
GeneratorPtr QueryWizardPlugin::CreateGenerator() const {
// TODO
return GeneratorPtr();
}
void QueryWizardPlugin::UpdateSortOrder() {
const SearchTerm::Field field =
SearchTerm::Field(sort_ui_->field_value->currentIndex());
const SearchTerm::Type type = SearchTerm::TypeOf(field);
const QString asc = SearchTerm::FieldSortOrderText(type, true);
const QString desc = SearchTerm::FieldSortOrderText(type, false);
sort_ui_->order->clear();
sort_ui_->order->addItem(asc);
sort_ui_->order->addItem(desc);
}
void QueryWizardPlugin::AddSearchTerm() {
SearchTermWidget* widget =
new SearchTermWidget(library_, search_page_);
connect(widget, SIGNAL(RemoveClicked()), SLOT(RemoveSearchTerm()));
connect(widget, SIGNAL(Changed()), SLOT(UpdateTermPreview()));
search_page_->layout_->insertWidget(search_page_->terms_.count(), widget);
search_page_->terms_ << widget;
UpdateTermPreview();
}
void QueryWizardPlugin::RemoveSearchTerm() {
SearchTermWidget* widget =
qobject_cast<SearchTermWidget*>(sender());
if (!widget)
return;
const int index = search_page_->terms_.indexOf(widget);
if (index == -1)
return;
delete search_page_->terms_.takeAt(index);
UpdateTermPreview();
}
void QueryWizardPlugin::UpdateTermPreview() {
Search search = MakeSearch();
emit search_page_->completeChanged();
if (!search.is_valid())
return;
// Don't apply limits in the term page
search.limit_ = -1;
search_page_->preview_->Update(search);
}
void QueryWizardPlugin::UpdateSortPreview() {
Search search = MakeSearch();
if (!search.is_valid())
return;
sort_ui_->preview->Update(search);
}
Search QueryWizardPlugin::MakeSearch() const {
Search ret;
// Search type
ret.search_type_ = Search::SearchType(search_page_->ui_->type->currentIndex());
// Search terms
foreach (SearchTermWidget* widget, search_page_->terms_) {
SearchTerm term = widget->Term();
if (term.is_valid())
ret.terms_ << term;
}
// Sort order
if (sort_ui_->random->isChecked()) {
ret.sort_type_ = Search::Sort_Random;
} else {
const bool ascending = sort_ui_->order->currentIndex() == 0;
ret.sort_type_ = ascending ? Search::Sort_FieldAsc :
Search::Sort_FieldDesc;
ret.sort_field_ = SearchTerm::Field(sort_ui_->field_value->currentIndex());
}
// Limit
if (sort_ui_->limit_none->isChecked())
ret.limit_ = -1;
else
ret.limit_ = sort_ui_->limit_value->value();
return ret;
}
void QueryWizardPlugin::SearchTypeChanged() {
const bool all = search_page_->ui_->type->currentIndex() == 2;
search_page_->ui_->terms_group->setEnabled(!all);
UpdateTermPreview();
}
QueryWizardPlugin::SearchPage::SearchPage(QWidget* parent)
: QWizardPage(parent),
ui_(new Ui_SmartPlaylistQuerySearchPage)
{
ui_->setupUi(this);
}
bool QueryWizardPlugin::SearchPage::isComplete() const {
if (ui_->type->currentIndex() == 2) // All songs
return true;
foreach (SearchTermWidget* widget, terms_) {
if (!widget->Term().is_valid())
return false;
}
return true;
}
} // namespace smart_playlists

View File

@ -0,0 +1,85 @@
/* 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 QUERYWIZARDPLUGIN_H
#define QUERYWIZARDPLUGIN_H
#include "search.h"
#include "wizardplugin.h"
#include <QWizard>
#include <boost/scoped_ptr.hpp>
class Ui_SmartPlaylistQuerySearchPage;
class Ui_SmartPlaylistQuerySortPage;
class QVBoxLayout;
namespace smart_playlists {
class SearchPreview;
class SearchTermWidget;
class QueryWizardPlugin : public WizardPlugin {
Q_OBJECT
public:
QueryWizardPlugin(LibraryBackend* library, QObject* parent);
~QueryWizardPlugin();
QString name() const;
QString description() const;
int CreatePages(QWizard* wizard);
GeneratorPtr CreateGenerator() const;
private slots:
void AddSearchTerm();
void RemoveSearchTerm();
void SearchTypeChanged();
void UpdateTermPreview();
void UpdateSortPreview();
void UpdateSortOrder();
private:
class SearchPage : public QWizardPage {
friend class QueryWizardPlugin;
public:
SearchPage(QWidget* parent = 0);
bool isComplete() const;
QVBoxLayout* layout_;
QList<SearchTermWidget*> terms_;
SearchTermWidget* new_term_;
SearchPreview* preview_;
boost::scoped_ptr<Ui_SmartPlaylistQuerySearchPage> ui_;
};
Search MakeSearch() const;
SearchPage* search_page_;
boost::scoped_ptr<Ui_SmartPlaylistQuerySortPage> sort_ui_;
};
} // namespace smart_playlists
#endif // QUERYWIZARDPLUGIN_H

View File

@ -14,179 +14,63 @@
along with Clementine. If not, see <http://www.gnu.org/licenses/>. along with Clementine. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "generator.h" #include "querywizardplugin.h"
#include "searchpreview.h"
#include "searchtermwidget.h"
#include "wizard.h" #include "wizard.h"
#include "ui_wizard.h" #include "wizardplugin.h"
#include <QLabel>
#include <QRadioButton>
#include <QSignalMapper>
#include <QVBoxLayout>
namespace smart_playlists { namespace smart_playlists {
Wizard::SearchPage::SearchPage(QWidget* parent)
: QWizardPage(parent)
{
}
bool Wizard::SearchPage::isComplete() const {
if (type_->currentIndex() == 2) // All songs
return true;
foreach (SearchTermWidget* widget, terms_) {
if (!widget->Term().is_valid())
return false;
}
return true;
}
Wizard::Wizard(LibraryBackend* library, QWidget* parent) Wizard::Wizard(LibraryBackend* library, QWidget* parent)
: QWizard(parent), : QWizard(parent),
ui_(new Ui_SmartPlaylistWizard), library_(library),
library_(library) type_page_(new TypePage(this)),
type_mapper_(new QSignalMapper(this))
{ {
ui_->setupUi(this); setWindowIcon(QIcon(":/icon.png"));
ui_->limit_value->setValue(Generator::kDefaultLimit); setWindowTitle(tr("Smart playlist"));
resize(687, 628);
connect(ui_->search_type, SIGNAL(currentIndexChanged(int)), SLOT(SearchTypeChanged())); type_page_->setTitle(tr("Playlist type"));
type_page_->setSubTitle(tr("A smart playlist is a dynamic list of songs that come from your library. There are different types of smart playlist that offer different ways of selecting songs."));
addPage(type_page_);
// Get the type combo box connect(type_mapper_, SIGNAL(mapped(int)), SLOT(TypeChanged(int)));
ui_->page_query_search->type_ = ui_->search_type;
// Create the new search term widget new QVBoxLayout(type_page_);
ui_->page_query_search->new_term_ = new SearchTermWidget(library_, this); AddPlugin(new QueryWizardPlugin(library_, this));
ui_->page_query_search->new_term_->SetActive(false);
connect(ui_->page_query_search->new_term_, SIGNAL(Clicked()), SLOT(AddSearchTerm()));
// Add an empty initial term
ui_->page_query_search->layout_ = static_cast<QVBoxLayout*>(ui_->terms_group->layout());
ui_->page_query_search->layout_->addWidget(ui_->page_query_search->new_term_);
AddSearchTerm();
// Add the preview widget at the bottom of the search terms page
QVBoxLayout* terms_page_layout = static_cast<QVBoxLayout*>(ui_->page_query_search->layout());
terms_page_layout->addStretch();
ui_->page_query_search->preview_ = new SearchPreview(this);
ui_->page_query_search->preview_->set_library(library_);
terms_page_layout->addWidget(ui_->page_query_search->preview_);
// Add sort field texts
for (int i=0 ; i<SearchTerm::FieldCount ; ++i) {
const SearchTerm::Field field = SearchTerm::Field(i);
const QString field_name = SearchTerm::FieldName(field);
ui_->sort_field_value->addItem(field_name);
}
connect(ui_->sort_field_value, SIGNAL(currentIndexChanged(int)), SLOT(UpdateSortOrder()));
UpdateSortOrder();
// Set the sort and limit radio buttons back to their defaults - they would
// have been changed by setupUi
ui_->sort_random->setChecked(true);
ui_->limit_none->setChecked(true);
// Set up the preview widget that's already at the bottom of the sort page
ui_->sort_preview->set_library(library_);
} }
Wizard::~Wizard() { Wizard::~Wizard() {
delete ui_; qDeleteAll(plugins_);
} }
void Wizard::UpdateSortOrder() { void Wizard::AddPlugin(WizardPlugin* plugin) {
const SearchTerm::Field field = const int index = plugins_.count();
SearchTerm::Field(ui_->sort_field_value->currentIndex()); plugins_ << plugin;
const SearchTerm::Type type = SearchTerm::TypeOf(field); plugin->Init(this);
const QString asc = SearchTerm::FieldSortOrderText(type, true);
const QString desc = SearchTerm::FieldSortOrderText(type, false);
ui_->sort_order->clear(); // Create the radio button
ui_->sort_order->addItem(asc); QRadioButton* name = new QRadioButton(plugin->name(), type_page_);
ui_->sort_order->addItem(desc); QLabel* description = new QLabel(plugin->description(), type_page_);
} type_page_->layout()->addWidget(name);
type_page_->layout()->addWidget(description);
void Wizard::AddSearchTerm() { type_mapper_->setMapping(name, index);
SearchTermWidget* widget = connect(name, SIGNAL(clicked()), type_mapper_, SLOT(map()));
new SearchTermWidget(library_, this);
connect(widget, SIGNAL(RemoveClicked()), SLOT(RemoveSearchTerm()));
connect(widget, SIGNAL(Changed()), SLOT(UpdateTermPreview()));
ui_->page_query_search->layout_->insertWidget( if (index == 0) {
ui_->page_query_search->terms_.count(), widget); name->setChecked(true);
ui_->page_query_search->terms_ << widget; TypeChanged(0);
UpdateTermPreview();
}
void Wizard::RemoveSearchTerm() {
SearchTermWidget* widget =
qobject_cast<SearchTermWidget*>(sender());
if (!widget)
return;
const int index = ui_->page_query_search->terms_.indexOf(widget);
if (index == -1)
return;
delete ui_->page_query_search->terms_.takeAt(index);
UpdateTermPreview();
}
void Wizard::UpdateTermPreview() {
Search search = MakeSearch();
emit ui_->page_query_search->completeChanged();
if (!search.is_valid())
return;
// Don't apply limits in the term page
search.limit_ = -1;
ui_->page_query_search->preview_->Update(search);
}
void Wizard::UpdateSortPreview() {
Search search = MakeSearch();
if (!search.is_valid())
return;
ui_->sort_preview->Update(search);
}
Search Wizard::MakeSearch() const {
Search ret;
// Search type
ret.search_type_ = Search::SearchType(ui_->search_type->currentIndex());
// Search terms
foreach (SearchTermWidget* widget, ui_->page_query_search->terms_) {
SearchTerm term = widget->Term();
if (term.is_valid())
ret.terms_ << term;
} }
// Sort order
if (ui_->sort_random->isChecked()) {
ret.sort_type_ = Search::Sort_Random;
} else {
const bool ascending = ui_->sort_order->currentIndex() == 0;
ret.sort_type_ = ascending ? Search::Sort_FieldAsc :
Search::Sort_FieldDesc;
ret.sort_field_ = SearchTerm::Field(
ui_->sort_field_value->currentIndex());
}
// Limit
if (ui_->limit_none->isChecked())
ret.limit_ = -1;
else
ret.limit_ = ui_->limit_value->value();
return ret;
} }
void Wizard::SearchTypeChanged() { void Wizard::TypeChanged(int index) {
const bool all = ui_->search_type->currentIndex() == 2; type_page_->next_id_ = plugins_[index]->start_page();
ui_->terms_group->setEnabled(!all);
UpdateTermPreview();
} }
} // namespace } // namespace

View File

@ -17,20 +17,15 @@
#ifndef SMARTPLAYLISTWIZARD_H #ifndef SMARTPLAYLISTWIZARD_H
#define SMARTPLAYLISTWIZARD_H #define SMARTPLAYLISTWIZARD_H
#include "search.h"
#include <QWizard> #include <QWizard>
class LibraryBackend; class LibraryBackend;
class Ui_SmartPlaylistWizard;
class QComboBox; class QSignalMapper;
class QVBoxLayout;
namespace smart_playlists { namespace smart_playlists {
class SearchPreview; class WizardPlugin;
class SearchTermWidget;
class Wizard : public QWizard { class Wizard : public QWizard {
Q_OBJECT Q_OBJECT
@ -39,36 +34,24 @@ public:
Wizard(LibraryBackend* library, QWidget* parent); Wizard(LibraryBackend* library, QWidget* parent);
~Wizard(); ~Wizard();
class SearchPage : public QWizardPage { private:
friend class Wizard; struct TypePage : public QWizardPage {
public: TypePage(QWidget* parent) : QWizardPage(parent), next_id_(0) {}
SearchPage(QWidget* parent = 0); int nextId() const { return next_id_; }
bool isComplete() const; int next_id_;
QVBoxLayout* layout_;
QComboBox* type_;
QList<SearchTermWidget*> terms_;
SearchTermWidget* new_term_;
SearchPreview* preview_;
}; };
void AddPlugin(WizardPlugin* plugin);
private slots: private slots:
void AddSearchTerm(); void TypeChanged(int index);
void RemoveSearchTerm();
void SearchTypeChanged();
void UpdateTermPreview();
void UpdateSortPreview();
void UpdateSortOrder();
private: private:
Search MakeSearch() const;
private:
Ui_SmartPlaylistWizard* ui_;
LibraryBackend* library_; LibraryBackend* library_;
TypePage* type_page_;
QSignalMapper* type_mapper_;
QList<WizardPlugin*> plugins_;
}; };
} // namespace } // namespace

View File

@ -1,290 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>SmartPlaylistWizard</class>
<widget class="QWizard" name="SmartPlaylistWizard">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>687</width>
<height>628</height>
</rect>
</property>
<property name="windowTitle">
<string>Smart playlist</string>
</property>
<widget class="QWizardPage" name="page_type">
<property name="styleSheet">
<string notr="true">QRadioButton {
font-weight: bold;
}
QLabel {
margin-bottom: 1em;
}</string>
</property>
<property name="title">
<string>Playlist type</string>
</property>
<property name="subTitle">
<string>A smart playlist is a dynamic list of songs that come from your library. There are different types of smart playlist that offer different ways of selecting songs.</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QRadioButton" name="radioButton">
<property name="text">
<string>Library search</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Find songs in your library that match the criteria you specify.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="indent">
<number>24</number>
</property>
</widget>
</item>
<item>
<widget class="QRadioButton" name="radioButton_2">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Last.fm similar artists</string>
</property>
</widget>
</item>
<item>
<widget class="QLabel" name="label_2">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Let Last.fm suggest songs from your library that are similar to one you specify.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="indent">
<number>24</number>
</property>
</widget>
</item>
</layout>
</widget>
<widget class="smart_playlists::Wizard::SearchPage" name="page_query_search">
<property name="styleSheet">
<string notr="true">#termframe {
border: 1px solid grey;
border-radius: 10px;
}
#termframe #remove {
background:qlineargradient(x1:0, y1:0, x2:0, y2:1,
stop:0 rgba(255,0,0,32), stop: 1 rgba(255,0,0,64));
border: 0px;
border-left: 1px dashed grey;
padding: 6px;
margin-left: 9px;
}</string>
</property>
<property name="title">
<string>Search terms</string>
</property>
<property name="subTitle">
<string>A song will be included in the playlist if it matches these conditions.</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<widget class="QGroupBox" name="groupBox_3">
<property name="title">
<string>Search mode</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QComboBox" name="search_type">
<item>
<property name="text">
<string>Match every search term (AND)</string>
</property>
</item>
<item>
<property name="text">
<string>Match one or more search terms (OR)</string>
</property>
</item>
<item>
<property name="text">
<string>Don't use search terms (include all songs)</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="terms_group">
<property name="title">
<string>Search terms</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_5"/>
</widget>
</item>
</layout>
</widget>
<widget class="QWizardPage" name="page_query_sort">
<property name="title">
<string>Search options</string>
</property>
<property name="subTitle">
<string>Choose how the playlist is sorted and how many songs it will contain.</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Sorting</string>
</property>
<layout class="QFormLayout" name="formLayout">
<item row="0" column="0" colspan="2">
<widget class="QRadioButton" name="sort_random">
<property name="text">
<string>Put songs in a random order</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="sort_field">
<property name="text">
<string>Sort songs by</string>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QComboBox" name="sort_field_value"/>
</item>
<item>
<widget class="QComboBox" name="sort_order"/>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Limits</string>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0" colspan="2">
<widget class="QRadioButton" name="limit_none">
<property name="text">
<string>Show all the songs</string>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QRadioButton" name="limit_limit">
<property name="text">
<string>Only show the first</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="limit_value">
<property name="suffix">
<string> songs</string>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="value">
<number>15</number>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="Line" name="line">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<widget class="smart_playlists::SearchPreview" name="sort_preview" native="true"/>
</item>
</layout>
</widget>
</widget>
<customwidgets>
<customwidget>
<class>smart_playlists::SearchPreview</class>
<extends>QWidget</extends>
<header>smartplaylists/searchpreview.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>smart_playlists::Wizard::SearchPage</class>
<extends>QWizardPage</extends>
<header>smartplaylists/wizard.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections>
<connection>
<sender>sort_field_value</sender>
<signal>currentIndexChanged(int)</signal>
<receiver>sort_field</receiver>
<slot>click()</slot>
<hints>
<hint type="sourcelabel">
<x>190</x>
<y>152</y>
</hint>
<hint type="destinationlabel">
<x>142</x>
<y>148</y>
</hint>
</hints>
</connection>
<connection>
<sender>limit_value</sender>
<signal>valueChanged(int)</signal>
<receiver>limit_limit</receiver>
<slot>click()</slot>
<hints>
<hint type="sourcelabel">
<x>221</x>
<y>252</y>
</hint>
<hint type="destinationlabel">
<x>163</x>
<y>248</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@ -0,0 +1,32 @@
/* 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 "wizardplugin.h"
namespace smart_playlists {
WizardPlugin::WizardPlugin(LibraryBackend* library, QObject* parent)
: QObject(parent),
library_(library),
start_page_(-1)
{
}
void WizardPlugin::Init(QWizard* wizard) {
start_page_ = CreatePages(wizard);
}
} // namespace smart_playlists

View File

@ -0,0 +1,55 @@
/* 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 WIZARDPLUGIN_H
#define WIZARDPLUGIN_H
#include <QObject>
#include "generator_fwd.h"
class LibraryBackend;
class QWizard;
namespace smart_playlists {
class WizardPlugin : public QObject {
Q_OBJECT
public:
WizardPlugin(LibraryBackend* library, QObject* parent);
virtual QString name() const = 0;
virtual QString description() const = 0;
int start_page() const { return start_page_; }
virtual GeneratorPtr CreateGenerator() const = 0;
void Init(QWizard* wizard);
protected:
virtual int CreatePages(QWizard* wizard) = 0;
LibraryBackend* library_;
private:
int start_page_;
};
} // namespace smart_playlists
#endif // WIZARDPLUGIN_H

View File

@ -1131,9 +1131,6 @@ msgstr ""
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1149,11 +1146,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "المدة" msgstr "المدة"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "" msgstr ""

View File

@ -1136,9 +1136,6 @@ msgstr "Last.fm парола"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1154,11 +1151,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Дължина" msgstr "Дължина"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "" msgstr ""

View File

@ -1157,9 +1157,6 @@ msgstr "Contrasenya de Last.fm"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1177,11 +1174,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Durada" msgstr "Durada"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Biblioteca" msgstr "Biblioteca"

View File

@ -1136,9 +1136,6 @@ msgstr "Heslo k Last.fm"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1154,11 +1151,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Délka" msgstr "Délka"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Knihovna" msgstr "Knihovna"

View File

@ -1131,9 +1131,6 @@ msgstr ""
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1149,11 +1146,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "" msgstr ""
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "" msgstr ""

View File

@ -1137,9 +1137,6 @@ msgstr "Last.fm-adgangskode"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1155,11 +1152,6 @@ msgstr "Lad stå blank for standard. Eksempler: \"/dev/dsp\", \"front\", osv."
msgid "Length" msgid "Length"
msgstr "Længde" msgstr "Længde"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Bibliotek" msgstr "Bibliotek"

View File

@ -1160,9 +1160,6 @@ msgstr "Last.fm Passwort"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "Last.fm Abspielzähler" msgstr "Last.fm Abspielzähler"
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "Last.fm tags" msgstr "Last.fm tags"
@ -1180,11 +1177,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Länge" msgstr "Länge"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Sammlung" msgstr "Sammlung"

View File

@ -1171,9 +1171,6 @@ msgstr "Last.fm συνθηματικό"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "Αριθμός αναπαραγωγής Last.fm" msgstr "Αριθμός αναπαραγωγής Last.fm"
msgid "Last.fm similar artists"
msgstr "Παρόμοιοι καλλιτέχνες Last.fm"
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "Ετικέτες του Last.fm" msgstr "Ετικέτες του Last.fm"
@ -1189,13 +1186,6 @@ msgstr "Κενό για τα προεπιλεγμένα. Π.χ. \"/dev/dsp\", \
msgid "Length" msgid "Length"
msgstr "Διάρκεια" msgstr "Διάρκεια"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
"Επιτρέψτε στο Last.fm να προτείνει τραγούδια από την βιβλιοθήκη σας παρόμοια "
"με αυτό που ορίζετε."
msgid "Library" msgid "Library"
msgstr "Βιβλιοθήκη" msgstr "Βιβλιοθήκη"
@ -2411,6 +2401,16 @@ msgstr "διακοπή"
msgid "track %1" msgid "track %1"
msgstr "κομμάτι %1" msgstr "κομμάτι %1"
#~ msgid "Last.fm similar artists"
#~ msgstr "Παρόμοιοι καλλιτέχνες Last.fm"
#~ msgid ""
#~ "Let Last.fm suggest songs from your library that are similar to one you "
#~ "specify."
#~ msgstr ""
#~ "Επιτρέψτε στο Last.fm να προτείνει τραγούδια από την βιβλιοθήκη σας "
#~ "παρόμοια με αυτό που ορίζετε."
#~ msgid "Playlists" #~ msgid "Playlists"
#~ msgstr "Λίστες αναπαραγωγής" #~ msgstr "Λίστες αναπαραγωγής"

View File

@ -1135,9 +1135,6 @@ msgstr "Last.fm password"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1153,11 +1150,6 @@ msgstr "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc."
msgid "Length" msgid "Length"
msgstr "Length" msgstr "Length"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Library" msgstr "Library"

View File

@ -1133,9 +1133,6 @@ msgstr "Last.fm password"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1151,11 +1148,6 @@ msgstr "Leave blank for the default. Examples: \"/dev/dsp\", \"front\", etc."
msgid "Length" msgid "Length"
msgstr "Length" msgstr "Length"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Library" msgstr "Library"

View File

@ -1131,9 +1131,6 @@ msgstr ""
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1149,11 +1146,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "" msgstr ""
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "" msgstr ""

View File

@ -1169,9 +1169,6 @@ msgstr "Contraseña"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "Recuento de reproducciones de Last.fm" msgstr "Recuento de reproducciones de Last.fm"
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "Etiquetas de Last.fm" msgstr "Etiquetas de Last.fm"
@ -1189,11 +1186,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Duración" msgstr "Duración"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Colección" msgstr "Colección"

View File

@ -1133,9 +1133,6 @@ msgstr ""
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "Last.fm sildipilv" msgstr "Last.fm sildipilv"
@ -1151,11 +1148,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Kestvus" msgstr "Kestvus"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Helikogu" msgstr "Helikogu"

View File

@ -1133,9 +1133,6 @@ msgstr "Last.fm-salasana"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1151,11 +1148,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Kesto" msgstr "Kesto"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Kirjasto" msgstr "Kirjasto"

View File

@ -1168,9 +1168,6 @@ msgstr "Mot de passe"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "Nombre d'écoutes Last.fm" msgstr "Nombre d'écoutes Last.fm"
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "Tags Last.fm" msgstr "Tags Last.fm"
@ -1188,11 +1185,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Durée" msgstr "Durée"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Bibliothèque" msgstr "Bibliothèque"

View File

@ -1138,9 +1138,6 @@ msgstr ""
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1156,11 +1153,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Durazón" msgstr "Durazón"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "" msgstr ""

View File

@ -1163,9 +1163,6 @@ msgstr "Last.fm jelszó"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "Last.fm lejátszás számláló" msgstr "Last.fm lejátszás számláló"
msgid "Last.fm similar artists"
msgstr "Last.fm hasonló előadók"
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "Last.fm címkék" msgstr "Last.fm címkék"
@ -1182,13 +1179,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Időtartam" msgstr "Időtartam"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
"Last.fm ajánlások használata számok kiválasztásához a zenetáradból a "
"feltételeidnek megfelelően."
msgid "Library" msgid "Library"
msgstr "Zenetár" msgstr "Zenetár"
@ -2396,6 +2386,16 @@ msgstr "leállítás"
msgid "track %1" msgid "track %1"
msgstr "%1. szám" msgstr "%1. szám"
#~ msgid "Last.fm similar artists"
#~ msgstr "Last.fm hasonló előadók"
#~ msgid ""
#~ "Let Last.fm suggest songs from your library that are similar to one you "
#~ "specify."
#~ msgstr ""
#~ "Last.fm ajánlások használata számok kiválasztásához a zenetáradból a "
#~ "feltételeidnek megfelelően."
#~ msgid "Playlists" #~ msgid "Playlists"
#~ msgstr "Lejátszási listák" #~ msgstr "Lejátszási listák"

View File

@ -1170,9 +1170,6 @@ msgstr "Password Last.fm"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "Contatore riproduzioni di Last.fm" msgstr "Contatore riproduzioni di Last.fm"
msgid "Last.fm similar artists"
msgstr "Artisti simili di Last.fm"
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "Etichette di Last.fm" msgstr "Etichette di Last.fm"
@ -1190,13 +1187,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Durata" msgstr "Durata"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
"Lascia che Last.fm suggerisca brani della raccolta che sono simili a quello "
"specificato."
msgid "Library" msgid "Library"
msgstr "Raccolta" msgstr "Raccolta"
@ -2411,6 +2401,16 @@ msgstr "ferma"
msgid "track %1" msgid "track %1"
msgstr "traccia %1" msgstr "traccia %1"
#~ msgid "Last.fm similar artists"
#~ msgstr "Artisti simili di Last.fm"
#~ msgid ""
#~ "Let Last.fm suggest songs from your library that are similar to one you "
#~ "specify."
#~ msgstr ""
#~ "Lascia che Last.fm suggerisca brani della raccolta che sono simili a "
#~ "quello specificato."
#~ msgid "Playlists" #~ msgid "Playlists"
#~ msgstr "Scalette" #~ msgstr "Scalette"

View File

@ -1156,9 +1156,6 @@ msgstr "Last.fm のパスワード"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "Last.fm の再生回数" msgstr "Last.fm の再生回数"
msgid "Last.fm similar artists"
msgstr "Last.fm のテイストの似たアーティスト"
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "Last.fm タグ" msgstr "Last.fm タグ"
@ -1174,11 +1171,6 @@ msgstr "既定にするには空のままにします。例: \"/dev/dsp\"、\"fr
msgid "Length" msgid "Length"
msgstr "長さ" msgstr "長さ"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr "ライブラリの指定する曲にテイストの似た曲を Last.fm から検索します。"
msgid "Library" msgid "Library"
msgstr "ライブラリ" msgstr "ライブラリ"
@ -2380,6 +2372,14 @@ msgstr "停止"
msgid "track %1" msgid "track %1"
msgstr "トラック %1" msgstr "トラック %1"
#~ msgid "Last.fm similar artists"
#~ msgstr "Last.fm のテイストの似たアーティスト"
#~ msgid ""
#~ "Let Last.fm suggest songs from your library that are similar to one you "
#~ "specify."
#~ msgstr "ライブラリの指定する曲にテイストの似た曲を Last.fm から検索します。"
#~ msgid "Playlists" #~ msgid "Playlists"
#~ msgstr "プレイリスト" #~ msgstr "プレイリスト"

View File

@ -1133,9 +1133,6 @@ msgstr ""
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1151,11 +1148,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Ұзындығы" msgstr "Ұзындығы"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "" msgstr ""

View File

@ -1132,9 +1132,6 @@ msgstr ""
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1150,11 +1147,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "" msgstr ""
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "" msgstr ""

View File

@ -1146,9 +1146,6 @@ msgstr "Last.fm passord"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1164,11 +1161,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Lengde" msgstr "Lengde"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Bibliotek" msgstr "Bibliotek"

View File

@ -1160,9 +1160,6 @@ msgstr "Last.fm wachtwoord"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1179,11 +1176,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Duur" msgstr "Duur"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Bibliotheek" msgstr "Bibliotheek"

View File

@ -1131,9 +1131,6 @@ msgstr ""
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1149,11 +1146,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Longor" msgstr "Longor"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Bibliotèca" msgstr "Bibliotèca"

View File

@ -1157,9 +1157,6 @@ msgstr "Hasło Last.fm"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1177,11 +1174,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Długość" msgstr "Długość"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Biblioteka" msgstr "Biblioteka"

View File

@ -1166,9 +1166,6 @@ msgstr "Senha Last.fm"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "Reprodções Last.fm" msgstr "Reprodções Last.fm"
msgid "Last.fm similar artists"
msgstr "Artistas semelhantes na Last.fm"
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "\\\"Tags\\\" Last.fm" msgstr "\\\"Tags\\\" Last.fm"
@ -1186,13 +1183,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Duração" msgstr "Duração"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
"Deixar que a Last.fm sugira as músicas da sua biblioteca que sejam "
"semelhantes às que especificou."
msgid "Library" msgid "Library"
msgstr "Biblioteca" msgstr "Biblioteca"
@ -2402,6 +2392,16 @@ msgstr "parar"
msgid "track %1" msgid "track %1"
msgstr "faixa %1" msgstr "faixa %1"
#~ msgid "Last.fm similar artists"
#~ msgstr "Artistas semelhantes na Last.fm"
#~ msgid ""
#~ "Let Last.fm suggest songs from your library that are similar to one you "
#~ "specify."
#~ msgstr ""
#~ "Deixar que a Last.fm sugira as músicas da sua biblioteca que sejam "
#~ "semelhantes às que especificou."
#~ msgid "Playlists" #~ msgid "Playlists"
#~ msgstr "Listas de reprodução" #~ msgstr "Listas de reprodução"

View File

@ -1148,9 +1148,6 @@ msgstr "Senha do Last.fm"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1166,11 +1163,6 @@ msgstr "Deixe em brando por padrão. Exemplos: \"/dev/dsp\", \"front\", etc."
msgid "Length" msgid "Length"
msgstr "Duração" msgstr "Duração"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Biblioteca" msgstr "Biblioteca"

View File

@ -1132,9 +1132,6 @@ msgstr ""
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1150,11 +1147,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Durată" msgstr "Durată"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Bibliotecă" msgstr "Bibliotecă"

View File

@ -1153,9 +1153,6 @@ msgstr "Пароль Last.fm"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "Количество прослушиваний на Last.fm" msgstr "Количество прослушиваний на Last.fm"
msgid "Last.fm similar artists"
msgstr "Похожие исполнители на Last.fm"
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "Last.fm теги" msgstr "Last.fm теги"
@ -1172,11 +1169,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Длительность" msgstr "Длительность"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Коллекция" msgstr "Коллекция"
@ -2383,6 +2375,9 @@ msgstr "Остановить"
msgid "track %1" msgid "track %1"
msgstr "композиция %1" msgstr "композиция %1"
#~ msgid "Last.fm similar artists"
#~ msgstr "Похожие исполнители на Last.fm"
#~ msgid "Playlists" #~ msgid "Playlists"
#~ msgstr "Плейлисты" #~ msgstr "Плейлисты"

View File

@ -1157,9 +1157,6 @@ msgstr "Last.fm heslo"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "Last.fm počet prehraní" msgstr "Last.fm počet prehraní"
msgid "Last.fm similar artists"
msgstr "Last.fm podobný interpréti"
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "Last.fm tagy" msgstr "Last.fm tagy"
@ -1175,13 +1172,6 @@ msgstr "Nechať pôvodne - prázdne. Príklady: \"/dev/dsp\", \"front\", atď."
msgid "Length" msgid "Length"
msgstr "Dĺžka" msgstr "Dĺžka"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
"Nechať Last.fm napovedať piesne z vašej zbierky ktoré sú podobné ako tá, čo "
"ste vybrali."
msgid "Library" msgid "Library"
msgstr "Zbierka" msgstr "Zbierka"
@ -2387,6 +2377,16 @@ msgstr "zastaviť"
msgid "track %1" msgid "track %1"
msgstr "skladba %1" msgstr "skladba %1"
#~ msgid "Last.fm similar artists"
#~ msgstr "Last.fm podobný interpréti"
#~ msgid ""
#~ "Let Last.fm suggest songs from your library that are similar to one you "
#~ "specify."
#~ msgstr ""
#~ "Nechať Last.fm napovedať piesne z vašej zbierky ktoré sú podobné ako tá, "
#~ "čo ste vybrali."
#~ msgid "Playlists" #~ msgid "Playlists"
#~ msgstr "Playlisty" #~ msgstr "Playlisty"

View File

@ -1159,9 +1159,6 @@ msgstr "Geslo Last.fm"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "Število predvajanj last.fm" msgstr "Število predvajanj last.fm"
msgid "Last.fm similar artists"
msgstr "Last.fm podobni izvajalci"
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "Last.fm oznake" msgstr "Last.fm oznake"
@ -1177,13 +1174,6 @@ msgstr "Pustite prazno za privzeto. Primeri: \"/dev/dsp\", \"front\", itd."
msgid "Length" msgid "Length"
msgstr "Dolžina" msgstr "Dolžina"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
"Dovoli, da Last.fm predlaga skladbe iz vaše knjižnice, ki so podobne tisti, "
"ki ste jo določili."
msgid "Library" msgid "Library"
msgstr "Knjižnica" msgstr "Knjižnica"
@ -2389,6 +2379,16 @@ msgstr "zaustavi"
msgid "track %1" msgid "track %1"
msgstr "skladba %1" msgstr "skladba %1"
#~ msgid "Last.fm similar artists"
#~ msgstr "Last.fm podobni izvajalci"
#~ msgid ""
#~ "Let Last.fm suggest songs from your library that are similar to one you "
#~ "specify."
#~ msgstr ""
#~ "Dovoli, da Last.fm predlaga skladbe iz vaše knjižnice, ki so podobne "
#~ "tisti, ki ste jo določili."
#~ msgid "Playlists" #~ msgid "Playlists"
#~ msgstr "Seznami predvajanja" #~ msgstr "Seznami predvajanja"

View File

@ -1137,9 +1137,6 @@ msgstr "ЛастФМ лозинка"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1155,11 +1152,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Трајање" msgstr "Трајање"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Библиотека" msgstr "Библиотека"

View File

@ -1158,9 +1158,6 @@ msgstr "Last.fm-lösenord"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "Last.fm-låtstatistik" msgstr "Last.fm-låtstatistik"
msgid "Last.fm similar artists"
msgstr "Liknande Last.fm-artister"
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "Last.fm-taggar" msgstr "Last.fm-taggar"
@ -1176,11 +1173,6 @@ msgstr "Lämna tomt för standardvärdet. Exempel: \"/dev/dsp\", \"front\", etc.
msgid "Length" msgid "Length"
msgstr "Speltid" msgstr "Speltid"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr "Låt Last.fm föreslå låtar från ditt bibliotek som liknar den du anger."
msgid "Library" msgid "Library"
msgstr "Bibliotek" msgstr "Bibliotek"
@ -2384,6 +2376,15 @@ msgstr "stoppa"
msgid "track %1" msgid "track %1"
msgstr "spår %1" msgstr "spår %1"
#~ msgid "Last.fm similar artists"
#~ msgstr "Liknande Last.fm-artister"
#~ msgid ""
#~ "Let Last.fm suggest songs from your library that are similar to one you "
#~ "specify."
#~ msgstr ""
#~ "Låt Last.fm föreslå låtar från ditt bibliotek som liknar den du anger."
#~ msgid "Playlists" #~ msgid "Playlists"
#~ msgstr "Spellistor" #~ msgstr "Spellistor"

View File

@ -1154,9 +1154,6 @@ msgstr "Last.fm parolası"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr "Last.fm benzer sanatçılar"
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "Last.fm etiketleri" msgstr "Last.fm etiketleri"
@ -1174,11 +1171,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "Süre" msgstr "Süre"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "Kütüphane" msgstr "Kütüphane"
@ -2376,6 +2368,9 @@ msgstr "durdur"
msgid "track %1" msgid "track %1"
msgstr "parça %1" msgstr "parça %1"
#~ msgid "Last.fm similar artists"
#~ msgstr "Last.fm benzer sanatçılar"
#~ msgid "Playlists" #~ msgid "Playlists"
#~ msgstr "Çalma Listeleri" #~ msgstr "Çalma Listeleri"

View File

@ -1122,9 +1122,6 @@ msgstr ""
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1140,11 +1137,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "" msgstr ""
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "" msgstr ""

View File

@ -1158,9 +1158,6 @@ msgstr "Пароль Last.fm"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "Кількість відтворень на Last.fm" msgstr "Кількість відтворень на Last.fm"
msgid "Last.fm similar artists"
msgstr "Подібні виконавці на Last.fm"
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "Позначки Last.fm" msgstr "Позначки Last.fm"
@ -1176,13 +1173,6 @@ msgstr "Типово, залишити порожнім. Наприклад: \"
msgid "Length" msgid "Length"
msgstr "Тривалість" msgstr "Тривалість"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
"Дозволити Last.fm пропонувати композиції з вашої фонотеки подібні до "
"вказаних вами."
msgid "Library" msgid "Library"
msgstr "Фонотека" msgstr "Фонотека"
@ -2383,6 +2373,16 @@ msgstr "зупинити"
msgid "track %1" msgid "track %1"
msgstr "доріжка %1" msgstr "доріжка %1"
#~ msgid "Last.fm similar artists"
#~ msgstr "Подібні виконавці на Last.fm"
#~ msgid ""
#~ "Let Last.fm suggest songs from your library that are similar to one you "
#~ "specify."
#~ msgstr ""
#~ "Дозволити Last.fm пропонувати композиції з вашої фонотеки подібні до "
#~ "вказаних вами."
#~ msgid "Playlists" #~ msgid "Playlists"
#~ msgstr "Списки відтворення" #~ msgstr "Списки відтворення"

View File

@ -1133,9 +1133,6 @@ msgstr "Last.fm 密码"
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1151,11 +1148,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "长度" msgstr "长度"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "" msgstr ""

View File

@ -1137,9 +1137,6 @@ msgstr ""
msgid "Last.fm play counts" msgid "Last.fm play counts"
msgstr "" msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags" msgid "Last.fm tags"
msgstr "" msgstr ""
@ -1155,11 +1152,6 @@ msgstr ""
msgid "Length" msgid "Length"
msgstr "長度" msgstr "長度"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library" msgid "Library"
msgstr "音樂庫" msgstr "音樂庫"