aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Ui/qsui/listwidget.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2017-08-27 19:50:42 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2017-08-27 19:50:42 +0000
commitbfb93b795add0b7eb440cbffdaf9b51b61ec9d6c (patch)
treec6d86521b3ddb80bd58518e0af998dd4c8df8ca5 /src/plugins/Ui/qsui/listwidget.cpp
parent465d171ec72009ec2bdbd41a939a77871bef0fe7 (diff)
downloadqmmp-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.cpp120
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);