diff options
Diffstat (limited to 'src/plugins/Ui')
| -rw-r--r-- | src/plugins/Ui/qsui/keyboardmanager.cpp | 28 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/listwidget.cpp | 120 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/listwidget.h | 16 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/mainwindow.cpp | 2 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/qsuiquicksearch.cpp | 77 | ||||
| -rw-r--r-- | src/plugins/Ui/qsui/qsuiquicksearch.h | 10 |
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; }; |
