From f64bd2e26416485e770852d1531870632b219cf9 Mon Sep 17 00:00:00 2001 From: w1z7ard Date: Sun, 4 Nov 2007 04:07:23 +0000 Subject: [PATCH] kaboom in search bar, but very close methinks git-svn-id: https://projectm.svn.sourceforge.net/svnroot/projectm/trunk@645 6778bc44-b910-0410-a7a0-be141de4315d --- src/projectM-engine/PresetLoader.cpp | 2 + src/qprojectM/src/QPlaylistModel.cpp | 5 ++- src/qprojectM/src/QPlaylistModel.hpp | 3 +- src/qprojectM/src/QProjectM_MainWindow.cpp | 49 +++++++++++++++++++++- src/qprojectM/src/QProjectM_MainWindow.hpp | 16 ++++--- 5 files changed, 64 insertions(+), 11 deletions(-) diff --git a/src/projectM-engine/PresetLoader.cpp b/src/projectM-engine/PresetLoader.cpp index 28fb97aff..1c717fc0c 100644 --- a/src/projectM-engine/PresetLoader.cpp +++ b/src/projectM-engine/PresetLoader.cpp @@ -166,6 +166,8 @@ unsigned int PresetLoader::addPresetURL(const std::string & url, const std::stri void PresetLoader::removePreset(unsigned int index) { std::vector::iterator pos = m_entries.begin(); + asser(pos != m_entries.end()); + pos += index; m_entries.erase(pos); m_presetNames.erase(pos); diff --git a/src/qprojectM/src/QPlaylistModel.cpp b/src/qprojectM/src/QPlaylistModel.cpp index 32e4f58c1..37f97c81d 100644 --- a/src/qprojectM/src/QPlaylistModel.cpp +++ b/src/qprojectM/src/QPlaylistModel.cpp @@ -10,7 +10,8 @@ QVariant QPlaylistModel::data ( const QModelIndex & index, int role = Qt::Displa if (role == Qt::DisplayRole) return QVariant(QString(m_projectM.getPresetName(index.row()).c_str())); - else + else if (role == QPlaylistModel::URLInfoRole) + return QVariant(QString(m_projectM.getPresetURL(index.row()).c_str())); return QVariant(); } @@ -22,7 +23,7 @@ QVariant QPlaylistModel::headerData ( int section, Qt::Orientation orientation, return QAbstractTableModel::headerData(section, orientation, role); } -int QPlaylistModel::rowCount ( const QModelIndex & parent = QModelIndex() ) const { +int QPlaylistModel::rowCount ( const QModelIndex & parent) const { return m_projectM.getPlaylistSize(); } diff --git a/src/qprojectM/src/QPlaylistModel.hpp b/src/qprojectM/src/QPlaylistModel.hpp index 54faef8a4..22ee9eb20 100644 --- a/src/qprojectM/src/QPlaylistModel.hpp +++ b/src/qprojectM/src/QPlaylistModel.hpp @@ -32,6 +32,7 @@ Q_OBJECT // must include this if you use Qt signals/slots public: +static const int URLInfoRole = 1000; QPlaylistModel(projectM & _projectM, QObject * parent = 0); ~QPlaylistModel() { } @@ -42,7 +43,7 @@ QVariant headerData ( int section, Qt::Orientation orientation, int role = Qt::D void clear(); QVariant data ( const QModelIndex & index, int role) const; -int rowCount ( const QModelIndex & parent) const ; +int rowCount ( const QModelIndex & parent = QModelIndex()) const ; int columnCount ( const QModelIndex & parent) const ; diff --git a/src/qprojectM/src/QProjectM_MainWindow.cpp b/src/qprojectM/src/QProjectM_MainWindow.cpp index f78f05d78..b8ee510f8 100644 --- a/src/qprojectM/src/QProjectM_MainWindow.cpp +++ b/src/qprojectM/src/QProjectM_MainWindow.cpp @@ -47,7 +47,7 @@ QProjectM_MainWindow::QProjectM_MainWindow(const std::string & config_file) this, SLOT(clearPlaylist())); connect(m_QProjectMWidget, SIGNAL(projectM_Initialized()), this, SLOT(postProjectM_Initialize())); - + ui.tableView->setVerticalHeader(0); // ui.tableView->setModel(playlistModel); @@ -102,7 +102,7 @@ void QProjectM_MainWindow::postProjectM_Initialize() { ui.tableView->setModel(playlistModel); connect(m_QProjectMWidget->getQProjectM(), SIGNAL(presetSwitchedSignal(bool,unsigned int)), this, SLOT(updatePlaylistSelection(bool,unsigned int))); - + connect(ui.presetSearchBarLineEdit, SIGNAL(textChanged(const QString&)), this, SLOT(updateFilteredPlaylist(const QString&))); connect(ui.tableView, SIGNAL(activated(const QModelIndex &)), this, SLOT(selectPlaylistItem(const QModelIndex &))); @@ -125,6 +125,8 @@ void QProjectM_MainWindow::keyReleaseEvent ( QKeyEvent * e ) { return; case Qt::Key_F: + //if (ui.presetSearchBarLineEdit->hasFocus()) + // return; this->setWindowState(this->windowState() ^ Qt::WindowFullScreen); return; @@ -281,3 +283,46 @@ QString QProjectM_MainWindow::strippedName(const QString &fullFileName) } +void QProjectM_MainWindow::updateFilteredPlaylist(const QString & text) { + + + const QString & filter = text; + + if (filter.length() < previousFilter.length()) { + + StringPairVector & stringPairs = *exclusionHash.value(previousFilter); + while (!stringPairs.empty()) { + const StringPair & pair = stringPairs.last(); + /// @bug need to do **ordered** insert, or something faster (index reference book keeping?) + playlistModel->appendRow(pair.first, pair.second); + stringPairs.pop_back(); + + } + exclusionHash.remove(previousFilter); + delete(&stringPairs); + + } else { + assert(filter.length() != previousFilter.length()); + StringPairVector * stringPairs = new StringPairVector(); + exclusionHash.insert(filter, stringPairs); + + for (int i = 0; i < playlistModel->rowCount(); i++) { + QModelIndex index = playlistModel->index(i, 0); + const QString & name = playlistModel->data(index, Qt::DisplayRole).toString(); + const QString & url = playlistModel->data(index, QPlaylistModel::URLInfoRole).toString(); + if (!name.contains(filter, Qt::CaseInsensitive)) { + + stringPairs->push_back(StringPair(url, name)); + assert (i < playlistModel->rowCount()); + assert (i >= 0); + std::cerr << "deleting " << i << std::endl; + playlistModel->removeRow(i); + i--; + } + + } + + } + previousFilter = filter; +} + diff --git a/src/qprojectM/src/QProjectM_MainWindow.hpp b/src/qprojectM/src/QProjectM_MainWindow.hpp index e00f172a8..9d940e4a8 100644 --- a/src/qprojectM/src/QProjectM_MainWindow.hpp +++ b/src/qprojectM/src/QProjectM_MainWindow.hpp @@ -31,8 +31,6 @@ #include "libprojectM/projectM.hpp" #include -#include -//#include class QAction; class QMenu; @@ -204,7 +202,7 @@ class QProjectM_MainWindow:public QMainWindow Q_OBJECT public: - + QProjectM_MainWindow(const std::string & config_file); ~QProjectM_MainWindow() {}; void keyReleaseEvent ( QKeyEvent * e ); @@ -214,6 +212,9 @@ public: protected: + + typedef QPair StringPair; + typedef QVector StringPairVector; void closeEvent(QCloseEvent *event); private slots: @@ -223,14 +224,16 @@ private slots: void postProjectM_Initialize(); void updatePlaylistSelection(bool hardCut, unsigned int index); void selectPlaylistItem(const QModelIndex & index); - + void updateFilteredPlaylist(const QString & text); + private: QPlaylistModel * playlistModel; Ui::qProjectM_MainWindow ui; - QHash playlistHash; - + /// example: hashes string "erl" to "Geiss & Sperl, ...", and string "erla" to "Berlap, ..." + QHash exclusionHash; + QTimer * m_timer; void createActions(); void createMenus(); @@ -252,6 +255,7 @@ private: QAction *aboutAct; QAction *aboutQtAct; + QString previousFilter; QProjectMFileDialog * m_QProjectMFileDialog; };