2017-04-27 18:26:05 +00:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
2018-10-21 16:00:02 +00:00
|
|
|
|
2016-04-05 05:02:03 +00:00
|
|
|
#include "desktop-widgets/modeldelegates.h"
|
2018-05-11 15:25:41 +00:00
|
|
|
#include "core/subsurface-string.h"
|
2016-04-05 05:02:03 +00: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 18:56:37 +00:00
|
|
|
#include "profile-widget/profilewidget2.h"
|
2016-04-05 05:02:03 +00:00
|
|
|
#include "qt-models/tankinfomodel.h"
|
2018-05-10 15:35:30 +00:00
|
|
|
#include "qt-models/weightsysteminfomodel.h"
|
2016-04-05 05:02:03 +00:00
|
|
|
#include "qt-models/weightmodel.h"
|
|
|
|
#include "qt-models/divetripmodel.h"
|
2018-10-25 06:02:06 +00:00
|
|
|
#include "qt-models/divelocationmodel.h"
|
2016-04-05 05:02:03 +00:00
|
|
|
#include "core/qthelper.h"
|
2019-03-04 22:20:29 +00:00
|
|
|
#include "core/divesite.h"
|
2018-10-21 16:00:02 +00:00
|
|
|
#include "desktop-widgets/simplewidgets.h"
|
2015-05-28 21:33:51 +00:00
|
|
|
|
2013-05-23 18:33:20 +00:00
|
|
|
#include <QCompleter>
|
2015-02-09 20:58:40 +00:00
|
|
|
#include <QKeyEvent>
|
2015-02-09 22:37:17 +00:00
|
|
|
#include <QTextDocument>
|
2015-07-02 00:04:03 +00:00
|
|
|
#include <QApplication>
|
|
|
|
#include <QFont>
|
|
|
|
#include <QBrush>
|
|
|
|
#include <QColor>
|
2015-07-16 21:08:08 +00:00
|
|
|
#include <QAbstractProxyModel>
|
2018-10-21 16:00:02 +00:00
|
|
|
#include <QLineEdit>
|
|
|
|
#include <QAbstractItemView>
|
|
|
|
#include <QSpinBox>
|
2013-05-02 22:27:36 +00:00
|
|
|
|
2018-05-21 16:09:09 +00:00
|
|
|
QSize DiveListDelegate::sizeHint(const QStyleOptionViewItem&, const QModelIndex&) const
|
2013-12-11 23:44:05 +00:00
|
|
|
{
|
2018-08-26 21:37:01 +00:00
|
|
|
const QFontMetrics metrics(qApp->font());
|
|
|
|
return QSize(50, qMax(22, metrics.height()));
|
2013-12-11 23:44:05 +00:00
|
|
|
}
|
|
|
|
|
2013-07-18 13:24:02 +00:00
|
|
|
// Gets the index of the model in the currentRow and column.
|
|
|
|
// currCombo is defined below.
|
2014-01-16 04:50:56 +00:00
|
|
|
#define IDX(_XX) mymodel->index(currCombo.currRow, (_XX))
|
2013-10-15 16:45:24 +00:00
|
|
|
static bool keyboardFinished = false;
|
2013-07-18 13:24:02 +00:00
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
StarWidgetsDelegate::StarWidgetsDelegate(QWidget *parent) : QStyledItemDelegate(parent),
|
2013-05-02 22:27:36 +00:00
|
|
|
parentWidget(parent)
|
|
|
|
{
|
2014-10-15 13:30:52 +00:00
|
|
|
const IconMetrics& metrics = defaultIconMetrics();
|
|
|
|
minStarSize = QSize(metrics.sz_small * TOTALSTARS + metrics.spacing * (TOTALSTARS - 1), metrics.sz_small);
|
2013-05-02 22:27:36 +00:00
|
|
|
}
|
2013-04-27 15:27:27 +00:00
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
void StarWidgetsDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
|
2013-04-27 15:27:27 +00:00
|
|
|
{
|
2013-05-02 22:27:36 +00:00
|
|
|
QStyledItemDelegate::paint(painter, option, index);
|
2013-05-02 05:00:08 +00:00
|
|
|
if (!index.isValid())
|
2013-04-27 15:27:27 +00:00
|
|
|
return;
|
|
|
|
|
2018-12-27 09:06:11 +00:00
|
|
|
QVariant value = index.model()->data(index, DiveTripModelBase::STAR_ROLE);
|
2013-05-02 05:00:08 +00:00
|
|
|
if (!value.isValid())
|
2013-05-02 02:51:34 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
int rating = value.toInt();
|
2014-02-28 04:09:57 +00:00
|
|
|
int deltaY = option.rect.height() / 2 - StarWidget::starActive().height() / 2;
|
2013-04-27 15:27:27 +00:00
|
|
|
painter->save();
|
|
|
|
painter->setRenderHint(QPainter::Antialiasing, true);
|
2014-06-19 21:45:26 +00:00
|
|
|
const QPixmap active = QPixmap::fromImage(StarWidget::starActive());
|
|
|
|
const QPixmap inactive = QPixmap::fromImage(StarWidget::starInactive());
|
2014-10-15 13:30:52 +00:00
|
|
|
const IconMetrics& metrics = defaultIconMetrics();
|
2014-06-19 21:45:26 +00:00
|
|
|
|
2014-01-16 04:50:56 +00:00
|
|
|
for (int i = 0; i < rating; i++)
|
2014-10-15 13:30:52 +00:00
|
|
|
painter->drawPixmap(option.rect.x() + i * metrics.sz_small + metrics.spacing, option.rect.y() + deltaY, active);
|
2014-01-16 04:50:56 +00:00
|
|
|
for (int i = rating; i < TOTALSTARS; i++)
|
2014-10-15 13:30:52 +00:00
|
|
|
painter->drawPixmap(option.rect.x() + i * metrics.sz_small + metrics.spacing, option.rect.y() + deltaY, inactive);
|
2013-04-27 15:27:27 +00:00
|
|
|
painter->restore();
|
|
|
|
}
|
|
|
|
|
2018-05-21 16:09:09 +00:00
|
|
|
QSize StarWidgetsDelegate::sizeHint(const QStyleOptionViewItem&, const QModelIndex&) const
|
2013-04-27 15:27:27 +00:00
|
|
|
{
|
2014-10-15 13:30:49 +00:00
|
|
|
return minStarSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
const QSize& StarWidgetsDelegate::starSize() const
|
|
|
|
{
|
|
|
|
return minStarSize;
|
2013-04-27 15:27:27 +00:00
|
|
|
}
|
2013-05-22 17:11:49 +00:00
|
|
|
|
2017-03-26 21:47:21 +00:00
|
|
|
ComboBoxDelegate::ComboBoxDelegate(QAbstractItemModel *model, QObject *parent, bool allowEdit) : QStyledItemDelegate(parent), model(model)
|
2013-05-22 17:11:49 +00:00
|
|
|
{
|
2017-03-26 21:47:21 +00:00
|
|
|
editable = allowEdit;
|
2014-02-28 04:09:57 +00:00
|
|
|
connect(this, SIGNAL(closeEditor(QWidget *, QAbstractItemDelegate::EndEditHint)),
|
|
|
|
this, SLOT(revertModelData(QWidget *, QAbstractItemDelegate::EndEditHint)));
|
2014-07-16 22:10:23 +00:00
|
|
|
connect(this, SIGNAL(closeEditor(QWidget *, QAbstractItemDelegate::EndEditHint)),
|
|
|
|
this, SLOT(fixTabBehavior()));
|
2013-05-22 17:11:49 +00:00
|
|
|
}
|
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
void ComboBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
|
2013-05-23 18:33:20 +00:00
|
|
|
{
|
2014-02-28 04:09:57 +00:00
|
|
|
QComboBox *c = qobject_cast<QComboBox *>(editor);
|
2013-05-23 18:33:20 +00: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 17:58:24 +00:00
|
|
|
c->lineEdit()->setSelection(0, c->lineEdit()->text().length());
|
2013-05-23 18:33:20 +00:00
|
|
|
}
|
|
|
|
|
2019-04-27 15:42:09 +00:00
|
|
|
static struct CurrSelected {
|
2013-07-16 22:13:58 +00: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 19:37:24 +00:00
|
|
|
bool ignoreSelection;
|
2013-07-16 22:13:58 +00:00
|
|
|
} currCombo;
|
|
|
|
|
2018-05-21 16:09:09 +00:00
|
|
|
QWidget *ComboBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem&, const QModelIndex &index) const
|
2013-06-16 13:15:19 +00: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 19:37:24 +00:00
|
|
|
comboDelegate->view()->setEditTriggers(QAbstractItemView::AllEditTriggers);
|
2014-02-28 04:09:57 +00:00
|
|
|
comboDelegate->lineEdit()->installEventFilter(const_cast<QObject *>(qobject_cast<const QObject *>(this)));
|
2017-03-26 21:47:21 +00:00
|
|
|
comboDelegate->lineEdit()->setEnabled(editable);
|
2014-02-28 04:09:57 +00:00
|
|
|
comboDelegate->view()->installEventFilter(const_cast<QObject *>(qobject_cast<const QObject *>(this)));
|
2014-04-24 18:17:30 +00:00
|
|
|
QAbstractItemView *comboPopup = comboDelegate->lineEdit()->completer()->popup();
|
|
|
|
comboPopup->setMouseTracking(true);
|
2013-07-16 22:13:58 +00: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 19:37:24 +00:00
|
|
|
connect(comboDelegate, SIGNAL(activated(QString)), this, SLOT(fakeActivation()));
|
2014-04-24 18:17:30 +00:00
|
|
|
connect(comboPopup, SIGNAL(entered(QModelIndex)), this, SLOT(testActivation(QModelIndex)));
|
|
|
|
connect(comboPopup, SIGNAL(activated(QModelIndex)), this, SLOT(fakeActivation()));
|
2013-07-16 22:13:58 +00:00
|
|
|
currCombo.comboEditor = comboDelegate;
|
|
|
|
currCombo.currRow = index.row();
|
2014-02-28 04:09:57 +00:00
|
|
|
currCombo.model = const_cast<QAbstractItemModel *>(index.model());
|
2013-10-15 16:45:24 +00:00
|
|
|
keyboardFinished = false;
|
2013-09-27 15:52:01 +00: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 13:15:19 +00:00
|
|
|
return comboDelegate;
|
|
|
|
}
|
|
|
|
|
2013-09-26 22:59:58 +00: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-03 23:04:51 +00:00
|
|
|
* One thing is important, if the user writes a *new* cylinder or weight type, it will
|
2013-09-26 22:59:58 +00:00
|
|
|
* be ADDED to the list, and the user will need to fill the other data.
|
|
|
|
*/
|
2014-02-28 04:09:57 +00:00
|
|
|
void ComboBoxDelegate::testActivation(const QString &currText)
|
2013-07-16 22:13:58 +00:00
|
|
|
{
|
2013-09-26 22:59:58 +00:00
|
|
|
currCombo.activeText = currText.isEmpty() ? currCombo.comboEditor->currentText() : currText;
|
2013-07-16 22:13:58 +00:00
|
|
|
setModelData(currCombo.comboEditor, currCombo.model, QModelIndex());
|
|
|
|
}
|
|
|
|
|
2014-04-24 18:17:30 +00: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 19:37:24 +00:00
|
|
|
// HACK, send a fake event so Qt thinks we hit 'enter' on the line edit.
|
2014-02-28 04:09:57 +00: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 19:37:24 +00: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 04:50:56 +00: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 19:37:24 +00:00
|
|
|
currCombo.ignoreSelection = false;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
QKeyEvent ev(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier);
|
|
|
|
QStyledItemDelegate::eventFilter(currCombo.comboEditor, &ev);
|
|
|
|
}
|
|
|
|
|
2013-10-15 16:45:24 +00: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 04:50:56 +00:00
|
|
|
if (keyboardFinished) {
|
2014-02-28 04:09:57 +00:00
|
|
|
setModelData(0, 0, QModelIndex());
|
2013-10-15 16:45:24 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
bool ComboBoxDelegate::eventFilter(QObject *object, QEvent *event)
|
2013-07-16 18:31:44 +00:00
|
|
|
{
|
|
|
|
// Reacts on Key_UP and Key_DOWN to show the QComboBox - list of choices.
|
2014-01-16 04:50:56 +00:00
|
|
|
if (event->type() == QEvent::KeyPress || event->type() == QEvent::ShortcutOverride) {
|
|
|
|
if (object == currCombo.comboEditor) { // the 'LineEdit' part
|
2014-02-28 04:09:57 +00:00
|
|
|
QKeyEvent *ev = static_cast<QKeyEvent *>(event);
|
2014-01-16 04:50:56 +00: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 19:37:24 +00:00
|
|
|
currCombo.ignoreSelection = true;
|
2014-05-22 18:40:22 +00:00
|
|
|
if (!currCombo.comboEditor->completer()->popup()->isVisible()) {
|
2014-03-19 21:29:35 +00:00
|
|
|
currCombo.comboEditor->showPopup();
|
|
|
|
return true;
|
|
|
|
}
|
2013-07-17 14:47:23 +00:00
|
|
|
}
|
2014-01-16 04:50:56 +00:00
|
|
|
if (ev->key() == Qt::Key_Tab || ev->key() == Qt::Key_Enter || ev->key() == Qt::Key_Return) {
|
2014-02-28 04:09:57 +00:00
|
|
|
currCombo.activeText = currCombo.comboEditor->currentText();
|
2013-10-15 16:45:24 +00:00
|
|
|
keyboardFinished = true;
|
|
|
|
}
|
2014-02-28 04:09:57 +00:00
|
|
|
} else { // the 'Drop Down Menu' part.
|
|
|
|
QKeyEvent *ev = static_cast<QKeyEvent *>(event);
|
2014-01-16 04:50:56 +00:00
|
|
|
if (ev->key() == Qt::Key_Enter || ev->key() == Qt::Key_Return ||
|
2014-02-28 04:09:57 +00:00
|
|
|
ev->key() == Qt::Key_Tab || ev->key() == Qt::Key_Backtab ||
|
2014-01-16 04:50:56 +00:00
|
|
|
ev->key() == Qt::Key_Escape) {
|
2013-07-17 14:47:23 +00: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 18:31:44 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-01-16 04:50:56 +00:00
|
|
|
return QStyledItemDelegate::eventFilter(object, event);
|
2013-07-16 18:31:44 +00:00
|
|
|
}
|
|
|
|
|
2018-05-21 16:09:09 +00:00
|
|
|
void ComboBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex&) const
|
2013-06-16 15:33:27 +00:00
|
|
|
{
|
|
|
|
QRect defaultRect = option.rect;
|
2014-02-28 04:09:57 +00:00
|
|
|
defaultRect.setX(defaultRect.x() - 1);
|
|
|
|
defaultRect.setY(defaultRect.y() - 1);
|
|
|
|
defaultRect.setWidth(defaultRect.width() + 2);
|
|
|
|
defaultRect.setHeight(defaultRect.height() + 2);
|
2014-01-16 04:50:56 +00:00
|
|
|
editor->setGeometry(defaultRect);
|
2013-06-16 15:33:27 +00:00
|
|
|
}
|
|
|
|
|
2019-04-27 15:42:09 +00:00
|
|
|
static struct RevertCylinderData {
|
2013-07-18 13:24:02 +00:00
|
|
|
QString type;
|
|
|
|
int pressure;
|
|
|
|
int size;
|
|
|
|
} currCylinderData;
|
|
|
|
|
2018-05-21 16:09:09 +00:00
|
|
|
void TankInfoDelegate::setModelData(QWidget*, QAbstractItemModel*, const QModelIndex&) const
|
2013-05-23 18:33:20 +00:00
|
|
|
{
|
2013-07-16 22:13:58 +00:00
|
|
|
CylindersModel *mymodel = qobject_cast<CylindersModel *>(currCombo.model);
|
2013-05-23 18:59:12 +00:00
|
|
|
TankInfoModel *tanks = TankInfoModel::instance();
|
2014-02-28 04:09:57 +00:00
|
|
|
QModelIndexList matches = tanks->match(tanks->index(0, 0), Qt::DisplayRole, currCombo.activeText);
|
2013-05-24 05:56:12 +00:00
|
|
|
int row;
|
2014-07-16 22:05:49 +00:00
|
|
|
QString cylinderName = currCombo.activeText;
|
2013-05-24 05:56:12 +00:00
|
|
|
if (matches.isEmpty()) {
|
|
|
|
tanks->insertRows(tanks->rowCount(), 1);
|
2014-02-28 04:09:57 +00:00
|
|
|
tanks->setData(tanks->index(tanks->rowCount() - 1, 0), currCombo.activeText);
|
2013-05-24 05:56:12 +00:00
|
|
|
row = tanks->rowCount() - 1;
|
|
|
|
} else {
|
|
|
|
row = matches.first().row();
|
2014-07-16 22:05:49 +00:00
|
|
|
cylinderName = matches.first().data().toString();
|
2013-05-24 05:56:12 +00:00
|
|
|
}
|
|
|
|
int tankSize = tanks->data(tanks->index(row, TankInfoModel::ML)).toInt();
|
|
|
|
int tankPressure = tanks->data(tanks->index(row, TankInfoModel::BAR)).toInt();
|
|
|
|
|
2014-07-16 22:05:49 +00:00
|
|
|
mymodel->setData(IDX(CylindersModel::TYPE), cylinderName, Qt::EditRole);
|
2013-07-18 13:24:02 +00:00
|
|
|
mymodel->passInData(IDX(CylindersModel::WORKINGPRESS), tankPressure);
|
|
|
|
mymodel->passInData(IDX(CylindersModel::SIZE), tankSize);
|
2013-05-23 18:33:20 +00:00
|
|
|
}
|
|
|
|
|
2017-03-26 21:47:21 +00:00
|
|
|
TankInfoDelegate::TankInfoDelegate(QObject *parent) : ComboBoxDelegate(TankInfoModel::instance(), parent, true)
|
2013-05-24 01:40:16 +00:00
|
|
|
{
|
2014-12-13 21:06:52 +00:00
|
|
|
connect(this, SIGNAL(closeEditor(QWidget *, QAbstractItemDelegate::EndEditHint)),
|
|
|
|
this, SLOT(reenableReplot(QWidget *, QAbstractItemDelegate::EndEditHint)));
|
|
|
|
}
|
|
|
|
|
2018-05-21 16:09:09 +00:00
|
|
|
void TankInfoDelegate::reenableReplot(QWidget*, QAbstractItemDelegate::EndEditHint)
|
2014-12-13 21:06:52 +00:00
|
|
|
{
|
2018-10-12 13:07:40 +00:00
|
|
|
MainWindow::instance()->graphics->setReplot(true);
|
2015-03-19 12:32:43 +00:00
|
|
|
// FIXME: We need to replot after a cylinder is selected but the replot below overwrites
|
2015-01-31 21:25:28 +00:00
|
|
|
// the newly selected cylinder.
|
2018-10-12 13:07:40 +00:00
|
|
|
// MainWindow::instance()->graphics->replot();
|
2013-07-18 13:24:02 +00:00
|
|
|
}
|
|
|
|
|
2018-05-21 16:09:09 +00:00
|
|
|
void TankInfoDelegate::revertModelData(QWidget*, QAbstractItemDelegate::EndEditHint hint)
|
2013-07-18 13:24:02 +00:00
|
|
|
{
|
2014-08-29 16:53:57 +00:00
|
|
|
if (hint == QAbstractItemDelegate::NoHint ||
|
|
|
|
hint == QAbstractItemDelegate::RevertModelCache) {
|
2013-07-18 13:24:02 +00: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-28 04:09:57 +00:00
|
|
|
QWidget *TankInfoDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
|
2013-07-18 13:24:02 +00: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 15:27:37 +00:00
|
|
|
currCylinderData.type = cyl->type.description;
|
2013-07-18 13:24:02 +00:00
|
|
|
currCylinderData.pressure = cyl->type.workingpressure.mbar;
|
|
|
|
currCylinderData.size = cyl->type.size.mliter;
|
2018-10-12 13:07:40 +00:00
|
|
|
MainWindow::instance()->graphics->setReplot(false);
|
2013-07-18 13:24:02 +00:00
|
|
|
return delegate;
|
2013-05-24 01:40:16 +00:00
|
|
|
}
|
|
|
|
|
2014-12-18 18:47:00 +00:00
|
|
|
TankUseDelegate::TankUseDelegate(QObject *parent) : QStyledItemDelegate(parent)
|
2014-11-17 14:03:37 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2018-05-21 16:09:09 +00: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 19:03:16 +00: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 12:51:41 +00: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-04-27 15:42:09 +00:00
|
|
|
static struct RevertWeightData {
|
2013-07-18 14:53:47 +00:00
|
|
|
QString type;
|
2013-08-05 10:23:20 +00:00
|
|
|
int weight;
|
|
|
|
} currWeight;
|
2013-07-18 14:53:47 +00:00
|
|
|
|
2018-05-21 16:09:09 +00:00
|
|
|
void WSInfoDelegate::revertModelData(QWidget*, QAbstractItemDelegate::EndEditHint hint)
|
2013-07-18 14:53:47 +00:00
|
|
|
{
|
2014-08-29 16:53:57 +00:00
|
|
|
if (hint == QAbstractItemDelegate::NoHint ||
|
|
|
|
hint == QAbstractItemDelegate::RevertModelCache) {
|
2013-07-18 14:53:47 +00:00
|
|
|
WeightModel *mymodel = qobject_cast<WeightModel *>(currCombo.model);
|
2013-08-05 10:23:20 +00:00
|
|
|
mymodel->setData(IDX(WeightModel::TYPE), currWeight.type, Qt::EditRole);
|
|
|
|
mymodel->passInData(IDX(WeightModel::WEIGHT), currWeight.weight);
|
2013-07-18 14:53:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-05-21 16:09:09 +00:00
|
|
|
void WSInfoDelegate::setModelData(QWidget*, QAbstractItemModel*, const QModelIndex&) const
|
2013-05-24 01:40:16 +00:00
|
|
|
{
|
2013-07-16 22:13:58 +00:00
|
|
|
WeightModel *mymodel = qobject_cast<WeightModel *>(currCombo.model);
|
2013-05-24 05:56:12 +00:00
|
|
|
WSInfoModel *wsim = WSInfoModel::instance();
|
2014-02-28 04:09:57 +00:00
|
|
|
QModelIndexList matches = wsim->match(wsim->index(0, 0), Qt::DisplayRole, currCombo.activeText);
|
2013-05-24 05:56:12 +00:00
|
|
|
int row;
|
|
|
|
if (matches.isEmpty()) {
|
|
|
|
// we need to add this puppy
|
|
|
|
wsim->insertRows(wsim->rowCount(), 1);
|
2013-07-16 22:13:58 +00:00
|
|
|
wsim->setData(wsim->index(wsim->rowCount() - 1, 0), currCombo.activeText);
|
2013-05-24 05:56:12 +00:00
|
|
|
row = wsim->rowCount() - 1;
|
|
|
|
} else {
|
|
|
|
row = matches.first().row();
|
|
|
|
}
|
|
|
|
int grams = wsim->data(wsim->index(row, WSInfoModel::GR)).toInt();
|
2013-07-16 22:13:58 +00:00
|
|
|
QVariant v = QString(currCombo.activeText);
|
2013-07-18 12:01:37 +00:00
|
|
|
|
2013-07-18 13:24:02 +00:00
|
|
|
mymodel->setData(IDX(WeightModel::TYPE), v, Qt::EditRole);
|
|
|
|
mymodel->passInData(IDX(WeightModel::WEIGHT), grams);
|
2013-05-24 01:40:16 +00:00
|
|
|
}
|
|
|
|
|
2017-05-09 11:48:30 +00:00
|
|
|
WSInfoDelegate::WSInfoDelegate(QObject *parent) : ComboBoxDelegate(WSInfoModel::instance(), parent, true)
|
2013-05-24 01:40:16 +00:00
|
|
|
{
|
|
|
|
}
|
2013-07-18 13:24:02 +00:00
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
QWidget *WSInfoDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
|
2013-07-18 13:24:02 +00:00
|
|
|
{
|
2013-07-18 14:53:47 +00:00
|
|
|
/* First, call the combobox-create editor, it will setup our globals. */
|
|
|
|
QWidget *editor = ComboBoxDelegate::createEditor(parent, option, index);
|
|
|
|
WeightModel *mymodel = qobject_cast<WeightModel *>(currCombo.model);
|
2019-11-03 14:25:23 +00:00
|
|
|
weightsystem_t ws = mymodel->weightSystemAt(index);
|
|
|
|
currWeight.type = ws.description;
|
|
|
|
currWeight.weight = ws.weight.grams;
|
2013-07-18 14:53:47 +00:00
|
|
|
return editor;
|
2013-07-18 13:24:02 +00:00
|
|
|
}
|
2013-08-30 10:14:30 +00:00
|
|
|
|
2018-05-21 16:09:09 +00:00
|
|
|
void AirTypesDelegate::revertModelData(QWidget*, QAbstractItemDelegate::EndEditHint)
|
2013-08-30 10:14:30 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2014-02-28 04:09:57 +00:00
|
|
|
void AirTypesDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
|
2013-08-30 10:14:30 +00:00
|
|
|
{
|
2013-08-30 18:06:26 +00:00
|
|
|
if (!index.isValid())
|
|
|
|
return;
|
2014-02-28 04:09:57 +00:00
|
|
|
QComboBox *combo = qobject_cast<QComboBox *>(editor);
|
2016-07-06 12:40:28 +00:00
|
|
|
model->setData(index, QVariant(combo->currentIndex()));
|
2013-08-30 10:14:30 +00:00
|
|
|
}
|
|
|
|
|
2017-03-26 21:47:21 +00:00
|
|
|
AirTypesDelegate::AirTypesDelegate(QObject *parent) : ComboBoxDelegate(GasSelectionModel::instance(), parent, false)
|
2013-08-30 10:14:30 +00:00
|
|
|
{
|
|
|
|
}
|
2013-10-03 14:50:40 +00:00
|
|
|
|
2018-05-21 16:09:09 +00:00
|
|
|
void DiveTypesDelegate::revertModelData(QWidget*, QAbstractItemDelegate::EndEditHint)
|
2018-05-08 15:26:48 +00: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 12:24:25 +00:00
|
|
|
SpinBoxDelegate::SpinBoxDelegate(int min, int max, int step, QObject *parent):
|
2014-07-11 20:42:43 +00:00
|
|
|
QStyledItemDelegate(parent),
|
|
|
|
min(min),
|
2014-07-12 12:24:25 +00:00
|
|
|
max(max),
|
|
|
|
step(step)
|
2014-07-11 20:42:43 +00: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 12:24:25 +00:00
|
|
|
w->setSingleStep(step);
|
2014-07-11 20:42:43 +00:00
|
|
|
return w;
|
|
|
|
}
|
|
|
|
|
2014-07-12 12:24:25 +00:00
|
|
|
DoubleSpinBoxDelegate::DoubleSpinBoxDelegate(double min, double max, double step, QObject *parent):
|
2014-07-11 20:42:43 +00:00
|
|
|
QStyledItemDelegate(parent),
|
|
|
|
min(min),
|
2014-07-12 12:24:25 +00:00
|
|
|
max(max),
|
|
|
|
step(step)
|
2014-07-11 20:42:43 +00: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 12:24:25 +00:00
|
|
|
w->setSingleStep(step);
|
2014-07-11 20:42:43 +00:00
|
|
|
return w;
|
|
|
|
}
|
2014-07-17 23:10:44 +00:00
|
|
|
|
2019-04-25 07:35:46 +00:00
|
|
|
LocationFilterDelegate::LocationFilterDelegate(QObject *) : currentLocation({0, 0})
|
2015-07-01 22:31:56 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2019-04-25 07:35:46 +00:00
|
|
|
void LocationFilterDelegate::setCurrentLocation(location_t loc)
|
|
|
|
{
|
|
|
|
currentLocation = loc;
|
|
|
|
}
|
|
|
|
|
2015-07-16 21:08:08 +00:00
|
|
|
void LocationFilterDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &origIdx) const
|
2015-07-01 22:31:56 +00:00
|
|
|
{
|
2015-07-02 00:04:03 +00:00
|
|
|
QFont fontBigger = qApp->font();
|
|
|
|
QFont fontSmaller = qApp->font();
|
|
|
|
QFontMetrics fmBigger(fontBigger);
|
2017-03-25 15:06:46 +00:00
|
|
|
QStyleOptionViewItem opt = option;
|
2015-07-16 21:08:08 +00:00
|
|
|
const QAbstractProxyModel *proxyModel = dynamic_cast<const QAbstractProxyModel*>(origIdx.model());
|
2017-12-28 18:54:26 +00:00
|
|
|
if (!proxyModel)
|
|
|
|
return;
|
2015-07-16 21:08:08 +00:00
|
|
|
QModelIndex index = proxyModel->mapToSource(origIdx);
|
2015-07-02 00:04:03 +00:00
|
|
|
QStyledItemDelegate::initStyleOption(&opt, index);
|
|
|
|
QString diveSiteName = index.data().toString();
|
2015-07-14 21:43:47 +00:00
|
|
|
QString bottomText;
|
|
|
|
QIcon icon = index.data(Qt::DecorationRole).value<QIcon>();
|
2018-10-28 20:16:42 +00:00
|
|
|
struct dive_site *ds =
|
|
|
|
index.model()->data(index.model()->index(index.row(), LocationInformationModel::DIVESITE)).value<dive_site *>();
|
2019-04-25 07:35:46 +00:00
|
|
|
bool currentDiveHasGPS = has_location(¤tLocation);
|
2015-07-14 21:43:47 +00:00
|
|
|
//Special case: do not show name, but instead, show
|
2015-07-16 18:19:31 +00:00
|
|
|
if (index.row() < 2) {
|
2015-07-14 21:43:47 +00:00
|
|
|
diveSiteName = index.data().toString();
|
|
|
|
bottomText = index.data(Qt::ToolTipRole).toString();
|
|
|
|
goto print_part;
|
|
|
|
}
|
|
|
|
|
2015-07-02 00:04:03 +00:00
|
|
|
if (!ds)
|
|
|
|
return;
|
|
|
|
|
2015-07-14 18:44:40 +00: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 14:09:51 +00:00
|
|
|
continue;
|
|
|
|
if(!bottomText.isEmpty())
|
2015-07-14 18:44:40 +00:00
|
|
|
bottomText += " / ";
|
|
|
|
bottomText += QString(ds->taxonomy.category[idx].value);
|
2015-07-08 14:09:51 +00:00
|
|
|
}
|
|
|
|
|
2019-03-25 08:05:47 +00:00
|
|
|
if (bottomText.isEmpty())
|
|
|
|
bottomText = printGPSCoords(&ds->location);
|
2015-07-02 00:04:03 +00:00
|
|
|
|
2019-04-25 07:35:46 +00:00
|
|
|
if (dive_site_has_gps_location(ds) && currentDiveHasGPS) {
|
2015-07-14 18:35:04 +00: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 07:35:46 +00:00
|
|
|
if (same_location(&ds->location, ¤tLocation)) {
|
2015-07-14 18:35:04 +00:00
|
|
|
bottomText += tr(" (same GPS fix)");
|
|
|
|
} else {
|
2019-04-25 07:35:46 +00:00
|
|
|
int distanceMeters = get_distance(&ds->location, ¤tLocation);
|
2015-07-14 18:35:04 +00:00
|
|
|
QString distance = distance_string(distanceMeters);
|
2019-03-07 08:01:18 +00:00
|
|
|
int nr = nr_of_dives_at_dive_site(ds);
|
2015-07-18 20:34:05 +00:00
|
|
|
bottomText += tr(" (~%1 away").arg(distance);
|
2015-10-29 08:24:47 +00:00
|
|
|
bottomText += tr(", %n dive(s) here)", "", nr);
|
2015-07-14 18:35:04 +00:00
|
|
|
}
|
|
|
|
}
|
2015-07-15 17:37:25 +00:00
|
|
|
if (bottomText.isEmpty()) {
|
2019-04-25 07:35:46 +00:00
|
|
|
if (currentDiveHasGPS)
|
2015-07-15 17:37:25 +00: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 22:33:28 +00:00
|
|
|
print_part:
|
|
|
|
|
2015-07-08 13:11:13 +00:00
|
|
|
fontBigger.setPointSize(fontBigger.pointSize() + 1);
|
2015-07-02 00:04:03 +00:00
|
|
|
fontBigger.setBold(true);
|
2015-10-07 14:13:00 +00:00
|
|
|
QPen textPen = QPen(option.state & QStyle::State_Selected ? option.palette.highlightedText().color() : option.palette.text().color(), 1);
|
2015-07-02 00:04:03 +00:00
|
|
|
|
2015-07-08 14:13:06 +00:00
|
|
|
initStyleOption(&opt, index);
|
|
|
|
opt.text = QString();
|
2015-07-14 21:43:47 +00:00
|
|
|
opt.icon = QIcon();
|
2015-07-21 00:21:37 +00:00
|
|
|
painter->setClipRect(option.rect);
|
2015-07-08 14:13:06 +00:00
|
|
|
|
2015-07-02 00:04:03 +00:00
|
|
|
painter->save();
|
2015-10-07 14:13:00 +00:00
|
|
|
if (option.state & QStyle::State_Selected) {
|
|
|
|
painter->setPen(QPen(opt.palette.highlight().color().darker()));
|
|
|
|
painter->setBrush(opt.palette.highlight());
|
2017-03-23 01:13:49 +00:00
|
|
|
const int pad = 1;
|
|
|
|
const int pad2 = pad * 2;
|
|
|
|
const int rounding = 5;
|
2015-10-07 14:13:00 +00:00
|
|
|
painter->drawRoundedRect(option.rect.x() + pad,
|
2017-03-23 01:13:49 +00:00
|
|
|
option.rect.y() + pad,
|
|
|
|
option.rect.width() - pad2,
|
|
|
|
option.rect.height() - pad2,
|
|
|
|
rounding, rounding);
|
2015-10-07 14:13:00 +00:00
|
|
|
}
|
2015-07-21 00:25:10 +00:00
|
|
|
painter->setPen(textPen);
|
2015-07-02 00:04:03 +00:00
|
|
|
painter->setFont(fontBigger);
|
2017-03-23 01:13:49 +00:00
|
|
|
const int textPad = 5;
|
2015-10-07 14:13:00 +00:00
|
|
|
painter->drawText(option.rect.x() + textPad, option.rect.y() + fmBigger.boundingRect("YH").height(), diveSiteName);
|
2015-07-15 17:37:25 +00:00
|
|
|
double pointSize = fontSmaller.pointSizeF();
|
|
|
|
fontSmaller.setPointSizeF(0.9 * pointSize);
|
2015-07-02 00:04:03 +00:00
|
|
|
painter->setFont(fontSmaller);
|
2015-10-07 14:13:00 +00:00
|
|
|
painter->drawText(option.rect.x() + textPad, option.rect.y() + fmBigger.boundingRect("YH").height() * 2, bottomText);
|
2015-07-01 22:31:56 +00:00
|
|
|
painter->restore();
|
2015-07-14 21:43:47 +00: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 22:31:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
QSize LocationFilterDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
|
|
|
|
{
|
2015-07-02 00:04:03 +00:00
|
|
|
QFont fontBigger = qApp->font();
|
2015-07-08 13:11:13 +00:00
|
|
|
fontBigger.setPointSize(fontBigger.pointSize());
|
2015-07-02 00:04:03 +00:00
|
|
|
fontBigger.setBold(true);
|
|
|
|
|
|
|
|
QFontMetrics fmBigger(fontBigger);
|
|
|
|
|
|
|
|
QFont fontSmaller = qApp->font();
|
|
|
|
QFontMetrics fmSmaller(fontSmaller);
|
|
|
|
|
|
|
|
QSize retSize = QStyledItemDelegate::sizeHint(option, index);
|
2015-07-08 13:11:13 +00:00
|
|
|
retSize.setHeight(
|
|
|
|
fmBigger.boundingRect("Yellow House").height() + 5 /*spacing*/ +
|
|
|
|
fmSmaller.boundingRect("Yellow House").height());
|
|
|
|
|
2015-07-02 00:04:03 +00:00
|
|
|
return retSize;
|
2015-07-01 22:31:56 +00:00
|
|
|
}
|