From e1ad9ba325c1e8e23b7d484d967fc04626883524 Mon Sep 17 00:00:00 2001 From: Nikolay Tischenko Date: Wed, 22 Sep 2010 14:15:00 +0700 Subject: [PATCH] Implemented search --- src/libraryform.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ src/libraryform.h | 7 +++++++ src/mainwindow.cpp | 9 +++++++++ src/playerform.cpp | 32 ++++++++++++++++++++++++++++++++ src/playerform.h | 1 + src/trackrenderer.cpp | 9 ++++++++- src/trackrenderer.h | 4 ++++ 7 files changed, 102 insertions(+), 1 deletion(-) diff --git a/src/libraryform.cpp b/src/libraryform.cpp index 3704819..6882a44 100644 --- a/src/libraryform.cpp +++ b/src/libraryform.cpp @@ -295,3 +295,44 @@ void LibraryForm::_delete_track(Track track) { void LibraryForm::_use_button() { _lib->saveCurrentPlaylist(_current_playlist); } + +void LibraryForm::search(QString &pattern) { + _search_pattern = pattern; + _search_current_id = -1; + nextItem(); +} + +void LibraryForm::nextItem() { + QString data = _model->index(_search_current_id, 0).data().toString(); + for (int i = _search_current_id+1; i < _model->rowCount(); i++) { + data = _model->index(i, 0).data().toString(); + if (data.contains(_search_pattern, Qt::CaseInsensitive)) { + _search_current_id = i; + break; + } + } + QModelIndex id = _model->index(_search_current_id, 0); + ui->listView->selectionModel()->clearSelection(); + ui->listView->selectionModel()->select(id, QItemSelectionModel::Select); + ui->listView->scrollTo(id); +} + +void LibraryForm::prevItem() { + QString data = _model->index(_search_current_id, 0).data().toString(); + for (int i = _search_current_id-1; i >= 0; i--) { + data = _model->index(i, 0).data().toString(); + if (data.contains(_search_pattern, Qt::CaseInsensitive)) { + _search_current_id = i; + break; + } + } + QModelIndex id = _model->index(_search_current_id, 0); + ui->listView->selectionModel()->clearSelection(); + ui->listView->selectionModel()->select(id, QItemSelectionModel::Select); + ui->listView->scrollTo(id); +} + +void LibraryForm::cancelSearch() { + _search_pattern = ""; + ui->listView->selectionModel()->clearSelection(); +} diff --git a/src/libraryform.h b/src/libraryform.h index 38cf8cd..fb33ba9 100644 --- a/src/libraryform.h +++ b/src/libraryform.h @@ -30,6 +30,11 @@ signals: void player(); void busy(QString); void done(); +public slots: + void search(QString &); + void nextItem(); + void prevItem(); + void cancelSearch(); private slots: void _player(); void _view_button(); @@ -50,6 +55,8 @@ private: QString _current_album; Playlist _current_playlist; QList _current_tracks; + QString _search_pattern; + int _search_current_id; void _add_artist(QString artist); void _add_album(QString artist, QString album); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index dc82962..3ad7ea1 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -123,6 +123,7 @@ void MainWindow::_toggle_search_line() { void MainWindow::showSearchPanel() { ui->searchButton->show(); + ui->searchLine->setFocus(); } void MainWindow::hideSearchPanel() { @@ -137,24 +138,32 @@ void MainWindow::hideSearchPanel() { void MainWindow::_search(QString pattern) { if (ui->stackedWidget->currentIndex() == 0) { // player _player_form->search(pattern); + } else if (ui->stackedWidget->currentIndex() == 1) { // library + _library_form->search(pattern); } } void MainWindow::_nextItem() { if (ui->stackedWidget->currentIndex() == 0) { // player _player_form->nextItem(); + } else if (ui->stackedWidget->currentIndex() == 1) { // library + _library_form->nextItem(); } } void MainWindow::_prevItem() { if (ui->stackedWidget->currentIndex() == 0) { // player _player_form->prevItem(); + } else if (ui->stackedWidget->currentIndex() == 1) { // library + _library_form->prevItem(); } } void MainWindow::_cancelSearch() { if (ui->stackedWidget->currentIndex() == 0) { // player _player_form->cancelSearch(); + } else if (ui->stackedWidget->currentIndex() == 1) { // library + _library_form->cancelSearch(); } } diff --git a/src/playerform.cpp b/src/playerform.cpp index 6bb2379..ae9948b 100644 --- a/src/playerform.cpp +++ b/src/playerform.cpp @@ -209,14 +209,46 @@ void PlayerForm::_toggle_repeat() { void PlayerForm::search(QString &pattern) { _search_pattern = pattern; + _search_current_id = -1; + nextItem(); } void PlayerForm::nextItem() { + QString data = _model->index(_search_current_id, 0).data().toString(); + for (int i = _search_current_id+1; i < _model->rowCount(); i++) { + data = _model->index(i, 0).data().toString(); + if (data.contains(_search_pattern, Qt::CaseInsensitive)) { + _search_current_id = i; + break; + } + } + QModelIndex id = _model->index(_search_current_id, 0); + _track_renderer->setSearchRow(_search_current_id); + ui->playlistView->scrollTo(id); + ui->playlistView->hide(); + ui->playlistView->show(); } void PlayerForm::prevItem() { + QString data = _model->index(_search_current_id, 0).data().toString(); + for (int i = _search_current_id-1; i >= 0; i--) { + data = _model->index(i, 0).data().toString(); + if (data.contains(_search_pattern, Qt::CaseInsensitive)) { + _search_current_id = i; + break; + } + } + QModelIndex id = _model->index(_search_current_id, 0); + _track_renderer->setSearchRow(_search_current_id); + ui->playlistView->scrollTo(id); + ui->playlistView->hide(); + ui->playlistView->show(); } void PlayerForm::cancelSearch() { _search_pattern = ""; + _track_renderer->setSearchRow(-1); + ui->playlistView->scrollTo(_model->index(_track_renderer->activeRow(), 0)); + ui->playlistView->hide(); + ui->playlistView->show(); } diff --git a/src/playerform.h b/src/playerform.h index 9d74ad7..343b457 100644 --- a/src/playerform.h +++ b/src/playerform.h @@ -68,6 +68,7 @@ private: TrackRenderer *_track_renderer; void _display_track(Track); + int _search_current_id; }; #endif // PLAYERFORM_H diff --git a/src/trackrenderer.cpp b/src/trackrenderer.cpp index 339f2e3..aabb48f 100644 --- a/src/trackrenderer.cpp +++ b/src/trackrenderer.cpp @@ -23,13 +23,16 @@ void TrackRenderer::paint(QPainter *painter, const QStyleOptionViewItem &option, QPen npen (QColor::fromRgb(80, 130, 255, 50)); QPen apen (QColor::fromRgb(255, 255, 255, 128)); QPen spen (QColor::fromRgb(100, 150, 220)); + QPen sspen (QColor::fromRgb(100, 220, 150)); f.setBold(true); painter->setFont(f); f.setBold(false); painter->setPen(npen); painter->drawLine(x1, y1, x2, y1); - if (index.row() == _active_row) { + if (index.row() == _search_row) { + painter->setPen(sspen); + } else if (index.row() == _active_row) { painter->setPen(spen); } else { painter->setPen(pen); @@ -54,3 +57,7 @@ QSize TrackRenderer::sizeHint(const QStyleOptionViewItem &option, const QModelIn void TrackRenderer::setActiveRow(int r) { _active_row = r; } + +void TrackRenderer::setSearchRow(int r) { + _search_row = r; +} diff --git a/src/trackrenderer.h b/src/trackrenderer.h index c18a187..da0d676 100644 --- a/src/trackrenderer.h +++ b/src/trackrenderer.h @@ -19,8 +19,12 @@ signals: public slots: void setActiveRow(int); + void setSearchRow(int); + int activeRow() {return _active_row;} + int searchRow() {return _search_row;} private: int _active_row; + int _search_row; }; -- 1.7.9.5