Incidenceeditor

incidencecompletionpriority.cpp
1/*
2 SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
3 SPDX-FileContributor: Kevin Krammer <krake@kdab.com>
4
5 SPDX-License-Identifier: LGPL-2.0-or-later
6*/
7
8#include "incidencecompletionpriority.h"
9#include "ui_dialogdesktop.h"
10
11#include <KCalendarCore/Todo>
12
13using namespace IncidenceEditorNG;
14
15class IncidenceEditorNG::IncidenceCompletionPriorityPrivate
16{
17 IncidenceCompletionPriority *const q;
18
19public:
20 explicit IncidenceCompletionPriorityPrivate(IncidenceCompletionPriority *parent)
21 : q(parent)
22 {
23 }
24
25public:
26 Ui::EventOrTodoDesktop *mUi = nullptr;
27 int mOrigPercentCompleted = -1;
28
29public: // slots
30 void sliderValueChanged(int);
31};
32
33void IncidenceCompletionPriorityPrivate::sliderValueChanged(int value)
34{
35 if (q->sender() == mUi->mCompletionSlider) {
36 mOrigPercentCompleted = -1;
37 }
38
39 mUi->mCompletedLabel->setText(QStringLiteral("%1%").arg(value));
41}
42
43IncidenceCompletionPriority::IncidenceCompletionPriority(Ui::EventOrTodoDesktop *ui)
45 , d(new IncidenceCompletionPriorityPrivate(this))
46{
47 Q_ASSERT(ui != nullptr);
48 setObjectName(QLatin1StringView("IncidenceCompletionPriority"));
49
50 d->mUi = ui;
51
52 d->sliderValueChanged(d->mUi->mCompletionSlider->value());
53 d->mUi->mCompletionPriorityWidget->hide();
54 d->mUi->mTaskLabel->hide();
55 const QFontMetrics metrics(d->mUi->mCompletedLabel->font());
56 d->mUi->mCompletedLabel->setMinimumWidth(metrics.boundingRect(QStringLiteral("100%")).width());
57 d->mUi->mTaskSeparator->hide();
58
59 connect(d->mUi->mCompletionSlider, &QSlider::valueChanged, this, [this](int val) {
60 d->sliderValueChanged(val);
61 });
62 connect(d->mUi->mPriorityCombo, &QComboBox::currentIndexChanged, this, &IncidenceCompletionPriority::checkDirtyStatus);
63}
64
65IncidenceCompletionPriority::~IncidenceCompletionPriority() = default;
66
67void IncidenceCompletionPriority::load(const KCalendarCore::Incidence::Ptr &incidence)
68{
69 mLoadedIncidence = incidence;
70
71 // TODO priority might be valid for other incidence types as well
72 // only for Todos
74 if (todo == nullptr) {
75 mWasDirty = false;
76 return;
77 }
78
79 d->mUi->mCompletionPriorityWidget->show();
80 d->mUi->mTaskLabel->show();
81 d->mUi->mTaskSeparator->show();
82
83 d->mOrigPercentCompleted = todo->percentComplete();
84 d->mUi->mCompletionSlider->blockSignals(true);
85 d->mUi->mCompletionSlider->setValue(todo->percentComplete());
86 d->sliderValueChanged(d->mUi->mCompletionSlider->value());
87 d->mUi->mCompletionSlider->blockSignals(false);
88
89 d->mUi->mPriorityCombo->blockSignals(true);
90 d->mUi->mPriorityCombo->setCurrentIndex(todo->priority());
91 d->mUi->mPriorityCombo->blockSignals(false);
92
93 mWasDirty = false;
94}
95
96void IncidenceCompletionPriority::save(const KCalendarCore::Incidence::Ptr &incidence)
97{
98 // TODO priority might be valid for other incidence types as well
99 // only for Todos
101 if (todo == nullptr) {
102 return;
103 }
104
105 // we only have multiples of ten on our combo. If the combo did not change its value,
106 // see if we have an original value to restore
107 if (d->mOrigPercentCompleted != -1) {
108 todo->setPercentComplete(d->mOrigPercentCompleted);
109 } else {
110 const int pct = d->mUi->mCompletionSlider->value();
111 if (pct >= 100) {
112 todo->setCompleted(QDateTime::currentDateTimeUtc());
114 } else {
115 todo->setCompleted(false);
116 todo->setStatus(pct <= 0 ? KCalendarCore::Incidence::StatusNone : KCalendarCore::Incidence::StatusInProcess);
117 }
118 todo->setPercentComplete(pct);
119 }
120 todo->setPriority(d->mUi->mPriorityCombo->currentIndex());
121}
122
123bool IncidenceCompletionPriority::isDirty() const
124{
126
127 if (!todo) {
128 return false;
129 }
130
131 if (d->mUi->mCompletionSlider->value() != todo->percentComplete()) {
132 return true;
133 }
134
135 if (d->mUi->mPriorityCombo->currentIndex() != todo->priority()) {
136 return true;
137 }
138
139 return false;
140}
141
142#include "moc_incidencecompletionpriority.cpp"
KCal Incidences are complicated objects.
void checkDirtyStatus()
Checks if the dirty status has changed until last check and emits the dirtyStatusChanged signal if ne...
QSharedPointer< IncidenceT > incidence() const
Convenience method to get a pointer for a specific const Incidence Type.
AKONADI_CALENDAR_EXPORT KCalendarCore::Todo::Ptr todo(const Akonadi::Item &item)
void valueChanged(int value)
void currentIndexChanged(int index)
QDateTime currentDateTimeUtc()
T qobject_cast(QObject *object)
QObject * sender() const const
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:19:37 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.