Dirk,

Take a look at 002 carefully, since I changed and added a few things to
event manipulation.

the idea of 0002 is to add / remove / rename an Bookmark without triggering
an (expesive) redraw of the profile, so we create just the Event item and
put it on screen.
The issue is that the depth of the bookark is calculated based on the
events of the current_dive when we create_plot_data. so I called
copy_events(current_dive, displayed_dive) and did it by hand.

Tomaz
From cc64959903353c1d1cb4b182d50246d7fd1cd701 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <tomaz.canabr...@intel.com>
Date: Fri, 12 Dec 2014 14:06:04 -0200
Subject: [PATCH 2/2] Fixes the Bookmark Add/Rename/Remove witout replotting
 everything.

This seems to work. I'v reworked the Event positioning code so
we don't need to recreate the full DisplayedDive when a new
bookmark is added, just figure out where it should be added
and position it at the right spot.

This is a series of patches to start using less replots
on the Profile.

Signed-off-by: Tomaz Canabrava <tomaz.canabr...@intel.com>
---
 dive.c                           | 12 ++++++++++++
 dive.h                           |  2 +-
 qt-ui/profile/diveeventitem.cpp  | 25 ++++++++++++++++++-------
 qt-ui/profile/profilewidget2.cpp | 23 ++++++++++++++++++++---
 4 files changed, 51 insertions(+), 11 deletions(-)

diff --git a/dive.c b/dive.c
index b318c4b..4fb6717 100644
--- a/dive.c
+++ b/dive.c
@@ -150,6 +150,18 @@ void update_event_name(struct dive *d, struct event *event, char *name)
 	free(remove);
 }
 
+struct event *get_event_by_time(struct dive *d, uint32_t time){
+	if (!d)
+		return NULL;
+	struct divecomputer *dc = get_dive_dc(d, dc_number);
+	if (!dc)
+		return NULL;
+	struct event **events = &dc->events;
+	while((*events)->next && (*events)->time.seconds != time)
+		events = &(*events)->next;
+	return (*events);
+}
+
 void add_extra_data(struct divecomputer *dc, const char *key, const char *value)
 {
 	struct extra_data **ed = &dc->extra_data;
diff --git a/dive.h b/dive.h
index f67c736..979c8bf 100644
--- a/dive.h
+++ b/dive.h
@@ -709,7 +709,7 @@ extern void per_cylinder_mean_depth(struct dive *dive, struct divecomputer *dc,
 extern int get_cylinder_index(struct dive *dive, struct event *ev);
 extern int nr_cylinders(struct dive *dive);
 extern int nr_weightsystems(struct dive *dive);
-
+extern struct event *get_event_by_time(struct dive *d, uint32_t time);
 /* UI related protopypes */
 
 // extern void report_error(GError* error);
diff --git a/qt-ui/profile/diveeventitem.cpp b/qt-ui/profile/diveeventitem.cpp
index a9c3c3f..14cb0a3 100644
--- a/qt-ui/profile/diveeventitem.cpp
+++ b/qt-ui/profile/diveeventitem.cpp
@@ -9,6 +9,7 @@
 #include <QDebug>
 #include "gettextfromc.h"
 #include "metrics.h"
+#include <profile.h>
 
 extern struct ev_select *ev_namelist;
 extern int evn_used;
@@ -152,18 +153,27 @@ bool DiveEventItem::shouldBeHidden()
 
 void DiveEventItem::recalculatePos(bool instant)
 {
-	if (!vAxis || !hAxis || !internalEvent || !dataModel)
+	if (!vAxis || !hAxis || !internalEvent || !dataModel){
 		return;
+	}
 
-	QModelIndexList result = dataModel->match(dataModel->index(0, DivePlotDataModel::TIME), Qt::DisplayRole, internalEvent->time.seconds);
-	if (result.isEmpty()) {
-		Q_ASSERT("can't find a spot in the dataModel");
-		hide();
-		return;
+	// find the correct time or interpolate between two points.
+	int depth = -1;
+	plot_data *entry = dataModel->data().entry;
+	for(int i = 0; i < dataModel->data().nr; i++){
+		if (entry[i].sec == internalEvent->time.seconds){
+			depth = entry[i].depth;
+			break;
+		} else if (entry[i].sec > internalEvent->time.seconds) {
+			int min = entry[i-1].depth;
+			int max = entry[i].depth;
+			depth = min + ((max - min)/2);
+			break;
+		}
 	}
+
 	if (!isVisible() && !shouldBeHidden())
 		show();
-	int depth = dataModel->data(dataModel->index(result.first().row(), DivePlotDataModel::DEPTH)).toInt();
 	qreal x = hAxis->posAtValue(internalEvent->time.seconds);
 	qreal y = vAxis->posAtValue(depth);
 	if (!instant)
@@ -172,4 +182,5 @@ void DiveEventItem::recalculatePos(bool instant)
 		setPos(x, y);
 	if (isVisible() && shouldBeHidden())
 		hide();
+	qDebug() << pos();
 }
diff --git a/qt-ui/profile/profilewidget2.cpp b/qt-ui/profile/profilewidget2.cpp
index 1970561..1181fc5 100644
--- a/qt-ui/profile/profilewidget2.cpp
+++ b/qt-ui/profile/profilewidget2.cpp
@@ -1277,8 +1277,11 @@ void ProfileWidget2::removeEvent()
 								  tr("%1 @ %2:%3").arg(event->name).arg(event->time.seconds / 60).arg(event->time.seconds % 60, 2, 10, QChar('0'))),
 				  QMessageBox::Ok | QMessageBox::Cancel) == QMessageBox::Ok) {
 		remove_event(event);
+		copy_events(&current_dive->dc, &displayed_dive.dc);
 		mark_divelist_changed(true);
-		replot();
+		scene()->removeItem(item);
+		eventItems.removeOne(item);
+		item->deleteLater();
 	}
 }
 
@@ -1287,8 +1290,20 @@ void ProfileWidget2::addBookmark()
 	QAction *action = qobject_cast<QAction *>(sender());
 	QPointF scenePos = mapToScene(mapFromGlobal(action->data().toPoint()));
 	add_event(current_dc, timeAxis->valueAt(scenePos), SAMPLE_EVENT_BOOKMARK, 0, 0, "bookmark");
+	copy_events(&current_dive->dc, &displayed_dive.dc);
+	struct event *ev = get_event_by_time(&displayed_dive, timeAxis->valueAt(scenePos));
+	qDebug() << "time = " << timeAxis->valueAt(scenePos) << "Event time: " << ev->time.seconds;
 	mark_divelist_changed(true);
-	replot();
+	DiveEventItem *item = new DiveEventItem();
+	item->setHorizontalAxis(timeAxis);
+	item->setVerticalAxis(profileYAxis);
+	item->setModel(dataModel);
+	item->setEvent(ev);
+	item->setZValue(2);
+	item->recalculatePos(true);
+	item->setVisible(true);
+	eventItems.push_back(item);
+	scene()->addItem(item);
 }
 
 void ProfileWidget2::addSetpointChange()
@@ -1377,10 +1392,12 @@ void ProfileWidget2::editName()
 		// order is important! first update the current dive (by matching the unchanged event),
 		// then update the displayed dive (as event is part of the events on displayed dive
 		// and will be freed as part of changing the name!
+		int time = event->time.seconds;
 		update_event_name(current_dive, event, newName.toUtf8().data());
 		update_event_name(&displayed_dive, event, newName.toUtf8().data());
+		struct event *ev = get_event_by_time(&displayed_dive, time);
 		mark_divelist_changed(true);
-		replot();
+		item->setEvent(ev);
 	}
 }
 
-- 
2.1.3

From 9b99d39e9f82bb6c581db8b254c592b2b22ab6b0 Mon Sep 17 00:00:00 2001
From: Tomaz Canabrava <tomaz.canabr...@intel.com>
Date: Fri, 12 Dec 2014 11:06:55 -0200
Subject: [PATCH 1/2] More lists organized alphabetically.

I forgot this one, tsc.

Signed-off-by: Tomaz Canabrava <tomaz.canabr...@intel.com>
---
 qt-ui/completionmodels.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/qt-ui/completionmodels.cpp b/qt-ui/completionmodels.cpp
index 1ac1846..fd3cc75 100644
--- a/qt-ui/completionmodels.cpp
+++ b/qt-ui/completionmodels.cpp
@@ -33,7 +33,9 @@
 				set.insert(value.trimmed());                                     \
 			}                                                                        \
 		}                                                                                \
-		setStringList(set.toList());                                                     \
+		QStringList setList = set.toList();                                              \
+		std::sort(setList.begin(), setList.end());                                       \
+		setStringList(setList);                                                     \
 	}
 
 CREATE_CSV_UPDATE_METHOD(BuddyCompletionModel, buddy);
-- 
2.1.3

_______________________________________________
subsurface mailing list
subsurface@subsurface-divelog.org
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to