File indexing completed on 2024-06-16 04:46:58

0001 /*
0002     SPDX-FileCopyrightText: 2014-2016 Christian Dávid <christian-david@web.de>
0003     SPDX-License-Identifier: GPL-2.0-or-later
0004 */
0005 
0006 #include "ibanbicitemdelegate.h"
0007 
0008 #include <QApplication>
0009 #include <QPainter>
0010 #include <QAbstractItemView>
0011 
0012 #include <KLocalizedString>
0013 
0014 #include "models/payeeidentifiercontainermodel.h"
0015 #include "ibanbicitemedit.h"
0016 
0017 ibanBicItemDelegate::ibanBicItemDelegate(QObject* parent, const QVariantList&)
0018     : QStyledItemDelegate(parent)
0019 {
0020 
0021 }
0022 
0023 /** @todo elide texts */
0024 void ibanBicItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
0025 {
0026     QStyleOptionViewItem opt = option;
0027     initStyleOption(&opt, index);
0028 
0029     // Background
0030     QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
0031     style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget);
0032 
0033     const int margin = style->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1;
0034     const QRect textArea = QRect(opt.rect.x() + margin, opt.rect.y() + margin, opt.rect.width() - 2 * margin, opt.rect.height() - 2 * margin);
0035 
0036     // Do not paint text if the edit widget is shown
0037     const QAbstractItemView *view = qobject_cast<const QAbstractItemView *>(opt.widget);
0038     if (view && view->indexWidget(index))
0039         return;
0040 
0041     // Get data
0042     payeeIdentifierTyped<payeeIdentifiers::ibanBic> ibanBic = ibanBicByIndex(index);
0043 
0044     // Paint Bic
0045     painter->save();
0046     const QFont smallFont = painter->font();
0047     const QFontMetrics metrics(opt.font);
0048     const QFontMetrics smallMetrics(smallFont);
0049     const QRect bicRect = style->alignedRect((opt.direction  == Qt::RightToLeft) ? Qt::LeftToRight : Qt::RightToLeft, Qt::AlignTop, QSize(textArea.width(), smallMetrics.lineSpacing()),
0050                           QRect(textArea.left(), metrics.lineSpacing() + textArea.top(), textArea.width(), smallMetrics.lineSpacing())
0051                                             );
0052     painter->setFont(smallFont);
0053     style->drawItemText(painter, bicRect, Qt::AlignBottom | Qt::AlignRight, QApplication::palette(), true, ibanBic->storedBic(), opt.state & QStyle::State_Selected ? QPalette::HighlightedText : QPalette::Text);
0054     painter->restore();
0055 
0056     // Paint Bank name
0057     painter->save();
0058     const QRect nameRect = style->alignedRect(opt.direction, Qt::AlignTop, QSize(textArea.width(), smallMetrics.lineSpacing()),
0059                            QRect(textArea.left(), metrics.lineSpacing() + textArea.top(), textArea.width(), smallMetrics.lineSpacing())
0060                                              );
0061     style->drawItemText(painter, nameRect, Qt::AlignBottom, QApplication::palette(), true, ibanBic->institutionName(), opt.state & QStyle::State_Selected ? QPalette::HighlightedText : QPalette::Text);
0062     painter->restore();
0063 
0064     // Paint IBAN
0065     painter->save();
0066     QFont normal = painter->font();
0067     normal.setBold(true);
0068     painter->setFont(normal);
0069     const QRect ibanRect = style->alignedRect(opt.direction, Qt::AlignTop, QSize(textArea.width(), metrics.lineSpacing()), textArea);
0070     style->drawItemText(painter, ibanRect, Qt::AlignTop, QApplication::palette(), true, ibanBic->paperformatIban(), opt.state & QStyle::State_Selected ? QPalette::HighlightedText : QPalette::Text);
0071     painter->restore();
0072 
0073     // Paint type
0074     painter->save();
0075     QRect typeRect = style->alignedRect(opt.direction, Qt::AlignTop | Qt::AlignRight, QSize(textArea.width() / 5, metrics.lineSpacing()), textArea);
0076     style->drawItemText(painter, typeRect, Qt::AlignTop | Qt::AlignRight, QApplication::palette(), true, i18n("IBAN & BIC"), opt.state & QStyle::State_Selected ? QPalette::HighlightedText : QPalette::Text);
0077     painter->restore();
0078 }
0079 
0080 QSize ibanBicItemDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const
0081 {
0082     QStyleOptionViewItem opt = option;
0083     initStyleOption(&opt, index);
0084 
0085     // Test if current index is edited at the moment
0086     const QAbstractItemView *view = qobject_cast<const QAbstractItemView *>(opt.widget);
0087     if (view && view->indexWidget(index))
0088         return view->indexWidget(index)->sizeHint();
0089 
0090     QFontMetrics metrics(option.font);
0091     const QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
0092     const int margin = style->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1;
0093 
0094     // A bic has maximal 11 characters, an IBAN 32
0095     return QSize((32 + 11) * metrics.horizontalAdvance(QLatin1Char('X')) + 3 * margin, 3 * metrics.lineSpacing() + metrics.leading() + 2 * margin);
0096 }
0097 
0098 QWidget* ibanBicItemDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem& option, const QModelIndex& index) const
0099 {
0100     Q_UNUSED(option);
0101     ibanBicItemEdit* edit = new ibanBicItemEdit(parent);
0102     connect(edit, &ibanBicItemEdit::commitData, this, &ibanBicItemDelegate::commitData);
0103     connect(edit, &ibanBicItemEdit::closeEditor, this, [&](QWidget* editor) {
0104         Q_EMIT const_cast<ibanBicItemDelegate*>(this)->closeEditor(editor);
0105     } );
0106     Q_EMIT const_cast<ibanBicItemDelegate*>(this)->sizeHintChanged(index);
0107     return edit;
0108 }
0109 
0110 void ibanBicItemDelegate::setEditorData(QWidget* editor, const QModelIndex& index) const
0111 {
0112     payeeIdentifierTyped<payeeIdentifiers::ibanBic> ibanBic = ibanBicByIndex(index);
0113     ibanBicItemEdit* ibanEditor = qobject_cast< ibanBicItemEdit* >(editor);
0114     Q_CHECK_PTR(ibanEditor);
0115 
0116     ibanEditor->setIdentifier(ibanBic);
0117 }
0118 
0119 void ibanBicItemDelegate::setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const
0120 {
0121     Q_CHECK_PTR(editor);
0122     Q_CHECK_PTR(model);
0123     Q_ASSERT(index.isValid());
0124 
0125     ibanBicItemEdit* ibanEditor = qobject_cast< ibanBicItemEdit* >(editor);
0126     Q_CHECK_PTR(ibanEditor);
0127 
0128     model->setData(index, QVariant::fromValue<payeeIdentifier>(ibanEditor->identifier()), payeeIdentifierContainerModel::payeeIdentifier);
0129 }
0130 
0131 void ibanBicItemDelegate::updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const
0132 {
0133     Q_UNUSED(index);
0134     editor->setGeometry(option.rect);
0135 }
0136 
0137 /**
0138  * Internal helper to directly convert the QVariant into the correct pointer type.
0139  */
0140 payeeIdentifierTyped<payeeIdentifiers::ibanBic> ibanBicItemDelegate::ibanBicByIndex(const QModelIndex& index) const
0141 {
0142     payeeIdentifierTyped<payeeIdentifiers::ibanBic> ibanBic{
0143         index.model()->data(index, payeeIdentifierContainerModel::payeeIdentifier).value<payeeIdentifier>()
0144     };
0145     Q_ASSERT(!ibanBic.isNull());
0146     return ibanBic;
0147 }