File indexing completed on 2024-05-12 05:07:57
0001 /* 0002 SPDX-FileCopyrightText: 2006-2010 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 "kmymoneycategory.h" 0008 #include "kmymoneycombo_p.h" 0009 0010 // ---------------------------------------------------------------------------- 0011 // QT Includes 0012 0013 #include <QPalette> 0014 #include <QHBoxLayout> 0015 #include <QFrame> 0016 #include <QPushButton> 0017 #include <QIcon> 0018 #include <QEvent> 0019 0020 // ---------------------------------------------------------------------------- 0021 // KDE Includes 0022 0023 #include <KGuiItem> 0024 #include <KLocalizedString> 0025 0026 // ---------------------------------------------------------------------------- 0027 // Project Includes 0028 0029 #include "kmymoneyaccountselector.h" 0030 #include "mymoneyfile.h" 0031 #include "mymoneyaccount.h" 0032 #include "kmymoneyaccountcompletion.h" 0033 #include "icons/icons.h" 0034 0035 using namespace Icons; 0036 0037 class KMyMoneyCategoryPrivate : public KMyMoneyComboPrivate 0038 { 0039 public: 0040 KMyMoneyCategoryPrivate() : 0041 splitButton(0), 0042 frame(0), 0043 recursive(false), 0044 isSplit(false) 0045 { 0046 } 0047 0048 QPushButton* splitButton; 0049 QFrame* frame; 0050 bool recursive; 0051 bool isSplit; 0052 }; 0053 0054 KMyMoneyCategory::KMyMoneyCategory(bool splitButton, QWidget* parent) : 0055 KMyMoneyCombo(*new KMyMoneyCategoryPrivate, true, parent) 0056 { 0057 Q_D(KMyMoneyCategory); 0058 if (splitButton) { 0059 d->frame = new QFrame(nullptr); 0060 // don't change the following name unless you want to break TransactionEditor::setup() 0061 d->frame->setObjectName("KMyMoneyCategoryFrame"); 0062 d->frame->setFocusProxy(this); 0063 QHBoxLayout* layout = new QHBoxLayout(d->frame); 0064 layout->setContentsMargins(0, 0, 0, 0); 0065 0066 // make sure not to use our own overridden version of reparent() here 0067 KMyMoneyCombo::setParent(d->frame, windowFlags() & ~Qt::WindowType_Mask); 0068 KMyMoneyCombo::show(); 0069 if (parent) { 0070 d->frame->setParent(parent); 0071 d->frame->show(); 0072 } 0073 0074 // create button 0075 KGuiItem splitButtonItem(QString(), 0076 Icons::get(Icon::Split), QString(), QString()); 0077 d->splitButton = new QPushButton(d->frame); 0078 d->splitButton->setObjectName("splitButton"); 0079 KGuiItem::assign(d->splitButton, splitButtonItem); 0080 0081 layout->addWidget(this, 5); 0082 layout->addWidget(d->splitButton); 0083 0084 installEventFilter(this); 0085 } 0086 0087 d->m_completion = new KMyMoneyAccountCompletion(this); 0088 connect(d->m_completion, &KMyMoneyCompletion::itemSelected, this, &KMyMoneyCategory::slotItemSelected); 0089 connect(this, &QComboBox::editTextChanged, d->m_completion, &KMyMoneyCompletion::slotMakeCompletion); 0090 } 0091 0092 KMyMoneyCategory::~KMyMoneyCategory() 0093 { 0094 Q_D(KMyMoneyCategory); 0095 // make sure to wipe out the frame, button and layout 0096 if (d->frame && !d->frame->parentWidget()) 0097 d->frame->deleteLater(); 0098 } 0099 0100 QPushButton* KMyMoneyCategory::splitButton() const 0101 { 0102 Q_D(const KMyMoneyCategory); 0103 return d->splitButton; 0104 } 0105 0106 void KMyMoneyCategory::setPalette(const QPalette& palette) 0107 { 0108 Q_D(KMyMoneyCategory); 0109 if (d->frame) 0110 d->frame->setPalette(palette); 0111 KMyMoneyCombo::setPalette(palette); 0112 } 0113 0114 void KMyMoneyCategory::reparent(QWidget *parent, Qt::WindowFlags w, const QPoint&, bool showIt) 0115 { 0116 Q_D(KMyMoneyCategory); 0117 if (d->frame) { 0118 d->frame->setParent(parent, w); 0119 if (showIt) 0120 d->frame->show(); 0121 } else { 0122 KMyMoneyCombo::setParent(parent, w); 0123 if (showIt) 0124 KMyMoneyCombo::show(); 0125 } 0126 } 0127 0128 KMyMoneyAccountSelector* KMyMoneyCategory::selector() const 0129 { 0130 return dynamic_cast<KMyMoneyAccountSelector*>(KMyMoneyCombo::selector()); 0131 } 0132 0133 void KMyMoneyCategory::setCurrentTextById(const QString& id) 0134 { 0135 if (!id.isEmpty()) { 0136 QString category = MyMoneyFile::instance()->accountToCategory(id); 0137 setCompletedText(category); 0138 setEditText(category); 0139 } else { 0140 setCompletedText(QString()); 0141 clearEditText(); 0142 } 0143 setSuppressObjectCreation(false); 0144 } 0145 0146 void KMyMoneyCategory::slotItemSelected(const QString& id) 0147 { 0148 Q_D(KMyMoneyCategory); 0149 setCurrentTextById(id); 0150 0151 d->m_completion->hide(); 0152 0153 if (d->m_id != id) { 0154 d->m_id = id; 0155 Q_EMIT itemSelected(id); 0156 } 0157 } 0158 0159 void KMyMoneyCategory::focusOutEvent(QFocusEvent *ev) 0160 { 0161 if (isSplitTransaction()) { 0162 KComboBox::focusOutEvent(ev); 0163 } else { 0164 KMyMoneyCombo::focusOutEvent(ev); 0165 } 0166 } 0167 0168 void KMyMoneyCategory::focusInEvent(QFocusEvent *ev) 0169 { 0170 KMyMoneyCombo::focusInEvent(ev); 0171 0172 // make sure, we get a clean state before we automagically move the focus to 0173 // some other widget (like for 'split transaction'). We do this by delaying 0174 // the emission of the focusIn signal until the next run of the event loop. 0175 QMetaObject::invokeMethod(this, "focusIn", Qt::QueuedConnection); 0176 } 0177 0178 void KMyMoneyCategory::setSplitTransaction() 0179 { 0180 Q_D(KMyMoneyCategory); 0181 d->isSplit = true; 0182 setEditText(i18nc("Split transaction (category replacement)", "Split transaction")); 0183 setSuppressObjectCreation(true); 0184 } 0185 0186 bool KMyMoneyCategory::isSplitTransaction() const 0187 { 0188 Q_D(const KMyMoneyCategory); 0189 return d->isSplit; 0190 } 0191 0192 void KMyMoneyCategory::setCurrentText(const QString& txt) 0193 { 0194 KMyMoneyCombo::setCurrentText(txt); 0195 } 0196 0197 void KMyMoneyCategory::setCurrentText() 0198 { 0199 KMyMoneyCombo::setCurrentText(QString()); 0200 } 0201 0202 bool KMyMoneyCategory::eventFilter(QObject *o, QEvent *ev) 0203 { 0204 Q_D(KMyMoneyCategory); 0205 // forward enable/disable state to split button 0206 if (o == this && ev->type() == QEvent::EnabledChange) { 0207 if (d->splitButton) { 0208 d->splitButton->setEnabled(isEnabled()); 0209 } 0210 } 0211 return KMyMoneyCombo::eventFilter(o, ev); 0212 } 0213 0214 KMyMoneySecurity::KMyMoneySecurity(QWidget* parent) : 0215 KMyMoneyCategory(false, parent) 0216 { 0217 } 0218 0219 KMyMoneySecurity::~KMyMoneySecurity() 0220 { 0221 } 0222 0223 void KMyMoneySecurity::setCurrentText(const QString& txt) 0224 { 0225 KMyMoneyCategory::setCurrentText(txt); 0226 } 0227 0228 void KMyMoneySecurity::setCurrentText() 0229 { 0230 KMyMoneyCategory::setCurrentText(QString()); 0231 } 0232 0233 void KMyMoneySecurity::setCurrentTextById(const QString& id) 0234 { 0235 if (!id.isEmpty()) { 0236 QString security = MyMoneyFile::instance()->account(id).name(); 0237 setCompletedText(security); 0238 setEditText(security); 0239 } else { 0240 setCompletedText(QString()); 0241 clearEditText(); 0242 } 0243 }