aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Ui/skinned/playlistbrowser.cpp
diff options
context:
space:
mode:
authortrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-11-12 11:21:34 +0000
committertrialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38>2013-11-12 11:21:34 +0000
commitf4cd134ee7ce57efb52eea4a13fbecc2d441fd8e (patch)
treebe0c3142c14edbbeb2f3d00a383f7cc3f6a6ef3a /src/plugins/Ui/skinned/playlistbrowser.cpp
parent8b33aab8eee5e85711c479ea054ce0c2dac29bb8 (diff)
downloadqmmp-f4cd134ee7ce57efb52eea4a13fbecc2d441fd8e.tar.gz
qmmp-f4cd134ee7ce57efb52eea4a13fbecc2d441fd8e.tar.bz2
qmmp-f4cd134ee7ce57efb52eea4a13fbecc2d441fd8e.zip
skinned: improved playlist browser
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@3887 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src/plugins/Ui/skinned/playlistbrowser.cpp')
-rw-r--r--src/plugins/Ui/skinned/playlistbrowser.cpp147
1 files changed, 98 insertions, 49 deletions
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 <QApplication>
#include <QStyle>
#include <QKeyEvent>
+#include <QStandardItemModel>
+#include <QSortFilterProxyModel>
#include <qmmpui/playlistmanager.h>
#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 <PlayListModel *> 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<QKeyEvent *>(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);
}