aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/Ui')
-rw-r--r--src/plugins/Ui/qsui/keyboardmanager.cpp28
-rw-r--r--src/plugins/Ui/qsui/listwidget.cpp120
-rw-r--r--src/plugins/Ui/qsui/listwidget.h16
-rw-r--r--src/plugins/Ui/qsui/mainwindow.cpp2
-rw-r--r--src/plugins/Ui/qsui/qsuiquicksearch.cpp77
-rw-r--r--src/plugins/Ui/qsui/qsuiquicksearch.h10
6 files changed, 126 insertions, 127 deletions
diff --git a/src/plugins/Ui/qsui/keyboardmanager.cpp b/src/plugins/Ui/qsui/keyboardmanager.cpp
index cc480c8c8..d7227c138 100644
--- a/src/plugins/Ui/qsui/keyboardmanager.cpp
+++ b/src/plugins/Ui/qsui/keyboardmanager.cpp
@@ -1,5 +1,5 @@
/***************************************************************************
- * Copyright (C) 2011-2014 by Ilya Kotov *
+ * Copyright (C) 2011-2017 by Ilya Kotov *
* forkotov02@hotmail.ru *
* *
* This program is free software; you can redistribute it and/or modify *
@@ -60,7 +60,7 @@ QList<QAction *> KeyboardManager::actions()
void KeyboardManager::processUp()
{
- if(!m_listWidget)
+ if(!m_listWidget || m_listWidget->filterMode())
return;
int keys = qobject_cast<QAction *>(sender())->shortcut()[0];
@@ -131,13 +131,13 @@ void KeyboardManager::processUp()
if(m_listWidget->anchorIndex() < first_visible)
{
- m_listWidget->scroll (m_listWidget->firstVisibleIndex() - 1);
+ m_listWidget->setViewPosition (m_listWidget->firstVisibleIndex() - 1);
}
}
void KeyboardManager::processDown()
{
- if(!m_listWidget)
+ if(!m_listWidget || m_listWidget->filterMode())
return;
int keys = qobject_cast<QAction *>(sender())->shortcut()[0];
@@ -209,7 +209,7 @@ void KeyboardManager::processDown()
if(m_listWidget->anchorIndex() > last_visible)
{
- m_listWidget->scroll (m_listWidget->firstVisibleIndex() + 1);
+ m_listWidget->setViewPosition (m_listWidget->firstVisibleIndex() + 1);
}
}
@@ -220,7 +220,7 @@ void KeyboardManager::setListWidget(ListWidget *listWidget)
void KeyboardManager::processEnter()
{
- if(!m_listWidget)
+ if(!m_listWidget || m_listWidget->filterMode())
return;
QList<int> rows = m_listWidget->model()->selectedIndexes();
if(rows.isEmpty())
@@ -233,12 +233,12 @@ void KeyboardManager::processEnter()
void KeyboardManager::processPgUp()
{
- if(!m_listWidget)
+ if(!m_listWidget || m_listWidget->filterMode())
return;
int first = m_listWidget->firstVisibleIndex();
int offset = qMax(m_listWidget->firstVisibleIndex() - m_listWidget->visibleRows(), 0);
- m_listWidget->scroll (offset);
+ m_listWidget->setViewPosition (offset);
m_listWidget->model()->clearSelection();
if(m_listWidget->firstVisibleIndex() == first)
@@ -250,13 +250,13 @@ void KeyboardManager::processPgUp()
void KeyboardManager::processPgDown()
{
- if(!m_listWidget)
+ if(!m_listWidget || m_listWidget->filterMode())
return;
int first = m_listWidget->firstVisibleIndex();
int offset = qMin(first + m_listWidget->visibleRows(),
m_listWidget->model()->count() - 1);
- m_listWidget->scroll (offset);
+ m_listWidget->setViewPosition (offset);
m_listWidget->model()->clearSelection();
if(m_listWidget->firstVisibleIndex() == first)
@@ -268,10 +268,10 @@ void KeyboardManager::processPgDown()
void KeyboardManager::processHome()
{
- if(!m_listWidget)
+ if(!m_listWidget || m_listWidget->filterMode())
return;
int keys = qobject_cast<QAction *>(sender())->shortcut()[0];
- m_listWidget->scroll (0);
+ m_listWidget->setViewPosition (0);
if(keys & Qt::ShiftModifier)
{
m_listWidget->model()->setSelected (0, m_listWidget->anchorIndex(), true);
@@ -286,13 +286,13 @@ void KeyboardManager::processHome()
void KeyboardManager::processEnd()
{
- if(!m_listWidget)
+ if(!m_listWidget || m_listWidget->filterMode())
return;
int keys = qobject_cast<QAction *>(sender())->shortcut()[0];
int scroll_to = m_listWidget->model()->count() - m_listWidget->visibleRows();
if(scroll_to >= 0)
- m_listWidget->scroll(scroll_to);
+ m_listWidget->setViewPosition(scroll_to);
if(keys & Qt::ShiftModifier)
{
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);
diff --git a/src/plugins/Ui/qsui/listwidget.h b/src/plugins/Ui/qsui/listwidget.h
index 6fad7139d..0bf154998 100644
--- a/src/plugins/Ui/qsui/listwidget.h
+++ b/src/plugins/Ui/qsui/listwidget.h
@@ -65,16 +65,17 @@ public:
QMenu *menu();
void setMenu(QMenu *menu);
PlayListModel *model();
+ bool filterMode() const;
public slots:
void setModel(PlayListModel *selected, PlayListModel *previous);
void readSettings();
void updateList(int flags);
- void scroll(int); //0-99
-
+ void setViewPosition(int sc);
+ void setFilterString(const QString &str = QString());
signals:
- void selectionChanged();
+ void doubleClicked();
void positionChanged(int, int); //current position, maximum value
protected:
@@ -109,9 +110,9 @@ private:
void recenterTo(int index);
/*!
- * Returns string with queue number or(and) repeate flag for the item number \b i.
+ * Returns string with queue number or(and) repeate flag for the \b item.
*/
- const QString getExtraString(int i);
+ const QString getExtraString(PlayListItem *item);
bool updateRowCount();
void updateScrollBars();
@@ -138,6 +139,11 @@ private:
ListWidgetDrawer m_drawer;
PlayListHeader *m_header;
QScrollBar *m_hslider;
+
+ QString m_filterString;
+ bool m_filterMode;
+ QList<PlayListItem *> m_filteredItems;
+
};
#endif
diff --git a/src/plugins/Ui/qsui/mainwindow.cpp b/src/plugins/Ui/qsui/mainwindow.cpp
index e21b066f0..8c6b8f4cf 100644
--- a/src/plugins/Ui/qsui/mainwindow.cpp
+++ b/src/plugins/Ui/qsui/mainwindow.cpp
@@ -145,7 +145,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
m_volumeSlider->setValue(m_core->volume());
updateVolumeIcon();
//quick search
- m_quickSearch = new QSUIQuickSearch(this);
+ m_quickSearch = new QSUIQuickSearch(m_listWidget, this);
m_quickSearch->setMaximumWidth(250);
//visualization
m_analyzer = new QSUiAnalyzer(this);
diff --git a/src/plugins/Ui/qsui/qsuiquicksearch.cpp b/src/plugins/Ui/qsui/qsuiquicksearch.cpp
index 89160bdbb..2763c9542 100644
--- a/src/plugins/Ui/qsui/qsuiquicksearch.cpp
+++ b/src/plugins/Ui/qsui/qsuiquicksearch.cpp
@@ -23,15 +23,16 @@
#include <QToolButton>
#include <QStyle>
#include <QEvent>
-#include <QApplication>
#include <QDebug>
#include <qmmpui/playlistmanager.h>
#include <qmmpui/playlistmodel.h>
+#include "listwidget.h"
#include "qsuiquicksearch.h"
-QSUIQuickSearch::QSUIQuickSearch(QWidget *parent) :
+QSUIQuickSearch::QSUIQuickSearch(ListWidget *listWidget, QWidget *parent) :
QWidget(parent)
{
+ m_listWidget = listWidget;
m_manager = PlayListManager::instance();
m_lineEdit = new QLineEdit(this);
QHBoxLayout *layout = new QHBoxLayout;
@@ -40,73 +41,7 @@ QSUIQuickSearch::QSUIQuickSearch(QWidget *parent) :
setLayout(layout);
layout->addWidget(m_lineEdit);
m_lineEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
-
- QToolButton *downButton = new QToolButton(this);
- downButton->setAutoRaise(true);
- downButton->setIcon(style()->standardIcon(QStyle::QStyle::SP_ArrowDown));
- layout->addWidget(downButton);
- QToolButton *upButton = new QToolButton(this);
- upButton->setIcon(style()->standardIcon(QStyle::QStyle::SP_ArrowUp));
- upButton->setAutoRaise(true);
- layout->addWidget(upButton);
-
- connect(qApp, SIGNAL(focusChanged(QWidget*,QWidget*)), SLOT(onFocusChanged(QWidget*,QWidget*)));
- connect(m_lineEdit, SIGNAL(textEdited(QString)), SLOT(onTextEdited(QString)));
- connect(downButton, SIGNAL(clicked(bool)), SLOT(onSearchDownClicked()));
- connect(upButton, SIGNAL(clicked(bool)), SLOT(onSearchUpClicked()));
-}
-
-void QSUIQuickSearch::onFocusChanged(QWidget *old, QWidget *now)
-{
- if(now == m_lineEdit)
- {
- qDebug("focus in");
- search(m_lineEdit->text());
- updateSelection();
- }
- else if(old == m_lineEdit)
- qDebug("focus out");
-}
-
-void QSUIQuickSearch::onTextEdited(const QString &str)
-{
- search(str);
- updateSelection();
-}
-
-void QSUIQuickSearch::onSearchUpClicked()
-{
- PlayListModel *model = m_manager->selectedPlayList();
-}
-
-void QSUIQuickSearch::onSearchDownClicked()
-{
- PlayListModel *model = m_manager->selectedPlayList();
-}
-
-void QSUIQuickSearch::search(const QString &str)
-{
- m_indexes.clear();
- if(str.isEmpty())
- return;
-
- PlayListModel *model = m_manager->selectedPlayList();
-
- for(int i = 0; i < model->count(); ++i)
- {
- PlayListItem *item = model->item(i);
- if(item->isGroup())
- continue;
-
- if(!item->formattedTitles().filter(str, Qt::CaseInsensitive).isEmpty())
- m_indexes << i;
- }
-}
-
-void QSUIQuickSearch::updateSelection()
-{
- PlayListModel *model = m_manager->selectedPlayList();
- model->clearSelection();
- model->setSelected(m_indexes);
+ connect(m_lineEdit, SIGNAL(textEdited(QString)), m_listWidget, SLOT(setFilterString(QString)));
+ connect(m_manager, SIGNAL(selectedPlayListChanged(PlayListModel*,PlayListModel*)), m_lineEdit, SLOT(clear()));
+ connect(m_listWidget, SIGNAL(doubleClicked()), m_lineEdit, SLOT(clear()));
}
-
diff --git a/src/plugins/Ui/qsui/qsuiquicksearch.h b/src/plugins/Ui/qsui/qsuiquicksearch.h
index 077bc0a95..2cb0240b1 100644
--- a/src/plugins/Ui/qsui/qsuiquicksearch.h
+++ b/src/plugins/Ui/qsui/qsuiquicksearch.h
@@ -26,6 +26,7 @@
class QLineEdit;
class PlayListManager;
+class ListWidget;
/**
@author Ilya Kotov <forkotov02@hotmail.ru>
@@ -34,20 +35,15 @@ class QSUIQuickSearch : public QWidget
{
Q_OBJECT
public:
- explicit QSUIQuickSearch(QWidget *parent = 0);
+ explicit QSUIQuickSearch(ListWidget *listWidget, QWidget *parent = 0);
private slots:
- void onFocusChanged(QWidget *old, QWidget *now);
void onTextEdited(const QString &str);
- void onSearchUpClicked();
- void onSearchDownClicked();
private:
- void search(const QString &str);
- void updateSelection();
QLineEdit *m_lineEdit;
PlayListManager *m_manager;
- QList<int> m_indexes;
+ ListWidget *m_listWidget;
};