diff options
author | Tomaz Canabrava <tcanabrava@kde.org> | 2017-04-18 17:32:10 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2017-05-27 07:46:01 -0700 |
commit | 3c3f91dcb2964180f5ced838a06db35021dde0f1 (patch) | |
tree | e40083478664803e09d1f5f52b5199fd8795487c /qt-models | |
parent | 6bfd20a0144da0851cbed1e8454fa3603709806f (diff) | |
download | subsurface-3c3f91dcb2964180f5ced838a06db35021dde0f1.tar.gz |
Move model code to models
This makes it easery to use it on Qml.
Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-models')
-rw-r--r-- | qt-models/CMakeLists.txt | 1 | ||||
-rw-r--r-- | qt-models/diveimportedmodel.cpp | 115 | ||||
-rw-r--r-- | qt-models/diveimportedmodel.h | 31 |
3 files changed, 147 insertions, 0 deletions
diff --git a/qt-models/CMakeLists.txt b/qt-models/CMakeLists.txt index 34e462fa3..cbdf47501 100644 --- a/qt-models/CMakeLists.txt +++ b/qt-models/CMakeLists.txt @@ -22,6 +22,7 @@ set(SUBSURFACE_MODELS_LIB_SRCS ssrfsortfilterproxymodel.cpp divelistmodel.cpp gpslistmodel.cpp + diveimportedmodel.cpp ) source_group("Subsurface Models" FILES ${SUBSURFACE_MODELS}) diff --git a/qt-models/diveimportedmodel.cpp b/qt-models/diveimportedmodel.cpp new file mode 100644 index 000000000..b1e5a6174 --- /dev/null +++ b/qt-models/diveimportedmodel.cpp @@ -0,0 +1,115 @@ +#include "diveimportedmodel.h" +#include "core/helpers.h" + +DiveImportedModel::DiveImportedModel(QObject *o) : QAbstractTableModel(o), + firstIndex(0), + lastIndex(-1), + checkStates(0) +{ +} + +int DiveImportedModel::columnCount(const QModelIndex &model) const +{ + Q_UNUSED(model) + return 3; +} + +int DiveImportedModel::rowCount(const QModelIndex &model) const +{ + Q_UNUSED(model) + return lastIndex - firstIndex + 1; +} + +QVariant DiveImportedModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + if (orientation == Qt::Vertical) + return QVariant(); + if (role == Qt::DisplayRole) { + switch (section) { + case 0: + return QVariant(tr("Date/time")); + case 1: + return QVariant(tr("Duration")); + case 2: + return QVariant(tr("Depth")); + } + } + return QVariant(); +} + +QVariant DiveImportedModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid()) + return QVariant(); + + if (index.row() + firstIndex > lastIndex) + return QVariant(); + + struct dive *d = get_dive_from_table(index.row() + firstIndex, &downloadTable); + if (!d) + return QVariant(); + if (role == Qt::DisplayRole) { + switch (index.column()) { + case 0: + return QVariant(get_short_dive_date_string(d->when)); + case 1: + return QVariant(get_dive_duration_string(d->duration.seconds, tr("h:"), tr("min"))); + case 2: + return QVariant(get_depth_string(d->maxdepth.mm, true, false)); + } + } + if (role == Qt::CheckStateRole) { + if (index.column() == 0) + return checkStates[index.row()] ? Qt::Checked : Qt::Unchecked; + } + return QVariant(); +} + +void DiveImportedModel::changeSelected(QModelIndex clickedIndex) +{ + checkStates[clickedIndex.row()] = !checkStates[clickedIndex.row()]; + dataChanged(index(clickedIndex.row(), 0), index(clickedIndex.row(), 0), QVector<int>() << Qt::CheckStateRole); +} + +void DiveImportedModel::selectAll() +{ + memset(checkStates, true, lastIndex - firstIndex + 1); + dataChanged(index(0, 0), index(lastIndex - firstIndex, 0), QVector<int>() << Qt::CheckStateRole); +} + +void DiveImportedModel::selectNone() +{ + memset(checkStates, false, lastIndex - firstIndex + 1); + dataChanged(index(0, 0), index(lastIndex - firstIndex,0 ), QVector<int>() << Qt::CheckStateRole); +} + +Qt::ItemFlags DiveImportedModel::flags(const QModelIndex &index) const +{ + if (index.column() != 0) + return QAbstractTableModel::flags(index); + return QAbstractTableModel::flags(index) | Qt::ItemIsUserCheckable; +} + +void DiveImportedModel::clearTable() +{ + beginRemoveRows(QModelIndex(), 0, lastIndex - firstIndex); + lastIndex = -1; + firstIndex = 0; + endRemoveRows(); +} + +void DiveImportedModel::setImportedDivesIndexes(int first, int last) +{ + Q_ASSERT(last >= first); + if (lastIndex >= firstIndex) { + beginRemoveRows(QModelIndex(), 0, lastIndex - firstIndex); + endRemoveRows(); + } + beginInsertRows(QModelIndex(), 0, last - first); + lastIndex = last; + firstIndex = first; + delete[] checkStates; + checkStates = new bool[last - first + 1]; + memset(checkStates, true, last - first + 1); + endInsertRows(); +} diff --git a/qt-models/diveimportedmodel.h b/qt-models/diveimportedmodel.h new file mode 100644 index 000000000..06d73b6b2 --- /dev/null +++ b/qt-models/diveimportedmodel.h @@ -0,0 +1,31 @@ +#ifndef DIVEIMPORTEDMODEL_H +#define DIVEIMPORTEDMODEL_H + +#include <QAbstractTableModel> + +class DiveImportedModel : public QAbstractTableModel +{ + Q_OBJECT +public: + DiveImportedModel(QObject *o); + int columnCount(const QModelIndex& index = QModelIndex()) const; + int rowCount(const QModelIndex& index = QModelIndex()) const; + QVariant data(const QModelIndex& index, int role) const; + QVariant headerData(int section, Qt::Orientation orientation, int role) const; + void setImportedDivesIndexes(int first, int last); + Qt::ItemFlags flags(const QModelIndex &index) const; + void clearTable(); + +public +slots: + void changeSelected(QModelIndex clickedIndex); + void selectAll(); + void selectNone(); + +private: + int firstIndex; + int lastIndex; + bool *checkStates; +}; + +#endif |