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 }