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"