/* 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 .
*/
#include "smartplaylistsearchpreview.h"
#include "smartplaylistsearchtermwidget.h"
#include "smartplaylistwizard.h"
#include "ui_smartplaylistwizard.h"
#include "playlistgenerator.h"
SmartPlaylistWizard::SearchPage::SearchPage(QWidget* parent)
: QWizardPage(parent)
{
}
bool SmartPlaylistWizard::SearchPage::isComplete() const {
if (type_->currentIndex() == 2) // All songs
return true;
foreach (SmartPlaylistSearchTermWidget* widget, terms_) {
if (!widget->Term().is_valid())
return false;
}
return true;
}
SmartPlaylistWizard::SmartPlaylistWizard(LibraryBackend* library, QWidget* parent)
: QWizard(parent),
ui_(new Ui_SmartPlaylistWizard),
library_(library)
{
ui_->setupUi(this);
ui_->limit_value->setValue(PlaylistGenerator::kDefaultLimit);
connect(ui_->search_type, SIGNAL(currentIndexChanged(int)), SLOT(SearchTypeChanged()));
// Get the type combo box
ui_->page_query_search->type_ = ui_->search_type;
// Create the new search term widget
ui_->page_query_search->new_term_ = new SmartPlaylistSearchTermWidget(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(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(ui_->page_query_search->layout());
terms_page_layout->addStretch();
ui_->page_query_search->preview_ = new SmartPlaylistSearchPreview(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 ; isort_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_);
}
SmartPlaylistWizard::~SmartPlaylistWizard() {
delete ui_;
}
void SmartPlaylistWizard::UpdateSortOrder() {
const SmartPlaylistSearchTerm::Field field =
SmartPlaylistSearchTerm::Field(ui_->sort_field_value->currentIndex());
const SmartPlaylistSearchTerm::Type type = SmartPlaylistSearchTerm::TypeOf(field);
const QString asc = SmartPlaylistSearchTerm::FieldSortOrderText(type, true);
const QString desc = SmartPlaylistSearchTerm::FieldSortOrderText(type, false);
ui_->sort_order->clear();
ui_->sort_order->addItem(asc);
ui_->sort_order->addItem(desc);
}
void SmartPlaylistWizard::AddSearchTerm() {
SmartPlaylistSearchTermWidget* widget =
new SmartPlaylistSearchTermWidget(library_, this);
connect(widget, SIGNAL(RemoveClicked()), SLOT(RemoveSearchTerm()));
connect(widget, SIGNAL(Changed()), SLOT(UpdateTermPreview()));
ui_->page_query_search->layout_->insertWidget(
ui_->page_query_search->terms_.count(), widget);
ui_->page_query_search->terms_ << widget;
UpdateTermPreview();
}
void SmartPlaylistWizard::RemoveSearchTerm() {
SmartPlaylistSearchTermWidget* widget =
qobject_cast(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 SmartPlaylistWizard::UpdateTermPreview() {
SmartPlaylistSearch 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 SmartPlaylistWizard::UpdateSortPreview() {
SmartPlaylistSearch search = MakeSearch();
if (!search.is_valid())
return;
ui_->sort_preview->Update(search);
}
SmartPlaylistSearch SmartPlaylistWizard::MakeSearch() const {
SmartPlaylistSearch ret;
// Search type
ret.search_type_ = SmartPlaylistSearch::SearchType(ui_->search_type->currentIndex());
// Search terms
foreach (SmartPlaylistSearchTermWidget* widget, ui_->page_query_search->terms_) {
SmartPlaylistSearchTerm term = widget->Term();
if (term.is_valid())
ret.terms_ << term;
}
// Sort order
if (ui_->sort_random->isChecked()) {
ret.sort_type_ = SmartPlaylistSearch::Sort_Random;
} else {
const bool ascending = ui_->sort_order->currentIndex() == 0;
ret.sort_type_ = ascending ? SmartPlaylistSearch::Sort_FieldAsc :
SmartPlaylistSearch::Sort_FieldDesc;
ret.sort_field_ = SmartPlaylistSearchTerm::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 SmartPlaylistWizard::SearchTypeChanged() {
const bool all = ui_->search_type->currentIndex() == 2;
ui_->terms_group->setEnabled(!all);
UpdateTermPreview();
}