_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() {
#include "dbstorage.h"
#include <QSqlQuery>
#include <QSqlResult>
+#include <QDebug>
using namespace SomePlayer::Storage;
using namespace SomePlayer::DataObjects;
"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");
"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() {
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;
}
}
}
+
+QList<Track> DbStorage::search(QString pattern) {
+ QList <Track> 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;
+}
Playlist getNeverPlayed();
Playlist getRecentlyAdded();
+ QList<Track> search(QString pattern);
+
void removeTrack(Track track);
void addToFavorites(Track track);
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;
}
_resolver->updateTags(ntrack);
}
+
+QList<Track> Library::search(QString pattern) {
+ return _library_storage->search(pattern);
+}
QMap<QString, int> getAlbumsForArtist(QString artist);
QList<Track> getTracksForAlbum(QString album, QString artist);
+ QList<Track> search(QString pattern);
+
Playlist getFavorites();
Playlist getMostPlayed();
Playlist getNeverPlayed();
model->clear();
int count = data.count();
model->setRowCount(count);
- QMap<int, QList<QString> > years;
- foreach (QString name, data.keys()) {
- years[data[name]].append(name);
- }
- QList<int> 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<int, QList<QString> > years;
+ foreach (QString name, data.keys()) {
+ years[data[name]].append(name);
+ }
+ QList<int> 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<QString> 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++;
}
}
_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);
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();
_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;
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);
}
}
+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();
+}
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
{
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;
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);
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()
#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"
updateIcons();
QWidget::show();
}
+
+void ToolsWidget::toggleArrows(bool state) {
+ ui->nextButton->setVisible(state);
+ ui->prevButton->setVisible(state);
+}
public slots:
void updateIcons();
void show();
+ void toggleArrows(bool);
signals:
void toggleFullscreen(bool);
</property>
<property name="sizeHint" stdset="0">
<size>
- <width>26</width>
+ <width>20</width>
<height>20</height>
</size>
</property>