File indexing completed on 2024-04-28 05:11:33

0001 /*
0002   SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
0003   SPDX-FileContributor: Kevin Krammer <krake@kdab.com>
0004 
0005   SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #include "incidencecompletionpriority.h"
0009 #include "ui_dialogdesktop.h"
0010 
0011 #include <KCalendarCore/Todo>
0012 
0013 using namespace IncidenceEditorNG;
0014 
0015 class IncidenceEditorNG::IncidenceCompletionPriorityPrivate
0016 {
0017     IncidenceCompletionPriority *const q;
0018 
0019 public:
0020     explicit IncidenceCompletionPriorityPrivate(IncidenceCompletionPriority *parent)
0021         : q(parent)
0022     {
0023     }
0024 
0025 public:
0026     Ui::EventOrTodoDesktop *mUi = nullptr;
0027     int mOrigPercentCompleted = -1;
0028 
0029 public: // slots
0030     void sliderValueChanged(int);
0031 };
0032 
0033 void IncidenceCompletionPriorityPrivate::sliderValueChanged(int value)
0034 {
0035     if (q->sender() == mUi->mCompletionSlider) {
0036         mOrigPercentCompleted = -1;
0037     }
0038 
0039     mUi->mCompletedLabel->setText(QStringLiteral("%1%").arg(value));
0040     q->checkDirtyStatus();
0041 }
0042 
0043 IncidenceCompletionPriority::IncidenceCompletionPriority(Ui::EventOrTodoDesktop *ui)
0044     : IncidenceEditor()
0045     , d(new IncidenceCompletionPriorityPrivate(this))
0046 {
0047     Q_ASSERT(ui != nullptr);
0048     setObjectName(QLatin1StringView("IncidenceCompletionPriority"));
0049 
0050     d->mUi = ui;
0051 
0052     d->sliderValueChanged(d->mUi->mCompletionSlider->value());
0053     d->mUi->mCompletionPriorityWidget->hide();
0054     d->mUi->mTaskLabel->hide();
0055     const QFontMetrics metrics(d->mUi->mCompletedLabel->font());
0056     d->mUi->mCompletedLabel->setMinimumWidth(metrics.boundingRect(QStringLiteral("100%")).width());
0057     d->mUi->mTaskSeparator->hide();
0058 
0059     connect(d->mUi->mCompletionSlider, &QSlider::valueChanged, this, [this](int val) {
0060         d->sliderValueChanged(val);
0061     });
0062     connect(d->mUi->mPriorityCombo, &QComboBox::currentIndexChanged, this, &IncidenceCompletionPriority::checkDirtyStatus);
0063 }
0064 
0065 IncidenceCompletionPriority::~IncidenceCompletionPriority() = default;
0066 
0067 void IncidenceCompletionPriority::load(const KCalendarCore::Incidence::Ptr &incidence)
0068 {
0069     mLoadedIncidence = incidence;
0070 
0071     // TODO priority might be valid for other incidence types as well
0072     // only for Todos
0073     KCalendarCore::Todo::Ptr todo = IncidenceCompletionPriority::incidence<KCalendarCore::Todo>();
0074     if (todo == nullptr) {
0075         mWasDirty = false;
0076         return;
0077     }
0078 
0079     d->mUi->mCompletionPriorityWidget->show();
0080     d->mUi->mTaskLabel->show();
0081     d->mUi->mTaskSeparator->show();
0082 
0083     d->mOrigPercentCompleted = todo->percentComplete();
0084     d->mUi->mCompletionSlider->blockSignals(true);
0085     d->mUi->mCompletionSlider->setValue(todo->percentComplete());
0086     d->sliderValueChanged(d->mUi->mCompletionSlider->value());
0087     d->mUi->mCompletionSlider->blockSignals(false);
0088 
0089     d->mUi->mPriorityCombo->blockSignals(true);
0090     d->mUi->mPriorityCombo->setCurrentIndex(todo->priority());
0091     d->mUi->mPriorityCombo->blockSignals(false);
0092 
0093     mWasDirty = false;
0094 }
0095 
0096 void IncidenceCompletionPriority::save(const KCalendarCore::Incidence::Ptr &incidence)
0097 {
0098     // TODO priority might be valid for other incidence types as well
0099     // only for Todos
0100     KCalendarCore::Todo::Ptr todo = IncidenceCompletionPriority::incidence<KCalendarCore::Todo>(incidence);
0101     if (todo == nullptr) {
0102         return;
0103     }
0104 
0105     // we only have multiples of ten on our combo. If the combo did not change its value,
0106     // see if we have an original value to restore
0107     if (d->mOrigPercentCompleted != -1) {
0108         todo->setPercentComplete(d->mOrigPercentCompleted);
0109     } else {
0110         const int pct = d->mUi->mCompletionSlider->value();
0111         if (pct >= 100) {
0112             todo->setCompleted(QDateTime::currentDateTimeUtc());
0113             todo->setStatus(KCalendarCore::Incidence::StatusCompleted);
0114         } else {
0115             todo->setCompleted(false);
0116             todo->setStatus(pct <= 0 ? KCalendarCore::Incidence::StatusNone : KCalendarCore::Incidence::StatusInProcess);
0117         }
0118         todo->setPercentComplete(pct);
0119     }
0120     todo->setPriority(d->mUi->mPriorityCombo->currentIndex());
0121 }
0122 
0123 bool IncidenceCompletionPriority::isDirty() const
0124 {
0125     KCalendarCore::Todo::Ptr todo = IncidenceCompletionPriority::incidence<KCalendarCore::Todo>();
0126 
0127     if (!todo) {
0128         return false;
0129     }
0130 
0131     if (d->mUi->mCompletionSlider->value() != todo->percentComplete()) {
0132         return true;
0133     }
0134 
0135     if (d->mUi->mPriorityCombo->currentIndex() != todo->priority()) {
0136         return true;
0137     }
0138 
0139     return false;
0140 }
0141 
0142 #include "moc_incidencecompletionpriority.cpp"