aboutsummaryrefslogtreecommitdiffstats
path: root/qt-ui
diff options
context:
space:
mode:
authorGravatar Tomaz Canabrava <tomaz.canabrava@intel.com>2014-09-17 15:45:18 -0300
committerGravatar Dirk Hohndel <dirk@hohndel.org>2014-09-17 15:28:04 -0700
commita6e9a1eab561af3255d99d31011c57135a90ca3f (patch)
tree424a8843682411c072a2fddac6e89924994388d0 /qt-ui
parent7a90b9d7647537057f574916314a9f488e900e8a (diff)
downloadsubsurface-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.cpp1
-rw-r--r--qt-ui/models.cpp51
-rw-r--r--qt-ui/models.h14
-rw-r--r--qt-ui/simplewidgets.cpp5
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);
}