aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/Ui')
-rw-r--r--src/plugins/Ui/skinned/forms/playlistbrowser.ui76
-rw-r--r--src/plugins/Ui/skinned/playlistbrowser.cpp147
-rw-r--r--src/plugins/Ui/skinned/playlistbrowser.h16
3 files changed, 157 insertions, 82 deletions
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 @@
<property name="leftMargin">
<number>6</number>
</property>
- <property name="topMargin">
- <number>9</number>
- </property>
<property name="rightMargin">
<number>6</number>
</property>
<property name="bottomMargin">
<number>6</number>
</property>
- <property name="spacing">
- <number>6</number>
- </property>
<item row="0" column="0" colspan="5">
- <widget class="QListWidget" name="listWidget">
- <property name="selectionMode">
- <enum>QAbstractItemView::ExtendedSelection</enum>
- </property>
- <property name="selectionBehavior">
- <enum>QAbstractItemView::SelectRows</enum>
- </property>
- </widget>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Filter:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLineEdit" name="filterLineEdit"/>
+ </item>
+ </layout>
</item>
- <item row="1" column="0">
+ <item row="2" column="0">
<widget class="QPushButton" name="newButton">
<property name="text">
<string>New</string>
</property>
</widget>
</item>
- <item row="1" column="1">
+ <item row="2" column="1">
<widget class="QPushButton" name="deleteButton">
<property name="text">
<string>Delete</string>
</property>
</widget>
</item>
- <item row="1" column="4">
- <widget class="QDialogButtonBox" name="buttonBox">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="standardButtons">
- <set>QDialogButtonBox::Close</set>
- </property>
- </widget>
- </item>
- <item row="1" column="2">
+ <item row="2" column="2">
<widget class="QToolButton" name="downButton">
<property name="text">
<string>...</string>
@@ -73,7 +61,7 @@
</property>
</widget>
</item>
- <item row="1" column="3">
+ <item row="2" column="3">
<widget class="QToolButton" name="upButton">
<property name="text">
<string>...</string>
@@ -86,8 +74,40 @@
</property>
</widget>
</item>
+ <item row="2" column="4">
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Close</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="5">
+ <widget class="QListView" name="listView">
+ <property name="editTriggers">
+ <set>QAbstractItemView::NoEditTriggers</set>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::SingleSelection</enum>
+ </property>
+ <property name="selectionBehavior">
+ <enum>QAbstractItemView::SelectRows</enum>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
+ <tabstops>
+ <tabstop>filterLineEdit</tabstop>
+ <tabstop>listView</tabstop>
+ <tabstop>newButton</tabstop>
+ <tabstop>deleteButton</tabstop>
+ <tabstop>downButton</tabstop>
+ <tabstop>upButton</tabstop>
+ <tabstop>buttonBox</tabstop>
+ </tabstops>
<resources/>
<connections>
<connection>
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);
}
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 <forkotov02@hotmail.ru>
@@ -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