diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2017-08-27 19:50:42 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2017-08-27 19:50:42 +0000 |
| commit | bfb93b795add0b7eb440cbffdaf9b51b61ec9d6c (patch) | |
| tree | c6d86521b3ddb80bd58518e0af998dd4c8df8ca5 /src/plugins/Ui/qsui/listwidget.cpp | |
| parent | 465d171ec72009ec2bdbd41a939a77871bef0fe7 (diff) | |
| download | qmmp-bfb93b795add0b7eb440cbffdaf9b51b61ec9d6c.tar.gz qmmp-bfb93b795add0b7eb440cbffdaf9b51b61ec9d6c.tar.bz2 qmmp-bfb93b795add0b7eb440cbffdaf9b51b61ec9d6c.zip | |
qsui: changed quick search implementation
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@7392 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Ui/qsui/listwidget.cpp')
| -rw-r--r-- | src/plugins/Ui/qsui/listwidget.cpp | 120 |
1 files changed, 91 insertions, 29 deletions
diff --git a/src/plugins/Ui/qsui/listwidget.cpp b/src/plugins/Ui/qsui/listwidget.cpp index bd00ffa49..7274cff57 100644 --- a/src/plugins/Ui/qsui/listwidget.cpp +++ b/src/plugins/Ui/qsui/listwidget.cpp @@ -47,6 +47,7 @@ ListWidget::ListWidget(PlayListModel *model, QWidget *parent) m_popupWidget = 0; m_ui_settings = QmmpUiSettings::instance(); m_menu = 0; + m_filterMode = false; m_model = model; m_timer = new QTimer(this); m_timer->setInterval(50); @@ -71,8 +72,8 @@ ListWidget::ListWidget(PlayListModel *model, QWidget *parent) readSettings(); connect(m_ui_settings, SIGNAL(repeatableTrackChanged(bool)), SLOT(updateRepeatIndicator())); connect(m_timer, SIGNAL(timeout()), SLOT(autoscroll())); - connect(m_scrollBar, SIGNAL(valueChanged (int)), SLOT(scroll(int))); - connect(m_hslider, SIGNAL(valueChanged(int)), m_header, SLOT(scroll(int))); + connect(m_scrollBar, SIGNAL(valueChanged (int)), SLOT(setViewPosition(int))); + connect(m_hslider, SIGNAL(valueChanged(int)), m_header, SLOT(setViewPosition(int))); connect(m_hslider, SIGNAL(valueChanged(int)), this, SLOT(update())); connect(m_model, SIGNAL(scrollToRequest(int)), SLOT(scrollTo(int))); connect(m_model, SIGNAL(listChanged(int)), SLOT(updateList(int))); @@ -153,8 +154,20 @@ PlayListModel *ListWidget::model() return m_model; } +bool ListWidget::filterMode() const +{ + return m_filterMode; +} + void ListWidget::setModel(PlayListModel *selected, PlayListModel *previous) { + if(m_filterMode) + { + m_filterMode = false; + m_first = 0; + m_filteredItems.clear(); + } + if(previous) { previous->setProperty("first_visible", m_first); @@ -216,15 +229,23 @@ void ListWidget::mouseDoubleClickEvent (QMouseEvent *e) { int y = e->y(); int index = indexAt(y); + if (INVALID_INDEX != index) { + if(m_filterMode) + { + m_filterMode = false; + m_filteredItems.clear(); + scrollTo(index); + } + m_model->setCurrent(index); MediaPlayer *player = MediaPlayer::instance(); player->playListManager()->selectPlayList(m_model); player->playListManager()->activatePlayList(m_model); player->stop(); player->play(); - emit selectionChanged(); + emit doubleClicked(); update(); } } @@ -359,48 +380,54 @@ void ListWidget::updateList(int flags) if(updateRowCount()) flags |= PlayListModel::STRUCTURE; + if(flags & PlayListModel::STRUCTURE && m_filterMode) + { + m_filteredItems = m_model->findTracks(m_filterString); + } + if(flags & PlayListModel::CURRENT) recenterTo(m_model->currentIndex()); QList<PlayListItem *> items; + int count = m_filterMode ? m_filteredItems.count() : m_model->count(); if(flags & PlayListModel::STRUCTURE || flags & PlayListModel::CURRENT) { m_scrollBar->blockSignals(true); - if(m_row_count >= m_model->count()) + if(m_row_count >= count) { m_first = 0; m_scrollBar->setMaximum(0); m_scrollBar->setValue(0); emit positionChanged(0,0); } - else if(m_first + m_row_count >= m_model->count()) + else if(m_first + m_row_count >= count) { - m_first = qMax(0, m_model->count() - m_row_count); - m_scrollBar->setMaximum(m_model->count() - m_row_count); + m_first = qMax(0, count - m_row_count); + m_scrollBar->setMaximum(count - m_row_count); m_scrollBar->setValue(m_first); emit positionChanged(m_first, m_first); } else { - m_scrollBar->setMaximum(m_model->count() - m_row_count); + m_scrollBar->setMaximum(count - m_row_count); m_scrollBar->setValue(m_first); - emit positionChanged(m_first, m_model->count() - m_row_count); + emit positionChanged(m_first, count - m_row_count); } m_scrollBar->blockSignals(false); - items = m_model->mid(m_first, m_row_count); + items = m_filterMode ? m_filteredItems.mid(m_first, m_row_count) : m_model->mid(m_first, m_row_count); while(m_rows.count() < qMin(m_row_count, items.count())) m_rows << new ListWidgetRow; while(m_rows.count() > qMin(m_row_count, items.count())) delete m_rows.takeFirst(); - m_scrollBar->setVisible(m_model->count() > m_row_count); + m_scrollBar->setVisible(count > m_row_count); } else { - items = m_model->mid(m_first, m_row_count); + items = m_filterMode ? m_filteredItems.mid(m_first, m_row_count) : m_model->mid(m_first, m_row_count); } if(flags & PlayListModel::STRUCTURE) @@ -452,7 +479,7 @@ void ListWidget::updateList(int flags) row->sizes = m_header->sizes(); row->alignment = m_header->alignment(); - (m_first + i) == m_model->currentIndex() ? row->flags |= ListWidgetRow::CURRENT : + items[i] == m_model->currentTrack() ? row->flags |= ListWidgetRow::CURRENT : row->flags &= ~ListWidgetRow::CURRENT; if(items[i]->isGroup()) @@ -465,8 +492,8 @@ void ListWidget::updateList(int flags) { row->flags &= ~ListWidgetRow::GROUP; row->number = items.at(i)->trackIndex() + 1; - row->length = items[i]->formattedLength(); - row->extraString = getExtraString(m_first + i); + row->length = items.at(i)->formattedLength(); + row->extraString = getExtraString(items.at(i)); } m_drawer.prepareRow(row); //elide titles } @@ -475,6 +502,9 @@ void ListWidget::updateList(int flags) void ListWidget::autoscroll() { + if(m_filterMode) + return; + SimpleSelection sel = m_model->getSelection(m_pressed_index); if ((sel.m_top == 0 && m_scroll_direction == TOP && sel.count() > 1) || (sel.m_bottom == m_model->count() - 1 && m_scroll_direction == DOWN && sel.count() > 1)) @@ -502,18 +532,35 @@ void ListWidget::updateRepeatIndicator() void ListWidget::scrollTo(int index) { - if (m_row_count) + if (m_row_count && !m_filterMode) { recenterTo(index); updateList(PlayListModel::STRUCTURE); } } -void ListWidget::scroll(int sc) +void ListWidget::setViewPosition(int sc) { if (m_model->count() <= m_row_count) return; - m_first = sc; //*(m_model->count() - m_rows)/99; + m_first = sc; + updateList(PlayListModel::STRUCTURE); +} + +void ListWidget::setFilterString(const QString &str) +{ + m_filterString = str; + if(str.isEmpty()) + { + m_filteredItems.clear(); + m_filterString.clear(); + m_filterMode = false; + } + else + { + m_filterMode = true; + } + m_first = 0; updateList(PlayListModel::STRUCTURE); } @@ -531,7 +578,7 @@ void ListWidget::dragEnterEvent(QDragEnterEvent *event) void ListWidget::dropEvent(QDropEvent *event) { - if (event->mimeData()->hasUrls()) + if (!m_filterMode && event->mimeData()->hasUrls()) { QList<QUrl> list_urls = event->mimeData()->urls(); event->acceptProposedAction(); @@ -565,13 +612,13 @@ void ListWidget::dragMoveEvent(QDragMoveEvent *event) } } -const QString ListWidget::getExtraString(int i) +const QString ListWidget::getExtraString(PlayListItem *item) { - QString extra_string; + if(item->isGroup()) + return QString(); - PlayListTrack *track = m_model->track(i); - if(!track) - return extra_string; + QString extra_string; + PlayListTrack *track = static_cast<PlayListTrack *>(item); if (m_show_protocol && track->url().contains("://")) extra_string = "[" + track->url().split("://").at(0) + "]"; @@ -582,7 +629,7 @@ const QString ListWidget::getExtraString(int i) extra_string += "|"+QString::number(index + 1)+"|"; } - if(m_model->currentIndex() == i && m_ui_settings->isRepeatableTrack()) + if(m_model->currentTrack() == track && m_ui_settings->isRepeatableTrack()) extra_string += "|R|"; else if(m_model->isStopAfter(track)) extra_string += "|S|"; @@ -630,6 +677,9 @@ void ListWidget::updateScrollBars() void ListWidget::mouseMoveEvent(QMouseEvent *e) { + if(m_filterMode) + return; + if(e->buttons() == Qt::LeftButton) { if (m_prev_y > e->y()) @@ -695,10 +745,22 @@ void ListWidget::mouseReleaseEvent(QMouseEvent *e) int ListWidget::indexAt(int y) const { y -= m_header->isVisible() ? m_header->height() : 0; - for (int i = 0; i < qMin(m_row_count, m_model->count() - m_first); ++i) + + if(m_filterMode) { - if ((y >= i * m_drawer.rowHeight()) && (y <= (i+1) * m_drawer.rowHeight())) - return m_first + i; + for (int i = 0; i < qMin(m_row_count, m_filteredItems.count() - m_first); ++i) + { + if ((y >= i * m_drawer.rowHeight()) && (y <= (i+1) * m_drawer.rowHeight())) + return m_model->indexOf(m_filteredItems.at(m_first + i)); + } + } + else + { + for (int i = 0; i < qMin(m_row_count, m_model->count() - m_first); ++i) + { + if ((y >= i * m_drawer.rowHeight()) && (y <= (i+1) * m_drawer.rowHeight())) + return m_first + i; + } } return INVALID_INDEX; } @@ -711,7 +773,7 @@ void ListWidget::contextMenuEvent(QContextMenuEvent * event) void ListWidget::recenterTo(int index) { - if (m_row_count) + if (m_row_count && !m_filterMode) { if (m_first + m_row_count < index + 1) m_first = qMin(m_model->count() - m_row_count, index - m_row_count/2); |
