summaryrefslogtreecommitdiffstats
path: root/qt-models/weightmodel.cpp
diff options
context:
space:
mode:
authorGravatar Tomaz Canabrava <tomaz.canabrava@intel.com>2015-05-28 17:17:09 -0300
committerGravatar Dirk Hohndel <dirk@hohndel.org>2015-05-29 14:11:12 -0700
commitd84ffa8fc3162692597c19c42e621f7d8ac58dca (patch)
treec0817f3684a6adfa025205506bb2d3672e21e997 /qt-models/weightmodel.cpp
parenta0f3c9992c0f9d2134742b5ba7fd532094c1a865 (diff)
downloadsubsurface-d84ffa8fc3162692597c19c42e621f7d8ac58dca.tar.gz
Move WeightModel to qt-models
One more step to make it easyer to port the app to Mobile. Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
Diffstat (limited to 'qt-models/weightmodel.cpp')
-rw-r--r--qt-models/weightmodel.cpp174
1 files changed, 174 insertions, 0 deletions
diff --git a/qt-models/weightmodel.cpp b/qt-models/weightmodel.cpp
new file mode 100644
index 000000000..88ebeff6b
--- /dev/null
+++ b/qt-models/weightmodel.cpp
@@ -0,0 +1,174 @@
+#include "weightmodel.h"
+#include "dive.h"
+#include "gettextfromc.h"
+#include "metrics.h"
+#include "helpers.h"
+#include "weigthsysteminfomodel.h"
+
+WeightModel::WeightModel(QObject *parent) : CleanerTableModel(parent),
+ changed(false),
+ rows(0)
+{
+ //enum Column {REMOVE, TYPE, WEIGHT};
+ setHeaderDataStrings(QStringList() << tr("") << tr("Type") << tr("Weight"));
+}
+
+weightsystem_t *WeightModel::weightSystemAt(const QModelIndex &index)
+{
+ return &displayed_dive.weightsystem[index.row()];
+}
+
+void WeightModel::remove(const QModelIndex &index)
+{
+ if (index.column() != REMOVE) {
+ return;
+ }
+ beginRemoveRows(QModelIndex(), index.row(), index.row()); // yah, know, ugly.
+ rows--;
+ remove_weightsystem(&displayed_dive, index.row());
+ changed = true;
+ endRemoveRows();
+}
+
+void WeightModel::clear()
+{
+ if (rows > 0) {
+ beginRemoveRows(QModelIndex(), 0, rows - 1);
+ endRemoveRows();
+ }
+}
+
+QVariant WeightModel::data(const QModelIndex &index, int role) const
+{
+ QVariant ret;
+ if (!index.isValid() || index.row() >= MAX_WEIGHTSYSTEMS)
+ return ret;
+
+ weightsystem_t *ws = &displayed_dive.weightsystem[index.row()];
+
+ switch (role) {
+ case Qt::FontRole:
+ ret = defaultModelFont();
+ break;
+ case Qt::TextAlignmentRole:
+ ret = Qt::AlignCenter;
+ break;
+ case Qt::DisplayRole:
+ case Qt::EditRole:
+ switch (index.column()) {
+ case TYPE:
+ ret = gettextFromC::instance()->tr(ws->description);
+ break;
+ case WEIGHT:
+ ret = get_weight_string(ws->weight, true);
+ break;
+ }
+ break;
+ case Qt::DecorationRole:
+ if (index.column() == REMOVE)
+ ret = trashIcon();
+ break;
+ case Qt::SizeHintRole:
+ if (index.column() == REMOVE)
+ ret = trashIcon().size();
+ break;
+ case Qt::ToolTipRole:
+ if (index.column() == REMOVE)
+ ret = tr("Clicking here will remove this weight system.");
+ break;
+ }
+ return ret;
+}
+
+// this is our magic 'pass data in' function that allows the delegate to get
+// the data here without silly unit conversions;
+// so we only implement the two columns we care about
+void WeightModel::passInData(const QModelIndex &index, const QVariant &value)
+{
+ weightsystem_t *ws = &displayed_dive.weightsystem[index.row()];
+ if (index.column() == WEIGHT) {
+ if (ws->weight.grams != value.toInt()) {
+ ws->weight.grams = value.toInt();
+ dataChanged(index, index);
+ }
+ }
+}
+
+
+bool WeightModel::setData(const QModelIndex &index, const QVariant &value, int role)
+{
+ QString vString = value.toString();
+ weightsystem_t *ws = &displayed_dive.weightsystem[index.row()];
+ switch (index.column()) {
+ case TYPE:
+ if (!value.isNull()) {
+ //TODO: C-function weigth_system_set_description ?
+ if (!ws->description || gettextFromC::instance()->tr(ws->description) != vString) {
+ // loop over translations to see if one matches
+ int i = -1;
+ while (ws_info[++i].name) {
+ if (gettextFromC::instance()->tr(ws_info[i].name) == vString) {
+ ws->description = copy_string(ws_info[i].name);
+ break;
+ }
+ }
+ if (ws_info[i].name == NULL) // didn't find a match
+ ws->description = strdup(vString.toUtf8().constData());
+ changed = true;
+ }
+ }
+ break;
+ case WEIGHT:
+ if (CHANGED()) {
+ ws->weight = string_to_weight(vString.toUtf8().data());
+ // now update the ws_info
+ changed = true;
+ WSInfoModel *wsim = WSInfoModel::instance();
+ QModelIndexList matches = wsim->match(wsim->index(0, 0), Qt::DisplayRole, gettextFromC::instance()->tr(ws->description));
+ if (!matches.isEmpty())
+ wsim->setData(wsim->index(matches.first().row(), WSInfoModel::GR), ws->weight.grams);
+ }
+ break;
+ }
+ dataChanged(index, index);
+ return true;
+}
+
+Qt::ItemFlags WeightModel::flags(const QModelIndex &index) const
+{
+ if (index.column() == REMOVE)
+ return Qt::ItemIsEnabled;
+ return QAbstractItemModel::flags(index) | Qt::ItemIsEditable;
+}
+
+int WeightModel::rowCount(const QModelIndex &parent) const
+{
+ return rows;
+}
+
+void WeightModel::add()
+{
+ if (rows >= MAX_WEIGHTSYSTEMS)
+ return;
+
+ int row = rows;
+ beginInsertRows(QModelIndex(), row, row);
+ rows++;
+ changed = true;
+ endInsertRows();
+}
+
+void WeightModel::updateDive()
+{
+ clear();
+ rows = 0;
+ for (int i = 0; i < MAX_WEIGHTSYSTEMS; i++) {
+ if (!weightsystem_none(&displayed_dive.weightsystem[i])) {
+ rows = i + 1;
+ }
+ }
+ if (rows > 0) {
+ beginInsertRows(QModelIndex(), 0, rows - 1);
+ endInsertRows();
+ }
+}