File indexing completed on 2024-05-19 16:16:54

0001 /*
0002     SPDX-FileCopyrightText: 2009-2016 Cristian Oneț <onet.cristian@gmail.com>
0003     SPDX-FileCopyrightText: 2009-2010 Alvaro Soliverez <asoliverez@gmail.com>
0004     SPDX-FileCopyrightText: 2010-2016 Thomas Baumgart <tbaumgart@kde.org>
0005     SPDX-FileCopyrightText: 2017-2018 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "ktagcontainer.h"
0010 
0011 // ----------------------------------------------------------------------------
0012 // QT Includes
0013 
0014 #include <QHBoxLayout>
0015 
0016 // ----------------------------------------------------------------------------
0017 // KDE Includes
0018 
0019 // ----------------------------------------------------------------------------
0020 // Project Includes
0021 
0022 #include "ktaglabel.h"
0023 #include "mymoneytag.h"
0024 #include "kmymoneytagcombo.h"
0025 
0026 class KTagContainerPrivate
0027 {
0028     Q_DISABLE_COPY(KTagContainerPrivate)
0029 
0030 public:
0031     KTagContainerPrivate() :
0032         m_tagCombo(nullptr)
0033     {
0034     }
0035 
0036     KMyMoneyTagCombo *m_tagCombo;
0037     QList<KTagLabel*> m_tagLabelList;
0038     QList<QString> m_tagIdList;
0039     QList<QString> m_tagNameList;
0040 
0041     // A local cache of the list of all Tags, it's updated when loadTags is called
0042     QList<MyMoneyTag> m_list;
0043 };
0044 
0045 KTagContainer::KTagContainer(QWidget* parent) :
0046     QWidget(parent),
0047     d_ptr(new KTagContainerPrivate)
0048 {
0049     Q_D(KTagContainer);
0050     d->m_tagCombo = new KMyMoneyTagCombo;
0051     QHBoxLayout *layout = new QHBoxLayout;
0052     layout->setContentsMargins(0, 0, 5, 0);
0053     layout->setSpacing(0);
0054     layout->addWidget(d->m_tagCombo, 100);
0055     this->setLayout(layout);
0056     this->setFocusProxy(d->m_tagCombo);
0057     connect(d->m_tagCombo, &KMyMoneyMVCCombo::lostFocus, this, &KTagContainer::slotAddTagWidget);
0058 }
0059 
0060 KTagContainer::~KTagContainer()
0061 {
0062     Q_D(KTagContainer);
0063     // make sure we are not called as part of the destruction
0064     disconnect(d->m_tagCombo, &KMyMoneyMVCCombo::lostFocus, this, &KTagContainer::slotAddTagWidget);
0065     delete d;
0066 }
0067 
0068 void KTagContainer::loadTags(const QList<MyMoneyTag>& list)
0069 {
0070     Q_D(KTagContainer);
0071     d->m_list = list;
0072     d->m_tagCombo->loadTags(list);
0073 }
0074 
0075 KMyMoneyTagCombo* KTagContainer::tagCombo()
0076 {
0077     Q_D(KTagContainer);
0078     return d->m_tagCombo;
0079 }
0080 
0081 const QList<QString> KTagContainer::selectedTags()
0082 {
0083     Q_D(KTagContainer);
0084     // Adding possible selected tag which is not yet in the list
0085     slotAddTagWidget();
0086     return d->m_tagIdList;
0087 }
0088 
0089 void KTagContainer::addTagWidget(const QString& id)
0090 {
0091     Q_D(KTagContainer);
0092     if (id.isNull() || d->m_tagIdList.contains(id))
0093         return;
0094     const QString tagName = d->m_tagCombo->itemText(d->m_tagCombo->findData(QVariant(id), Qt::UserRole, Qt::MatchExactly));
0095     KTagLabel *t = new KTagLabel(id, tagName, this);
0096     connect(t, &KTagLabel::clicked, this, &KTagContainer::slotRemoveTagWidget);
0097     d->m_tagLabelList.append(t);
0098     d->m_tagNameList.append(tagName);
0099     d->m_tagIdList.append(id);
0100     this->layout()->addWidget(t);
0101     d->m_tagCombo->loadTags(d->m_list);
0102     d->m_tagCombo->setUsedTagList(d->m_tagIdList, d->m_tagNameList);
0103     d->m_tagCombo->setCurrentIndex(0);
0104     d->m_tagCombo->setFocus();
0105 }
0106 
0107 void KTagContainer::RemoveAllTagWidgets()
0108 {
0109     Q_D(KTagContainer);
0110     d->m_tagIdList.clear();
0111     d->m_tagNameList.clear();
0112     while (!d->m_tagLabelList.isEmpty())
0113         delete d->m_tagLabelList.takeLast();
0114     d->m_tagCombo->loadTags(d->m_list);
0115     d->m_tagCombo->setUsedTagList(d->m_tagIdList, d->m_tagNameList);
0116     d->m_tagCombo->setCurrentIndex(0);
0117 }
0118 
0119 void KTagContainer::slotAddTagWidget()
0120 {
0121     Q_D(KTagContainer);
0122     addTagWidget(d->m_tagCombo->selectedItem());
0123 }
0124 
0125 void KTagContainer::slotRemoveTagWidget()
0126 {
0127     Q_D(KTagContainer);
0128     this->tagCombo()->setFocus();
0129     KTagLabel *t = (KTagLabel *)sender();
0130     int index = d->m_tagLabelList.indexOf(t);
0131     d->m_tagLabelList.removeAt(index);
0132     d->m_tagIdList.removeAt(index);
0133     d->m_tagNameList.removeAt(index);
0134     delete t;
0135     d->m_tagCombo->loadTags(d->m_list);
0136     d->m_tagCombo->setUsedTagList(d->m_tagIdList, d->m_tagNameList);
0137     d->m_tagCombo->setCurrentIndex(0);
0138 }