From 109fab3285bc116bde056ba40c9f33255fdce503 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <[email protected]>
Date: Tue, 14 Jul 2015 18:43:47 -0300
Subject: [PATCH 7/7] Offer an option to just complete the text

Make the kids fight no more.

Signed-off-by: Tomaz Canabrava <[email protected]>
---
 qt-models/divelocationmodel.cpp | 53 ++++++++++++++++++++++++++++++++++++-----
 qt-models/divelocationmodel.h   |  4 ++++
 qt-ui/maintab.cpp               |  3 ++-
 qt-ui/modeldelegates.cpp        | 22 +++++++++++++++--
 4 files changed, 73 insertions(+), 9 deletions(-)

diff --git a/qt-models/divelocationmodel.cpp b/qt-models/divelocationmodel.cpp
index 42af4f6..bddca8f 100644
--- a/qt-models/divelocationmodel.cpp
+++ b/qt-models/divelocationmodel.cpp
@@ -1,6 +1,8 @@
 #include "divelocationmodel.h"
 #include "dive.h"
 #include <QDebug>
+#include <QLineEdit>
+#include <QIcon>
 
 bool dive_site_less_than(dive_site *a, dive_site *b)
 {
@@ -13,7 +15,9 @@ LocationInformationModel *LocationInformationModel::instance()
 	return self;
 }
 
-LocationInformationModel::LocationInformationModel(QObject *obj) : QAbstractTableModel(obj), internalRowCount(0)
+LocationInformationModel::LocationInformationModel(QObject *obj) : QAbstractTableModel(obj),
+	internalRowCount(0),
+	textField(NULL)
 {
 }
 
@@ -25,19 +29,45 @@ int LocationInformationModel::columnCount(const QModelIndex &parent) const
 int LocationInformationModel::rowCount(const QModelIndex &parent) const
 {
 	Q_UNUSED(parent);
-	return internalRowCount;
+	return internalRowCount + 1;
 }
 
 QVariant LocationInformationModel::data(const QModelIndex &index, int role) const
 {
 	if (!index.isValid())
 		return QVariant();
-	struct dive_site *ds = get_dive_site(index.row());
+
+	// Special case to handle the 'create dive site' with name.
+	if (index.row() == 0) {
+		if (index.column() == UUID)
+			return 0;
+		switch(role) {
+			case Qt::DisplayRole : {
+				struct dive_site *ds;
+				int i;
+				for_each_dive_site(i, ds) {
+					QString dsName(ds->name);
+					if (dsName.startsWith(textField->text()))
+						return dsName;
+				}
+				return textField->text();
+			}
+			case Qt::ToolTipRole : {
+				return QString(tr("Create dive site"));
+			}
+			case Qt::EditRole : return textField->text();
+			case Qt::DecorationRole : return QIcon(":plus");
+		}
+	}
+
+	// The dive sites are -1 because of the first item.
+	struct dive_site *ds = get_dive_site(index.row()-1);
 
 	if (!ds)
 		return QVariant();
 
 	switch(role) {
+	case Qt::EditRole:
 	case Qt::DisplayRole :
 		switch(index.column()) {
 		case UUID: return ds->uuid;
@@ -52,11 +82,22 @@ QVariant LocationInformationModel::data(const QModelIndex &index, int role) cons
 		case TAXONOMY_3: return "TODO";
 		}
 	break;
+	case Qt::DecorationRole : {
+		if (dive_site_has_gps_location(ds))
+			return QIcon(":geocode");
+		else
+			return QVariant();
+	}
 	}
 
 	return QVariant();
 }
 
+void LocationInformationModel::setFirstRowTextField(QLineEdit *t)
+{
+	textField = t;
+}
+
 void LocationInformationModel::update()
 {
 	beginResetModel();
@@ -71,7 +112,7 @@ int32_t LocationInformationModel::addDiveSite(const QString& name, int lon, int
 	latitude.udeg = lat;
 	longitude.udeg = lon;
 
-	beginInsertRows(QModelIndex(), dive_site_table.nr, dive_site_table.nr);
+	beginInsertRows(QModelIndex(), dive_site_table.nr + 1, dive_site_table.nr + 1);
 	uint32_t uuid = create_dive_site_with_gps(name.toUtf8().data(), latitude, longitude);
 	qSort(dive_site_table.dive_sites, dive_site_table.dive_sites + dive_site_table.nr, dive_site_less_than);
 	internalRowCount = dive_site_table.nr;
@@ -81,7 +122,7 @@ int32_t LocationInformationModel::addDiveSite(const QString& name, int lon, int
 
 bool LocationInformationModel::setData(const QModelIndex &index, const QVariant &value, int role)
 {
-	if (!index.isValid())
+	if (!index.isValid() || index.row() == 0)
 		return false;
 
 	if (role != Qt::EditRole)
@@ -99,7 +140,7 @@ bool LocationInformationModel::removeRows(int row, int count, const QModelIndex
 	if(row >= rowCount())
 		return false;
 
-	beginRemoveRows(QModelIndex(), row, row);
+	beginRemoveRows(QModelIndex(), row + 1, row + 1);
 	struct dive_site *ds = get_dive_site(row);
 	if (ds)
 		delete_dive_site(ds->uuid);
diff --git a/qt-models/divelocationmodel.h b/qt-models/divelocationmodel.h
index 8cae3a0..ee52d2b 100644
--- a/qt-models/divelocationmodel.h
+++ b/qt-models/divelocationmodel.h
@@ -5,6 +5,8 @@
 #include <QStringListModel>
 #include <stdint.h>
 
+class QLineEdit;
+
 class LocationInformationModel : public QAbstractTableModel {
 Q_OBJECT
 public:
@@ -16,12 +18,14 @@ public:
 	int32_t addDiveSite(const QString& name, int lat = 0, int lon = 0);
 	bool setData(const QModelIndex &index, const QVariant &value, int role);
 	bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex());
+	void setFirstRowTextField(QLineEdit *textField);
 
 public slots:
 	void update();
 private:
 	LocationInformationModel(QObject *obj = 0);
 	int internalRowCount;
+	QLineEdit *textField;
 };
 
 class GeoReferencingOptionsModel : public QStringListModel {
diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp
index abb6af9..0519625 100644
--- a/qt-ui/maintab.cpp
+++ b/qt-ui/maintab.cpp
@@ -61,10 +61,11 @@ MainTab::MainTab(QWidget *parent) : QTabWidget(parent),
 
 	QCompleter *completer = new QCompleter();
 	QListView *completerListview = new QListView();
+	LocationInformationModel::instance()->setFirstRowTextField(ui.location);
+
 	completer->setPopup(completerListview);
 	completer->setModel(LocationInformationModel::instance());
 	completer->setCompletionColumn(LocationInformationModel::NAME);
-	completer->setCompletionRole(Qt::DisplayRole);
 	completer->setCaseSensitivity(Qt::CaseInsensitive);
 	completerListview->setItemDelegate(new LocationFilterDelegate());
 
diff --git a/qt-ui/modeldelegates.cpp b/qt-ui/modeldelegates.cpp
index 3357d39..953c16b 100644
--- a/qt-ui/modeldelegates.cpp
+++ b/qt-ui/modeldelegates.cpp
@@ -495,14 +495,22 @@ void LocationFilterDelegate::paint(QPainter *painter, const QStyleOptionViewItem
 	QStyledItemDelegate::initStyleOption(&opt, index);
 	QBrush bg;
 	QString diveSiteName = index.data().toString();
-
+	QString bottomText;
+	QIcon icon = index.data(Qt::DecorationRole).value<QIcon>();
 	struct dive_site *ds = get_dive_site_by_uuid(
 		index.model()->data(index.model()->index(index.row(),0)).toInt()
 	);
+
+	//Special case: do not show name, but instead, show
+	if (index.row() == 0) {
+		diveSiteName = index.data().toString();
+		bottomText = index.data(Qt::ToolTipRole).toString();
+		goto print_part;
+	}
+
 	if (!ds)
 		return;
 
-	QString bottomText;
 	for (int i = 0; i < ds->taxonomy.nr; i++) {
 		if(ds->taxonomy.category[i].category == TC_NONE)
 			continue;
@@ -517,11 +525,13 @@ void LocationFilterDelegate::paint(QPainter *painter, const QStyleOptionViewItem
 		free( (void*) gpsCoords);
 	}
 
+	print_part:
 	fontBigger.setPointSize(fontBigger.pointSize() + 1);
 	fontBigger.setBold(true);
 
 	initStyleOption(&opt, index);
 	opt.text = QString();
+	opt.icon = QIcon();
 	qApp->style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, NULL);
 
 	painter->save();
@@ -539,6 +549,14 @@ void LocationFilterDelegate::paint(QPainter *painter, const QStyleOptionViewItem
 	painter->setBrush(option.palette.brightText());
 	painter->drawText(option.rect.x(),option.rect.y() + fmBigger.boundingRect("YH").height() * 2, bottomText);
 	painter->restore();
+
+	if (!icon.isNull()) {
+		painter->save();
+		painter->drawPixmap(
+			option.rect.x() + option.rect.width() - 24,
+			option.rect.y() + option.rect.height() - 24, icon.pixmap(20,20));
+		painter->restore();
+	}
 }
 
 QSize LocationFilterDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
-- 
2.4.5

_______________________________________________
subsurface mailing list
[email protected]
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to