From b41c45b4ca554e974f7c65560d6057d7aae9d4f4 Mon Sep 17 00:00:00 2001 From: Nikolay Tischenko Date: Tue, 12 Oct 2010 01:08:08 +0700 Subject: [PATCH] Implemented search through library --- src/config.cpp | 4 +++ src/dbstorage.cpp | 51 ++++++++++++++++++++++++++++++ src/dbstorage.h | 3 ++ src/library.cpp | 4 +++ src/library.h | 2 ++ src/libraryform.cpp | 81 +++++++++++++++++++++++++++++++++++++++++------- src/libraryform.h | 4 ++- src/settingsdialog.cpp | 9 ++---- src/someplayer.h | 2 +- src/toolswidget.cpp | 5 +++ src/toolswidget.h | 1 + src/ui/toolswidget.ui | 2 +- 12 files changed, 148 insertions(+), 20 deletions(-) diff --git a/src/config.cpp b/src/config.cpp index cec2c90..49ccfa4 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -28,6 +28,10 @@ Config::Config() _settings = new QSettings(QString(applicationDir())+"/settings.ini", QSettings::IniFormat); if (_settings->value("ui/iconstheme").toString() == "") _settings->setValue("ui/iconstheme", "white"); + if (_settings->value("ui/albumsorting").toString() == "") + _settings->setValue("ui/albumsorting", "date"); + if (_settings->value("ui/gradient").toString() == "") + _settings->setValue("ui/gradient", "yes"); } Config::~Config() { diff --git a/src/dbstorage.cpp b/src/dbstorage.cpp index 05428cb..5d4c356 100644 --- a/src/dbstorage.cpp +++ b/src/dbstorage.cpp @@ -20,6 +20,7 @@ #include "dbstorage.h" #include #include +#include using namespace SomePlayer::Storage; using namespace SomePlayer::DataObjects; @@ -89,6 +90,14 @@ void DbStorage::_prepare_queries() { "tracks JOIN artist ON tracks.artist_id = artist.id AND source = :source) " "JOIN album ON album_id = album.id LIMIT 1"); + _get_tracks_by_pattern_query = new QSqlQuery(db); + _get_tracks_by_pattern_query->prepare("SELECT id, title, artist, album, source, count, length, year FROM " + "entire WHERE " + "utitle LIKE (SELECT '%' || :ptitle || '%') OR " + "album_uname LIKE (SELECT '%' || :palbum || '%') OR " + "artist_uname LIKE (SELECT '%' || :partist || '%') " + "ORDER BY artist_uname, year"); + _check_artist_query = new QSqlQuery(db); _check_artist_query->prepare("SELECT id FROM artist WHERE uname = :uname"); @@ -151,6 +160,21 @@ void DbStorage::_create_database_structure() { "date integer, " "foreign key(track_id) references tracks(id) " ");"); + query->exec("create view entire as " + "select id, title, artist_name as artist, album_name as album, source, count, length, album_year as year, utitle, artist_uname, album_uname from " + "tracks left join " + "(select artist.id as aartist_id, " + "artist.uname as artist_uname, " + "artist.name as artist_name, " + "album.uname as album_uname, " + "album.year as album_year, " + "album.id as aalbum_id, " + "album.name as album_name from " + "artist " + "join album " + "on album.artist_id = artist.id) " + "on aartist_id = tracks.artist_id " + "and aalbum_id = tracks.album_id"); } DbStorage::~DbStorage() { @@ -163,6 +187,7 @@ DbStorage::~DbStorage() { delete _get_recently_added_query; delete _get_tracks_for_album_query; delete _get_track_by_source_query; + delete _get_tracks_by_pattern_query; delete _check_album_query; delete _check_artist_query; delete _check_track_query; @@ -461,3 +486,29 @@ int DbStorage::_check_add_album(QString album, int artist_id, int year) { } } } + +QList DbStorage::search(QString pattern) { + QList found; + QSqlQuery *query = _get_tracks_by_pattern_query; + query->bindValue(":ptitle", pattern.toUpper()); // with :pattern only doesn't work + query->bindValue(":palbum", pattern.toUpper()); + query->bindValue(":partist", pattern.toUpper()); + query->exec(); + // id, title, artist, album, source, count, length, year + while (query->next()) { + int id = query->value(0).toInt(); + QString title = query->value(1).toString(); + QString artist = query->value(2).toString(); + QString album = query->value(3).toString(); + QString source = query->value(4).toString(); + int count = query->value(5).toInt(); + int length = query->value(6).toInt(); + int year = query->value(7).toInt(); + TrackMetadata meta(title, artist, album, length); + meta.setYear(year); + Track track(id, meta, source); + track.setCount(count); + found.append(track); + } + return found; +} diff --git a/src/dbstorage.h b/src/dbstorage.h index 9976519..e6c5eb5 100644 --- a/src/dbstorage.h +++ b/src/dbstorage.h @@ -51,6 +51,8 @@ namespace SomePlayer { Playlist getNeverPlayed(); Playlist getRecentlyAdded(); + QList search(QString pattern); + void removeTrack(Track track); void addToFavorites(Track track); @@ -77,6 +79,7 @@ namespace SomePlayer { QSqlQuery *_get_recently_added_query; QSqlQuery *_get_track_count; QSqlQuery *_get_track_by_source_query; + QSqlQuery *_get_tracks_by_pattern_query; QSqlQuery *_check_artist_query; QSqlQuery *_check_album_query; diff --git a/src/library.cpp b/src/library.cpp index 2b07566..77e6887 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -161,3 +161,7 @@ void Library::updateTrackMetadata(Track track) { } _resolver->updateTags(ntrack); } + +QList Library::search(QString pattern) { + return _library_storage->search(pattern); +} diff --git a/src/library.h b/src/library.h index f57c881..77239b7 100644 --- a/src/library.h +++ b/src/library.h @@ -54,6 +54,8 @@ namespace SomePlayer { QMap getAlbumsForArtist(QString artist); QList getTracksForAlbum(QString album, QString artist); + QList search(QString pattern); + Playlist getFavorites(); Playlist getMostPlayed(); Playlist getNeverPlayed(); diff --git a/src/libraryform.cpp b/src/libraryform.cpp index 257e3b0..3b97389 100644 --- a/src/libraryform.cpp +++ b/src/libraryform.cpp @@ -59,18 +59,28 @@ inline void __fill_model_album(QStandardItemModel *model, QMap dat model->clear(); int count = data.count(); model->setRowCount(count); - QMap > years; - foreach (QString name, data.keys()) { - years[data[name]].append(name); - } - QList keys = years.keys(); - qSort(keys); - int i = 0; - foreach (int year, keys) { - foreach (QString name, years[year]) { + Config config; + if (config.getValue("ui/albumsorting").toString() == "date") { + QMap > years; + foreach (QString name, data.keys()) { + years[data[name]].append(name); + } + QList keys = years.keys(); + qSort(keys); + + foreach (int year, keys) { + foreach (QString name, years[year]) { + model->setItem(i, 0, new QStandardItem(QIcon(":/icons/"+icons_theme+"/deselect_all.png"), "")); + model->setItem(i, 1, new QStandardItem(QString("[%1] %2").arg(year).arg(name))); + i++; + } + } + } else { + QList names = data.keys(); + foreach (QString name, names) { model->setItem(i, 0, new QStandardItem(QIcon(":/icons/"+icons_theme+"/deselect_all.png"), "")); - model->setItem(i, 1, new QStandardItem(QString("[%1] %2").arg(year).arg(name))); + model->setItem(i, 1, new QStandardItem(QString("[%1] %2").arg(data[name]).arg(name))); i++; } } @@ -104,6 +114,11 @@ LibraryForm::LibraryForm(Library *lib, QWidget *parent) : _model->setColumnCount(2); _state = STATE_NONE; _tools_widget = new ToolsWidget(this); + QPushButton *search_in_library = new QPushButton(QIcon(":/icons/"+_icons_theme+"/search.png"), "", _tools_widget); + search_in_library->setFlat(true); + search_in_library->setCheckable(true); + _tools_widget->layout()->addItem(new QSpacerItem(20, 20)); + _tools_widget->layout()->addWidget(search_in_library); ui->setupUi(this); ui->listView->setModel(_model); ui->listView->setColumnWidth(0, 70); @@ -127,6 +142,7 @@ LibraryForm::LibraryForm(Library *lib, QWidget *parent) : connect(_tools_widget, SIGNAL(prevSearch()), this, SLOT(prevItem())); connect(_tools_widget, SIGNAL(toggleFullscreen(bool)), this, SIGNAL(fullscreen(bool))); connect(ui->moreButton, SIGNAL(clicked()), this, SLOT(_more_button())); + connect(search_in_library, SIGNAL(toggled(bool)), this, SLOT(_search_button(bool))); _view_button(); _current_playlist_changed = true; _top_gradient = ui->topWidget->styleSheet(); @@ -306,6 +322,13 @@ void LibraryForm::_add_button() { _lib->saveCurrentPlaylist(cur); _current_playlist_changed = true; break; + case STATE_SEARCH: + foreach (QModelIndex id, selected) { + _add_track(&cur, _current_tracks.at(id.row())); + } + _lib->saveCurrentPlaylist(cur); + _current_playlist_changed = true; + break; default: emit done(); return; @@ -676,7 +699,7 @@ void LibraryForm::_process_selection(QItemSelection selected, QItemSelection des void LibraryForm::_process_dblclick(QModelIndex id) { if (id.column() == 0) return; - if (_state == STATE_TRACK || _state == STATE_PLAYLIST_TRACK) { + if (_state == STATE_TRACK || _state == STATE_PLAYLIST_TRACK || _state == STATE_SEARCH) { Playlist cur = _lib->getCurrentPlaylist(); Track track = _current_tracks.at(id.row()); cur.addTrack(track); @@ -687,3 +710,39 @@ void LibraryForm::_process_dblclick(QModelIndex id) { } } +void LibraryForm::_search_button(bool state) { + ui->moreButton->setEnabled(!state); + _tools_widget->toggleArrows(!state); + ui->backButton->setEnabled(!state); + _tools_widget->setFocus(); + _tools_widget->reset(); + if (state) { + ui->listLabel->setText("Search in library"); + ui->deleteButton->setIcon(QIcon()); + ui->deleteButton->setEnabled(false); + ui->useButton->setIcon(QIcon()); + ui->useButton->setEnabled(false); + ui->addButton->setIcon(QIcon(":/icons/"+_icons_theme+"/add.png")); + ui->addButton->setEnabled(true); + disconnect(_tools_widget, SIGNAL(search(QString)), this, SLOT(search(QString))); + connect(_tools_widget, SIGNAL(search(QString)), this, SLOT(_search_in_library(QString))); + _model->clear(); + _state = STATE_SEARCH; + } else { + _view_button(); + connect(_tools_widget, SIGNAL(search(QString)), this, SLOT(search(QString))); + disconnect(_tools_widget, SIGNAL(search(QString)), this, SLOT(_search_in_library(QString))); + } +} + +void LibraryForm::_search_in_library(QString pattern) { + pattern = pattern.trimmed(); + if (pattern.isEmpty()) { + _model->clear(); + return; + } + _current_tracks = _lib->search(pattern); + __fill_model_tracks(_model, _current_tracks, _icons_theme); + ui->listView->setColumnWidth(0, 70); + ui->listView->scrollToTop(); +} diff --git a/src/libraryform.h b/src/libraryform.h index f3133ee..59bb9a0 100644 --- a/src/libraryform.h +++ b/src/libraryform.h @@ -39,7 +39,7 @@ using SomePlayer::DataObjects::Library; using SomePlayer::DataObjects::Track; using SomePlayer::DataObjects::Playlist; -enum LibraryFormListState {STATE_NONE, STATE_ARTIST, STATE_ALBUM, STATE_TRACK, STATE_PLAYLIST, STATE_PLAYLIST_TRACK, STATE_DYNAMIC}; +enum LibraryFormListState {STATE_NONE, STATE_ARTIST, STATE_ALBUM, STATE_TRACK, STATE_PLAYLIST, STATE_PLAYLIST_TRACK, STATE_DYNAMIC, STATE_SEARCH}; class LibraryForm : public QWidget { @@ -78,6 +78,8 @@ private slots: void _process_dblclick(QModelIndex); void _process_selection(QItemSelection, QItemSelection); void _more_button(); + void _search_button(bool); + void _search_in_library(QString); private: Ui::LibraryForm *ui; diff --git a/src/settingsdialog.cpp b/src/settingsdialog.cpp index b4edd1f..10e5831 100644 --- a/src/settingsdialog.cpp +++ b/src/settingsdialog.cpp @@ -34,13 +34,13 @@ SettingsDialog::SettingsDialog(QWidget *parent) : QString orientation = config.getValue("ui/orientation").toString(); QString icons_theme = config.getValue("ui/iconstheme").toString(); QString gradient = config.getValue("ui/gradient").toString(); - ui->albumsSortAButton->setChecked(true); // defaule sorting + ui->albumsSortDButton->setChecked(true); // defaule sorting ui->showTrackLenghtYButton->setChecked(true); // show by default ui->orientationLButton->setChecked(true); ui->iconsWButton->setChecked(true); ui->gradientYButton->setChecked(true); - if (albumSorting == "date") { - ui->albumsSortDButton->setChecked(true); + if (albumSorting == "alphabet") { + ui->albumsSortAButton->setChecked(true); } if (showTrackLenght == "no") { ui->showTrackLenghtNButton->setChecked(true); @@ -67,9 +67,6 @@ SettingsDialog::SettingsDialog(QWidget *parent) : connect (ui->iconsWButton, SIGNAL(toggled(bool)), this, SLOT(_set_icons_white(bool))); connect (ui->gradientNButton, SIGNAL(toggled(bool)), this, SLOT(_set_gradient_no(bool))); connect (ui->gradientYButton, SIGNAL(toggled(bool)), this, SLOT(_set_gradient_yes(bool))); - - // disabled to 1.4.0 - ui->albumSortingGroupBox->setVisible(false); } SettingsDialog::~SettingsDialog() diff --git a/src/someplayer.h b/src/someplayer.h index 06eeb9d..56fe37a 100644 --- a/src/someplayer.h +++ b/src/someplayer.h @@ -47,7 +47,7 @@ namespace SomePlayer { #include "config.h" #define _DYNAMIC_PLAYLIST_MAX_COUNT_ 50 -#define _SOMEPLAYER_VERSION_ "1.3.6" +#define _SOMEPLAYER_VERSION_ "1.3.7" #define NDEBUG #define _SERVICE_NAME_ "ru.somebody.someplayer" diff --git a/src/toolswidget.cpp b/src/toolswidget.cpp index 8ba215b..07aea3b 100644 --- a/src/toolswidget.cpp +++ b/src/toolswidget.cpp @@ -69,3 +69,8 @@ void ToolsWidget::show() { updateIcons(); QWidget::show(); } + +void ToolsWidget::toggleArrows(bool state) { + ui->nextButton->setVisible(state); + ui->prevButton->setVisible(state); +} diff --git a/src/toolswidget.h b/src/toolswidget.h index dd8034d..82a9b3b 100644 --- a/src/toolswidget.h +++ b/src/toolswidget.h @@ -39,6 +39,7 @@ public: public slots: void updateIcons(); void show(); + void toggleArrows(bool); signals: void toggleFullscreen(bool); diff --git a/src/ui/toolswidget.ui b/src/ui/toolswidget.ui index fc1bd3f..f21d90e 100644 --- a/src/ui/toolswidget.ui +++ b/src/ui/toolswidget.ui @@ -59,7 +59,7 @@ - 26 + 20 20 -- 1.7.9.5