Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F117904419
D66.1775386867.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
13 KB
Referenced Files
None
Subscribers
None
D66.1775386867.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D66: send updates of tasks to delegator/delegatee.
Attached
Detach File
Event Timeline