File indexing completed on 2024-05-12 16:42:34

0001 /*
0002     SPDX-FileCopyrightText: 2000-2001 Michael Edwardes <mte@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2017 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "mymoneycategory.h"
0008 
0009 #include <QString>
0010 #include <QStringList>
0011 #include <QDataStream>
0012 
0013 class MyMoneyCategoryPrivate
0014 {
0015 public:
0016     bool m_income; // if false, m_income == expense
0017     QString m_name;
0018     QStringList m_minorCategories;
0019 };
0020 
0021 MyMoneyCategory::MyMoneyCategory() :
0022     d_ptr(new MyMoneyCategoryPrivate)
0023 {
0024     Q_D(MyMoneyCategory);
0025     d->m_income = true;
0026 }
0027 
0028 MyMoneyCategory::MyMoneyCategory(const bool income, const QString& name) :
0029     d_ptr(new MyMoneyCategoryPrivate)
0030 {
0031     Q_D(MyMoneyCategory);
0032     d->m_income = income;
0033     d->m_name = name;
0034 }
0035 
0036 MyMoneyCategory::MyMoneyCategory(const bool income, const QString& name, QStringList minors) :
0037     d_ptr(new MyMoneyCategoryPrivate)
0038 {
0039     Q_D(MyMoneyCategory);
0040     d->m_income = income;
0041     d->m_name = name;
0042     d->m_minorCategories = minors;
0043 }
0044 
0045 MyMoneyCategory::MyMoneyCategory(const MyMoneyCategory& other) :
0046     d_ptr(new MyMoneyCategoryPrivate(*other.d_func()))
0047 {
0048 }
0049 
0050 MyMoneyCategory::~MyMoneyCategory()
0051 {
0052     Q_D(MyMoneyCategory);
0053     delete d;
0054 }
0055 
0056 QString MyMoneyCategory::name() const
0057 {
0058     Q_D(const MyMoneyCategory);
0059     return d->m_name;
0060 }
0061 
0062 QStringList& MyMoneyCategory::minorCategories()
0063 {
0064     Q_D(MyMoneyCategory);
0065     return d->m_minorCategories;
0066 }
0067 
0068 bool MyMoneyCategory::isIncome() const
0069 {
0070     Q_D(const MyMoneyCategory);
0071     return d->m_income;
0072 }
0073 
0074 void MyMoneyCategory::setIncome(const bool val)
0075 {
0076     Q_D(MyMoneyCategory);
0077     d->m_income = val;
0078 }
0079 
0080 void MyMoneyCategory::setName(const QString& val)
0081 {
0082     Q_D(MyMoneyCategory);
0083     d->m_name = val;
0084 }
0085 
0086 // Functions use the find method to search the list
0087 bool MyMoneyCategory::addMinorCategory(const QString& val)
0088 {
0089     Q_D(MyMoneyCategory);
0090     if (val.isEmpty() || val.isNull())
0091         return false;
0092 
0093     if (d->m_minorCategories.indexOf(val) == -1) {
0094         d->m_minorCategories.append(val);
0095         return true;
0096     }
0097 
0098     return false;
0099 }
0100 
0101 bool MyMoneyCategory::removeMinorCategory(const QString& val)
0102 {
0103     Q_D(MyMoneyCategory);
0104     if (val.isEmpty() || val.isNull())
0105         return false;
0106 
0107     if (d->m_minorCategories.indexOf(val) != -1) {
0108         d->m_minorCategories.removeOne(val);
0109         return true;
0110     }
0111 
0112     return false;
0113 }
0114 
0115 bool MyMoneyCategory::renameMinorCategory(const QString& oldVal, const QString& newVal)
0116 {
0117     Q_D(MyMoneyCategory);
0118     if (oldVal.isEmpty() || oldVal.isNull() || newVal.isEmpty() || newVal.isNull())
0119         return false;
0120 
0121     if ((d->m_minorCategories.indexOf(oldVal) != -1) &&
0122             (d->m_minorCategories.indexOf(newVal) == -1)) {
0123 
0124         d->m_minorCategories.removeOne(oldVal);
0125         return addMinorCategory(newVal);
0126     }
0127 
0128     return false;
0129 }
0130 
0131 bool MyMoneyCategory::addMinorCategory(QStringList values)
0132 {
0133     for (QStringList::Iterator it = values.begin(); it != values.end(); ++it) {
0134         addMinorCategory(*it);
0135     }
0136 
0137     return true;
0138 }
0139 
0140 bool MyMoneyCategory::setMinorCategories(QStringList values)
0141 {
0142     Q_D(MyMoneyCategory);
0143     d->m_minorCategories.clear();
0144     return addMinorCategory(values);
0145 }
0146 
0147 bool MyMoneyCategory::removeAllMinors()
0148 {
0149     Q_D(MyMoneyCategory);
0150     d->m_minorCategories.clear();
0151     return true;
0152 }
0153 
0154 QString MyMoneyCategory::firstMinor()
0155 {
0156     Q_D(MyMoneyCategory);
0157     return d->m_minorCategories.first();
0158 }
0159 
0160 QDataStream &operator<<(QDataStream &s, MyMoneyCategory &category)
0161 {
0162     if (category.d_func()->m_income)
0163         s << (qint32)1;
0164     else
0165         s << (qint32)0;
0166 
0167     s << category.d_func()->m_name;
0168 
0169     s << (quint32)category.d_func()->m_minorCategories.count();
0170     for (QStringList::Iterator it = category.d_func()->m_minorCategories.begin(); it != category.d_func()->m_minorCategories.end(); ++it) {
0171         s << (*it);
0172     }
0173 
0174     return s;
0175 }
0176 
0177 QDataStream &operator>>(QDataStream &s, MyMoneyCategory &category)
0178 {
0179     qint32 inc;
0180     s >> inc;
0181     if (inc == 0)
0182         category.d_func()->m_income = false;
0183     else
0184         category.d_func()->m_income = true;
0185 
0186     s >> category.d_func()->m_name;
0187 
0188     quint32 minorCount;
0189     QString buffer;
0190 
0191     s >> minorCount;
0192     category.d_func()->m_minorCategories.clear();
0193     for (unsigned int i = 0; i < minorCount; i++) {
0194         s >> buffer;
0195         category.d_func()->m_minorCategories.append(buffer);
0196     }
0197 
0198     return s;
0199 }
0200 
0201 void MyMoneyCategory::clear()
0202 {
0203     Q_D(MyMoneyCategory);
0204     d->m_minorCategories.clear();
0205 }