File indexing completed on 2024-05-12 16:43:57

0001 /*
0002     SPDX-FileCopyrightText: 2006-2018 Thomas Baumgart <tbaumgart@kde.org>
0003     SPDX-FileCopyrightText: 2017-2018 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "groupmarker.h"
0008 #include "groupmarker_p.h"
0009 
0010 // ----------------------------------------------------------------------------
0011 // QT Includes
0012 
0013 #include <QString>
0014 #include <QPixmap>
0015 #include <QHeaderView>
0016 #include <QStyleOptionViewItem>
0017 #include <QPainter>
0018 
0019 // ----------------------------------------------------------------------------
0020 // KDE Includes
0021 
0022 // ----------------------------------------------------------------------------
0023 // Project Includes
0024 
0025 #include "widgetenums.h"
0026 
0027 using namespace KMyMoneyRegister;
0028 
0029 QPixmap* GroupMarkerPrivate::GroupMarkerPrivate::m_bg = nullptr;
0030 int GroupMarkerPrivate::GroupMarkerPrivate::m_bgRefCnt = 0;
0031 
0032 GroupMarker::GroupMarker(Register *parent, const QString& txt) :
0033     RegisterItem(*new GroupMarkerPrivate, parent)
0034 {
0035     Q_D(GroupMarker);
0036     d->m_txt = txt;
0037     d->init();
0038 }
0039 
0040 GroupMarker::GroupMarker(GroupMarkerPrivate &dd, Register *parent, const QString& txt) :
0041     RegisterItem(dd, parent)
0042 {
0043     Q_D(GroupMarker);
0044     d->m_txt = txt;
0045     d->init();
0046 }
0047 
0048 GroupMarker::~GroupMarker()
0049 {
0050     Q_D(GroupMarker);
0051     --d->GroupMarkerPrivate::m_bgRefCnt;
0052     if (!d->GroupMarkerPrivate::m_bgRefCnt) {
0053         delete d->GroupMarkerPrivate::m_bg;
0054         d->GroupMarkerPrivate::m_bg = 0;
0055     }
0056 }
0057 
0058 void GroupMarker::setText(const QString& txt)
0059 {
0060     Q_D(GroupMarker);
0061     d->m_txt = txt;
0062 }
0063 
0064 QString GroupMarker::text() const
0065 {
0066     Q_D(const GroupMarker);
0067     return d->m_txt;
0068 }
0069 
0070 bool GroupMarker::isSelectable() const
0071 {
0072     return false;
0073 }
0074 
0075 bool GroupMarker::canHaveFocus() const
0076 {
0077     return false;
0078 }
0079 
0080 int GroupMarker::numRows() const
0081 {
0082     return 1;
0083 }
0084 
0085 const char* GroupMarker::className()
0086 {
0087     return "GroupMarker";
0088 }
0089 
0090 bool GroupMarker::isErroneous() const
0091 {
0092     Q_D(const GroupMarker);
0093     return d->m_erroneous;
0094 }
0095 
0096 void GroupMarker::paintRegisterCell(QPainter *painter, QStyleOptionViewItem &option, const QModelIndex &index)
0097 {
0098     Q_D(GroupMarker);
0099     QRect r(option.rect);
0100     painter->save();
0101 
0102     // the group marker always uses all cols
0103     r.setX(d->m_parent->horizontalHeader()->sectionPosition(0));
0104     r.setWidth(d->m_parent->viewport()->width());
0105     painter->translate(r.x(), r.y());
0106 
0107     QRect cellRect;
0108     cellRect.setX(0);
0109     cellRect.setY(0);
0110     cellRect.setWidth(d->m_parent->viewport()->width());
0111     cellRect.setHeight(d->m_parent->rowHeight(index.row()));
0112 
0113     option.palette.setColor(QPalette::Base, isErroneous() ? KMyMoneySettings::schemeColor(SchemeColor::TransactionErroneous) : KMyMoneySettings::schemeColor(SchemeColor::GroupMarker));
0114 
0115     QBrush backgroundBrush(option.palette.color(QPalette::Base));
0116     painter->fillRect(cellRect, backgroundBrush);
0117     painter->setPen(KMyMoneySettings::schemeColor(SchemeColor::ListGrid));
0118     painter->drawLine(cellRect.x(), cellRect.height() - 1, cellRect.width(), cellRect.height() - 1);
0119 
0120     // now write the text
0121     painter->setPen(option.palette.color(QPalette::HighlightedText));
0122     QFont font = painter->font();
0123     font.setBold(true);
0124     painter->setFont(font);
0125 
0126     painter->drawText(cellRect, Qt::AlignVCenter | Qt::AlignCenter, d->m_txt);
0127 
0128     cellRect.setHeight(d->GroupMarkerPrivate::m_bg->height());
0129 
0130     // now it's time to draw the background
0131     painter->drawPixmap(cellRect, *KMyMoneyRegister::GroupMarkerPrivate::m_bg);
0132 
0133     // in case we need to show the date, we just paint it in col 1
0134     if (d->m_showDate) {
0135         font.setBold(false);
0136         cellRect.setX(d->m_parent->horizontalHeader()->sectionPosition((int)eWidgets::eTransaction::Column::Date));
0137         cellRect.setWidth(d->m_parent->horizontalHeader()->sectionSize((int)eWidgets::eTransaction::Column::Date));
0138         painter->setFont(font);
0139         painter->drawText(cellRect, Qt::AlignVCenter | Qt::AlignCenter, QLocale().toString(sortPostDate(), QLocale::ShortFormat));
0140     }
0141 
0142     painter->restore();
0143 }
0144 
0145 void GroupMarker::paintFormCell(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index)
0146 {
0147     Q_UNUSED(painter);
0148     Q_UNUSED(option);
0149     Q_UNUSED(index);
0150 }
0151 
0152 int GroupMarker::rowHeightHint() const
0153 {
0154     Q_D(const GroupMarker);
0155     if (!d->m_visible)
0156         return 0;
0157 
0158     return d->GroupMarkerPrivate::m_bg->height();
0159 }
0160 
0161 bool GroupMarker::matches(const RegisterFilter&) const
0162 {
0163     return true;
0164 }
0165 
0166 int GroupMarker::sortSamePostDate() const
0167 {
0168     return 0;
0169 }
0170 
0171 void GroupMarker::setErroneous(bool condition)
0172 {
0173     Q_D(GroupMarker);
0174     d->m_erroneous = condition;
0175 }