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 }