/*************************************************************************** * Copyright (C) 2009-2013 by Ilya Kotov * * forkotov02@hotmail.ru * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "actionmanager.h" #include "playlistbrowser.h" PlayListBrowser::PlayListBrowser(PlayListManager *manager, QWidget *parent) : QWidget(parent) { m_lineEdit = new QLineEdit(this); m_lineEdit->installEventFilter(this); m_lineEdit->setContentsMargins(5,5,5,0); m_listView = new QListView(this); m_listView->setFrameStyle(QFrame::NoFrame); m_listView->setEditTriggers(QAbstractItemView::NoEditTriggers); m_listView->installEventFilter(this); QVBoxLayout *layout = new QVBoxLayout(); layout->setContentsMargins(0,0,0,0); layout->addWidget(m_lineEdit); layout->addWidget(m_listView); setLayout(layout); m_pl_manager = manager; connect(m_pl_manager, SIGNAL(playListsChanged()), SLOT(updateList())); //actions m_listView->setContextMenuPolicy(Qt::ActionsContextMenu); m_listView->addAction(ACTION(ActionManager::PL_RENAME)); m_listView->addAction(ACTION(ActionManager::PL_CLOSE)); m_listModel = new QStandardItemModel(this); m_proxyModel = new QSortFilterProxyModel(this); m_proxyModel->setDynamicSortFilter(true); m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); m_proxyModel->setSourceModel(m_listModel); m_listView->setModel(m_proxyModel); connect(m_lineEdit, SIGNAL(textChanged(QString)), SLOT(onLineEditTextChanged(QString))); connect(m_listView, SIGNAL(activated(QModelIndex)), SLOT(onListViewActivated(QModelIndex))); connect(m_listView->selectionModel(), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)), SLOT(updateCurrentRow(QModelIndex,QModelIndex))); updateList(); } PlayListBrowser::~PlayListBrowser() {} void PlayListBrowser::updateList() { m_listView->selectionModel()->blockSignals(true); m_listModel->clear(); foreach(PlayListModel *model, m_pl_manager->playLists()) { QStandardItem *item = new QStandardItem(model->name()); if(m_pl_manager->currentPlayList() == model) { QFont font = item->font(); font.setBold(true); item->setFont(font); } m_listModel->appendRow(item); if(m_pl_manager->selectedPlayList() == model) { m_listView->setCurrentIndex(m_proxyModel->mapFromSource(m_listModel->indexFromItem(item))); } } m_listView->selectionModel()->blockSignals(false); } void PlayListBrowser::onLineEditTextChanged(const QString &str) { m_listView->selectionModel()->blockSignals(true); m_proxyModel->setFilterFixedString(str); m_listView->selectionModel()->blockSignals(false); } void PlayListBrowser::onListViewActivated(const QModelIndex &index) { int row = m_proxyModel->mapToSource(index).row(); if(row >= 0) { m_pl_manager->activatePlayList(row); m_pl_manager->selectPlayList(row); } } void PlayListBrowser::updateCurrentRow(QModelIndex index, QModelIndex) { int row = m_proxyModel->mapToSource(index).row(); if(row >= 0) m_pl_manager->selectPlayList(row); } bool PlayListBrowser::eventFilter(QObject *o, QEvent *e) { if((o == m_lineEdit || o == m_listView) && e->type() == QEvent::ShortcutOverride) { e->accept(); return false; } if(o == m_lineEdit && e->type() == QEvent::KeyPress) { QKeyEvent *key_event = static_cast(e); QModelIndex index = m_listView->currentIndex(); bool select_first = false; if(!index.isValid() && m_proxyModel->rowCount()) { select_first = true; index = m_proxyModel->index(0,0); } if(key_event->key() == Qt::Key_Up) { if(!select_first) index = m_proxyModel->index(index.row() - 1, index.column()); if(index.isValid()) m_listView->setCurrentIndex(index); return true; } else if(key_event->key() == Qt::Key_Down) { if(!select_first) index = m_proxyModel->index(index.row() + 1, index.column()); if(index.isValid()) m_listView->setCurrentIndex(index); return true; } } return QWidget::eventFilter(o, e); }