Branch 'kolab/integration/4.13.0' - incidenceeditor-ng/dialogdesktop.ui incidenceeditor-ng/incidenceattendee.cpp incidenceeditor-ng/incidenceattendee.h
Sandro Knauß
knauss at kolabsys.com
Wed Aug 20 12:11:15 CEST 2014
incidenceeditor-ng/dialogdesktop.ui | 10 +
incidenceeditor-ng/incidenceattendee.cpp | 248 +++++++++++++++++++++----------
incidenceeditor-ng/incidenceattendee.h | 34 +++-
3 files changed, 203 insertions(+), 89 deletions(-)
New commits:
commit d85ab09f599f70e80e447deb1cfe877b99eb35be
Author: Sandro Knauà <knauss at kolabsys.com>
Date: Wed Aug 20 12:01:57 2014 +0200
Substitute groups to members in incidenceeditor
KOLAB-BUG:#3377
diff --git a/incidenceeditor-ng/dialogdesktop.ui b/incidenceeditor-ng/dialogdesktop.ui
index a2a7063..fa610b2 100644
--- a/incidenceeditor-ng/dialogdesktop.ui
+++ b/incidenceeditor-ng/dialogdesktop.ui
@@ -755,6 +755,16 @@
</spacer>
</item>
<item>
+ <widget class="QPushButton" name="mGroupSubstitution">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Substitute with group members</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<widget class="QPushButton" name="mSelectButton">
<property name="toolTip">
<string comment="@info:tooltip">Select attendees from your address book.</string>
diff --git a/incidenceeditor-ng/incidenceattendee.cpp b/incidenceeditor-ng/incidenceattendee.cpp
index 56084af..d5fd2f3 100644
--- a/incidenceeditor-ng/incidenceattendee.cpp
+++ b/incidenceeditor-ng/incidenceattendee.cpp
@@ -50,26 +50,6 @@
using namespace IncidenceEditorNG;
-static bool compareAttendees(const KCalCore::Attendee::Ptr &newAttendee,
- const KCalCore::Attendee::Ptr &originalAttendee)
-{
- KCalCore::Attendee::Ptr originalClone(new KCalCore::Attendee(*originalAttendee));
-
- if (newAttendee->name() != originalAttendee->name()) {
- // What you put into an IncidenceEditorNG::AttendeeLine isn't exactly what you get out.
- // In rare situations, such as "Doe\, John <john.doe at kde.org>", AttendeeLine will normalize
- // the name, and set "Doe, John <john.doe at kde.org>" instead.
- // So, for isDirty() purposes, have that in mind, so we don't return that the editor is dirty
- // when the user didn't edit anything.
- QString dummy;
- QString originalNameNormalized;
- KPIMUtils::extractEmailAddressAndName(originalAttendee->fullName(), dummy, originalNameNormalized);
- originalClone->setName(originalNameNormalized);
- }
-
- return *newAttendee == *originalClone;
-}
-
#ifdef KDEPIM_MOBILE_UI
IncidenceAttendee::IncidenceAttendee( QWidget *parent, IncidenceDateTime *dateTime,
Ui::EventOrTodoMore *ui )
@@ -79,7 +59,6 @@ IncidenceAttendee::IncidenceAttendee( QWidget *parent, IncidenceDateTime *dateTi
#endif
: mUi( ui ),
mParentWidget( parent ),
- mAttendeeEditor( new AttendeeEditor ),
mStateDelegate(new AttendeeComboBoxDelegate(this)),
mRoleDelegate(new AttendeeComboBoxDelegate(this)),
mResponseDelegate(new AttendeeComboBoxDelegate(this)),
@@ -145,13 +124,14 @@ IncidenceAttendee::IncidenceAttendee( QWidget *parent, IncidenceDateTime *dateTi
#ifdef KDEPIM_MOBILE_UI
#else
+ connect(mUi->mGroupSubstitution, SIGNAL(clicked(bool)),
+ SLOT(slotGroupSubstitutionPressed()));
+
mUi->mAttendeeTable->setModel(filterProxyModel);
mAttendeeDelegate = new AttendeeLineEditDelegate(this);
mAttendeeDelegate->setCompletionMode( KGlobalSettings::self()->completionMode() );
-
-
mUi->mAttendeeTable->setItemDelegateForColumn(AttendeeTableModel::Role, roleDelegate());
mUi->mAttendeeTable->setItemDelegateForColumn(AttendeeTableModel::FullName, attendeeDelegate());
mUi->mAttendeeTable->setItemDelegateForColumn(AttendeeTableModel::Status, stateDelegate());
@@ -195,13 +175,17 @@ IncidenceAttendee::IncidenceAttendee( QWidget *parent, IncidenceDateTime *dateTi
slotUpdateConflictLabel( 0 ); //initialize label
- connect( mAttendeeEditor, SIGNAL(editingFinished(KPIM::MultiplyingLine*)),
- SLOT(checkIfExpansionIsNeeded(KPIM::MultiplyingLine*)) );
+ // confict resolver (should show also resources)
+ connect(mDataModel, SIGNAL(layoutChanged()), SLOT(slotConflictResolverLayoutChanged()));
+ connect(mDataModel, SIGNAL(rowsAboutToBeRemoved(const QModelIndex&, int , int)), SLOT(slotConflictResolverAttendeeRemoved(const QModelIndex&,int,int)));
+ connect(mDataModel, SIGNAL(rowsInserted(const QModelIndex&, int , int)), SLOT(slotConflictResolverAttendeeAdded(const QModelIndex&,int,int)));
+ connect(mDataModel, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)), SLOT(slotConflictResolverAttendeeChanged(const QModelIndex&, const QModelIndex&)));
- connect(mDataModel, SIGNAL(layoutChanged()), SLOT(slotAttendeeLayoutChanged()));
- connect(mDataModel, SIGNAL(rowsAboutToBeRemoved(const QModelIndex&, int , int)), SLOT(slotAttendeeRemoved(const QModelIndex&,int,int)));
- connect(mDataModel, SIGNAL(rowsInserted(const QModelIndex&, int , int)), SLOT(slotAttendeeAdded(const QModelIndex&,int,int)));
- connect(mDataModel, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)), SLOT(slotAttendeeChanged(const QModelIndex&, const QModelIndex&)));
+ //Group substitution
+ connect(filterProxyModel, SIGNAL(layoutChanged()), SLOT(slotGroupSubstitutionLayoutChanged()));
+ connect(filterProxyModel, SIGNAL(rowsAboutToBeRemoved(const QModelIndex&, int , int)), SLOT(slotGroupSubstitutionAttendeeRemoved(const QModelIndex&,int,int)));
+ connect(filterProxyModel, SIGNAL(rowsInserted(const QModelIndex&, int , int)), SLOT(slotGroupSubstitutionAttendeeAdded(const QModelIndex&,int,int)));
+ connect(filterProxyModel, SIGNAL(dataChanged(const QModelIndex&, const QModelIndex&)), SLOT(slotGroupSubstitutionAttendeeChanged(const QModelIndex&, const QModelIndex&)));
connect(filterProxyModel, SIGNAL(rowsInserted(const QModelIndex&, int , int)), SLOT(updateCount()));
connect(filterProxyModel, SIGNAL(rowsRemoved(const QModelIndex&, int , int)), SLOT(updateCount()));
@@ -384,61 +368,89 @@ void IncidenceAttendee::fillOrganizerCombo()
mUi->mOrganizerCombo->addItems( uniqueList );
}
-void IncidenceAttendee::checkIfExpansionIsNeeded( KPIM::MultiplyingLine *line )
+void IncidenceAttendee::checkIfExpansionIsNeeded(const KCalCore::Attendee::Ptr attendee )
{
- AttendeeData::Ptr data = qSharedPointerDynamicCast<AttendeeData>( line->data() );
- if ( !data ) {
- kDebug() << "dynamic cast failed";
- return;
- }
+ QString fullname = attendee->fullName();
- // For some reason, when pressing enter (instead of tab) the editingFinished()
- // signal is emitted twice. Check if there is already a job running to prevent
- // that we end up with the group members twice.
- if ( mMightBeGroupLines.key( QWeakPointer<KPIM::MultiplyingLine>( line ) ) != 0 ) {
- return;
- }
-
- Akonadi::ContactGroupSearchJob *job = new Akonadi::ContactGroupSearchJob();
- job->setQuery( Akonadi::ContactGroupSearchJob::Name, data->name() );
- connect( job, SIGNAL(result(KJob*)), this, SLOT(groupSearchResult(KJob*)) );
+ // stop old job
+ KJob *oldJob = mMightBeGroupJobs.key(attendee);
+ if ( oldJob != 0 ) {
+ disconnect(oldJob);
+ oldJob->deleteLater();
+ mMightBeGroupJobs.remove(oldJob);
+ }
- mMightBeGroupLines.insert( job, QWeakPointer<KPIM::MultiplyingLine>( line ) );
-}
+ mGroupList.remove(attendee);
-void IncidenceAttendee::expandResult( KJob *job )
-{
- Akonadi::ContactGroupExpandJob *expandJob = qobject_cast<Akonadi::ContactGroupExpandJob*>( job );
- Q_ASSERT( expandJob );
+ if (!fullname.isEmpty()) {
+ Akonadi::ContactGroupSearchJob *job = new Akonadi::ContactGroupSearchJob();
+ job->setQuery( Akonadi::ContactGroupSearchJob::Name, fullname);
+ connect( job, SIGNAL(result(KJob*)), this, SLOT(groupSearchResult(KJob*)) );
- const KABC::Addressee::List groupMembers = expandJob->contacts();
- foreach ( const KABC::Addressee &member, groupMembers ) {
- insertAttendeeFromAddressee( member );
- }
+ mMightBeGroupJobs.insert( job, attendee );
+ }
}
void IncidenceAttendee::groupSearchResult( KJob *job )
{
Akonadi::ContactGroupSearchJob *searchJob = qobject_cast<Akonadi::ContactGroupSearchJob*>( job );
- Q_ASSERT( searchJob );
+ Q_ASSERT(searchJob);
- Q_ASSERT( mMightBeGroupLines.contains( job ) );
- KPIM::MultiplyingLine *line = mMightBeGroupLines.take( job ).data();
+ Q_ASSERT(mMightBeGroupJobs.contains(job));
+ KCalCore::Attendee::Ptr attendee = mMightBeGroupJobs.take(job);
const KABC::ContactGroup::List contactGroups = searchJob->contactGroups();
if ( contactGroups.isEmpty() ) {
+ updateGroupExpand();
return; // Nothing todo, probably a normal email address was entered
}
// TODO: Give the user the possibility to choose a group when there is more than one?!
KABC::ContactGroup group = contactGroups.first();
- if ( line ) {
- line->slotPropagateDeletion();
- }
- Akonadi::ContactGroupExpandJob *expandJob = new Akonadi::ContactGroupExpandJob( group, this );
- connect( expandJob, SIGNAL(result(KJob*)), this, SLOT(expandResult(KJob*)) );
- expandJob->start();
+ mGroupList.insert(attendee, group);
+ updateGroupExpand();
+}
+
+void IncidenceAttendee::updateGroupExpand()
+{
+#ifndef KDEPIM_MOBILE_UI
+ mUi->mGroupSubstitution->setEnabled(mGroupList.count() > 0);
+#endif
+}
+
+
+void IncidenceAttendee::slotGroupSubstitutionPressed()
+{
+ foreach (KCalCore::Attendee::Ptr attendee, mGroupList.keys()) {
+ Akonadi::ContactGroupExpandJob *expandJob = new Akonadi::ContactGroupExpandJob( mGroupList.value(attendee), this );
+ connect( expandJob, SIGNAL(result(KJob*)), this, SLOT(expandResult(KJob*)) );
+ mExpandGroupJobs.insert(expandJob, attendee);
+ expandJob->start();
+ }
+}
+
+void IncidenceAttendee::expandResult( KJob *job )
+{
+#ifndef KDEPIM_MOBILE_UI
+ Akonadi::ContactGroupExpandJob *expandJob = qobject_cast<Akonadi::ContactGroupExpandJob*>( job );
+ Q_ASSERT( expandJob );
+ Q_ASSERT(mExpandGroupJobs.contains(job));
+ KCalCore::Attendee::Ptr attendee = mExpandGroupJobs.take(job);
+
+ int row = dataModel()->attendees().indexOf(attendee);
+
+ dataModel()->removeRow(row);
+ const KABC::Addressee::List groupMembers = expandJob->contacts();
+ foreach ( const KABC::Addressee &member, groupMembers ) {
+ KCalCore::Attendee::Ptr newAt(new KCalCore::Attendee(member.realName(), member.preferredEmail(),
+ attendee->RSVP(),
+ attendee->status(),
+ attendee->role(),
+ member.uid()));
+ dataModel()->insertAttendee(row, newAt);
+ }
+#endif
}
void IncidenceAttendee::slotSelectAddresses()
@@ -497,19 +509,18 @@ void IncidenceEditorNG::IncidenceAttendee::slotSolveConflictPressed()
}
}
-void IncidenceAttendee::slotAttendeeChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
+void IncidenceAttendee::slotConflictResolverAttendeeChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
{
#ifndef KDEPIM_MOBILE_UI
if (AttendeeTableModel::FullName <= bottomRight.column() && AttendeeTableModel::FullName >= topLeft.column()) {
for (int i = topLeft.row(); i <= bottomRight.row(); i++) {
- kDebug() << i;
- QModelIndex index = dataModel()->index(i, AttendeeTableModel::Email);
- KCalCore::Attendee::Ptr attendee = dataModel()->data(index, AttendeeTableModel::AttendeeRole).value<KCalCore::Attendee::Ptr>();
+ QModelIndex email = dataModel()->index(i, AttendeeTableModel::Email);
+ KCalCore::Attendee::Ptr attendee = dataModel()->data(email, AttendeeTableModel::AttendeeRole).value<KCalCore::Attendee::Ptr>();
if (mConflictResolver->containsAttendee(attendee)) {
mConflictResolver->removeAttendee(attendee);
}
- if (!dataModel()->data(index).toString().isEmpty()) {
- mConflictResolver->insertAttendee( attendee );
+ if (!dataModel()->data(email).toString().isEmpty()) {
+ mConflictResolver->insertAttendee(attendee);
}
}
}
@@ -517,7 +528,7 @@ void IncidenceAttendee::slotAttendeeChanged(const QModelIndex &topLeft, const QM
#endif
}
-void IncidenceAttendee::slotAttendeeAdded(const QModelIndex &index, int first, int last)
+void IncidenceAttendee::slotConflictResolverAttendeeAdded(const QModelIndex &index, int first, int last)
{
for (int i = first; i <= last; i++) {
QModelIndex email = dataModel()->index(i, AttendeeTableModel::Email, index);
@@ -528,31 +539,29 @@ void IncidenceAttendee::slotAttendeeAdded(const QModelIndex &index, int first, i
checkDirtyStatus();
}
-void IncidenceAttendee::slotAttendeeRemoved(const QModelIndex &index, int first, int last)
+void IncidenceAttendee::slotConflictResolverAttendeeRemoved(const QModelIndex &index, int first, int last)
{
for (int i = first; i <= last; i++) {
- kDebug() << i;
QModelIndex email = dataModel()->index(i, AttendeeTableModel::Email, index);
if (!dataModel()->data(email).toString().isEmpty()) {
- mConflictResolver->removeAttendee( dataModel()->data(email, AttendeeTableModel::AttendeeRole).value<KCalCore::Attendee::Ptr>() );
+ mConflictResolver->removeAttendee(dataModel()->data(email, AttendeeTableModel::AttendeeRole).value<KCalCore::Attendee::Ptr>());
}
}
checkDirtyStatus();
}
-void IncidenceAttendee::slotAttendeeLayoutChanged()
+void IncidenceAttendee::slotConflictResolverLayoutChanged()
{
KCalCore::Attendee::List attendees = mDataModel->attendees();
mConflictResolver->clearAttendees();
foreach(KCalCore::Attendee::Ptr attendee, attendees) {
- if (! attendee->email().isEmpty()) {
+ if (!attendee->email().isEmpty()) {
mConflictResolver->insertAttendee(attendee);
}
}
checkDirtyStatus();
}
-
void IncidenceAttendee::slotUpdateConflictLabel( int count )
{
kDebug() << "slotUpdateConflictLabel";
@@ -573,6 +582,84 @@ void IncidenceAttendee::slotUpdateConflictLabel( int count )
}
}
+void IncidenceAttendee::slotGroupSubstitutionAttendeeChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight)
+{
+ if (AttendeeTableModel::FullName <= bottomRight.column() && AttendeeTableModel::FullName >= topLeft.column()) {
+ for (int i = topLeft.row(); i <= bottomRight.row(); i++) {
+ QModelIndex email = dataModel()->index(i, AttendeeTableModel::Email);
+ KCalCore::Attendee::Ptr attendee = dataModel()->data(email, AttendeeTableModel::AttendeeRole).value<KCalCore::Attendee::Ptr>();
+ checkIfExpansionIsNeeded(attendee);
+ }
+ }
+ updateGroupExpand();
+}
+
+void IncidenceAttendee::slotGroupSubstitutionAttendeeAdded(const QModelIndex &index, int first, int last)
+{
+ Q_UNUSED(index);
+ for (int i = first; i <= last; i++) {
+ QModelIndex email = dataModel()->index(i, AttendeeTableModel::Email);
+ KCalCore::Attendee::Ptr attendee = dataModel()->data(email, AttendeeTableModel::AttendeeRole).value<KCalCore::Attendee::Ptr>();
+ checkIfExpansionIsNeeded(attendee);
+ }
+ updateGroupExpand();
+}
+
+void IncidenceAttendee::slotGroupSubstitutionAttendeeRemoved(const QModelIndex &index, int first, int last)
+{
+ Q_UNUSED(index);
+ for (int i = first; i <= last; i++) {
+ QModelIndex email = dataModel()->index(i, AttendeeTableModel::Email);
+ KCalCore::Attendee::Ptr attendee = dataModel()->data(email, AttendeeTableModel::AttendeeRole).value<KCalCore::Attendee::Ptr>();
+ KJob *job = mMightBeGroupJobs.key(attendee);
+ if (job) {
+ disconnect(job);
+ job->deleteLater();
+ mMightBeGroupJobs.remove(job);
+ }
+ job = mExpandGroupJobs.key(attendee);
+ if (job) {
+ disconnect(job);
+ job->deleteLater();
+ mExpandGroupJobs.remove(job);
+ }
+ mGroupList.remove(attendee);
+ }
+ updateGroupExpand();
+}
+
+void IncidenceAttendee::slotGroupSubstitutionLayoutChanged()
+{
+ foreach(KJob *job, mMightBeGroupJobs.keys()) {
+ disconnect(job);
+ job->deleteLater();
+ }
+ foreach(KJob *job, mExpandGroupJobs.keys()) {
+ disconnect(job);
+ job->deleteLater();
+ }
+ mMightBeGroupJobs.clear();
+ mExpandGroupJobs.clear();
+ mGroupList.clear();
+
+#ifndef KDEPIM_MOBILE_UI
+ QAbstractItemModel *model = mUi->mAttendeeTable->model();
+ if (!model ) {
+ return;
+ }
+ for(int i=0;i< model->rowCount(QModelIndex());i++) {
+ QModelIndex index = model->index(i,AttendeeTableModel::FullName);
+ if (!model->data(index).toString().isEmpty()) {
+ QModelIndex email = dataModel()->index(i, AttendeeTableModel::Email);
+ KCalCore::Attendee::Ptr attendee = dataModel()->data(email, AttendeeTableModel::AttendeeRole).value<KCalCore::Attendee::Ptr>();
+ checkIfExpansionIsNeeded(attendee);
+ }
+ }
+
+ updateGroupExpand();
+#endif
+}
+
bool IncidenceAttendee::iAmOrganizer() const
{
if ( mLoadedIncidence ) {
@@ -583,7 +670,7 @@ bool IncidenceAttendee::iAmOrganizer() const
return true;
}
-void IncidenceAttendee::insertAttendeeFromAddressee( const KABC::Addressee &a )
+void IncidenceAttendee::insertAttendeeFromAddressee( const KABC::Addressee &a, int pos/*=-1*/)
{
const bool sameAsOrganizer = mUi->mOrganizerCombo &&
KPIMUtils::compareEmail( a.preferredEmail(),
@@ -601,8 +688,11 @@ void IncidenceAttendee::insertAttendeeFromAddressee( const KABC::Addressee &a )
partStat,
KCalCore::Attendee::ReqParticipant,
a.uid() ) );
+ if (pos < 0 ) {
+ pos = dataModel()->rowCount() - 1;
+ }
- mDataModel->insertAttendee(mDataModel->rowCount(), newAt);
+ dataModel()->insertAttendee(pos, newAt);
}
void IncidenceAttendee::slotEventDurationChanged()
diff --git a/incidenceeditor-ng/incidenceattendee.h b/incidenceeditor-ng/incidenceattendee.h
index cf07170..36af4e8 100644
--- a/incidenceeditor-ng/incidenceattendee.h
+++ b/incidenceeditor-ng/incidenceattendee.h
@@ -36,6 +36,7 @@ namespace KPIM {
namespace KABC {
class Addressee;
+ class ContactGroup;
}
class KJob;
@@ -82,13 +83,17 @@ class INCIDENCEEDITORS_NG_EXPORT IncidenceAttendee : public IncidenceEditor
void declineForMe();
private slots:
- void checkIfExpansionIsNeeded( KPIM::MultiplyingLine * );
- void expandResult( KJob *job );
+ // cheks if row is a group, that can/should be expanded
+ void checkIfExpansionIsNeeded(KCalCore::Attendee::Ptr attendee);
+
+ // results of the group search job
void groupSearchResult( KJob *job );
+ void expandResult( KJob *job );
void slotSelectAddresses();
void slotSolveConflictPressed();
void slotUpdateConflictLabel( int );
void slotOrganizerChanged( const QString &organizer );
+ void slotGroupSubstitutionPressed();
// wrapper for the conflict resolver
void slotEventDurationChanged();
@@ -96,13 +101,19 @@ class INCIDENCEEDITORS_NG_EXPORT IncidenceAttendee : public IncidenceEditor
void filterLayoutChanged();
void updateCount();
- void slotAttendeeAdded(const QModelIndex &index, int first, int last);
- void slotAttendeeRemoved(const QModelIndex &index, int first, int last);
- void slotAttendeeChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
- void slotAttendeeLayoutChanged();
+ void slotConflictResolverAttendeeAdded(const QModelIndex &index, int first, int last);
+ void slotConflictResolverAttendeeRemoved(const QModelIndex &index, int first, int last);
+ void slotConflictResolverAttendeeChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
+ void slotConflictResolverLayoutChanged();
+ void slotGroupSubstitutionAttendeeAdded(const QModelIndex &index, int first, int last);
+ void slotGroupSubstitutionAttendeeRemoved(const QModelIndex &index, int first, int last);
+ void slotGroupSubstitutionAttendeeChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
+ void slotGroupSubstitutionLayoutChanged();
+
+private:
+ void updateGroupExpand();
- private:
void changeStatusForMe( KCalCore::Attendee::PartStat );
/** Returns if I was the organizer of the loaded event */
@@ -113,8 +124,9 @@ class INCIDENCEEDITORS_NG_EXPORT IncidenceAttendee : public IncidenceEditor
* from the addressbook and expanding distribution lists.
* The optional Attendee parameter can be used to pass in default values
* to be used by the new Attendee.
+ * pos =-1 means insert attendee before empty line
*/
- void insertAttendeeFromAddressee( const KABC::Addressee &a );
+ void insertAttendeeFromAddressee( const KABC::Addressee &a, int pos = -1);
void fillOrganizerCombo();
void setActions( KCalCore::Incidence::IncidenceType actions );
@@ -124,9 +136,8 @@ class INCIDENCEEDITORS_NG_EXPORT IncidenceAttendee : public IncidenceEditor
Ui::EventOrTodoDesktop *mUi;
#endif
QWidget *mParentWidget;
- AttendeeEditor *mAttendeeEditor;
ConflictResolver *mConflictResolver;
- QMap<KJob *,QWeakPointer<KPIM::MultiplyingLine> > mMightBeGroupLines;
+
IncidenceDateTime *mDateTime;
QString mOrganizer;
@@ -137,6 +148,9 @@ class INCIDENCEEDITORS_NG_EXPORT IncidenceAttendee : public IncidenceEditor
AttendeeComboBoxDelegate *mRoleDelegate;
AttendeeComboBoxDelegate *mResponseDelegate;
+ QMap<KCalCore::Attendee::Ptr, KABC::ContactGroup> mGroupList;
+ QMap<KJob *, KCalCore::Attendee::Ptr> mMightBeGroupJobs;
+ QMap<KJob *, KCalCore::Attendee::Ptr> mExpandGroupJobs;
};
}
More information about the commits
mailing list