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 }