Page MenuHomePhorge

D66.1775386867.diff
No OneTemporary

Authored By
Unknown
Size
13 KB
Referenced Files
None
Subscribers
None

D66.1775386867.diff

Index: src/akonadi/akonadimessaging.h
===================================================================
--- src/akonadi/akonadimessaging.h
+++ src/akonadi/akonadimessaging.h
@@ -40,6 +40,9 @@
void sendDeleteMessageToOrganizer(Akonadi::Item item) Q_DECL_OVERRIDE;
void sendDeleteMessageToDelegatee(Akonadi::Item item) Q_DECL_OVERRIDE;
+ void sendUpdateMessageToDelegatee(Akonadi::Item item) Q_DECL_OVERRIDE;
+ void sendUpdateMessageToOrganizer(Akonadi::Item item) Q_DECL_OVERRIDE;
+
private:
ITIPHandler *m_itip;
};
Index: src/akonadi/akonadimessaging.cpp
===================================================================
--- src/akonadi/akonadimessaging.cpp
+++ src/akonadi/akonadimessaging.cpp
@@ -78,4 +78,29 @@
}
m_itip->sendiTIPMessage(KCalCore::iTIPCancel, todo, window);
+}
+
+void Messaging::sendUpdateMessageToDelegatee(Akonadi::Item item)
+{
+ auto incidence = item.payload<KCalCore::Incidence::Ptr>();
+ Q_ASSERT(incidence);
+
+ QWidget *window = 0;
+ if (!QApplication::topLevelWidgets().isEmpty()) {
+ window = QApplication::topLevelWidgets().first();
+ }
+
+ m_itip->sendiTIPMessage(KCalCore::iTIPRequest, incidence, window);
+}
+
+void Messaging::sendUpdateMessageToOrganizer(Akonadi::Item item)
+{
+ auto incidence = item.payload<KCalCore::Incidence::Ptr>();
+ Q_ASSERT(incidence);
+
+ QWidget *window = 0;
+ if (!QApplication::topLevelWidgets().isEmpty()) {
+ window = QApplication::topLevelWidgets().first();
+ }
+ m_itip->sendiTIPMessage(KCalCore::iTIPReply, incidence, window);
}
\ No newline at end of file
Index: src/akonadi/akonadimessaginginterface.h
===================================================================
--- src/akonadi/akonadimessaginginterface.h
+++ src/akonadi/akonadimessaginginterface.h
@@ -37,6 +37,8 @@
virtual void sendDelegationMessage(Akonadi::Item item) = 0;
virtual void sendDeleteMessageToOrganizer(Akonadi::Item item) = 0;
virtual void sendDeleteMessageToDelegatee(Akonadi::Item item) = 0;
+ virtual void sendUpdateMessageToDelegatee(Akonadi::Item item) = 0;
+ virtual void sendUpdateMessageToOrganizer(Akonadi::Item item) = 0;
};
}
Index: src/akonadi/akonadiserializer.cpp
===================================================================
--- src/akonadi/akonadiserializer.cpp
+++ src/akonadi/akonadiserializer.cpp
@@ -488,6 +488,7 @@
task->setProperty("parentCollectionId", item.parentCollection().id());
task->setProperty("todoUid", todo->uid());
task->setProperty("relatedUid", todo->relatedTo());
+ task->setProperty("revision", todo->revision());
task->setProgress(todo->percentComplete());
task->setStatus(fromKCalStatus(todo->status()));
@@ -658,6 +659,10 @@
todo->setUid(task->property("todoUid").toString());
}
+ if (task->property("revision").isValid()) {
+ todo->setRevision(task->property("revision").toInt());
+ }
+
if (task->property("relatedUid").isValid()) {
todo->setRelatedTo(task->property("relatedUid").toString());
}
Index: src/akonadi/akonaditaskrepository.cpp
===================================================================
--- src/akonadi/akonaditaskrepository.cpp
+++ src/akonadi/akonaditaskrepository.cpp
@@ -156,6 +156,14 @@
KJob *TaskRepository::update(Domain::Task::Ptr task)
{
+
+ const auto delegate = task->delegate();
+ bool sendMail = true;
+ if (task->property("sendMail").isValid()) {
+ sendMail = task->property("sendMail").toBool();
+ qDebug() << "sendMail:" << sendMail;
+ task->setProperty("sendMail", true);
+ }
if (task->recurrence() && task->status() == Domain::Task::Complete) {
/* one ocurrence is completed
*
@@ -201,11 +209,27 @@
}
auto item = m_serializer->createItemFromTask(task);
+ item.payload<KCalCore::Incidence::Ptr>()->setLastModified(KDateTime::currentUtcDateTime());
Q_ASSERT(item.isValid());
+
auto itemOcurrence = m_serializer->createItemFromTask(ocurrence);
+ itemOcurrence.payload<KCalCore::Incidence::Ptr>()->setLastModified(KDateTime::currentUtcDateTime());
Q_ASSERT(!itemOcurrence.isValid());
auto collection = Akonadi::Collection(task->property("parentCollectionId").value<Entity::Id>());
+ if (sendMail && delegate.isValid()) {
+ item.payload<KCalCore::Incidence::Ptr>()->setRevision(item.payload<KCalCore::Incidence::Ptr>()->revision() + 1);
+
+ KPIMIdentities::IdentityManager identityManager;
+ if (identityManager.thatIsMe(delegate.email())) {
+ m_messaging->sendUpdateMessageToOrganizer(item);
+ //TODO: what must be sent to organizier if one occurene is finished?
+ } else {
+ m_messaging->sendUpdateMessageToDelegatee(item);
+ m_messaging->sendDelegationMessage(itemOcurrence);
+ }
+ }
+
auto job = new CompositeJob();
job->install(m_storage->createItem(itemOcurrence, collection),[] {});
job->install(m_storage->updateItem(item), [] {});
@@ -213,6 +237,20 @@
} else {
auto item = m_serializer->createItemFromTask(task);
Q_ASSERT(item.isValid());
+ item.payload<KCalCore::Incidence::Ptr>()->setLastModified(KDateTime::currentUtcDateTime());
+
+ qDebug() << "SEQUENCE: " << item.payload<KCalCore::Incidence::Ptr>()->revision();
+ if (sendMail && delegate.isValid()) {
+ item.payload<KCalCore::Incidence::Ptr>()->setRevision(item.payload<KCalCore::Incidence::Ptr>()->revision() + 1);
+
+ KPIMIdentities::IdentityManager identityManager;
+ if (identityManager.thatIsMe(delegate.email())) {
+ m_messaging->sendUpdateMessageToOrganizer(item);
+ } else {
+ m_messaging->sendUpdateMessageToDelegatee(item);
+ }
+ }
+ qDebug() << "SEQUENCE: " << item.payload<KCalCore::Incidence::Ptr>()->revision();
return m_storage->updateItem(item);
}
}
Index: src/presentation/artifacteditormodel.h
===================================================================
--- src/presentation/artifacteditormodel.h
+++ src/presentation/artifacteditormodel.h
@@ -62,6 +62,7 @@
Q_PROPERTY(Domain::Artifact::Attachment::List attachments READ attachments NOTIFY attachmentsChanged)
Q_PROPERTY(Domain::Recurrence::Ptr recurrence READ recurrence WRITE setRecurrence NOTIFY recurrenceChanged)
Q_PROPERTY(Domain::Alarm::Ptr alarm READ alarm READ alarm WRITE setAlarm NOTIFY alarmChanged)
+ Q_PROPERTY(bool saveNeeded READ isSaveNeeded NOTIFY saveNeededChanged)
public:
explicit ArtifactEditorModel(Domain::TaskRepository *taskRepository,
Domain::NoteRepository *noteRepository,
@@ -125,6 +126,8 @@
void setAlarmPosition(int position);
void setAlarmOffset(int offset);
+ void save();
+
signals:
void artifactChanged(const Domain::Artifact::Ptr &artifact);
void hasTaskPropertiesChanged(bool hasTaskProperties);
@@ -141,6 +144,8 @@
void alarmChanged(const Domain::Alarm::Ptr &alarm);
void tagsChanged(const Domain::Tag::List &tags);
+ void saveNeededChanged(bool saveNeeded);
+
private slots:
void onTextChanged(const QString &text);
void onTitleChanged(const QString &title);
@@ -154,7 +159,6 @@
void onAlarmChanged(const Domain::Alarm::Ptr &alarm);
void onAlarmsChanged(const Domain::Alarm::List &alarms);
- void save();
private:
void setSaveNeeded(bool needed);
Index: src/presentation/artifacteditormodel.cpp
===================================================================
--- src/presentation/artifacteditormodel.cpp
+++ src/presentation/artifacteditormodel.cpp
@@ -683,6 +683,11 @@
m_artifact->setText(m_text);
m_artifact->setAttachments(m_attachments);
+ if (property("sendMail").isValid()) {
+ m_artifact->setProperty("sendMail", property("sendMail").toInt());
+ setProperty("sendMail",QVariant());
+ }
+
if (auto task = m_artifact.objectCast<Domain::Task>()) {
task->setStartDate(m_start);
task->setDueDate(m_due);
@@ -713,12 +718,16 @@
void ArtifactEditorModel::setSaveNeeded(bool needed)
{
+ /* don't use timer otherwise delegator/ delegatee would get all 500ms updates (in worst case)
if (needed)
m_saveTimer->start();
else
m_saveTimer->stop();
-
- m_saveNeeded = needed;
+ */
+ if (m_saveNeeded != needed) {
+ m_saveNeeded = needed;
+ emit saveNeededChanged(needed);
+ }
}
bool ArtifactEditorModel::isSaveNeeded() const
Index: src/widgets/editorview.h
===================================================================
--- src/widgets/editorview.h
+++ src/widgets/editorview.h
@@ -37,6 +37,7 @@
class QVBoxLayout;
class QHBoxLayout;
class QListWidget;
+class QPushButton;
class KLineEdit;
class KTimeComboBox;
@@ -75,6 +76,8 @@
void alarmPositionChanged(int position);
void alarmOffsetChanged(int offset);
+ void save();
+
private slots:
void onArtifactChanged();
void onHasTaskPropertiesChanged();
@@ -113,6 +116,8 @@
void onAlarmOffsetChanged(int);
void onAlarmEnableChanged(int);
+ void onSaveNeededChanged(bool);
+
void toggleFullscreenEditor();
private:
@@ -144,6 +149,7 @@
QComboBox *m_alarmPositionWidget;
QSpinBox *m_alarmOffsetEdit;
QLineEdit *m_newTagWidget;
+ QPushButton *m_saveButton;
};
}
Index: src/widgets/editorview.cpp
===================================================================
--- src/widgets/editorview.cpp
+++ src/widgets/editorview.cpp
@@ -90,7 +90,8 @@
m_addAttachmentButton(new QPushButton(tr("Add attachment"), m_taskGroup)),
m_alarmTypeWidget(new QComboBox(m_taskGroup)),
m_alarmPositionWidget(new QComboBox(m_taskGroup)),
- m_alarmOffsetEdit(new QSpinBox(m_taskGroup))
+ m_alarmOffsetEdit(new QSpinBox(m_taskGroup)),
+ m_saveButton(new QPushButton())
{
// To avoid having unit tests talking to akonadi
// while we don't need the completion for them
@@ -113,6 +114,7 @@
m_alarmTypeWidget->setObjectName("alarmTypeWidget");
m_alarmPositionWidget->setObjectName("alarmPositionWidget");
m_alarmOffsetEdit->setObjectName("alarmOffsetEdit");
+ m_saveButton->setObjectName("saveButton");
m_startDateEdit->setMinimumContentsLength(10);
m_dueDateEdit->setMinimumContentsLength(10);
@@ -128,12 +130,16 @@
m_statusComboBox->addItem(tr("Completed"), Domain::Task::Complete);
m_statusComboBox->addItem(tr("Cancelled"), Domain::Task::Cancelled);
+ m_saveButton->setText(tr("Save"));
+ m_saveButton->setEnabled(false);
+
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(m_delegateLabel);
layout->addWidget(m_titleEdit);
layout->addWidget(m_textEdit);
layout->addLayout(m_relationsLayout);
layout->addWidget(m_taskGroup);
+ layout->addWidget(m_saveButton);
setLayout(layout);
connect(m_addAttachmentButton, SIGNAL(clicked()), this, SLOT(onAddAttachmentClicked()));
@@ -237,6 +243,7 @@
connect(m_alarmTypeWidget, SIGNAL(currentIndexChanged(int)), this, SLOT(onAlarmTypeChanged(int)));
connect(m_alarmPositionWidget, SIGNAL(currentIndexChanged(int)), this, SLOT(onAlarmPositionChanged(int)));
connect(m_alarmOffsetEdit, SIGNAL(valueChanged(int)), this, SLOT(onAlarmOffsetChanged(int)));
+ connect(m_saveButton, SIGNAL(clicked()), this, SIGNAL(save()));
setEnabled(false);
@@ -315,6 +322,7 @@
onAttachmentsChanged();
onStatusChanged();
onAlarmChanged();
+ onSaveNeededChanged(m_model->property("saveNeeded").toBool());
connect(m_model, SIGNAL(artifactChanged(Domain::Artifact::Ptr)),
this, SLOT(onArtifactChanged()));
@@ -333,6 +341,7 @@
connect(m_model, SIGNAL(tagsChanged(Domain::Tag::List)), this, SLOT(onTagsChanged()));
connect(m_model, SIGNAL(attachmentsChanged(Domain::Artifact::Attachment::List)), this, SLOT(onAttachmentsChanged()));
connect(m_model, SIGNAL(alarmChanged(Domain::Alarm::Ptr)), this, SLOT(onAlarmChanged()));
+ connect(m_model, SIGNAL(saveNeededChanged(bool)), this, SLOT(onSaveNeededChanged(bool)));
connect(this, SIGNAL(titleChanged(QString)), m_model, SLOT(setTitle(QString)));
connect(this, SIGNAL(textChanged(QString)), m_model, SLOT(setText(QString)));
@@ -344,6 +353,7 @@
connect(this, SIGNAL(alarmTypeChanged(int)),m_model, SLOT(setAlarmType(int)));
connect(this, SIGNAL(alarmPositionChanged(int)),m_model, SLOT(setAlarmPosition(int)));
connect(this, SIGNAL(alarmOffsetChanged(int)),m_model, SLOT(setAlarmOffset(int)));
+ connect(this, SIGNAL(save()),m_model, SLOT(save()));
connect(m_recurrenceWidget, SIGNAL(frequencyChanged(Domain::Recurrence::Frequency,int)),
m_model, SLOT(setFrequency(Domain::Recurrence::Frequency, int)));
@@ -365,6 +375,11 @@
m_model, SLOT(setByDayPosition(Domain::Recurrence::WeekPosition)));
}
+void EditorView::onSaveNeededChanged(bool saveNeeded)
+{
+ m_saveButton->setEnabled(saveNeeded);
+}
+
void EditorView::onArtifactChanged()
{
auto artifact = m_model->property("artifact").value<Domain::Artifact::Ptr>();
@@ -769,12 +784,14 @@
gotMatch = true;
}
+ m_model->setProperty("sendMail", false);
if (gotMatch) {
QMetaObject::invokeMethod(m_model, "delegate",
Q_ARG(QString, name),
Q_ARG(QString, email));
}
emit delegateChanged(name, email);
+ emit save();
}
void EditorView::onProgressChanged(int progress)

File Metadata

Mime Type
text/plain
Expires
Sun, Apr 5, 11:01 AM (3 h, 55 m ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18794541
Default Alt Text
D66.1775386867.diff (13 KB)

Event Timeline