diff options
author | Tomaz Canabrava <tomaz.canabrava@intel.com> | 2014-09-17 15:45:18 -0300 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2014-09-17 15:28:04 -0700 |
commit | a6e9a1eab561af3255d99d31011c57135a90ca3f (patch) | |
tree | 424a8843682411c072a2fddac6e89924994388d0 /qt-ui | |
parent | 7a90b9d7647537057f574916314a9f488e900e8a (diff) | |
download | subsurface-a6e9a1eab561af3255d99d31011c57135a90ca3f.tar.gz |
Implement the TagFilter model.
This model accepts check / unchedk. Now, I need to also
plug the result of the check / uncheck to the list model.
Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-ui')
-rw-r--r-- | qt-ui/mainwindow.cpp | 1 | ||||
-rw-r--r-- | qt-ui/models.cpp | 51 | ||||
-rw-r--r-- | qt-ui/models.h | 14 | ||||
-rw-r--r-- | qt-ui/simplewidgets.cpp | 5 |
4 files changed, 71 insertions, 0 deletions
diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp index 8cdf6de88..ec5fbd00f 100644 --- a/qt-ui/mainwindow.cpp +++ b/qt-ui/mainwindow.cpp @@ -181,6 +181,7 @@ void MainWindow::refreshDisplay(bool doRecreateDiveList) void MainWindow::recreateDiveList() { ui.ListWidget->reload(DiveTripModel::CURRENT); + TagFilterModel::instance()->repopulate(); } void MainWindow::current_dive_changed(int divenr) diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp index 5266130b4..b22702795 100644 --- a/qt-ui/models.cpp +++ b/qt-ui/models.cpp @@ -2099,3 +2099,54 @@ int LanguageModel::rowCount(const QModelIndex &parent) const { return languages.count(); } + + +TagFilterModel::TagFilterModel(QObject *parent): QStringListModel(parent), checkState(NULL) +{ +} + +TagFilterModel *TagFilterModel::instance() +{ + static TagFilterModel *self = new TagFilterModel(); + return self; +} + +QVariant TagFilterModel::data(const QModelIndex &index, int role) const +{ + if(role == Qt::CheckStateRole){ + return checkState[index.row()] ? Qt::Checked : Qt::Unchecked; + } else if (role == Qt::DisplayRole) { + return stringList()[index.row()]; + } + return QVariant(); +} + +Qt::ItemFlags TagFilterModel::flags(const QModelIndex &index) const +{ + return QStringListModel::flags(index) | Qt::ItemIsUserCheckable; +} + +void TagFilterModel::repopulate() +{ + if (g_tag_list == NULL) + return; + QStringList list; + struct tag_entry *current_tag_entry = g_tag_list->next; + while (current_tag_entry != NULL) { + list.append(QString(current_tag_entry->tag->name)); + current_tag_entry = current_tag_entry->next; + } + setStringList(list); + delete[] checkState; + checkState = new bool[list.count()]; + memset(checkState, false, list.count()); +} + +bool TagFilterModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if(role == Qt::CheckStateRole){ + checkState[index.row()] = value.toBool(); + return true; + } + return false; +} diff --git a/qt-ui/models.h b/qt-ui/models.h index c4a3a077d..c54a765ab 100644 --- a/qt-ui/models.h +++ b/qt-ui/models.h @@ -417,4 +417,18 @@ private: QStringList languages; }; + +class TagFilterModel : public QStringListModel { + Q_OBJECT +public: + static TagFilterModel *instance(); + virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; + virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); + virtual Qt::ItemFlags flags(const QModelIndex &index) const; +public slots: + void repopulate(); +private: + explicit TagFilterModel(QObject *parent = 0); + bool *checkState; +}; #endif // MODELS_H diff --git a/qt-ui/simplewidgets.cpp b/qt-ui/simplewidgets.cpp index e9bfc3cba..2f762ba60 100644 --- a/qt-ui/simplewidgets.cpp +++ b/qt-ui/simplewidgets.cpp @@ -7,6 +7,7 @@ #include <QFileDialog> #include <QShortcut> #include <QCalendarWidget> +#include <QSortFilterProxyModel> #include "exif.h" #include "dive.h" #include "file.h" @@ -459,4 +460,8 @@ void DiveComponentSelection::buttonClicked(QAbstractButton *button) TagFilter::TagFilter(QWidget *parent): QWidget(parent) { ui.setupUi(this); + QSortFilterProxyModel *filter = new QSortFilterProxyModel(); + filter->setSourceModel(TagFilterModel::instance()); + connect(ui.filterTag, SIGNAL(textChanged(QString)), filter, SLOT(setFilterFixedString(QString))); + ui.tagView->setModel(filter); } |