| 
									
										
										
										
											2017-04-27 20:26:36 +02:00
										 |  |  | // SPDX-License-Identifier: GPL-2.0
 | 
					
						
							| 
									
										
										
										
											2016-04-04 22:02:03 -07:00
										 |  |  | #include "profile-widget/divepixmapitem.h"
 | 
					
						
							|  |  |  | #include "profile-widget/animationfunctions.h"
 | 
					
						
							|  |  |  | #include "core/pref.h"
 | 
					
						
							| 
									
										
										
										
											2018-06-03 17:51:59 +02:00
										 |  |  | #include "core/qthelper.h"
 | 
					
						
							| 
									
										
										
										
											2019-07-10 22:23:25 +02:00
										 |  |  | #include "core/settings/qPrefDisplay.h"
 | 
					
						
							| 
									
										
										
										
											2020-11-24 12:50:52 +01:00
										 |  |  | #include "core/subsurface-qt/divelistnotifier.h"
 | 
					
						
							| 
									
										
										
										
											2015-11-06 10:20:18 -08:00
										 |  |  | #ifndef SUBSURFACE_MOBILE
 | 
					
						
							| 
									
										
										
										
											2020-04-17 23:18:58 +02:00
										 |  |  | #include "core/dive.h" // for displayed_dive
 | 
					
						
							|  |  |  | #include "commands/command.h"
 | 
					
						
							| 
									
										
										
										
											2015-11-06 10:20:18 -08:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2014-06-08 13:11:00 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-27 18:00:42 -03:00
										 |  |  | #include <QDesktopServices>
 | 
					
						
							| 
									
										
										
										
											2014-07-29 21:56:45 -03:00
										 |  |  | #include <QGraphicsView>
 | 
					
						
							| 
									
										
										
										
											2014-06-27 18:00:42 -03:00
										 |  |  | #include <QUrl>
 | 
					
						
							| 
									
										
										
										
											2017-11-29 12:40:06 +01:00
										 |  |  | #include <QGraphicsSceneMouseEvent>
 | 
					
						
							| 
									
										
										
										
											2014-06-08 13:11:00 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-04 01:01:52 +01:00
										 |  |  | DivePixmapItem::DivePixmapItem(QGraphicsItem *parent) : QGraphicsPixmapItem(parent) | 
					
						
							| 
									
										
										
										
											2014-01-14 14:59:24 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-01-16 11:50:56 +07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-06-08 12:43:04 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												Dive pictures: Fix crash on picture delete
The recent simplification of the close button code introduced a crash:
Deletion of pictures caused an invalid memory access, because the
CloseButtonItem was deleted with the parent DivePicture item.
For some (not fully understood!) reason, a reference to this button
was stored in the depths of Qt.
Empirically, it was found out that removing the first line of the pair
       QGraphicsItem::mousePressEvent(event);
       emit clicked();
fixed the crash.
It seemed therefore prudent to remove the whole questionable signal/slot
mechanism and directly call the removePicture() function of the parent.
Thus, the intermediate DiveButtonItem class became unnecessary and was
removed, leading to a shallower class hierarchy.
Unfortunately, CloseButtonItem must still be derived from QObject owing
to the Q_PROPERTY machinery, which is in turn needed for animation.
To make this compile on mobile, the conditional compilation of
removePicture() (#ifndef SUBSURFACE_MOBILE) was removed. After all,
if DivePixmapItem is used, there are pictures, so removePicture()
should be functional. Conditional compilation should concern the
whole class, not only this function.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
											
										 
											2018-05-16 22:50:24 +02:00
										 |  |  | CloseButtonItem::CloseButtonItem(QGraphicsItem *parent): DivePixmapItem(parent) | 
					
						
							| 
									
										
										
										
											2014-07-29 21:56:45 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-11-29 10:57:08 +01:00
										 |  |  | 	static QPixmap p = QPixmap(":list-remove-icon"); | 
					
						
							| 
									
										
										
										
											2014-07-29 21:56:45 -03:00
										 |  |  | 	setPixmap(p); | 
					
						
							|  |  |  | 	setFlag(ItemIgnoresTransformations); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-21 09:42:39 +02:00
										 |  |  | void CloseButtonItem::mousePressEvent(QGraphicsSceneMouseEvent *) | 
					
						
							| 
									
										
											  
											
												Dive pictures: Fix crash on picture delete
The recent simplification of the close button code introduced a crash:
Deletion of pictures caused an invalid memory access, because the
CloseButtonItem was deleted with the parent DivePicture item.
For some (not fully understood!) reason, a reference to this button
was stored in the depths of Qt.
Empirically, it was found out that removing the first line of the pair
       QGraphicsItem::mousePressEvent(event);
       emit clicked();
fixed the crash.
It seemed therefore prudent to remove the whole questionable signal/slot
mechanism and directly call the removePicture() function of the parent.
Thus, the intermediate DiveButtonItem class became unnecessary and was
removed, leading to a shallower class hierarchy.
Unfortunately, CloseButtonItem must still be derived from QObject owing
to the Q_PROPERTY machinery, which is in turn needed for animation.
To make this compile on mobile, the conditional compilation of
removePicture() (#ifndef SUBSURFACE_MOBILE) was removed. After all,
if DivePixmapItem is used, there are pictures, so removePicture()
should be functional. Conditional compilation should concern the
whole class, not only this function.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
											
										 
											2018-05-16 22:50:24 +02:00
										 |  |  | { | 
					
						
							|  |  |  | 	qgraphicsitem_cast<DivePictureItem*>(parentItem())->removePicture(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-29 21:56:45 -03:00
										 |  |  | void CloseButtonItem::hide() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
											  
											
												Dive pictures: Fix crash on picture delete
The recent simplification of the close button code introduced a crash:
Deletion of pictures caused an invalid memory access, because the
CloseButtonItem was deleted with the parent DivePicture item.
For some (not fully understood!) reason, a reference to this button
was stored in the depths of Qt.
Empirically, it was found out that removing the first line of the pair
       QGraphicsItem::mousePressEvent(event);
       emit clicked();
fixed the crash.
It seemed therefore prudent to remove the whole questionable signal/slot
mechanism and directly call the removePicture() function of the parent.
Thus, the intermediate DiveButtonItem class became unnecessary and was
removed, leading to a shallower class hierarchy.
Unfortunately, CloseButtonItem must still be derived from QObject owing
to the Q_PROPERTY machinery, which is in turn needed for animation.
To make this compile on mobile, the conditional compilation of
removePicture() (#ifndef SUBSURFACE_MOBILE) was removed. After all,
if DivePixmapItem is used, there are pictures, so removePicture()
should be functional. Conditional compilation should concern the
whole class, not only this function.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
											
										 
											2018-05-16 22:50:24 +02:00
										 |  |  | 	DivePixmapItem::hide(); | 
					
						
							| 
									
										
										
										
											2014-07-29 21:56:45 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CloseButtonItem::show() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
											  
											
												Dive pictures: Fix crash on picture delete
The recent simplification of the close button code introduced a crash:
Deletion of pictures caused an invalid memory access, because the
CloseButtonItem was deleted with the parent DivePicture item.
For some (not fully understood!) reason, a reference to this button
was stored in the depths of Qt.
Empirically, it was found out that removing the first line of the pair
       QGraphicsItem::mousePressEvent(event);
       emit clicked();
fixed the crash.
It seemed therefore prudent to remove the whole questionable signal/slot
mechanism and directly call the removePicture() function of the parent.
Thus, the intermediate DiveButtonItem class became unnecessary and was
removed, leading to a shallower class hierarchy.
Unfortunately, CloseButtonItem must still be derived from QObject owing
to the Q_PROPERTY machinery, which is in turn needed for animation.
To make this compile on mobile, the conditional compilation of
removePicture() (#ifndef SUBSURFACE_MOBILE) was removed. After all,
if DivePixmapItem is used, there are pictures, so removePicture()
should be functional. Conditional compilation should concern the
whole class, not only this function.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
											
										 
											2018-05-16 22:50:24 +02:00
										 |  |  | 	DivePixmapItem::show(); | 
					
						
							| 
									
										
										
										
											2014-07-29 21:56:45 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-04 01:01:52 +01:00
										 |  |  | DivePictureItem::DivePictureItem(QGraphicsItem *parent): DivePixmapItem(parent), | 
					
						
							| 
									
										
										
										
											2015-01-16 18:12:02 -02:00
										 |  |  | 	canvas(new QGraphicsRectItem(this)), | 
					
						
							| 
									
										
										
										
											2018-03-04 01:01:52 +01:00
										 |  |  | 	shadow(new QGraphicsRectItem(this)), | 
					
						
							| 
									
										
										
										
											2018-07-15 17:56:18 +02:00
										 |  |  | 	button(new CloseButtonItem(this)), | 
					
						
							|  |  |  | 	baseZValue(0.0) | 
					
						
							| 
									
										
										
										
											2014-06-08 12:43:04 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-06-27 18:13:33 -03:00
										 |  |  | 	setFlag(ItemIgnoresTransformations); | 
					
						
							| 
									
										
										
										
											2014-06-08 17:53:28 -07:00
										 |  |  | 	setAcceptHoverEvents(true); | 
					
						
							| 
									
										
										
										
											2014-06-08 12:43:04 -03:00
										 |  |  | 	setScale(0.2); | 
					
						
							| 
									
										
										
										
											2020-11-24 12:50:52 +01:00
										 |  |  | 	connect(&diveListNotifier, &DiveListNotifier::settingsChanged, this, &DivePictureItem::settingsChanged); | 
					
						
							| 
									
										
										
										
											2015-01-16 18:12:02 -02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	canvas->setPen(Qt::NoPen); | 
					
						
							|  |  |  | 	canvas->setBrush(QColor(Qt::white)); | 
					
						
							|  |  |  | 	canvas->setFlag(ItemStacksBehindParent); | 
					
						
							|  |  |  | 	canvas->setZValue(-1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	shadow->setPos(5,5); | 
					
						
							|  |  |  | 	shadow->setPen(Qt::NoPen); | 
					
						
							|  |  |  | 	shadow->setBrush(QColor(Qt::lightGray)); | 
					
						
							|  |  |  | 	shadow->setFlag(ItemStacksBehindParent); | 
					
						
							|  |  |  | 	shadow->setZValue(-2); | 
					
						
							| 
									
										
										
										
											2018-03-04 01:01:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	button->setScale(0.2); | 
					
						
							|  |  |  | 	button->setZValue(7); | 
					
						
							|  |  |  | 	button->hide(); | 
					
						
							| 
									
										
										
										
											2014-07-10 21:15:20 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-15 17:56:18 +02:00
										 |  |  | // The base z-value is used for correct paint-order of the thumbnails. On hoverEnter the z-value is raised
 | 
					
						
							|  |  |  | // so that the thumbnail is drawn on top of all other thumbnails and on hoverExit it is restored to the base value.
 | 
					
						
							|  |  |  | void DivePictureItem::setBaseZValue(double z) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	baseZValue = z; | 
					
						
							|  |  |  | 	setZValue(z); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-10 21:15:20 -03:00
										 |  |  | void DivePictureItem::settingsChanged() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	setVisible(prefs.show_pictures_in_profile); | 
					
						
							| 
									
										
										
										
											2014-06-08 12:43:04 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void DivePictureItem::setPixmap(const QPixmap &pix) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	DivePixmapItem::setPixmap(pix); | 
					
						
							| 
									
										
										
										
											2014-06-08 13:11:00 -03:00
										 |  |  | 	QRectF r = boundingRect(); | 
					
						
							| 
									
										
										
										
											2015-01-16 18:12:02 -02:00
										 |  |  | 	canvas->setRect(0 - 10, 0 -10, r.width() + 20, r.height() + 20); | 
					
						
							|  |  |  | 	shadow->setRect(canvas->rect()); | 
					
						
							| 
									
										
										
										
											2018-03-04 01:01:52 +01:00
										 |  |  | 	button->setPos(boundingRect().width() - button->boundingRect().width() * 0.2, | 
					
						
							|  |  |  | 				   boundingRect().height() - button->boundingRect().height() * 0.2); | 
					
						
							| 
									
										
										
										
											2014-06-08 12:43:04 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-21 18:20:29 +02:00
										 |  |  | void DivePictureItem::hoverEnterEvent(QGraphicsSceneHoverEvent*) | 
					
						
							| 
									
										
										
										
											2014-06-08 12:43:04 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-07-10 22:23:25 +02:00
										 |  |  | 	Animations::scaleTo(this, qPrefDisplay::animation_speed(), 1.0); | 
					
						
							| 
									
										
										
										
											2018-07-15 17:56:18 +02:00
										 |  |  | 	setZValue(baseZValue + 5.0); | 
					
						
							| 
									
										
										
										
											2014-07-29 21:56:45 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-30 17:20:38 -03:00
										 |  |  | 	button->setOpacity(0); | 
					
						
							| 
									
										
										
										
											2014-07-29 21:56:45 -03:00
										 |  |  | 	button->show(); | 
					
						
							| 
									
										
										
										
											2019-07-10 22:23:25 +02:00
										 |  |  | 	Animations::show(button, qPrefDisplay::animation_speed()); | 
					
						
							| 
									
										
										
										
											2014-06-08 12:43:04 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-29 22:13:14 -03:00
										 |  |  | void DivePictureItem::setFileUrl(const QString &s) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	fileUrl = s; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-21 18:20:29 +02:00
										 |  |  | void DivePictureItem::hoverLeaveEvent(QGraphicsSceneHoverEvent*) | 
					
						
							| 
									
										
										
										
											2014-06-08 12:43:04 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-07-10 22:23:25 +02:00
										 |  |  | 	Animations::scaleTo(this, qPrefDisplay::animation_speed(), 0.2); | 
					
						
							| 
									
										
										
										
											2018-07-15 17:56:18 +02:00
										 |  |  | 	setZValue(baseZValue); | 
					
						
							| 
									
										
										
										
											2019-07-10 22:23:25 +02:00
										 |  |  | 	Animations::hide(button, qPrefDisplay::animation_speed()); | 
					
						
							| 
									
										
										
										
											2014-08-06 18:05:54 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-27 18:00:42 -03:00
										 |  |  | void DivePictureItem::mousePressEvent(QGraphicsSceneMouseEvent *event) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2018-06-03 17:51:59 +02:00
										 |  |  | 	if (event->button() == Qt::LeftButton) | 
					
						
							|  |  |  | 		QDesktopServices::openUrl(QUrl::fromLocalFile(localFilePath(fileUrl))); | 
					
						
							| 
									
										
										
										
											2014-06-27 18:00:42 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-07-29 21:56:45 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | void DivePictureItem::removePicture() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
											  
											
												Dive pictures: Fix crash on picture delete
The recent simplification of the close button code introduced a crash:
Deletion of pictures caused an invalid memory access, because the
CloseButtonItem was deleted with the parent DivePicture item.
For some (not fully understood!) reason, a reference to this button
was stored in the depths of Qt.
Empirically, it was found out that removing the first line of the pair
       QGraphicsItem::mousePressEvent(event);
       emit clicked();
fixed the crash.
It seemed therefore prudent to remove the whole questionable signal/slot
mechanism and directly call the removePicture() function of the parent.
Thus, the intermediate DiveButtonItem class became unnecessary and was
removed, leading to a shallower class hierarchy.
Unfortunately, CloseButtonItem must still be derived from QObject owing
to the Q_PROPERTY machinery, which is in turn needed for animation.
To make this compile on mobile, the conditional compilation of
removePicture() (#ifndef SUBSURFACE_MOBILE) was removed. After all,
if DivePixmapItem is used, there are pictures, so removePicture()
should be functional. Conditional compilation should concern the
whole class, not only this function.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
											
										 
											2018-05-16 22:50:24 +02:00
										 |  |  | #ifndef SUBSURFACE_MOBILE
 | 
					
						
							| 
									
										
										
										
											2020-04-17 23:18:58 +02:00
										 |  |  | 	struct dive *d = get_dive_by_uniq_id(displayed_dive.id); | 
					
						
							|  |  |  | 	if (d) | 
					
						
							|  |  |  | 		Command::removePictures({ { d, { fileUrl.toStdString() } } }); | 
					
						
							| 
									
										
										
										
											2018-01-10 13:55:29 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
											  
											
												Dive pictures: Fix crash on picture delete
The recent simplification of the close button code introduced a crash:
Deletion of pictures caused an invalid memory access, because the
CloseButtonItem was deleted with the parent DivePicture item.
For some (not fully understood!) reason, a reference to this button
was stored in the depths of Qt.
Empirically, it was found out that removing the first line of the pair
       QGraphicsItem::mousePressEvent(event);
       emit clicked();
fixed the crash.
It seemed therefore prudent to remove the whole questionable signal/slot
mechanism and directly call the removePicture() function of the parent.
Thus, the intermediate DiveButtonItem class became unnecessary and was
removed, leading to a shallower class hierarchy.
Unfortunately, CloseButtonItem must still be derived from QObject owing
to the Q_PROPERTY machinery, which is in turn needed for animation.
To make this compile on mobile, the conditional compilation of
removePicture() (#ifndef SUBSURFACE_MOBILE) was removed. After all,
if DivePixmapItem is used, there are pictures, so removePicture()
should be functional. Conditional compilation should concern the
whole class, not only this function.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
											
										 
											2018-05-16 22:50:24 +02:00
										 |  |  | } |