diff options
Diffstat (limited to 'src/plugins/Ui')
| -rw-r--r-- | src/plugins/Ui/skinned/forms/playlistbrowser.ui | 76 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/playlistbrowser.cpp | 147 | ||||
| -rw-r--r-- | src/plugins/Ui/skinned/playlistbrowser.h | 16 |
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 |
