Implemented search
authorNikolay Tischenko <niktischenko@gmail.com>
Wed, 22 Sep 2010 07:15:00 +0000 (14:15 +0700)
committerNikolay Tischenko <niktischenko@gmail.com>
Wed, 22 Sep 2010 07:15:00 +0000 (14:15 +0700)
src/libraryform.cpp
src/libraryform.h
src/mainwindow.cpp
src/playerform.cpp
src/playerform.h
src/trackrenderer.cpp
src/trackrenderer.h

index 3704819..6882a44 100644 (file)
@@ -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();
+}
index 38cf8cd..fb33ba9 100644 (file)
@@ -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<Track> _current_tracks;
+       QString _search_pattern;
+       int _search_current_id;
 
        void _add_artist(QString artist);
        void _add_album(QString artist, QString album);
index dc82962..3ad7ea1 100644 (file)
@@ -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();
        }
 }
 
index 6bb2379..ae9948b 100644 (file)
@@ -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();
 }
index 9d74ad7..343b457 100644 (file)
@@ -68,6 +68,7 @@ private:
 
        TrackRenderer *_track_renderer;
        void _display_track(Track);
+       int _search_current_id;
 };
 
 #endif // PLAYERFORM_H
index 339f2e3..aabb48f 100644 (file)
@@ -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;
+}
index c18a187..da0d676 100644 (file)
@@ -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;
 
 };