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/generatorinserter.cpp
smartplaylists/querygenerator.cpp
smartplaylists/querywizardplugin.cpp
smartplaylists/search.cpp
smartplaylists/searchpreview.cpp
smartplaylists/searchterm.cpp
smartplaylists/searchtermwidget.cpp
smartplaylists/wizard.cpp
smartplaylists/wizardplugin.cpp
songinfo/artistinfoview.cpp
songinfo/collapsibleinfoheader.cpp
@ -290,9 +292,11 @@ set(HEADERS
smartplaylists/generator.h
smartplaylists/generatorinserter.h
smartplaylists/generatormimedata.h
smartplaylists/querywizardplugin.h
smartplaylists/searchpreview.h
smartplaylists/searchtermwidget.h
smartplaylists/wizard.h
smartplaylists/wizardplugin.h
songinfo/artistinfoview.h
songinfo/collapsibleinfoheader.h
@ -374,9 +378,10 @@ set(UI
radio/magnatunedownloaddialog.ui
radio/radioviewcontainer.ui
smartplaylists/querysearchpage.ui
smartplaylists/querysortpage.ui
smartplaylists/searchpreview.ui
smartplaylists/searchtermwidget.ui
smartplaylists/wizard.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/>.
*/
#include "generator.h"
#include "searchpreview.h"
#include "searchtermwidget.h"
#include "querywizardplugin.h"
#include "wizard.h"
#include "ui_wizard.h"
#include "wizardplugin.h"
#include <QLabel>
#include <QRadioButton>
#include <QSignalMapper>
#include <QVBoxLayout>
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)
: QWizard(parent),
ui_(new Ui_SmartPlaylistWizard),
library_(library)
library_(library),
type_page_(new TypePage(this)),
type_mapper_(new QSignalMapper(this))
{
ui_->setupUi(this);
ui_->limit_value->setValue(Generator::kDefaultLimit);
setWindowIcon(QIcon(":/icon.png"));
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
ui_->page_query_search->type_ = ui_->search_type;
connect(type_mapper_, SIGNAL(mapped(int)), SLOT(TypeChanged(int)));
// Create the new search term widget
ui_->page_query_search->new_term_ = new SearchTermWidget(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_);
new QVBoxLayout(type_page_);
AddPlugin(new QueryWizardPlugin(library_, this));
}
Wizard::~Wizard() {
delete ui_;
qDeleteAll(plugins_);
}
void Wizard::UpdateSortOrder() {
const SearchTerm::Field field =
SearchTerm::Field(ui_->sort_field_value->currentIndex());
const SearchTerm::Type type = SearchTerm::TypeOf(field);
const QString asc = SearchTerm::FieldSortOrderText(type, true);
const QString desc = SearchTerm::FieldSortOrderText(type, false);
void Wizard::AddPlugin(WizardPlugin* plugin) {
const int index = plugins_.count();
plugins_ << plugin;
plugin->Init(this);
ui_->sort_order->clear();
ui_->sort_order->addItem(asc);
ui_->sort_order->addItem(desc);
}
// Create the radio button
QRadioButton* name = new QRadioButton(plugin->name(), type_page_);
QLabel* description = new QLabel(plugin->description(), type_page_);
type_page_->layout()->addWidget(name);
type_page_->layout()->addWidget(description);
void Wizard::AddSearchTerm() {
SearchTermWidget* widget =
new SearchTermWidget(library_, this);
connect(widget, SIGNAL(RemoveClicked()), SLOT(RemoveSearchTerm()));
connect(widget, SIGNAL(Changed()), SLOT(UpdateTermPreview()));
type_mapper_->setMapping(name, index);
connect(name, SIGNAL(clicked()), type_mapper_, SLOT(map()));
ui_->page_query_search->layout_->insertWidget(
ui_->page_query_search->terms_.count(), widget);
ui_->page_query_search->terms_ << widget;
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;
if (index == 0) {
name->setChecked(true);
TypeChanged(0);
}
// 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() {
const bool all = ui_->search_type->currentIndex() == 2;
ui_->terms_group->setEnabled(!all);
UpdateTermPreview();
void Wizard::TypeChanged(int index) {
type_page_->next_id_ = plugins_[index]->start_page();
}
} // namespace

View File

@ -17,20 +17,15 @@
#ifndef SMARTPLAYLISTWIZARD_H
#define SMARTPLAYLISTWIZARD_H
#include "search.h"
#include <QWizard>
class LibraryBackend;
class Ui_SmartPlaylistWizard;
class QComboBox;
class QVBoxLayout;
class QSignalMapper;
namespace smart_playlists {
class SearchPreview;
class SearchTermWidget;
class WizardPlugin;
class Wizard : public QWizard {
Q_OBJECT
@ -39,36 +34,24 @@ public:
Wizard(LibraryBackend* library, QWidget* parent);
~Wizard();
class SearchPage : public QWizardPage {
friend class Wizard;
public:
SearchPage(QWidget* parent = 0);
bool isComplete() const;
QVBoxLayout* layout_;
QComboBox* type_;
QList<SearchTermWidget*> terms_;
SearchTermWidget* new_term_;
SearchPreview* preview_;
private:
struct TypePage : public QWizardPage {
TypePage(QWidget* parent) : QWizardPage(parent), next_id_(0) {}
int nextId() const { return next_id_; }
int next_id_;
};
void AddPlugin(WizardPlugin* plugin);
private slots:
void AddSearchTerm();
void RemoveSearchTerm();
void SearchTypeChanged();
void UpdateTermPreview();
void UpdateSortPreview();
void UpdateSortOrder();
void TypeChanged(int index);
private:
Search MakeSearch() const;
private:
Ui_SmartPlaylistWizard* ui_;
LibraryBackend* library_;
TypePage* type_page_;
QSignalMapper* type_mapper_;
QList<WizardPlugin*> plugins_;
};
} // 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"
msgstr ""
msgid "Last.fm similar artists"
msgstr ""
msgid "Last.fm tags"
msgstr ""
@ -1149,11 +1146,6 @@ msgstr ""
msgid "Length"
msgstr "المدة"
msgid ""
"Let Last.fm suggest songs from your library that are similar to one you "
"specify."
msgstr ""
msgid "Library"
msgstr ""

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1163,9 +1163,6 @@ msgstr "Last.fm jelszó"
msgid "Last.fm play counts"
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"
msgstr "Last.fm címkék"
@ -1182,13 +1179,6 @@ msgstr ""
msgid "Length"
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"
msgstr "Zenetár"
@ -2396,6 +2386,16 @@ msgstr "leállítás"
msgid "track %1"
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"
#~ msgstr "Lejátszási listák"

View File

@ -1170,9 +1170,6 @@ msgstr "Password Last.fm"
msgid "Last.fm play counts"
msgstr "Contatore riproduzioni di Last.fm"
msgid "Last.fm similar artists"
msgstr "Artisti simili di Last.fm"
msgid "Last.fm tags"
msgstr "Etichette di Last.fm"
@ -1190,13 +1187,6 @@ msgstr ""
msgid "Length"
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"
msgstr "Raccolta"
@ -2411,6 +2401,16 @@ msgstr "ferma"
msgid "track %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"
#~ msgstr "Scalette"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1166,9 +1166,6 @@ msgstr "Senha Last.fm"
msgid "Last.fm play counts"
msgstr "Reprodções Last.fm"
msgid "Last.fm similar artists"
msgstr "Artistas semelhantes na Last.fm"
msgid "Last.fm tags"
msgstr "\\\"Tags\\\" Last.fm"
@ -1186,13 +1183,6 @@ msgstr ""
msgid "Length"
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"
msgstr "Biblioteca"
@ -2402,6 +2392,16 @@ msgstr "parar"
msgid "track %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"
#~ msgstr "Listas de reprodução"

View File

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

View File

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

View File

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

View File

@ -1157,9 +1157,6 @@ msgstr "Last.fm heslo"
msgid "Last.fm play counts"
msgstr "Last.fm počet prehraní"
msgid "Last.fm similar artists"
msgstr "Last.fm podobný interpréti"
msgid "Last.fm tags"
msgstr "Last.fm tagy"
@ -1175,13 +1172,6 @@ msgstr "Nechať pôvodne - prázdne. Príklady: \"/dev/dsp\", \"front\", atď."
msgid "Length"
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"
msgstr "Zbierka"
@ -2387,6 +2377,16 @@ msgstr "zastaviť"
msgid "track %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"
#~ msgstr "Playlisty"

View File

@ -1159,9 +1159,6 @@ msgstr "Geslo Last.fm"
msgid "Last.fm play counts"
msgstr "Število predvajanj last.fm"
msgid "Last.fm similar artists"
msgstr "Last.fm podobni izvajalci"
msgid "Last.fm tags"
msgstr "Last.fm oznake"
@ -1177,13 +1174,6 @@ msgstr "Pustite prazno za privzeto. Primeri: \"/dev/dsp\", \"front\", itd."
msgid "Length"
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"
msgstr "Knjižnica"
@ -2389,6 +2379,16 @@ msgstr "zaustavi"
msgid "track %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"
#~ msgstr "Seznami predvajanja"

View File

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

View File

@ -1158,9 +1158,6 @@ msgstr "Last.fm-lösenord"
msgid "Last.fm play counts"
msgstr "Last.fm-låtstatistik"
msgid "Last.fm similar artists"
msgstr "Liknande Last.fm-artister"
msgid "Last.fm tags"
msgstr "Last.fm-taggar"
@ -1176,11 +1173,6 @@ msgstr "Lämna tomt för standardvärdet. Exempel: \"/dev/dsp\", \"front\", etc.
msgid "Length"
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"
msgstr "Bibliotek"
@ -2384,6 +2376,15 @@ msgstr "stoppa"
msgid "track %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"
#~ msgstr "Spellistor"

View File

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

View File

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

View File

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

View File

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

View File

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