| 
									
										
										
										
											2017-04-27 20:26:05 +02:00
										 |  |  | // SPDX-License-Identifier: GPL-2.0
 | 
					
						
							| 
									
										
										
										
											2018-10-21 18:00:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-04 22:02:03 -07:00
										 |  |  | #include "desktop-widgets/modeldelegates.h"
 | 
					
						
							| 
									
										
										
										
											2018-05-11 08:25:41 -07:00
										 |  |  | #include "core/subsurface-string.h"
 | 
					
						
							| 
									
										
										
										
											2016-04-04 22:02:03 -07:00
										 |  |  | #include "core/gettextfromc.h"
 | 
					
						
							|  |  |  | #include "desktop-widgets/mainwindow.h"
 | 
					
						
							|  |  |  | #include "qt-models/cylindermodel.h"
 | 
					
						
							|  |  |  | #include "qt-models/models.h"
 | 
					
						
							|  |  |  | #include "desktop-widgets/starwidget.h"
 | 
					
						
							| 
									
										
										
										
											2015-09-03 15:56:37 -03:00
										 |  |  | #include "profile-widget/profilewidget2.h"
 | 
					
						
							| 
									
										
										
										
											2016-04-04 22:02:03 -07:00
										 |  |  | #include "qt-models/tankinfomodel.h"
 | 
					
						
							| 
									
										
										
										
											2018-05-10 17:35:30 +02:00
										 |  |  | #include "qt-models/weightsysteminfomodel.h"
 | 
					
						
							| 
									
										
										
										
											2016-04-04 22:02:03 -07:00
										 |  |  | #include "qt-models/weightmodel.h"
 | 
					
						
							|  |  |  | #include "qt-models/divetripmodel.h"
 | 
					
						
							| 
									
										
										
										
											2018-10-25 08:02:06 +02:00
										 |  |  | #include "qt-models/divelocationmodel.h"
 | 
					
						
							| 
									
										
										
										
											2016-04-04 22:02:03 -07:00
										 |  |  | #include "core/qthelper.h"
 | 
					
						
							| 
									
										
										
										
											2019-03-04 23:20:29 +01:00
										 |  |  | #include "core/divesite.h"
 | 
					
						
							| 
									
										
										
										
											2018-10-21 18:00:02 +02:00
										 |  |  | #include "desktop-widgets/simplewidgets.h"
 | 
					
						
							| 
									
										
										
										
											2015-05-28 18:33:51 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-23 15:33:20 -03:00
										 |  |  | #include <QCompleter>
 | 
					
						
							| 
									
										
										
										
											2015-02-09 18:58:40 -02:00
										 |  |  | #include <QKeyEvent>
 | 
					
						
							| 
									
										
										
										
											2015-02-09 20:37:17 -02:00
										 |  |  | #include <QTextDocument>
 | 
					
						
							| 
									
										
										
										
											2015-07-01 21:04:03 -03:00
										 |  |  | #include <QApplication>
 | 
					
						
							|  |  |  | #include <QFont>
 | 
					
						
							|  |  |  | #include <QBrush>
 | 
					
						
							|  |  |  | #include <QColor>
 | 
					
						
							| 
									
										
										
										
											2015-07-16 18:08:08 -03:00
										 |  |  | #include <QAbstractProxyModel>
 | 
					
						
							| 
									
										
										
										
											2018-10-21 18:00:02 +02:00
										 |  |  | #include <QLineEdit>
 | 
					
						
							|  |  |  | #include <QAbstractItemView>
 | 
					
						
							|  |  |  | #include <QSpinBox>
 | 
					
						
							| 
									
										
										
										
											2013-05-02 19:27:36 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-21 18:09:09 +02:00
										 |  |  | QSize DiveListDelegate::sizeHint(const QStyleOptionViewItem&, const QModelIndex&) const | 
					
						
							| 
									
										
										
										
											2013-12-11 21:44:05 -02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-08-27 00:37:01 +03:00
										 |  |  | 	const QFontMetrics metrics(qApp->font()); | 
					
						
							|  |  |  | 	return QSize(50, qMax(22, metrics.height())); | 
					
						
							| 
									
										
										
										
											2013-12-11 21:44:05 -02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-18 10:24:02 -03:00
										 |  |  | // Gets the index of the model in the currentRow and column.
 | 
					
						
							|  |  |  | // currCombo is defined below.
 | 
					
						
							| 
									
										
										
										
											2014-01-16 11:50:56 +07:00
										 |  |  | #define IDX(_XX) mymodel->index(currCombo.currRow, (_XX))
 | 
					
						
							| 
									
										
										
										
											2013-10-15 13:45:24 -03:00
										 |  |  | static bool keyboardFinished = false; | 
					
						
							| 
									
										
										
										
											2013-07-18 10:24:02 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | StarWidgetsDelegate::StarWidgetsDelegate(QWidget *parent) : QStyledItemDelegate(parent), | 
					
						
							| 
									
										
										
										
											2013-05-02 19:27:36 -03:00
										 |  |  | 	parentWidget(parent) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-10-15 15:30:52 +02:00
										 |  |  | 	const IconMetrics& metrics = defaultIconMetrics(); | 
					
						
							|  |  |  | 	minStarSize = QSize(metrics.sz_small * TOTALSTARS + metrics.spacing * (TOTALSTARS - 1), metrics.sz_small); | 
					
						
							| 
									
										
										
										
											2013-05-02 19:27:36 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2013-04-27 12:27:27 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void StarWidgetsDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const | 
					
						
							| 
									
										
										
										
											2013-04-27 12:27:27 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-05-02 19:27:36 -03:00
										 |  |  | 	QStyledItemDelegate::paint(painter, option, index); | 
					
						
							| 
									
										
										
										
											2013-05-01 22:00:08 -07:00
										 |  |  | 	if (!index.isValid()) | 
					
						
							| 
									
										
										
										
											2013-04-27 12:27:27 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-27 10:06:11 +01:00
										 |  |  | 	QVariant value = index.model()->data(index, DiveTripModelBase::STAR_ROLE); | 
					
						
							| 
									
										
										
										
											2013-05-01 22:00:08 -07:00
										 |  |  | 	if (!value.isValid()) | 
					
						
							| 
									
										
										
										
											2013-05-01 23:51:34 -03:00
										 |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	int rating = value.toInt(); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	int deltaY = option.rect.height() / 2 - StarWidget::starActive().height() / 2; | 
					
						
							| 
									
										
										
										
											2013-04-27 12:27:27 -03:00
										 |  |  | 	painter->save(); | 
					
						
							|  |  |  | 	painter->setRenderHint(QPainter::Antialiasing, true); | 
					
						
							| 
									
										
										
										
											2014-06-19 18:45:26 -03:00
										 |  |  | 	const QPixmap active = QPixmap::fromImage(StarWidget::starActive()); | 
					
						
							|  |  |  | 	const QPixmap inactive = QPixmap::fromImage(StarWidget::starInactive()); | 
					
						
							| 
									
										
										
										
											2014-10-15 15:30:52 +02:00
										 |  |  | 	const IconMetrics& metrics = defaultIconMetrics(); | 
					
						
							| 
									
										
										
										
											2014-06-19 18:45:26 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 11:50:56 +07:00
										 |  |  | 	for (int i = 0; i < rating; i++) | 
					
						
							| 
									
										
										
										
											2014-10-15 15:30:52 +02:00
										 |  |  | 		painter->drawPixmap(option.rect.x() + i * metrics.sz_small + metrics.spacing, option.rect.y() + deltaY, active); | 
					
						
							| 
									
										
										
										
											2014-01-16 11:50:56 +07:00
										 |  |  | 	for (int i = rating; i < TOTALSTARS; i++) | 
					
						
							| 
									
										
										
										
											2014-10-15 15:30:52 +02:00
										 |  |  | 		painter->drawPixmap(option.rect.x() + i * metrics.sz_small + metrics.spacing, option.rect.y() + deltaY, inactive); | 
					
						
							| 
									
										
										
										
											2013-04-27 12:27:27 -03:00
										 |  |  | 	painter->restore(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-21 18:09:09 +02:00
										 |  |  | QSize StarWidgetsDelegate::sizeHint(const QStyleOptionViewItem&, const QModelIndex&) const | 
					
						
							| 
									
										
										
										
											2013-04-27 12:27:27 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-10-15 15:30:49 +02:00
										 |  |  | 	return minStarSize; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const QSize& StarWidgetsDelegate::starSize() const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return minStarSize; | 
					
						
							| 
									
										
										
										
											2013-04-27 12:27:27 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2013-05-22 14:11:49 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-26 23:47:21 +02:00
										 |  |  | ComboBoxDelegate::ComboBoxDelegate(QAbstractItemModel *model, QObject *parent, bool allowEdit) : QStyledItemDelegate(parent), model(model) | 
					
						
							| 
									
										
										
										
											2013-05-22 14:11:49 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2017-03-26 23:47:21 +02:00
										 |  |  | 	editable = allowEdit; | 
					
						
							| 
									
										
										
										
											2019-11-04 20:20:32 +01:00
										 |  |  | 	connect(this, &ComboBoxDelegate::closeEditor, this, &ComboBoxDelegate::editorClosed); | 
					
						
							|  |  |  | 	connect(this, &ComboBoxDelegate::closeEditor, this, &ComboBoxDelegate::fixTabBehavior); | 
					
						
							| 
									
										
										
										
											2013-05-22 14:11:49 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const | 
					
						
							| 
									
										
										
										
											2013-05-23 15:33:20 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	QComboBox *c = qobject_cast<QComboBox *>(editor); | 
					
						
							| 
									
										
										
										
											2013-05-23 15:33:20 -03:00
										 |  |  | 	QString data = index.model()->data(index, Qt::DisplayRole).toString(); | 
					
						
							|  |  |  | 	int i = c->findText(data); | 
					
						
							|  |  |  | 	if (i != -1) | 
					
						
							|  |  |  | 		c->setCurrentIndex(i); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		c->setEditText(data); | 
					
						
							| 
									
										
										
										
											2014-07-15 14:58:24 -03:00
										 |  |  | 	c->lineEdit()->setSelection(0, c->lineEdit()->text().length()); | 
					
						
							| 
									
										
										
										
											2013-05-23 15:33:20 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-27 17:42:09 +02:00
										 |  |  | static struct CurrSelected { | 
					
						
							| 
									
										
										
										
											2013-07-16 19:13:58 -03:00
										 |  |  | 	QComboBox *comboEditor; | 
					
						
							|  |  |  | 	int currRow; | 
					
						
							|  |  |  | 	QString activeText; | 
					
						
							|  |  |  | 	QAbstractItemModel *model; | 
					
						
							| 
									
										
										
											
												Make the Qt ComboBox behave in a Better Way
So, the ComboBox is a beast, and when used on a Delegate
it's very hard to get things right, wich is a pitty, because
I overly like qt. So:
1 - Combobox needs to show the popup when user press ↓ and ↑ keys
2 - Combobox needs to select when user press enter, not twice.
3 - Combobox neesds to select when user selects from the mouse, not
pressing enter after.
4 - Combobox needs to not mess with stuff when moving around.
Everything that I listed there works on a non-delegate combobox,
but for some reason, a delegate missed those, so I reimplemented
all. not nice, but now we have a code that will work, I hope.
*fingers crossed*
Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
											
										 
											2013-09-25 16:37:24 -03:00
										 |  |  | 	bool ignoreSelection; | 
					
						
							| 
									
										
										
										
											2013-07-16 19:13:58 -03:00
										 |  |  | } currCombo; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-21 18:09:09 +02:00
										 |  |  | QWidget *ComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem&, const QModelIndex &index) const | 
					
						
							| 
									
										
										
										
											2013-06-16 10:15:19 -03:00
										 |  |  | { | 
					
						
							|  |  |  | 	QComboBox *comboDelegate = new QComboBox(parent); | 
					
						
							|  |  |  | 	comboDelegate->setModel(model); | 
					
						
							|  |  |  | 	comboDelegate->setEditable(true); | 
					
						
							|  |  |  | 	comboDelegate->setAutoCompletion(true); | 
					
						
							|  |  |  | 	comboDelegate->setAutoCompletionCaseSensitivity(Qt::CaseInsensitive); | 
					
						
							|  |  |  | 	comboDelegate->completer()->setCompletionMode(QCompleter::PopupCompletion); | 
					
						
							| 
									
										
										
											
												Make the Qt ComboBox behave in a Better Way
So, the ComboBox is a beast, and when used on a Delegate
it's very hard to get things right, wich is a pitty, because
I overly like qt. So:
1 - Combobox needs to show the popup when user press ↓ and ↑ keys
2 - Combobox needs to select when user press enter, not twice.
3 - Combobox neesds to select when user selects from the mouse, not
pressing enter after.
4 - Combobox needs to not mess with stuff when moving around.
Everything that I listed there works on a non-delegate combobox,
but for some reason, a delegate missed those, so I reimplemented
all. not nice, but now we have a code that will work, I hope.
*fingers crossed*
Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
											
										 
											2013-09-25 16:37:24 -03:00
										 |  |  | 	comboDelegate->view()->setEditTriggers(QAbstractItemView::AllEditTriggers); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	comboDelegate->lineEdit()->installEventFilter(const_cast<QObject *>(qobject_cast<const QObject *>(this))); | 
					
						
							| 
									
										
										
										
											2017-03-26 23:47:21 +02:00
										 |  |  | 	comboDelegate->lineEdit()->setEnabled(editable); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	comboDelegate->view()->installEventFilter(const_cast<QObject *>(qobject_cast<const QObject *>(this))); | 
					
						
							| 
									
										
										
										
											2014-04-24 15:17:30 -03:00
										 |  |  | 	QAbstractItemView *comboPopup = comboDelegate->lineEdit()->completer()->popup(); | 
					
						
							|  |  |  | 	comboPopup->setMouseTracking(true); | 
					
						
							| 
									
										
										
										
											2013-07-16 19:13:58 -03:00
										 |  |  | 	connect(comboDelegate, SIGNAL(highlighted(QString)), this, SLOT(testActivation(QString))); | 
					
						
							| 
									
										
										
											
												Make the Qt ComboBox behave in a Better Way
So, the ComboBox is a beast, and when used on a Delegate
it's very hard to get things right, wich is a pitty, because
I overly like qt. So:
1 - Combobox needs to show the popup when user press ↓ and ↑ keys
2 - Combobox needs to select when user press enter, not twice.
3 - Combobox neesds to select when user selects from the mouse, not
pressing enter after.
4 - Combobox needs to not mess with stuff when moving around.
Everything that I listed there works on a non-delegate combobox,
but for some reason, a delegate missed those, so I reimplemented
all. not nice, but now we have a code that will work, I hope.
*fingers crossed*
Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
											
										 
											2013-09-25 16:37:24 -03:00
										 |  |  | 	connect(comboDelegate, SIGNAL(activated(QString)), this, SLOT(fakeActivation())); | 
					
						
							| 
									
										
										
										
											2014-04-24 15:17:30 -03:00
										 |  |  | 	connect(comboPopup, SIGNAL(entered(QModelIndex)), this, SLOT(testActivation(QModelIndex))); | 
					
						
							|  |  |  | 	connect(comboPopup, SIGNAL(activated(QModelIndex)), this, SLOT(fakeActivation())); | 
					
						
							| 
									
										
										
										
											2013-07-16 19:13:58 -03:00
										 |  |  | 	currCombo.comboEditor = comboDelegate; | 
					
						
							|  |  |  | 	currCombo.currRow = index.row(); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	currCombo.model = const_cast<QAbstractItemModel *>(index.model()); | 
					
						
							| 
									
										
										
										
											2013-10-15 13:45:24 -03:00
										 |  |  | 	keyboardFinished = false; | 
					
						
							| 
									
										
										
										
											2013-09-27 12:52:01 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// Current display of things on Gnome3 looks like shit, so
 | 
					
						
							|  |  |  | 	// let`s fix that.
 | 
					
						
							|  |  |  | 	if (isGnome3Session()) { | 
					
						
							|  |  |  | 		QPalette p; | 
					
						
							|  |  |  | 		p.setColor(QPalette::Window, QColor(Qt::white)); | 
					
						
							|  |  |  | 		p.setColor(QPalette::Base, QColor(Qt::white)); | 
					
						
							|  |  |  | 		comboDelegate->lineEdit()->setPalette(p); | 
					
						
							|  |  |  | 		comboDelegate->setPalette(p); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-06-16 10:15:19 -03:00
										 |  |  | 	return comboDelegate; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-26 19:59:58 -03:00
										 |  |  | /* This Method is being called when the user *writes* something and press enter or tab,
 | 
					
						
							|  |  |  |  * and it`s also called when the mouse walks over the list of choices from the ComboBox, | 
					
						
							| 
									
										
										
										
											2013-10-04 02:04:51 +03:00
										 |  |  |  * One thing is important, if the user writes a *new* cylinder or weight type, it will | 
					
						
							| 
									
										
										
										
											2013-09-26 19:59:58 -03:00
										 |  |  |  * be ADDED to the list, and the user will need to fill the other data. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void ComboBoxDelegate::testActivation(const QString &currText) | 
					
						
							| 
									
										
										
										
											2013-07-16 19:13:58 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-09-26 19:59:58 -03:00
										 |  |  | 	currCombo.activeText = currText.isEmpty() ? currCombo.comboEditor->currentText() : currText; | 
					
						
							| 
									
										
										
										
											2013-07-16 19:13:58 -03:00
										 |  |  | 	setModelData(currCombo.comboEditor, currCombo.model, QModelIndex()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-24 15:17:30 -03:00
										 |  |  | void ComboBoxDelegate::testActivation(const QModelIndex &currIndex) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	testActivation(currIndex.data().toString()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												Make the Qt ComboBox behave in a Better Way
So, the ComboBox is a beast, and when used on a Delegate
it's very hard to get things right, wich is a pitty, because
I overly like qt. So:
1 - Combobox needs to show the popup when user press ↓ and ↑ keys
2 - Combobox needs to select when user press enter, not twice.
3 - Combobox neesds to select when user selects from the mouse, not
pressing enter after.
4 - Combobox needs to not mess with stuff when moving around.
Everything that I listed there works on a non-delegate combobox,
but for some reason, a delegate missed those, so I reimplemented
all. not nice, but now we have a code that will work, I hope.
*fingers crossed*
Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
											
										 
											2013-09-25 16:37:24 -03:00
										 |  |  | // HACK, send a fake event so Qt thinks we hit 'enter' on the line edit.
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void ComboBoxDelegate::fakeActivation() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
											
												Make the Qt ComboBox behave in a Better Way
So, the ComboBox is a beast, and when used on a Delegate
it's very hard to get things right, wich is a pitty, because
I overly like qt. So:
1 - Combobox needs to show the popup when user press ↓ and ↑ keys
2 - Combobox needs to select when user press enter, not twice.
3 - Combobox neesds to select when user selects from the mouse, not
pressing enter after.
4 - Combobox needs to not mess with stuff when moving around.
Everything that I listed there works on a non-delegate combobox,
but for some reason, a delegate missed those, so I reimplemented
all. not nice, but now we have a code that will work, I hope.
*fingers crossed*
Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
											
										 
											2013-09-25 16:37:24 -03:00
										 |  |  | 	/* this test is needed because as soon as I show the selector,
 | 
					
						
							|  |  |  | 	 * the first item gots selected, this sending an activated signal, | 
					
						
							|  |  |  | 	 * calling this fakeActivation code and setting as the current, | 
					
						
							|  |  |  | 	 * thig that we don't want. so, let's just set the ignoreSelection | 
					
						
							|  |  |  | 	 * to false and be happy, because the next activation  ( by click | 
					
						
							|  |  |  | 	 * or keypress) is real. | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2014-01-16 11:50:56 +07:00
										 |  |  | 	if (currCombo.ignoreSelection) { | 
					
						
							| 
									
										
										
											
												Make the Qt ComboBox behave in a Better Way
So, the ComboBox is a beast, and when used on a Delegate
it's very hard to get things right, wich is a pitty, because
I overly like qt. So:
1 - Combobox needs to show the popup when user press ↓ and ↑ keys
2 - Combobox needs to select when user press enter, not twice.
3 - Combobox neesds to select when user selects from the mouse, not
pressing enter after.
4 - Combobox needs to not mess with stuff when moving around.
Everything that I listed there works on a non-delegate combobox,
but for some reason, a delegate missed those, so I reimplemented
all. not nice, but now we have a code that will work, I hope.
*fingers crossed*
Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
											
										 
											2013-09-25 16:37:24 -03:00
										 |  |  | 		currCombo.ignoreSelection = false; | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	QKeyEvent ev(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier); | 
					
						
							|  |  |  | 	QStyledItemDelegate::eventFilter(currCombo.comboEditor, &ev); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-15 13:45:24 -03:00
										 |  |  | // This 'reverts' the model data to what we actually choosed,
 | 
					
						
							|  |  |  | // becaus e a TAB is being understood by Qt as 'cancel' while
 | 
					
						
							|  |  |  | // we are on a QComboBox ( but not on a QLineEdit.
 | 
					
						
							|  |  |  | void ComboBoxDelegate::fixTabBehavior() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-01-16 11:50:56 +07:00
										 |  |  | 	if (keyboardFinished) { | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 		setModelData(0, 0, QModelIndex()); | 
					
						
							| 
									
										
										
										
											2013-10-15 13:45:24 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | bool ComboBoxDelegate::eventFilter(QObject *object, QEvent *event) | 
					
						
							| 
									
										
										
										
											2013-07-16 15:31:44 -03:00
										 |  |  | { | 
					
						
							|  |  |  | 	// Reacts on Key_UP and Key_DOWN to show the QComboBox - list of choices.
 | 
					
						
							| 
									
										
										
										
											2014-01-16 11:50:56 +07:00
										 |  |  | 	if (event->type() == QEvent::KeyPress || event->type() == QEvent::ShortcutOverride) { | 
					
						
							|  |  |  | 		if (object == currCombo.comboEditor) { // the 'LineEdit' part
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 			QKeyEvent *ev = static_cast<QKeyEvent *>(event); | 
					
						
							| 
									
										
										
										
											2014-01-16 11:50:56 +07:00
										 |  |  | 			if (ev->key() == Qt::Key_Up || ev->key() == Qt::Key_Down) { | 
					
						
							| 
									
										
										
											
												Make the Qt ComboBox behave in a Better Way
So, the ComboBox is a beast, and when used on a Delegate
it's very hard to get things right, wich is a pitty, because
I overly like qt. So:
1 - Combobox needs to show the popup when user press ↓ and ↑ keys
2 - Combobox needs to select when user press enter, not twice.
3 - Combobox neesds to select when user selects from the mouse, not
pressing enter after.
4 - Combobox needs to not mess with stuff when moving around.
Everything that I listed there works on a non-delegate combobox,
but for some reason, a delegate missed those, so I reimplemented
all. not nice, but now we have a code that will work, I hope.
*fingers crossed*
Signed-off-by: Tomaz Canabrava <tcanabrava@kde.org>
											
										 
											2013-09-25 16:37:24 -03:00
										 |  |  | 				currCombo.ignoreSelection = true; | 
					
						
							| 
									
										
										
										
											2014-05-22 11:40:22 -07:00
										 |  |  | 				if (!currCombo.comboEditor->completer()->popup()->isVisible()) { | 
					
						
							| 
									
										
										
										
											2014-03-19 18:29:35 -03:00
										 |  |  | 					currCombo.comboEditor->showPopup(); | 
					
						
							|  |  |  | 					return true; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-07-17 11:47:23 -03:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-01-16 11:50:56 +07:00
										 |  |  | 			if (ev->key() == Qt::Key_Tab || ev->key() == Qt::Key_Enter || ev->key() == Qt::Key_Return) { | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 				currCombo.activeText = currCombo.comboEditor->currentText(); | 
					
						
							| 
									
										
										
										
											2013-10-15 13:45:24 -03:00
										 |  |  | 				keyboardFinished = true; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 		} else { // the 'Drop Down Menu' part.
 | 
					
						
							|  |  |  | 			QKeyEvent *ev = static_cast<QKeyEvent *>(event); | 
					
						
							| 
									
										
										
										
											2014-01-16 11:50:56 +07:00
										 |  |  | 			if (ev->key() == Qt::Key_Enter || ev->key() == Qt::Key_Return || | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 			    ev->key() == Qt::Key_Tab || ev->key() == Qt::Key_Backtab || | 
					
						
							| 
									
										
										
										
											2014-01-16 11:50:56 +07:00
										 |  |  | 			    ev->key() == Qt::Key_Escape) { | 
					
						
							| 
									
										
										
										
											2013-07-17 11:47:23 -03:00
										 |  |  | 				// treat Qt as a silly little boy - pretending that the key_return nwas pressed on the combo,
 | 
					
						
							|  |  |  | 				// instead of the list of choices. this can be extended later for
 | 
					
						
							|  |  |  | 				// other imputs, like tab navigation and esc.
 | 
					
						
							|  |  |  | 				QStyledItemDelegate::eventFilter(currCombo.comboEditor, event); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-07-16 15:31:44 -03:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 11:50:56 +07:00
										 |  |  | 	return QStyledItemDelegate::eventFilter(object, event); | 
					
						
							| 
									
										
										
										
											2013-07-16 15:31:44 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-21 18:09:09 +02:00
										 |  |  | void ComboBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex&) const | 
					
						
							| 
									
										
										
										
											2013-06-16 12:33:27 -03:00
										 |  |  | { | 
					
						
							|  |  |  | 	QRect defaultRect = option.rect; | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	defaultRect.setX(defaultRect.x() - 1); | 
					
						
							|  |  |  | 	defaultRect.setY(defaultRect.y() - 1); | 
					
						
							|  |  |  | 	defaultRect.setWidth(defaultRect.width() + 2); | 
					
						
							|  |  |  | 	defaultRect.setHeight(defaultRect.height() + 2); | 
					
						
							| 
									
										
										
										
											2014-01-16 11:50:56 +07:00
										 |  |  | 	editor->setGeometry(defaultRect); | 
					
						
							| 
									
										
										
										
											2013-06-16 12:33:27 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-27 17:42:09 +02:00
										 |  |  | static struct RevertCylinderData { | 
					
						
							| 
									
										
										
										
											2013-07-18 10:24:02 -03:00
										 |  |  | 	QString type; | 
					
						
							|  |  |  | 	int pressure; | 
					
						
							|  |  |  | 	int size; | 
					
						
							|  |  |  | } currCylinderData; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-21 18:09:09 +02:00
										 |  |  | void TankInfoDelegate::setModelData(QWidget*, QAbstractItemModel*, const QModelIndex&) const | 
					
						
							| 
									
										
										
										
											2013-05-23 15:33:20 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-07-16 19:13:58 -03:00
										 |  |  | 	CylindersModel *mymodel = qobject_cast<CylindersModel *>(currCombo.model); | 
					
						
							| 
									
										
										
										
											2013-05-23 15:59:12 -03:00
										 |  |  | 	TankInfoModel *tanks = TankInfoModel::instance(); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	QModelIndexList matches = tanks->match(tanks->index(0, 0), Qt::DisplayRole, currCombo.activeText); | 
					
						
							| 
									
										
										
										
											2013-05-23 22:56:12 -07:00
										 |  |  | 	int row; | 
					
						
							| 
									
										
										
										
											2014-07-16 19:05:49 -03:00
										 |  |  | 	QString cylinderName = currCombo.activeText; | 
					
						
							| 
									
										
										
										
											2013-05-23 22:56:12 -07:00
										 |  |  | 	if (matches.isEmpty()) { | 
					
						
							|  |  |  | 		tanks->insertRows(tanks->rowCount(), 1); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 		tanks->setData(tanks->index(tanks->rowCount() - 1, 0), currCombo.activeText); | 
					
						
							| 
									
										
										
										
											2013-05-23 22:56:12 -07:00
										 |  |  | 		row = tanks->rowCount() - 1; | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		row = matches.first().row(); | 
					
						
							| 
									
										
										
										
											2014-07-16 19:05:49 -03:00
										 |  |  | 		cylinderName = matches.first().data().toString(); | 
					
						
							| 
									
										
										
										
											2013-05-23 22:56:12 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	int tankSize = tanks->data(tanks->index(row, TankInfoModel::ML)).toInt(); | 
					
						
							|  |  |  | 	int tankPressure = tanks->data(tanks->index(row, TankInfoModel::BAR)).toInt(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-16 19:05:49 -03:00
										 |  |  | 	mymodel->setData(IDX(CylindersModel::TYPE), cylinderName, Qt::EditRole); | 
					
						
							| 
									
										
										
										
											2013-07-18 10:24:02 -03:00
										 |  |  | 	mymodel->passInData(IDX(CylindersModel::WORKINGPRESS), tankPressure); | 
					
						
							|  |  |  | 	mymodel->passInData(IDX(CylindersModel::SIZE), tankSize); | 
					
						
							| 
									
										
										
										
											2013-05-23 15:33:20 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-26 23:47:21 +02:00
										 |  |  | TankInfoDelegate::TankInfoDelegate(QObject *parent) : ComboBoxDelegate(TankInfoModel::instance(), parent, true) | 
					
						
							| 
									
										
										
										
											2013-05-23 18:40:16 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-12-13 22:06:52 +01:00
										 |  |  | 	connect(this, SIGNAL(closeEditor(QWidget *, QAbstractItemDelegate::EndEditHint)), | 
					
						
							|  |  |  | 		this, SLOT(reenableReplot(QWidget *, QAbstractItemDelegate::EndEditHint))); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-21 18:09:09 +02:00
										 |  |  | void TankInfoDelegate::reenableReplot(QWidget*, QAbstractItemDelegate::EndEditHint) | 
					
						
							| 
									
										
										
										
											2014-12-13 22:06:52 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-12 15:07:40 +02:00
										 |  |  | 	MainWindow::instance()->graphics->setReplot(true); | 
					
						
							| 
									
										
										
										
											2015-03-19 13:32:43 +01:00
										 |  |  | 	// FIXME: We need to replot after a cylinder is selected but the replot below overwrites
 | 
					
						
							| 
									
										
										
										
											2015-01-31 22:25:28 +01:00
										 |  |  | 	//        the newly selected cylinder.
 | 
					
						
							| 
									
										
										
										
											2018-10-12 15:07:40 +02:00
										 |  |  | 	//	MainWindow::instance()->graphics->replot();
 | 
					
						
							| 
									
										
										
										
											2013-07-18 10:24:02 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-04 20:20:32 +01:00
										 |  |  | void TankInfoDelegate::editorClosed(QWidget*, QAbstractItemDelegate::EndEditHint hint) | 
					
						
							| 
									
										
										
										
											2013-07-18 10:24:02 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-08-29 09:53:57 -07:00
										 |  |  | 	if (hint == QAbstractItemDelegate::NoHint || | 
					
						
							|  |  |  | 	    hint == QAbstractItemDelegate::RevertModelCache) { | 
					
						
							| 
									
										
										
										
											2013-07-18 10:24:02 -03:00
										 |  |  | 		CylindersModel *mymodel = qobject_cast<CylindersModel *>(currCombo.model); | 
					
						
							|  |  |  | 		mymodel->setData(IDX(CylindersModel::TYPE), currCylinderData.type, Qt::EditRole); | 
					
						
							|  |  |  | 		mymodel->passInData(IDX(CylindersModel::WORKINGPRESS), currCylinderData.pressure); | 
					
						
							|  |  |  | 		mymodel->passInData(IDX(CylindersModel::SIZE), currCylinderData.size); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | QWidget *TankInfoDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const | 
					
						
							| 
									
										
										
										
											2013-07-18 10:24:02 -03:00
										 |  |  | { | 
					
						
							|  |  |  | 	// ncreate editor needs to be called before because it will populate a few
 | 
					
						
							|  |  |  | 	// things in the currCombo global var.
 | 
					
						
							|  |  |  | 	QWidget *delegate = ComboBoxDelegate::createEditor(parent, option, index); | 
					
						
							|  |  |  | 	CylindersModel *mymodel = qobject_cast<CylindersModel *>(currCombo.model); | 
					
						
							|  |  |  | 	cylinder_t *cyl = mymodel->cylinderAt(index); | 
					
						
							| 
									
										
										
										
											2019-04-27 17:27:37 +02:00
										 |  |  | 	currCylinderData.type = cyl->type.description; | 
					
						
							| 
									
										
										
										
											2013-07-18 10:24:02 -03:00
										 |  |  | 	currCylinderData.pressure = cyl->type.workingpressure.mbar; | 
					
						
							|  |  |  | 	currCylinderData.size = cyl->type.size.mliter; | 
					
						
							| 
									
										
										
										
											2018-10-12 15:07:40 +02:00
										 |  |  | 	MainWindow::instance()->graphics->setReplot(false); | 
					
						
							| 
									
										
										
										
											2013-07-18 10:24:02 -03:00
										 |  |  | 	return delegate; | 
					
						
							| 
									
										
										
										
											2013-05-23 18:40:16 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-18 10:47:00 -08:00
										 |  |  | TankUseDelegate::TankUseDelegate(QObject *parent) : QStyledItemDelegate(parent) | 
					
						
							| 
									
										
										
										
											2014-11-17 14:03:37 +00:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-21 18:09:09 +02:00
										 |  |  | QWidget *TankUseDelegate::createEditor(QWidget * parent, const QStyleOptionViewItem&, const QModelIndex&) const | 
					
						
							| 
									
										
										
										
											2014-11-17 14:03:37 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	QComboBox *comboBox = new QComboBox(parent); | 
					
						
							|  |  |  | 	for (int i = 0; i < NUM_GAS_USE; i++) | 
					
						
							| 
									
										
										
										
											2018-06-17 21:03:16 +02:00
										 |  |  | 		comboBox->addItem(gettextFromC::tr(cylinderuse_text[i])); | 
					
						
							| 
									
										
										
										
											2014-11-17 14:03:37 +00:00
										 |  |  | 	return comboBox; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void TankUseDelegate::setEditorData(QWidget * editor, const QModelIndex & index) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	QComboBox *comboBox = qobject_cast<QComboBox*>(editor); | 
					
						
							|  |  |  | 	QString indexString = index.data().toString(); | 
					
						
							| 
									
										
										
										
											2018-02-25 13:51:41 +01:00
										 |  |  | 	comboBox->setCurrentIndex(cylinderuse_from_text(qPrintable(indexString))); | 
					
						
							| 
									
										
										
										
											2014-11-17 14:03:37 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void TankUseDelegate::setModelData(QWidget * editor, QAbstractItemModel * model, const QModelIndex & index) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	QComboBox *comboBox = qobject_cast<QComboBox*>(editor); | 
					
						
							|  |  |  | 	model->setData(index, comboBox->currentIndex()); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-04 20:20:32 +01:00
										 |  |  | void WSInfoDelegate::editorClosed(QWidget*, QAbstractItemDelegate::EndEditHint hint) | 
					
						
							| 
									
										
										
										
											2013-07-18 11:53:47 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-11-04 20:20:32 +01:00
										 |  |  | 	WeightModel *mymodel = qobject_cast<WeightModel *>(currCombo.model); | 
					
						
							|  |  |  | 	if (hint == QAbstractItemDelegate::RevertModelCache) | 
					
						
							|  |  |  | 		mymodel->clearTempWS(); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		mymodel->commitTempWS(); | 
					
						
							| 
									
										
										
										
											2013-07-18 11:53:47 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-21 18:09:09 +02:00
										 |  |  | void WSInfoDelegate::setModelData(QWidget*, QAbstractItemModel*, const QModelIndex&) const | 
					
						
							| 
									
										
										
										
											2013-05-23 18:40:16 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-07-16 19:13:58 -03:00
										 |  |  | 	WeightModel *mymodel = qobject_cast<WeightModel *>(currCombo.model); | 
					
						
							| 
									
										
										
										
											2013-05-23 22:56:12 -07:00
										 |  |  | 	WSInfoModel *wsim = WSInfoModel::instance(); | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	QModelIndexList matches = wsim->match(wsim->index(0, 0), Qt::DisplayRole, currCombo.activeText); | 
					
						
							| 
									
										
										
										
											2013-05-23 22:56:12 -07:00
										 |  |  | 	int row; | 
					
						
							|  |  |  | 	if (matches.isEmpty()) { | 
					
						
							|  |  |  | 		// we need to add this puppy
 | 
					
						
							|  |  |  | 		wsim->insertRows(wsim->rowCount(), 1); | 
					
						
							| 
									
										
										
										
											2013-07-16 19:13:58 -03:00
										 |  |  | 		wsim->setData(wsim->index(wsim->rowCount() - 1, 0), currCombo.activeText); | 
					
						
							| 
									
										
										
										
											2013-05-23 22:56:12 -07:00
										 |  |  | 		row = wsim->rowCount() - 1; | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		row = matches.first().row(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	int grams = wsim->data(wsim->index(row, WSInfoModel::GR)).toInt(); | 
					
						
							| 
									
										
										
										
											2013-07-18 09:01:37 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-04 20:20:32 +01:00
										 |  |  | 	mymodel->setTempWS(currCombo.currRow, weightsystem_t{ { grams }, copy_qstring(currCombo.activeText) }); | 
					
						
							| 
									
										
										
										
											2013-05-23 18:40:16 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-09 13:48:30 +02:00
										 |  |  | WSInfoDelegate::WSInfoDelegate(QObject *parent) : ComboBoxDelegate(WSInfoModel::instance(), parent, true) | 
					
						
							| 
									
										
										
										
											2013-05-23 18:40:16 -07:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2013-07-18 10:24:02 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-04 20:20:32 +01:00
										 |  |  | void AirTypesDelegate::editorClosed(QWidget*, QAbstractItemDelegate::EndEditHint) | 
					
						
							| 
									
										
										
										
											2013-08-30 07:14:30 -03:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | void AirTypesDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const | 
					
						
							| 
									
										
										
										
											2013-08-30 07:14:30 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-08-30 15:06:26 -03:00
										 |  |  | 	if (!index.isValid()) | 
					
						
							|  |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2014-02-27 20:09:57 -08:00
										 |  |  | 	QComboBox *combo = qobject_cast<QComboBox *>(editor); | 
					
						
							| 
									
										
										
										
											2016-07-06 22:40:28 +10:00
										 |  |  | 	model->setData(index, QVariant(combo->currentIndex())); | 
					
						
							| 
									
										
										
										
											2013-08-30 07:14:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-03-26 23:47:21 +02:00
										 |  |  | AirTypesDelegate::AirTypesDelegate(QObject *parent) : ComboBoxDelegate(GasSelectionModel::instance(), parent, false) | 
					
						
							| 
									
										
										
										
											2013-08-30 07:14:30 -03:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2013-10-03 17:50:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-04 20:20:32 +01:00
										 |  |  | void DiveTypesDelegate::editorClosed(QWidget*, QAbstractItemDelegate::EndEditHint) | 
					
						
							| 
									
										
										
										
											2018-05-08 17:26:48 +02:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void DiveTypesDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (!index.isValid()) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	QComboBox *combo = qobject_cast<QComboBox *>(editor); | 
					
						
							|  |  |  | 	model->setData(index, QVariant(combo->currentIndex())); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DiveTypesDelegate::DiveTypesDelegate(QObject *parent) : ComboBoxDelegate(DiveTypeSelectionModel::instance(), parent, false) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-12 14:24:25 +02:00
										 |  |  | SpinBoxDelegate::SpinBoxDelegate(int min, int max, int step, QObject *parent): | 
					
						
							| 
									
										
										
										
											2014-07-11 17:42:43 -03:00
										 |  |  | 	QStyledItemDelegate(parent), | 
					
						
							|  |  |  | 	min(min), | 
					
						
							| 
									
										
										
										
											2014-07-12 14:24:25 +02:00
										 |  |  | 	max(max), | 
					
						
							|  |  |  | 	step(step) | 
					
						
							| 
									
										
										
										
											2014-07-11 17:42:43 -03:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QWidget *SpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	QSpinBox *w = qobject_cast<QSpinBox*>(QStyledItemDelegate::createEditor(parent, option, index)); | 
					
						
							|  |  |  | 	w->setRange(min,max); | 
					
						
							| 
									
										
										
										
											2014-07-12 14:24:25 +02:00
										 |  |  | 	w->setSingleStep(step); | 
					
						
							| 
									
										
										
										
											2014-07-11 17:42:43 -03:00
										 |  |  | 	return w; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-12 14:24:25 +02:00
										 |  |  | DoubleSpinBoxDelegate::DoubleSpinBoxDelegate(double min, double max, double step, QObject *parent): | 
					
						
							| 
									
										
										
										
											2014-07-11 17:42:43 -03:00
										 |  |  | 	QStyledItemDelegate(parent), | 
					
						
							|  |  |  | 	min(min), | 
					
						
							| 
									
										
										
										
											2014-07-12 14:24:25 +02:00
										 |  |  | 	max(max), | 
					
						
							|  |  |  | 	step(step) | 
					
						
							| 
									
										
										
										
											2014-07-11 17:42:43 -03:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QWidget *DoubleSpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	QDoubleSpinBox *w = qobject_cast<QDoubleSpinBox*>(QStyledItemDelegate::createEditor(parent, option, index)); | 
					
						
							|  |  |  | 	w->setRange(min,max); | 
					
						
							| 
									
										
										
										
											2014-07-12 14:24:25 +02:00
										 |  |  | 	w->setSingleStep(step); | 
					
						
							| 
									
										
										
										
											2014-07-11 17:42:43 -03:00
										 |  |  | 	return w; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-07-17 20:10:44 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-25 09:35:46 +02:00
										 |  |  | LocationFilterDelegate::LocationFilterDelegate(QObject *) : currentLocation({0, 0}) | 
					
						
							| 
									
										
										
										
											2015-07-01 19:31:56 -03:00
										 |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-25 09:35:46 +02:00
										 |  |  | void LocationFilterDelegate::setCurrentLocation(location_t loc) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	currentLocation = loc; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-16 18:08:08 -03:00
										 |  |  | void LocationFilterDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &origIdx) const | 
					
						
							| 
									
										
										
										
											2015-07-01 19:31:56 -03:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-07-01 21:04:03 -03:00
										 |  |  | 	QFont fontBigger = qApp->font(); | 
					
						
							|  |  |  | 	QFont fontSmaller = qApp->font(); | 
					
						
							|  |  |  | 	QFontMetrics fmBigger(fontBigger); | 
					
						
							| 
									
										
										
										
											2017-03-25 16:06:46 +01:00
										 |  |  | 	QStyleOptionViewItem opt = option; | 
					
						
							| 
									
										
										
										
											2015-07-16 18:08:08 -03:00
										 |  |  | 	const QAbstractProxyModel *proxyModel = dynamic_cast<const QAbstractProxyModel*>(origIdx.model()); | 
					
						
							| 
									
										
										
										
											2017-12-28 19:54:26 +01:00
										 |  |  | 	if (!proxyModel) | 
					
						
							|  |  |  | 		return; | 
					
						
							| 
									
										
										
										
											2015-07-16 18:08:08 -03:00
										 |  |  | 	QModelIndex index = proxyModel->mapToSource(origIdx); | 
					
						
							| 
									
										
										
										
											2015-07-01 21:04:03 -03:00
										 |  |  | 	QStyledItemDelegate::initStyleOption(&opt, index); | 
					
						
							|  |  |  | 	QString diveSiteName = index.data().toString(); | 
					
						
							| 
									
										
										
										
											2015-07-14 18:43:47 -03:00
										 |  |  | 	QString bottomText; | 
					
						
							|  |  |  | 	QIcon icon = index.data(Qt::DecorationRole).value<QIcon>(); | 
					
						
							| 
									
										
										
										
											2018-10-28 21:16:42 +01:00
										 |  |  | 	struct dive_site *ds = | 
					
						
							|  |  |  | 		index.model()->data(index.model()->index(index.row(), LocationInformationModel::DIVESITE)).value<dive_site *>(); | 
					
						
							| 
									
										
										
										
											2019-04-25 09:35:46 +02:00
										 |  |  | 	bool currentDiveHasGPS = has_location(¤tLocation); | 
					
						
							| 
									
										
										
										
											2015-07-14 18:43:47 -03:00
										 |  |  | 	//Special case: do not show name, but instead, show
 | 
					
						
							| 
									
										
										
										
											2015-07-16 11:19:31 -07:00
										 |  |  | 	if (index.row() < 2) { | 
					
						
							| 
									
										
										
										
											2015-07-14 18:43:47 -03:00
										 |  |  | 		diveSiteName = index.data().toString(); | 
					
						
							|  |  |  | 		bottomText = index.data(Qt::ToolTipRole).toString(); | 
					
						
							|  |  |  | 		goto print_part; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-01 21:04:03 -03:00
										 |  |  | 	if (!ds) | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-14 11:44:40 -07:00
										 |  |  | 	for (int i = 0; i < 3; i++) { | 
					
						
							|  |  |  | 		if (prefs.geocoding.category[i] == TC_NONE) | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		int idx = taxonomy_index_for_category(&ds->taxonomy, prefs.geocoding.category[i]); | 
					
						
							|  |  |  | 		if (idx == -1) | 
					
						
							| 
									
										
										
										
											2015-07-08 11:09:51 -03:00
										 |  |  | 			continue; | 
					
						
							|  |  |  | 		if(!bottomText.isEmpty()) | 
					
						
							| 
									
										
										
										
											2015-07-14 11:44:40 -07:00
										 |  |  | 			bottomText += " / "; | 
					
						
							|  |  |  | 		bottomText += QString(ds->taxonomy.category[idx].value); | 
					
						
							| 
									
										
										
										
											2015-07-08 11:09:51 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-25 09:05:47 +01:00
										 |  |  | 	if (bottomText.isEmpty()) | 
					
						
							|  |  |  | 		bottomText = printGPSCoords(&ds->location); | 
					
						
							| 
									
										
										
										
											2015-07-01 21:04:03 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-25 09:35:46 +02:00
										 |  |  | 	if (dive_site_has_gps_location(ds) && currentDiveHasGPS) { | 
					
						
							| 
									
										
										
										
											2015-07-14 11:35:04 -07:00
										 |  |  | 		// so we are showing a completion and both the current dive site and the completion
 | 
					
						
							|  |  |  | 		// have a GPS fix... so let's show the distance
 | 
					
						
							| 
									
										
										
										
											2019-04-25 09:35:46 +02:00
										 |  |  | 		if (same_location(&ds->location, ¤tLocation)) { | 
					
						
							| 
									
										
										
										
											2015-07-14 11:35:04 -07:00
										 |  |  | 			bottomText += tr(" (same GPS fix)"); | 
					
						
							|  |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2019-04-25 09:35:46 +02:00
										 |  |  | 			int distanceMeters = get_distance(&ds->location, ¤tLocation); | 
					
						
							| 
									
										
										
										
											2015-07-14 11:35:04 -07:00
										 |  |  | 			QString distance = distance_string(distanceMeters); | 
					
						
							| 
									
										
										
										
											2019-03-07 09:01:18 +01:00
										 |  |  | 			int nr = nr_of_dives_at_dive_site(ds); | 
					
						
							| 
									
										
										
										
											2015-07-18 13:34:05 -07:00
										 |  |  | 			bottomText += tr(" (~%1 away").arg(distance); | 
					
						
							| 
									
										
										
										
											2015-10-29 11:24:47 +03:00
										 |  |  | 			bottomText += tr(", %n dive(s) here)", "", nr); | 
					
						
							| 
									
										
										
										
											2015-07-14 11:35:04 -07:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-15 10:37:25 -07:00
										 |  |  | 	if (bottomText.isEmpty()) { | 
					
						
							| 
									
										
										
										
											2019-04-25 09:35:46 +02:00
										 |  |  | 		if (currentDiveHasGPS) | 
					
						
							| 
									
										
										
										
											2015-07-15 10:37:25 -07:00
										 |  |  | 			bottomText = tr("(no existing GPS data, add GPS fix from this dive)"); | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			bottomText = tr("(no GPS data)"); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	bottomText = tr("Pick site: ") + bottomText; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-14 15:33:28 -07:00
										 |  |  | print_part: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-08 10:11:13 -03:00
										 |  |  | 	fontBigger.setPointSize(fontBigger.pointSize() + 1); | 
					
						
							| 
									
										
										
										
											2015-07-01 21:04:03 -03:00
										 |  |  | 	fontBigger.setBold(true); | 
					
						
							| 
									
										
										
										
											2015-10-07 17:13:00 +03:00
										 |  |  | 	QPen textPen = QPen(option.state & QStyle::State_Selected ? option.palette.highlightedText().color() : option.palette.text().color(), 1); | 
					
						
							| 
									
										
										
										
											2015-07-01 21:04:03 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-08 11:13:06 -03:00
										 |  |  | 	initStyleOption(&opt, index); | 
					
						
							|  |  |  | 	opt.text = QString(); | 
					
						
							| 
									
										
										
										
											2015-07-14 18:43:47 -03:00
										 |  |  | 	opt.icon = QIcon(); | 
					
						
							| 
									
										
										
										
											2015-07-20 21:21:37 -03:00
										 |  |  | 	painter->setClipRect(option.rect); | 
					
						
							| 
									
										
										
										
											2015-07-08 11:13:06 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-01 21:04:03 -03:00
										 |  |  | 	painter->save(); | 
					
						
							| 
									
										
										
										
											2015-10-07 17:13:00 +03:00
										 |  |  | 	if (option.state & QStyle::State_Selected) { | 
					
						
							|  |  |  | 		painter->setPen(QPen(opt.palette.highlight().color().darker())); | 
					
						
							|  |  |  | 		painter->setBrush(opt.palette.highlight()); | 
					
						
							| 
									
										
										
										
											2017-03-23 08:13:49 +07:00
										 |  |  | 		const int pad = 1; | 
					
						
							|  |  |  | 		const int pad2 = pad * 2; | 
					
						
							|  |  |  | 		const int rounding = 5; | 
					
						
							| 
									
										
										
										
											2015-10-07 17:13:00 +03:00
										 |  |  | 		painter->drawRoundedRect(option.rect.x() + pad, | 
					
						
							| 
									
										
										
										
											2017-03-23 08:13:49 +07:00
										 |  |  | 					option.rect.y() + pad, | 
					
						
							|  |  |  | 					option.rect.width() - pad2, | 
					
						
							|  |  |  | 					option.rect.height() - pad2, | 
					
						
							|  |  |  | 					rounding, rounding); | 
					
						
							| 
									
										
										
										
											2015-10-07 17:13:00 +03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-20 21:25:10 -03:00
										 |  |  | 	painter->setPen(textPen); | 
					
						
							| 
									
										
										
										
											2015-07-01 21:04:03 -03:00
										 |  |  | 	painter->setFont(fontBigger); | 
					
						
							| 
									
										
										
										
											2017-03-23 08:13:49 +07:00
										 |  |  | 	const int textPad = 5; | 
					
						
							| 
									
										
										
										
											2015-10-07 17:13:00 +03:00
										 |  |  | 	painter->drawText(option.rect.x() + textPad, option.rect.y() + fmBigger.boundingRect("YH").height(), diveSiteName); | 
					
						
							| 
									
										
										
										
											2015-07-15 10:37:25 -07:00
										 |  |  | 	double pointSize = fontSmaller.pointSizeF(); | 
					
						
							|  |  |  | 	fontSmaller.setPointSizeF(0.9 * pointSize); | 
					
						
							| 
									
										
										
										
											2015-07-01 21:04:03 -03:00
										 |  |  | 	painter->setFont(fontSmaller); | 
					
						
							| 
									
										
										
										
											2015-10-07 17:13:00 +03:00
										 |  |  | 	painter->drawText(option.rect.x() + textPad, option.rect.y() + fmBigger.boundingRect("YH").height() * 2, bottomText); | 
					
						
							| 
									
										
										
										
											2015-07-01 19:31:56 -03:00
										 |  |  | 	painter->restore(); | 
					
						
							| 
									
										
										
										
											2015-07-14 18:43:47 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	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(); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-07-01 19:31:56 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | QSize LocationFilterDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2015-07-01 21:04:03 -03:00
										 |  |  | 	QFont fontBigger = qApp->font(); | 
					
						
							| 
									
										
										
										
											2015-07-08 10:11:13 -03:00
										 |  |  | 	fontBigger.setPointSize(fontBigger.pointSize()); | 
					
						
							| 
									
										
										
										
											2015-07-01 21:04:03 -03:00
										 |  |  | 	fontBigger.setBold(true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	QFontMetrics fmBigger(fontBigger); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	QFont fontSmaller = qApp->font(); | 
					
						
							|  |  |  | 	QFontMetrics fmSmaller(fontSmaller); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	QSize retSize = QStyledItemDelegate::sizeHint(option, index); | 
					
						
							| 
									
										
										
										
											2015-07-08 10:11:13 -03:00
										 |  |  | 	retSize.setHeight( | 
					
						
							|  |  |  | 		fmBigger.boundingRect("Yellow House").height() + 5 /*spacing*/ + | 
					
						
							|  |  |  | 		fmSmaller.boundingRect("Yellow House").height()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-01 21:04:03 -03:00
										 |  |  | 	return retSize; | 
					
						
							| 
									
										
										
										
											2015-07-01 19:31:56 -03:00
										 |  |  | } |