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 }