File indexing completed on 2024-06-16 04:46:58
0001 /* 0002 SPDX-FileCopyrightText: 2014-2015 Christian Dávid <christian-david@web.de> 0003 SPDX-License-Identifier: GPL-2.0-or-later 0004 */ 0005 0006 #include "kbicedit.h" 0007 0008 #include <QApplication> 0009 #include <QCompleter> 0010 #include <QStyledItemDelegate> 0011 #include <QPainter> 0012 #include <QStyle> 0013 #include <QAbstractItemView> 0014 0015 #include "kmymoneyplugin.h" 0016 #include "bicvalidator.h" 0017 #include "kmymoneyvalidationfeedback.h" 0018 #include "plugins/ibanbicdata/ibanbicdataenums.h" 0019 0020 class bicItemDelegate : public QStyledItemDelegate 0021 { 0022 public: 0023 explicit bicItemDelegate(QObject* parent = 0) : QStyledItemDelegate(parent) {} 0024 void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index) const final override; 0025 QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const final override; 0026 0027 private: 0028 inline QFont getSmallFont(const QStyleOptionViewItem& option) const; 0029 }; 0030 0031 KBicEdit::KBicEdit(QWidget* parent) 0032 : KLineEdit(parent) 0033 { 0034 QCompleter* completer = new QCompleter(this); 0035 if (auto plugin = pPlugins.data.value(QString::fromLatin1("ibanbicdata"), nullptr)) 0036 if (auto model = plugin->requestData(QString(), eIBANBIC::DataType::bicModel).value<QAbstractItemModel *>()) 0037 completer->setModel(model); 0038 0039 m_popupDelegate = new bicItemDelegate(this); 0040 completer->popup()->setItemDelegate(m_popupDelegate); 0041 0042 setCompleter(completer); 0043 0044 bicValidator *const validator = new bicValidator(this); 0045 setValidator(validator); 0046 } 0047 0048 KBicEdit::~KBicEdit() 0049 { 0050 delete m_popupDelegate; 0051 } 0052 0053 QFont bicItemDelegate::getSmallFont(const QStyleOptionViewItem& option) const 0054 { 0055 QFont smallFont = option.font; 0056 smallFont.setPointSize(0.9*smallFont.pointSize()); 0057 return smallFont; 0058 } 0059 0060 QSize bicItemDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const 0061 { 0062 QStyleOptionViewItem opt = option; 0063 initStyleOption(&opt, index); 0064 0065 QFontMetrics metrics(option.font); 0066 QFontMetrics smallMetrics(getSmallFont(option)); 0067 const QStyle *style = opt.widget ? opt.widget->style() : QApplication::style(); 0068 const int margin = style->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1; 0069 0070 // A bic has maximal 11 characters. So we guess, we want to display 11 characters. The name of the institution has to adapt to what is given 0071 return QSize(metrics.horizontalAdvance(QLatin1Char('X')) + 2 * margin, 0072 metrics.lineSpacing() + smallMetrics.lineSpacing() + smallMetrics.leading() + 2 * margin); 0073 } 0074 0075 /** 0076 * @todo enable eliding (use QFontMetrics::elidedText() ) 0077 */ 0078 void bicItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const 0079 { 0080 QStyleOptionViewItem opt = option; 0081 initStyleOption(&opt, index); 0082 0083 // Background 0084 QStyle *style = opt.widget ? opt.widget->style() : QApplication::style(); 0085 style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget); 0086 0087 const int margin = style->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1; 0088 const QRect textArea = QRect(opt.rect.x() + margin, opt.rect.y() + margin, opt.rect.width() - 2 * margin, opt.rect.height() - 2 * margin); 0089 0090 // Paint name 0091 painter->save(); 0092 QFont smallFont = getSmallFont(opt); 0093 QFontMetrics metrics(opt.font); 0094 QFontMetrics smallMetrics(smallFont); 0095 QRect nameRect = style->alignedRect(opt.direction, Qt::AlignBottom, QSize(textArea.width(), smallMetrics.lineSpacing()), textArea); 0096 painter->setFont(smallFont); 0097 style->drawItemText(painter, nameRect, Qt::AlignBottom, QApplication::palette(), true, index.model()->data(index, eIBANBIC::DisplayRole::InstitutionNameRole).toString(), option.state & QStyle::State_Selected ? QPalette::HighlightedText : QPalette::Mid); 0098 painter->restore(); 0099 0100 // Paint BIC 0101 painter->save(); 0102 QFont normal = painter->font(); 0103 normal.setBold(true); 0104 painter->setFont(normal); 0105 QRect bicRect = style->alignedRect(opt.direction, Qt::AlignTop, QSize(textArea.width(), metrics.lineSpacing()), textArea); 0106 const QString bic = index.model()->data(index, Qt::DisplayRole).toString(); 0107 style->drawItemText(painter, bicRect, Qt::AlignTop, QApplication::palette(), true, bic, option.state & QStyle::State_Selected ? QPalette::HighlightedText : QPalette::Text); 0108 0109 painter->restore(); 0110 }