[PATCH] Amend divetrip model to use int units

amit.k.chaudhuri at gmail.com amit.k.chaudhuri at gmail.com
Wed Apr 24 08:57:30 PDT 2013


From: Amit Chaudhuri <amit.k.chaudhuri at gmail.com>

Amend the DiveItem class to avoid float in favour of int. Add getters
which return display friendly QStrings reflecting user preferences for
(e.g.) depth.

Modify DiveTripModel to support controlled alignment by column; right
align for depth and duration.

Fix problems with utf8 encoding on rating stars, degree symbols and
O2 subscript.

Signed-off-by: Amit Chaudhuri <amit.k.chaudhuri at gmail.com>
---
 qt-ui/divelistview.cpp |    1 +
 qt-ui/models.cpp       |   97 +++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 80 insertions(+), 18 deletions(-)

diff --git a/qt-ui/divelistview.cpp b/qt-ui/divelistview.cpp
index a8b1eff..676d7c4 100644
--- a/qt-ui/divelistview.cpp
+++ b/qt-ui/divelistview.cpp
@@ -8,4 +8,5 @@
 
 DiveListView::DiveListView(QWidget *parent) : QTreeView(parent)
 {
+	setUniformRowHeights(true);
 }
diff --git a/qt-ui/models.cpp b/qt-ui/models.cpp
index 40307d0..0ba0783 100644
--- a/qt-ui/models.cpp
+++ b/qt-ui/models.cpp
@@ -8,6 +8,8 @@
 #include "../dive.h"
 #include "../divelist.h"
 
+#include <QtDebug>
+
 extern struct tank_info tank_info[100];
 
 CylindersModel::CylindersModel(QObject* parent): QAbstractTableModel(parent)
@@ -292,14 +294,16 @@ void TankInfoModel::update()
 class DiveItem
 {
 public:
-	explicit DiveItem(): number(0), dateTime(QString()), duration(0.0), depth(0.0), location(QString()) {parentItem = 0;}
-	explicit DiveItem(int num, QString dt, float, float, QString loc, DiveItem *parent = 0);
+	explicit DiveItem(): number(0), dateTime(QString()), seconds(0), mm(0), location(QString()) {parentItem = 0;}
+	explicit DiveItem(int num, QString dt, int, int, QString loc, DiveItem *parent = 0);
 	~DiveItem() { qDeleteAll(childlist); }
 
 	int diveNumber() const { return number; }
 	const QString& diveDateTime() const { return dateTime; }
-	float diveDuration() const { return duration; }
-	float diveDepth() const { return depth; }
+	int diveDuration() const { return seconds; }
+	int diveDepth() const { return mm; }
+	QString displayDuration() const;
+	QString displayDepth() const;
 	const QString& diveLocation() const { return location; }
 	DiveItem *parent() const { return parentItem; }
 	const QList<DiveItem *>& children() const { return childlist; }
@@ -312,8 +316,8 @@ public:
 private:
 	int number;
 	QString dateTime;
-	float duration;
-	float depth;
+	int seconds;
+	int mm;
 	QString location;
 
 	DiveItem *parentItem;
@@ -321,13 +325,49 @@ private:
 
 };
 
-DiveItem::DiveItem(int num, QString dt, float dur, float dep, QString loc, DiveItem *p):
-		   number(num), dateTime(dt), duration(dur), depth(dep), location(loc), parentItem(p)
+DiveItem::DiveItem(int num, QString dt, int dur, int dep, QString loc, DiveItem *p):
+		   number(num), dateTime(dt), seconds(dur), mm(dep), location(loc), parentItem(p)
 {
 	if (parentItem)
 		parentItem->addChild(this);
 }
 
+QString DiveItem::displayDepth() const
+{
+	const int scale = 1000;
+	QString fract, str;
+	if (get_units()->length == units::METERS){
+		fract = QString::number((unsigned)(mm%scale)/10);
+		str = QString("%1.%2").arg((unsigned)(mm/scale)).arg(fract);
+	}
+	if (get_units()->length == units::FEET){
+		str = QString::number(mm_to_feet(mm),'f',2);
+	}
+	return str;
+}
+
+QString DiveItem::displayDuration() const
+{
+	int hrs, mins, secs, val;
+	const int minutes_hour = 60;
+	const int seconds_minute= 60;
+
+	val = seconds;
+	secs = seconds % seconds_minute;
+	val /= seconds_minute;
+	mins = val % seconds_minute;
+	val /= minutes_hour;
+	hrs = val % minutes_hour;
+
+	QString displayTime;
+	if (hrs > 0)
+		displayTime = QString("%1:%2:%3").arg(hrs).arg(mins).arg(secs);
+	else
+		displayTime = QString("%1:%2").arg(mins).arg(secs);
+
+	return displayTime;
+}
+
 DiveTripModel::DiveTripModel(QObject *parent) : QAbstractItemModel(parent)
 {
 	rootItem = new DiveItem;
@@ -341,8 +381,8 @@ DiveTripModel::DiveTripModel(QObject *parent) : QAbstractItemModel(parent)
 		buffer = get_dive_date_string(&tm);
 		new DiveItem(d->number,
 				buffer,
-				d->duration.seconds/60.0,
-				d->maxdepth.mm/1000.0 ,
+				d->duration.seconds,
+				d->maxdepth.mm,
 				d->location,
 				rootItem);
 		free(buffer);
@@ -368,6 +408,16 @@ QVariant DiveTripModel::data(const QModelIndex &index, int role) const
 	DiveItem *item = static_cast<DiveItem*>(index.internalPointer());
 
 	QVariant retVal;
+	if (role == Qt::TextAlignmentRole){
+		switch (index.column()){
+			case DURATION: /* fall through */
+			case DEPTH:
+				retVal = Qt::AlignRight;
+				break;
+			default:
+				retVal = Qt::AlignLeft;
+		}
+	}
 	if (role == Qt::DisplayRole){
 		switch (index.column()) {
 			case NR:
@@ -377,10 +427,12 @@ QVariant DiveTripModel::data(const QModelIndex &index, int role) const
 				retVal = item->diveDateTime();
 				break;
 			case DURATION:
-				retVal = item->diveDuration();
+				retVal = item->displayDuration();
+				//retVal = item->diveDuration();
 				break;
 			case DEPTH:
-				retVal = item->diveDepth();
+				retVal = item->displayDepth();
+				//retVal = item->diveDepth();
 				break;
 			case LOCATION:
 				retVal = item->diveLocation();
@@ -407,19 +459,28 @@ QVariant DiveTripModel::headerData(int section, Qt::Orientation orientation, int
 				ret = tr("Date");
 				break;
 			case RATING:
-				ret = UTF8_BLACKSTAR;
+				ret = QString::fromUtf8(UTF8_BLACKSTAR);
 				break;
 			case DEPTH:
-				ret = tr("ft");
+				if (get_units()->length == units::METERS)
+					ret = tr("Depth (m)");
+				else
+					ret = tr("Depth (ft)");
 				break;
 			case DURATION:
-				ret = tr("min");
+				ret = tr("Duration (h:mm:ss)");
 				break;
 			case TEMPERATURE:
-				ret = UTF8_DEGREE "F";
+				if (get_units()->temperature == units::CELSIUS)
+					ret = QString("%1%2").arg(QString::fromUtf8(UTF8_DEGREE)).arg("C");
+				else
+					ret = QString("%1%2").arg(QString::fromUtf8(UTF8_DEGREE)).arg("F");
 				break;
 			case TOTALWEIGHT:
-				ret = tr("lbs");
+				if (get_units()->weight == units::KG)
+					ret = tr("Weight (kg)");
+				else
+					ret = tr("Weight (lbs)");
 				break;
 			case SUIT:
 				ret = tr("Suit");
@@ -428,7 +489,7 @@ QVariant DiveTripModel::headerData(int section, Qt::Orientation orientation, int
 				ret = tr("Cyl");
 				break;
 			case NITROX:
-				ret = "O" UTF8_SUBSCRIPT_2 "%";
+				ret = QString("O%1%").arg(QString::fromUtf8(UTF8_SUBSCRIPT_2));
 				break;
 			case SAC:
 				ret = tr("SAC");
-- 
1.7.10.4



More information about the subsurface mailing list