File indexing completed on 2024-05-12 16:43:59

0001 /*
0002     SPDX-FileCopyrightText: 2006-2010 Tony Bloomfield <tonybloom@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2017 Łukasz Wojniłowicz <lukasz.wojnilowicz@gmail.com>
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "kguiutils.h"
0008 
0009 // ----------------------------------------------------------------------------
0010 // QT Includes
0011 // No need for QDateEdit, QSpinBox, etc., since these always return values
0012 
0013 #include <QCheckBox>
0014 #include <QPushButton>
0015 #include <QWidget>
0016 #include <QSpinBox>
0017 #include <QApplication>
0018 #include <QListWidget>
0019 #include <QList>
0020 
0021 // ----------------------------------------------------------------------------
0022 // KDE Includes
0023 
0024 #include <KComboBox>
0025 #include <KLineEdit>
0026 #include <KUrlRequester>
0027 
0028 // ----------------------------------------------------------------------------
0029 // Project Includes
0030 
0031 #include "amountedit.h"
0032 #include "kmymoneysettings.h"
0033 #include "onlinetasks/interfaces/ui/ionlinejobedit.h"
0034 #include "kmymoneytextedit.h"
0035 #include "kmymoneypayeecombo.h"
0036 
0037 /**************************************************************************
0038  *                                                                        *
0039  * The MandatoryFieldGroup code is courtesy of                            *
0040  * Mark Summerfield in Qt Quarterly                                       *
0041  * https://doc.qt.io/archives/qq/qq11-mandatoryfields.html                *
0042  *                                                                        *
0043  * Enhanced by Thomas Baumgart to support the lineedit field of a         *
0044  * a KComboBox.                                                           *
0045  *                                                                        *
0046  * With further widgets added by Allan Anderson for missing fields.       *
0047  **************************************************************************/
0048 
0049 class KMandatoryFieldGroupPrivate
0050 {
0051     Q_DISABLE_COPY(KMandatoryFieldGroupPrivate)
0052 
0053 public:
0054     KMandatoryFieldGroupPrivate()
0055         : m_okButton(0)
0056         , m_enabled(true)
0057         , m_externalMandatoryState(true)
0058     {
0059     }
0060 
0061     QList<QWidget *>      m_widgets;
0062     QPushButton*          m_okButton;
0063     bool                  m_enabled;
0064     bool                  m_externalMandatoryState;
0065 };
0066 
0067 KMandatoryFieldGroup::KMandatoryFieldGroup(QObject *parent) :
0068     QObject(parent),
0069     d_ptr(new KMandatoryFieldGroupPrivate)
0070 {
0071 }
0072 
0073 KMandatoryFieldGroup::~KMandatoryFieldGroup()
0074 {
0075     Q_D(KMandatoryFieldGroup);
0076     delete d;
0077 }
0078 
0079 void KMandatoryFieldGroup::add(QWidget *widget)
0080 {
0081     Q_D(KMandatoryFieldGroup);
0082     if (!d->m_widgets.contains(widget)) {
0083         if (qobject_cast<QCheckBox*>(widget))
0084             connect(qobject_cast<QCheckBox*>(widget),
0085                     &QCheckBox::clicked,
0086                     this, &KMandatoryFieldGroup::changed);
0087 
0088         else if (qobject_cast<KComboBox*>(widget)) {
0089             KComboBox* combo = qobject_cast<KComboBox*>(widget);
0090             KLineEdit* lineedit = qobject_cast<KLineEdit*>(combo->lineEdit());
0091             if (lineedit) {
0092                 connect(lineedit, &QLineEdit::textChanged, this, &KMandatoryFieldGroup::changed);
0093             } else {
0094                 connect(combo, static_cast<void (QComboBox::*)(int)>(&QComboBox::highlighted), this, &KMandatoryFieldGroup::changed);
0095             }
0096         }
0097 
0098         else if (qobject_cast<QLineEdit*>(widget)) {
0099             connect(qobject_cast<QLineEdit*>(widget),
0100                     &QLineEdit::textChanged,
0101                     this, &KMandatoryFieldGroup::changed);
0102         }
0103 
0104         else if (qobject_cast<QSpinBox*>(widget))
0105             connect(qobject_cast<QSpinBox*>(widget),
0106                     static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged),
0107                     this, &KMandatoryFieldGroup::changed);
0108 
0109         else if (qobject_cast<QListWidget*>(widget))
0110             connect(qobject_cast<QListWidget*>(widget),
0111                     &QListWidget::itemSelectionChanged,
0112                     this, &KMandatoryFieldGroup::changed);
0113 
0114         else if (qobject_cast<KUrlRequester*>(widget))
0115             connect(qobject_cast<KUrlRequester*>(widget),
0116                     &KUrlRequester::textChanged,
0117                     this, &KMandatoryFieldGroup::changed);
0118 
0119         else if (qobject_cast<KMyMoneyTextEdit*>(widget))
0120             connect(qobject_cast<KMyMoneyTextEdit*>(widget),
0121                     &KMyMoneyTextEdit::textChanged,
0122                     this, &KMandatoryFieldGroup::changed);
0123 
0124         else if (qobject_cast<IonlineJobEdit*>(widget)) {
0125             connect(qobject_cast<IonlineJobEdit*>(widget),
0126                     SIGNAL(validityChanged(bool)),
0127                     this, SLOT(changed()));
0128 
0129             // Do not set palette for IonlineJobEdits as they contain subwidgets
0130             d->m_widgets.append(widget);
0131             changed();
0132             return;
0133         }
0134 
0135         else {
0136             qWarning("MandatoryFieldGroup: unsupported class %s", (widget->metaObject()->className()));
0137             return;
0138         }
0139 
0140         QPalette palette = widget->palette();
0141         palette.setColor(QPalette::Base, KMyMoneySettings::schemeColor(SchemeColor::FieldRequired));
0142         widget->setPalette(palette);
0143         d->m_widgets.append(widget);
0144         changed();
0145     }
0146 }
0147 
0148 void KMandatoryFieldGroup::removeAll()
0149 {
0150     Q_D(KMandatoryFieldGroup);
0151     while(!d->m_widgets.isEmpty()) {
0152         remove(d->m_widgets.at(0));
0153     }
0154 }
0155 
0156 void KMandatoryFieldGroup::remove(QWidget *widget)
0157 {
0158     Q_D(KMandatoryFieldGroup);
0159     widget->setPalette(QApplication::palette());
0160     d->m_widgets.removeOne(widget);
0161     changed();
0162 }
0163 
0164 void KMandatoryFieldGroup::setOkButton(QPushButton *button)
0165 {
0166     Q_D(KMandatoryFieldGroup);
0167     if (d->m_okButton && d->m_okButton != button)
0168         d->m_okButton->setEnabled(true);
0169     d->m_okButton = button;
0170     changed();
0171 }
0172 
0173 void KMandatoryFieldGroup::setExternalMandatoryState(bool state)
0174 {
0175     Q_D(KMandatoryFieldGroup);
0176     if (d->m_externalMandatoryState != state) {
0177         d->m_externalMandatoryState = state;
0178         changed();
0179     }
0180 }
0181 
0182 void KMandatoryFieldGroup::changed()
0183 {
0184     Q_D(KMandatoryFieldGroup);
0185     bool enable = d->m_externalMandatoryState;
0186     QList<QWidget *>::ConstIterator i;
0187     for (i = d->m_widgets.constBegin(); i != d->m_widgets.constEnd(); ++i) {
0188         QWidget *widget = *i;
0189         // disabled widgets don't count
0190         if (!(widget->isEnabled())) {
0191             continue;
0192         }
0193         if (qobject_cast<KMyMoneyPayeeCombo*>(widget)) {
0194             if ((dynamic_cast<KMyMoneyPayeeCombo*>(widget))->lineEdit()->text().isEmpty()) {
0195                 enable = false;
0196                 break;
0197             } else
0198                 continue;
0199         }
0200         if (qobject_cast<QCheckBox*>(widget)) {
0201             if ((qobject_cast<QCheckBox*>(widget))->checkState() == Qt::PartiallyChecked) {
0202                 enable = false;
0203                 break;
0204             } else
0205                 continue;
0206         }
0207         if (qobject_cast<KComboBox*>(widget)) {
0208             if ((qobject_cast<KComboBox*>(widget))->currentText().isEmpty()) {
0209                 enable = false;
0210                 break;
0211             } else
0212                 continue;
0213         }
0214         if (qobject_cast<QLineEdit*>(widget)) {
0215             if ((qobject_cast<QLineEdit*>(widget))->text().isEmpty()) {
0216                 enable = false;
0217                 break;
0218             } else
0219                 continue;
0220         }
0221         if ((qobject_cast<QListWidget*>(widget))) {
0222             if ((qobject_cast<QListWidget*>(widget))->selectedItems().count() == 0) {
0223                 enable = false;
0224                 break;
0225             } else
0226                 continue;
0227         }
0228         if ((qobject_cast<KUrlRequester*>(widget))) {
0229             if ((qobject_cast<KUrlRequester*>(widget))->text().isEmpty()) {
0230                 enable = false;
0231                 break;
0232             } else
0233                 continue;
0234         }
0235         if ((qobject_cast<AmountEdit*>(widget))) {
0236             if (!(qobject_cast<AmountEdit*>(widget))->value().isZero()) {
0237                 enable = false;
0238                 break;
0239             } else
0240                 continue;
0241         }
0242         if (qobject_cast<KMyMoneyTextEdit*>(widget)) {
0243             if (!(qobject_cast<KMyMoneyTextEdit*>(widget))->isValid()) {
0244                 enable = false;
0245                 break;
0246             } else {
0247                 continue;
0248             }
0249         }
0250         if (qobject_cast<IonlineJobEdit*>(widget)) {
0251             if (!(qobject_cast<IonlineJobEdit*>(widget))->isValid()) {
0252                 enable = false;
0253                 break;
0254             } else {
0255                 continue;
0256             }
0257         }
0258     }
0259 
0260     if (d->m_okButton)
0261         d->m_okButton->setEnabled(enable);
0262     d->m_enabled = enable;
0263 
0264     emit stateChanged();
0265     emit stateChanged(enable);
0266 }
0267 
0268 bool KMandatoryFieldGroup::isEnabled() const
0269 {
0270     Q_D(const KMandatoryFieldGroup);
0271     return d->m_enabled;
0272 }
0273 
0274 void KMandatoryFieldGroup::clear()
0275 {
0276     Q_D(KMandatoryFieldGroup);
0277     QList<QWidget *>::Iterator i;
0278     for (i = d->m_widgets.begin(); i != d->m_widgets.end(); ++i)
0279         (*i)->setPalette(QApplication::palette());
0280     d->m_widgets.clear();
0281     if (d->m_okButton) {
0282         d->m_okButton->setEnabled(true);
0283         d->m_okButton = 0;
0284         d->m_enabled = true;
0285     }
0286 }