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 }