From f4cd134ee7ce57efb52eea4a13fbecc2d441fd8e Mon Sep 17 00:00:00 2001 From: trialuser02 Date: Tue, 12 Nov 2013 11:21:34 +0000 Subject: skinned: improved playlist browser git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3887 90c681e8-e032-0410-971d-27865f9a5e38 --- src/plugins/Ui/skinned/forms/playlistbrowser.ui | 76 +++++++----- src/plugins/Ui/skinned/playlistbrowser.cpp | 147 ++++++++++++++++-------- src/plugins/Ui/skinned/playlistbrowser.h | 16 ++- 3 files changed, 157 insertions(+), 82 deletions(-) (limited to 'src/plugins/Ui') diff --git a/src/plugins/Ui/skinned/forms/playlistbrowser.ui b/src/plugins/Ui/skinned/forms/playlistbrowser.ui index 0f9280905..4b1337144 100644 --- a/src/plugins/Ui/skinned/forms/playlistbrowser.ui +++ b/src/plugins/Ui/skinned/forms/playlistbrowser.ui @@ -17,53 +17,41 @@ 6 - - 9 - 6 6 - - 6 - - - - QAbstractItemView::ExtendedSelection - - - QAbstractItemView::SelectRows - - + + + + + Filter: + + + + + + + - + New - + Delete - - - - Qt::Horizontal - - - QDialogButtonBox::Close - - - - + ... @@ -73,7 +61,7 @@ - + ... @@ -86,8 +74,40 @@ + + + + Qt::Horizontal + + + QDialogButtonBox::Close + + + + + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::SingleSelection + + + QAbstractItemView::SelectRows + + + + + filterLineEdit + listView + newButton + deleteButton + downButton + upButton + buttonBox + diff --git a/src/plugins/Ui/skinned/playlistbrowser.cpp b/src/plugins/Ui/skinned/playlistbrowser.cpp index 981083124..5acda6718 100644 --- a/src/plugins/Ui/skinned/playlistbrowser.cpp +++ b/src/plugins/Ui/skinned/playlistbrowser.cpp @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include #include "playlistbrowser.h" @@ -30,23 +32,33 @@ PlayListBrowser::PlayListBrowser(PlayListManager *manager, QWidget *parent) : QD setAttribute(Qt::WA_DeleteOnClose, true); setAttribute(Qt::WA_QuitOnClose, false); setWindowModality(Qt::NonModal); - ui.setupUi(this); + m_ui.setupUi(this); + m_ui.filterLineEdit->installEventFilter(this); m_pl_manager = manager; connect(m_pl_manager, SIGNAL(playListsChanged()), SLOT(updateList())); - connect(ui.newButton, SIGNAL(clicked()), m_pl_manager, SLOT(createPlayList())); - updateList(); + connect(m_ui.newButton, SIGNAL(clicked()), m_pl_manager, SLOT(createPlayList())); //actions QAction *renameAct = new QAction(tr("Rename"), this); QAction *removeAct = new QAction(tr("Delete"), this); connect(renameAct,SIGNAL(triggered()), SLOT(rename())); connect(removeAct,SIGNAL(triggered()), SLOT(on_deleteButton_clicked())); - ui.listWidget->setContextMenuPolicy(Qt::ActionsContextMenu); - ui.listWidget->addAction(renameAct); - ui.listWidget->addAction(removeAct); - ui.downButton->setIcon(QApplication::style()->standardIcon(QStyle::SP_ArrowDown)); - ui.upButton->setIcon(QApplication::style()->standardIcon(QStyle::SP_ArrowUp)); - ui.newButton->setIcon(QIcon::fromTheme("document-new")); - ui.deleteButton->setIcon(QIcon::fromTheme("edit-delete")); + m_ui.listView->setContextMenuPolicy(Qt::ActionsContextMenu); + m_ui.listView->addAction(renameAct); + m_ui.listView->addAction(removeAct); + 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_ui.listView->setModel(m_proxyModel); + m_ui.downButton->setIcon(QApplication::style()->standardIcon(QStyle::SP_ArrowDown)); + m_ui.upButton->setIcon(QApplication::style()->standardIcon(QStyle::SP_ArrowUp)); + m_ui.newButton->setIcon(QIcon::fromTheme("document-new")); + m_ui.deleteButton->setIcon(QIcon::fromTheme("edit-delete")); + connect(m_listModel, SIGNAL(itemChanged(QStandardItem*)), SLOT(updatePlayListName(QStandardItem*))); + connect(m_ui.listView->selectionModel(), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)), + SLOT(updateCurrentRow(QModelIndex,QModelIndex))); + updateList(); } PlayListBrowser::~PlayListBrowser() @@ -54,53 +66,76 @@ PlayListBrowser::~PlayListBrowser() void PlayListBrowser::updateList() { - ui.listWidget->clear(); + m_ui.listView->selectionModel()->blockSignals(true); + m_listModel->clear(); foreach(PlayListModel *model, m_pl_manager->playLists()) - ui.listWidget->addItem(model->name()); - ui.listWidget->setCurrentRow (m_pl_manager->selectedPlayListIndex()); - //mark current playlist - int current = m_pl_manager->currentPlayListIndex(); - QListWidgetItem *item = ui.listWidget->item(current); - if(item) { - QFont font = item->font(); - font.setBold(true); - item->setFont(font); + 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_ui.listView->setCurrentIndex(m_proxyModel->mapFromSource(m_listModel->indexFromItem(item))); + } } + m_ui.listView->selectionModel()->blockSignals(false); } -void PlayListBrowser::on_listWidget_itemDoubleClicked(QListWidgetItem *item) +void PlayListBrowser::on_filterLineEdit_textChanged(const QString &str) { - m_pl_manager->activatePlayList(ui.listWidget->row(item)); + m_ui.listView->selectionModel()->blockSignals(true); + m_proxyModel->setFilterFixedString(str); + m_ui.listView->selectionModel()->blockSignals(false); } -void PlayListBrowser::on_listWidget_itemChanged(QListWidgetItem *item) +void PlayListBrowser::on_listView_activated(const QModelIndex &index) { - m_pl_manager->playListAt(ui.listWidget->row(item))->setName(item->text()); + int row = m_proxyModel->mapToSource(index).row(); + if(row >= 0) + { + m_pl_manager->activatePlayList(row); + m_pl_manager->selectPlayList(row); + } +} + +void PlayListBrowser::updatePlayListName(QStandardItem *item) +{ + disconnect(m_pl_manager, SIGNAL(playListsChanged()), this, SLOT(updateList())); + m_pl_manager->playListAt(item->row())->setName(item->text()); + connect(m_pl_manager, SIGNAL(playListsChanged()), SLOT(updateList())); } -void PlayListBrowser::on_listWidget_itemPressed (QListWidgetItem *item) +void PlayListBrowser::updateCurrentRow(QModelIndex index, QModelIndex) { - m_pl_manager->selectPlayList(ui.listWidget->row(item)); + int row = m_proxyModel->mapToSource(index).row(); + if(row >= 0) + m_pl_manager->selectPlayList(row); } void PlayListBrowser::rename() { - QListWidgetItem *item = ui.listWidget->currentItem(); - if(item) - { - item->setFlags(Qt::ItemIsEditable | item->flags()); - ui.listWidget->editItem(item); - } + QModelIndex index = m_ui.listView->currentIndex(); + if(!index.isValid()) + return; + m_ui.listView->edit(index); } void PlayListBrowser::on_deleteButton_clicked() { - QList models; - foreach(QListWidgetItem *item, ui.listWidget->selectedItems()) - models.append(m_pl_manager->playListAt(ui.listWidget->row (item))); - foreach(PlayListModel *model, models) - m_pl_manager->removePlayList(model); + QModelIndexList selectedIndexes; + foreach(QModelIndex index, m_ui.listView->selectionModel()->selectedIndexes()) + { + selectedIndexes << m_proxyModel->mapToSource(index); + } + foreach (QModelIndex index, selectedIndexes) + { + m_pl_manager->removePlayList(index.row()); + } } void PlayListBrowser::on_downButton_clicked() @@ -117,21 +152,35 @@ void PlayListBrowser::on_upButton_clicked() m_pl_manager->move(pos, pos - 1); } -void PlayListBrowser::keyPressEvent(QKeyEvent *e) +bool PlayListBrowser::eventFilter(QObject *o, QEvent *e) { - if(e->key() == Qt::Key_Return) + if(o == m_ui.filterLineEdit && e->type() == QEvent::KeyPress) { - QListWidgetItem *item = ui.listWidget->currentItem(); - if(item) + QKeyEvent *key_event = static_cast(e); + QModelIndex index = m_ui.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_ui.listView->setCurrentIndex(index); + return true; + } + else if(key_event->key() == Qt::Key_Down) { - disconnect(m_pl_manager, SIGNAL(playListsChanged()), this, SLOT(updateList())); - m_pl_manager->activatePlayList(ui.listWidget->row(item)); - m_pl_manager->selectPlayList(ui.listWidget->row(item)); - connect(m_pl_manager, SIGNAL(playListsChanged()), SLOT(updateList())); - updateList(); + if(!select_first) + index = m_proxyModel->index(index.row() + 1, index.column()); + if(index.isValid()) + m_ui.listView->setCurrentIndex(index); + return true; } - e->accept(); } - else - QDialog::keyPressEvent(e); + return QDialog::eventFilter(o, e); } diff --git a/src/plugins/Ui/skinned/playlistbrowser.h b/src/plugins/Ui/skinned/playlistbrowser.h index f78680d4b..54450b663 100644 --- a/src/plugins/Ui/skinned/playlistbrowser.h +++ b/src/plugins/Ui/skinned/playlistbrowser.h @@ -25,6 +25,9 @@ #include "ui_playlistbrowser.h" class PlayListManager; +class QStandardItemModel; +class QSortFilterProxyModel; +class QStandardItem; /** @author Ilya Kotov @@ -38,18 +41,21 @@ public: private slots: void updateList(); - void on_listWidget_itemDoubleClicked(QListWidgetItem *item); - void on_listWidget_itemChanged(QListWidgetItem *item); - void on_listWidget_itemPressed (QListWidgetItem *item); + void on_filterLineEdit_textChanged(const QString &str); + void on_listView_activated(const QModelIndex & index); + void updatePlayListName(QStandardItem *item); + void updateCurrentRow(QModelIndex index, QModelIndex); void rename(); void on_deleteButton_clicked(); void on_downButton_clicked(); void on_upButton_clicked(); private: - void keyPressEvent(QKeyEvent *e); - Ui::PlayListBrowser ui; + bool eventFilter(QObject *o, QEvent *e); + Ui::PlayListBrowser m_ui; PlayListManager *m_pl_manager; + QStandardItemModel* m_listModel; + QSortFilterProxyModel* m_proxyModel; }; #endif // PLAYLISTBROWSER_H -- cgit v1.2.3-13-gbd6f