File indexing completed on 2024-05-12 16:44:02

0001 /*
0002     SPDX-FileCopyrightText: 2004-2011 Thomas Baumgart <tbaumgart@kde.org>
0003     SPDX-FileCopyrightText: 2017 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "kmymoneycurrencyselector.h"
0008 
0009 // ----------------------------------------------------------------------------
0010 // QT Includes
0011 
0012 #include <QPixmap>
0013 #include <QIcon>
0014 
0015 // ----------------------------------------------------------------------------
0016 // KDE Includes
0017 
0018 // ----------------------------------------------------------------------------
0019 // Project Includes
0020 
0021 #include "mymoneyfile.h"
0022 #include "mymoneysecurity.h"
0023 #include "icons/icons.h"
0024 
0025 using namespace Icons;
0026 
0027 class KMyMoneySecuritySelectorPrivate
0028 {
0029     Q_DISABLE_COPY(KMyMoneySecuritySelectorPrivate)
0030     Q_DECLARE_PUBLIC(KMyMoneySecuritySelector)
0031 
0032 public:
0033     enum displayItemE {
0034         Symbol = 0,
0035         FullName
0036     };
0037 
0038     enum displayTypeE {
0039         TypeCurrencies = 0x01,
0040         TypeSecurities = 0x02,
0041         TypeAll        = 0x03
0042     };
0043 
0044     explicit KMyMoneySecuritySelectorPrivate(KMyMoneySecuritySelector *qq):
0045         q_ptr(qq),
0046         m_displayItem(FullName),
0047         m_selectedItemId(0),
0048         m_displayOnly(false),
0049         m_displayType(TypeAll)
0050     {
0051     }
0052 
0053     void selectDisplayItem(displayItemE item)
0054     {
0055         Q_Q(KMyMoneySecuritySelector);
0056         m_displayItem = item;
0057         q->update(QString());
0058     }
0059 
0060     void setDisplayType(displayTypeE type)
0061     {
0062         m_displayType = type;
0063     }
0064 
0065     KMyMoneySecuritySelector *q_ptr;
0066     MyMoneySecurity m_currency;
0067     displayItemE    m_displayItem;
0068     int             m_selectedItemId;
0069     bool            m_displayOnly;
0070     displayTypeE    m_displayType;
0071     QList<MyMoneySecurity> m_list;
0072 };
0073 
0074 KMyMoneySecuritySelector::KMyMoneySecuritySelector(QWidget *parent) :
0075     KComboBox(parent),
0076     d_ptr(new KMyMoneySecuritySelectorPrivate(this))
0077 {
0078     // update(QString());
0079 }
0080 
0081 KMyMoneySecuritySelector::~KMyMoneySecuritySelector()
0082 {
0083     Q_D(KMyMoneySecuritySelector);
0084     delete d;
0085 }
0086 
0087 void KMyMoneySecuritySelector::update(const QString& id)
0088 {
0089     Q_D(KMyMoneySecuritySelector);
0090     MyMoneySecurity curr = MyMoneyFile::instance()->baseCurrency();
0091     QString baseCurrency = curr.id();
0092 
0093     if (!id.isEmpty())
0094         curr = d->m_currency;
0095 
0096     this->clear();
0097     d->m_list.clear();
0098     if (d->m_displayType & KMyMoneySecuritySelectorPrivate::TypeCurrencies)
0099         d->m_list += MyMoneyFile::instance()->currencyList();
0100     if (d->m_displayType & KMyMoneySecuritySelectorPrivate::TypeSecurities)
0101         d->m_list += MyMoneyFile::instance()->securityList();
0102 
0103     // sort
0104     qSort(d->m_list);
0105 
0106     QList<MyMoneySecurity>::ConstIterator it;
0107 
0108     // construct a transparent 16x16 pixmap
0109     // clang-format off
0110     static unsigned char empty_png[] = {
0111         0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A,
0112         0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52,
0113         0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10,
0114         0x08, 0x06, 0x00, 0x00, 0x00, 0x1F, 0xF3, 0xFF,
0115         0x61, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47,
0116         0x42, 0x00, 0xAE, 0xCE, 0x1C, 0xE9, 0x00, 0x00,
0117         0x00, 0x06, 0x62, 0x4B, 0x47, 0x44, 0x00, 0xFF,
0118         0x00, 0xFF, 0x00, 0xFF, 0xA0, 0xBD, 0xA7, 0x93,
0119         0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73,
0120         0x00, 0x00, 0x0B, 0x13, 0x00, 0x00, 0x0B, 0x13,
0121         0x01, 0x00, 0x9A, 0x9C, 0x18, 0x00, 0x00, 0x00,
0122         0x07, 0x74, 0x49, 0x4D, 0x45, 0x07, 0xDB, 0x07,
0123         0x08, 0x0B, 0x16, 0x09, 0xAA, 0xA8, 0x50, 0x21,
0124         0x00, 0x00, 0x00, 0x12, 0x49, 0x44, 0x41, 0x54,
0125         0x38, 0xCB, 0x63, 0x60, 0x18, 0x05, 0xA3, 0x60,
0126         0x14, 0x8C, 0x02, 0x08, 0x00, 0x00, 0x04, 0x10,
0127         0x00, 0x01, 0x85, 0x3F, 0xAA, 0x72, 0x00, 0x00,
0128         0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42,
0129         0x60, 0x82
0130     };
0131     // clang-format on
0132 
0133     QPixmap empty;
0134     empty.loadFromData(empty_png, sizeof(empty_png), 0, Qt::AutoColor);
0135     QIcon emptyIcon(empty);
0136 
0137     int itemId = 0;
0138     int m_selectedItemId = 0;
0139     for (it = d->m_list.constBegin(); it != d->m_list.constEnd(); ++it) {
0140         QString display;
0141         switch (d->m_displayItem) {
0142         default:
0143         case KMyMoneySecuritySelectorPrivate::FullName:
0144             if ((*it).isCurrency()) {
0145                 display = QString("%2 (%1)").arg((*it).id()).arg((*it).name());
0146             } else
0147                 display = QString("%2 (%1)").arg((*it).tradingSymbol()).arg((*it).name());
0148             break;
0149             break;
0150 
0151         case KMyMoneySecuritySelectorPrivate::Symbol:
0152             if ((*it).isCurrency())
0153                 display = (*it).id();
0154             else
0155                 display = (*it).tradingSymbol();
0156             break;
0157         }
0158         if ((*it).id() == baseCurrency) {
0159             insertItem(itemId, Icons::get(Icon::BankAccount), display);
0160         } else {
0161             insertItem(itemId, emptyIcon, display);
0162         }
0163 
0164         if (curr.id() == (*it).id()) {
0165             m_selectedItemId = itemId;
0166             d->m_currency = (*it);
0167         }
0168 
0169         itemId++;
0170     }
0171     setCurrentIndex(m_selectedItemId);
0172 }
0173 
0174 const MyMoneySecurity& KMyMoneySecuritySelector::security() const
0175 {
0176     Q_D(const KMyMoneySecuritySelector);
0177     int index = currentIndex();
0178     if ((0 <= index) && (index < d->m_list.size()))
0179         return d->m_list[index];
0180     else
0181         return d->m_currency;
0182 }
0183 
0184 void KMyMoneySecuritySelector::setSecurity(const MyMoneySecurity& currency)
0185 {
0186     Q_D(KMyMoneySecuritySelector);
0187     d->m_currency = currency;
0188     update(QString("x"));
0189 }
0190 
0191 KMyMoneyCurrencySelector::KMyMoneyCurrencySelector(QWidget *parent) :
0192     KMyMoneySecuritySelector(parent)
0193 {
0194     Q_D(KMyMoneySecuritySelector);
0195     d->setDisplayType(KMyMoneySecuritySelectorPrivate::TypeCurrencies);
0196 }
0197 
0198 KMyMoneyCurrencySelector::~KMyMoneyCurrencySelector()
0199 {
0200 }