diff --git a/calendarviews/agenda/viewcalendar.cpp b/calendarviews/agenda/viewcalendar.cpp index aa1555dfe8..8aeb095b91 100644 --- a/calendarviews/agenda/viewcalendar.cpp +++ b/calendarviews/agenda/viewcalendar.cpp @@ -1,169 +1,196 @@ #include "viewcalendar.h" #include "agendaview.h" #include "helper.h" #include using namespace EventViews; ViewCalendar::~ViewCalendar() { } MultiViewCalendar::~MultiViewCalendar() { } KCalCore::Calendar::Ptr MultiViewCalendar::getCalendar() const { return KCalCore::Calendar::Ptr(); } KCalCore::Incidence::List MultiViewCalendar::incidences() const { KCalCore::Incidence::List list; foreach(const ViewCalendar::Ptr &cal, mSubCalendars) { if (cal->getCalendar()) { list += cal->getCalendar()->incidences(); } } return list; } int MultiViewCalendar::calendars() const { return mSubCalendars.size(); } ViewCalendar::Ptr MultiViewCalendar::findCalendar(const KCalCore::Incidence::Ptr &incidence) const { foreach(const ViewCalendar::Ptr &cal, mSubCalendars) { if (cal->isValid(incidence)) { return cal; } } return ViewCalendar::Ptr(); } +ViewCalendar::Ptr MultiViewCalendar::findCalendar(const QString &incidenceIdentifier) const +{ + foreach(const ViewCalendar::Ptr &cal, mSubCalendars) { + if (cal->isValid(incidenceIdentifier)) { + return cal; + } + } + return ViewCalendar::Ptr(); +} + void MultiViewCalendar::addCalendar(const ViewCalendar::Ptr &calendar) { if (!mSubCalendars.contains(calendar)) { mSubCalendars.append(calendar); } } void MultiViewCalendar::setETMCalendar(const Akonadi::ETMCalendar::Ptr &calendar) { if (!mETMCalendar) { mETMCalendar = AkonadiViewCalendar::Ptr(new AkonadiViewCalendar); mETMCalendar->mAgendaView = mAgendaView; } mETMCalendar->mCalendar = calendar; addCalendar(mETMCalendar); } QString MultiViewCalendar::displayName(const KCalCore::Incidence::Ptr &incidence) const { ViewCalendar::Ptr cal = findCalendar(incidence); if (cal) { return cal->displayName(incidence); } return QString(); } QString MultiViewCalendar::iconForIncidence(const KCalCore::Incidence::Ptr &incidence) const { ViewCalendar::Ptr cal = findCalendar(incidence); if (cal) { return cal->iconForIncidence(incidence); } return QString(); } bool MultiViewCalendar::isValid(const KCalCore::Incidence::Ptr &incidence) const { ViewCalendar::Ptr cal = findCalendar(incidence); return cal; } +bool MultiViewCalendar::isValid(const QString &incidenceIdentifier) const +{ + ViewCalendar::Ptr cal = findCalendar(incidenceIdentifier); + return cal; +} + + QColor MultiViewCalendar::resourceColor(const KCalCore::Incidence::Ptr &incidence) const { ViewCalendar::Ptr cal = findCalendar(incidence); if (cal) { return cal->resourceColor(incidence); } return QColor(); } Akonadi::Item MultiViewCalendar::item(const KCalCore::Incidence::Ptr &incidence) const { if (mETMCalendar->isValid(incidence)) { return mETMCalendar->item(incidence); } return Akonadi::Item(); } AkonadiViewCalendar::~AkonadiViewCalendar() { } bool AkonadiViewCalendar::isValid(const KCalCore::Incidence::Ptr &incidence) const { if (!mCalendar) { return false; } if (item(incidence).isValid()) { return true; } return false; } -Akonadi::Item AkonadiViewCalendar::item(const KCalCore::Incidence::Ptr &incidence) const +bool AkonadiViewCalendar::isValid(const QString &incidenceIdentifier) const { if (!mCalendar) { + return false; + } + + return !mCalendar->incidence(incidenceIdentifier).isNull(); +} + + +Akonadi::Item AkonadiViewCalendar::item(const KCalCore::Incidence::Ptr &incidence) const +{ + if (!mCalendar || !incidence) { return Akonadi::Item(); } bool ok = false; Akonadi::Item::Id id = incidence->customProperty("VOLATILE", "AKONADI-ID").toLongLong(&ok); if (id == -1 || !ok) { id = mCalendar->item(incidence).id(); if (id == -1) { // Ok, we really don't know the ID, give up. kDebug() << "Item is invalid. uid = " << incidence->instanceIdentifier(); return Akonadi::Item(); } return mCalendar->item(incidence->instanceIdentifier()); } return mCalendar->item(id); } QString AkonadiViewCalendar::displayName(const KCalCore::Incidence::Ptr &incidence) const { return CalendarSupport::displayName( mCalendar.data(), item(incidence).parentCollection() ); } QColor AkonadiViewCalendar::resourceColor(const KCalCore::Incidence::Ptr &incidence) const { return EventViews::resourceColor( item(incidence), mAgendaView->preferences() ); } QString AkonadiViewCalendar::iconForIncidence(const KCalCore::Incidence::Ptr &incidence) const { return mAgendaView->iconForItem(item(incidence)); } KDateTime::Spec AkonadiViewCalendar::timeSpec() const { return mCalendar->timeSpec(); } KCalCore::Calendar::Ptr AkonadiViewCalendar::getCalendar() const { return mCalendar; } diff --git a/calendarviews/agenda/viewcalendar.h b/calendarviews/agenda/viewcalendar.h index 53551e5cd7..afa39a684d 100644 --- a/calendarviews/agenda/viewcalendar.h +++ b/calendarviews/agenda/viewcalendar.h @@ -1,103 +1,107 @@ /* Copyright (c) 2014 Sandro Knauß This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. As a special exception, permission is given to link this program with any edition of Qt, and distribute the resulting executable, without including the source code for Qt in the source distribution. */ #ifndef EVENTVIEWS_VIEWCALENDAR_H #define EVENTVIEWS_VIEWCALENDAR_H #include "eventviews_export.h" #include #include #include #include #include namespace EventViews { class AgendaView; class EVENTVIEWS_EXPORT ViewCalendar { public: typedef QSharedPointer Ptr; virtual ~ViewCalendar(); virtual bool isValid(const KCalCore::Incidence::Ptr &incidence) const=0; + virtual bool isValid(const QString &incidenceIdentifier) const=0; virtual QString displayName(const KCalCore::Incidence::Ptr &incidence) const=0; virtual QColor resourceColor(const KCalCore::Incidence::Ptr &incidence) const=0; virtual QString iconForIncidence(const KCalCore::Incidence::Ptr &incidence) const=0; virtual KCalCore::Calendar::Ptr getCalendar() const=0; }; class EVENTVIEWS_EXPORT AkonadiViewCalendar: public ViewCalendar { public: typedef QSharedPointer Ptr; virtual ~AkonadiViewCalendar(); virtual bool isValid(const KCalCore::Incidence::Ptr &incidence) const; + virtual bool isValid(const QString &incidenceIdentifier) const; virtual QString displayName(const KCalCore::Incidence::Ptr &incidence) const; virtual QColor resourceColor(const KCalCore::Incidence::Ptr &incidence) const; virtual QString iconForIncidence(const KCalCore::Incidence::Ptr &incidence) const; virtual Akonadi::Item item(const KCalCore::Incidence::Ptr &incidence) const; virtual KCalCore::Calendar::Ptr getCalendar() const; KDateTime::Spec timeSpec() const; Akonadi::ETMCalendar::Ptr mCalendar; AgendaView *mAgendaView; }; class EVENTVIEWS_EXPORT MultiViewCalendar { public: typedef QSharedPointer Ptr; virtual ~MultiViewCalendar(); ViewCalendar::Ptr findCalendar(const KCalCore::Incidence::Ptr &incidence) const; + ViewCalendar::Ptr findCalendar(const QString &incidenceIdentifier) const; virtual bool isValid(const KCalCore::Incidence::Ptr &incidence) const; + virtual bool isValid(const QString &incidenceIdentifier) const; virtual QString displayName(const KCalCore::Incidence::Ptr &incidence) const; virtual QColor resourceColor(const KCalCore::Incidence::Ptr &incidence) const; virtual QString iconForIncidence(const KCalCore::Incidence::Ptr &incidence) const; virtual Akonadi::Item item(const KCalCore::Incidence::Ptr &incidence) const; void addCalendar(const ViewCalendar::Ptr &calendar); void setETMCalendar(const Akonadi::ETMCalendar::Ptr &calendar); int calendars() const; KCalCore::Calendar::Ptr getCalendar() const; KCalCore::Incidence::List incidences() const; AgendaView *mAgendaView; AkonadiViewCalendar::Ptr mETMCalendar; QList mSubCalendars; }; } #endif \ No newline at end of file diff --git a/incidenceeditor-ng/resourcemanagement.cpp b/incidenceeditor-ng/resourcemanagement.cpp index b75c9d36bd..ff36677a74 100644 --- a/incidenceeditor-ng/resourcemanagement.cpp +++ b/incidenceeditor-ng/resourcemanagement.cpp @@ -1,292 +1,297 @@ /* * Copyright 2014 Sandro Knauß * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ //http://stackoverflow.com/questions/18831242/qt-start-editing-of-cell-after-one-click #include "resourcemanagement.h" #include "ui_resourcemanagement.h" #include "resourcemodel.h" #include "freebusymodel/freebusyitem.h" #include "freebusymodel/freebusycalendar.h" #include "ldaputils.h" #include "freebusyganttproxymodel.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace IncidenceEditorNG; class FreebusyViewCalendar : public EventViews::ViewCalendar { public: virtual ~FreebusyViewCalendar() {}; virtual bool isValid(const KCalCore::Incidence::Ptr &incidence) const { - return incidence->uid().startsWith("fb-"); + return isValid(incidence->uid()); + } + + virtual bool isValid(const QString &incidenceIdentifier) const + { + return incidenceIdentifier.startsWith("fb-"); } virtual QString displayName(const KCalCore::Incidence::Ptr &incidence) const { Q_UNUSED(incidence); return QLatin1String("Freebusy"); } virtual QColor resourceColor(const KCalCore::Incidence::Ptr &incidence) const { bool ok = false; int status = incidence->customProperty("FREEBUSY", "STATUS").toInt(&ok); if (!ok) { return QColor("#555"); } switch (status) { case KCalCore::FreeBusyPeriod::Busy: return QColor("#f00"); case KCalCore::FreeBusyPeriod::BusyTentative: case KCalCore::FreeBusyPeriod::BusyUnavailable: return QColor("#f70"); case KCalCore::FreeBusyPeriod::Free: return QColor("#0f0"); default: return QColor("#555"); } } virtual QString iconForIncidence(const KCalCore::Incidence::Ptr &incidence) const { return QString(); } virtual KCalCore::Calendar::Ptr getCalendar() const { return mCalendar; } KCalCore::Calendar::Ptr mCalendar; }; ResourceManagement::ResourceManagement() { setButtonText(KDialog::Ok, i18nc("@action:button add resource to attendeelist", "Book resource")); mUi = new Ui_resourceManagement; QWidget *w = new QWidget( this ); mUi->setupUi( w ); setMainWidget( w ); QVariantList list; mModel = new FreeBusyItemModel(this); mFreebusyCalendar.setModel(mModel); mAgendaView = new EventViews::AgendaView(QDate(), QDate(), false, false); FreebusyViewCalendar *fbCalendar = new FreebusyViewCalendar(); fbCalendar->mCalendar = mFreebusyCalendar.calendar(); mFbCalendar = EventViews::ViewCalendar::Ptr(fbCalendar); mAgendaView->addCalendar(mFbCalendar); mUi->resourceCalender->addWidget( mAgendaView ); QStringList attrs; attrs << QLatin1String("cn") << QLatin1String("mail") << QLatin1String("owner") << QLatin1String("givenname") << QLatin1String("sn") << QLatin1String("kolabDescAttribute") << QLatin1String("description"); ResourceModel *resourcemodel = new ResourceModel(attrs); mUi->treeResults->setModel(resourcemodel); // This doesn't work till now :( -> that's why i use the click signal mUi->treeResults->setSelectionMode(QAbstractItemView::SingleSelection); selectionModel = mUi->treeResults->selectionModel(); connect(mUi->resourceSearch, SIGNAL(textChanged(const QString&)), SLOT(slotStartSearch(const QString&))); connect(mUi->treeResults, SIGNAL(clicked(const QModelIndex &)), SLOT(slotShowDetails(const QModelIndex &))); connect(resourcemodel,SIGNAL(layoutChanged()),SLOT(slotLayoutChanged())); } ResourceManagement::~ResourceManagement() { delete mModel; } ResourceItem::Ptr ResourceManagement::selectedItem() const { return mSelectedItem; } void ResourceManagement::slotStartSearch(const QString &text) { ((ResourceModel*)mUi->treeResults->model())->startSearch(text); } void ResourceManagement::slotShowDetails(const QModelIndex & current) { ResourceItem::Ptr item = current.model()->data(current, ResourceModel::Resource).value(); mSelectedItem = item; showDetails(item->ldapObject(), item->ldapClient()); } void ResourceManagement::showDetails(const KLDAP::LdapObject &obj, const KLDAP::LdapClient &client) { // Clean up formDetails QLayoutItem *child; while ((child = mUi->formDetails->takeAt(0)) != 0) { delete child->widget(); delete child; } mUi->groupOwner->setHidden(true); // Fill formDetails with data foreach(const QString & key, obj.attributes().keys()) { if (key == QLatin1String("objectClass") || key == QLatin1String("email")) { continue; } else if (key == QLatin1String("owner")) { QStringList attrs; attrs << QLatin1String("cn") << QLatin1String("mail") << QLatin1String("mobile") << QLatin1String("telephoneNumber") << QLatin1String("kolabDescAttribute") << QLatin1String("description"); mOwnerItem = ResourceItem::Ptr(new ResourceItem(KLDAP::LdapDN(QString::fromUtf8(obj.attributes().value(key).at(0))), attrs, client)); connect(mOwnerItem.data(), SIGNAL(searchFinished()), SLOT(slotOwnerSearchFinished())); mOwnerItem->startSearch(); continue; } QStringList list; foreach(const QByteArray & value, obj.attributes().value(key)) { list << QString::fromUtf8(value); } if (key == QLatin1String("kolabDescAttribute")) { QJson::Parser parser; foreach(const QString &attr, list) { bool ok; QMap map = parser.parse(attr.toUtf8(), &ok).toMap(); foreach(const QString &pKey, map.keys()) { QString value; if (map.value(pKey).type() == QVariant::Bool) { value = map.value(pKey).toBool() ? i18n("yes") : i18n("no"); } else { value = map.value(pKey).toString(); } mUi->formDetails->addRow(translateKolabLDAPAttributeForDisplay(pKey), new QLabel(value)); } } } else { mUi->formDetails->addRow(translateLDAPAttributeForDisplay(key), new QLabel(list.join("\n"))); } } QString name = QString::fromUtf8(obj.attributes().value("cn")[0]); QString email = QString::fromUtf8(obj.attributes().value("mail")[0]); KCalCore::Attendee::Ptr attendee(new KCalCore::Attendee(name, email)); FreeBusyItem::Ptr freebusy( new FreeBusyItem( attendee, this )); mModel->clear(); mModel->addItem(freebusy); } void ResourceManagement::slotLayoutChanged() { for(int i = 1; i < mUi->treeResults->model()->columnCount(QModelIndex());i++) { mUi->treeResults->setColumnHidden(i, true); } } void ResourceManagement::slotOwnerSearchFinished() { // Clean up formDetails QLayoutItem *child; while ((child = mUi->formOwner->takeAt(0)) != 0) { delete child->widget(); delete child; } mUi->groupOwner->setHidden(false); const KLDAP::LdapObject &obj = mOwnerItem->ldapObject(); foreach(const QString & key, obj.attributes().keys()) { if (key == QLatin1String("objectClass") || key == QLatin1String("owner") || key == QLatin1String("givenname") || key == QLatin1String("sn")) { continue; } QStringList list; foreach(const QByteArray & value, obj.attributes().value(key)) { list << QString::fromUtf8(value); } if (key == QLatin1String("kolabDescAttribute")) { QJson::Parser parser; foreach(const QString &attr, list) { bool ok; QMap map = parser.parse(attr.toUtf8(), &ok).toMap(); foreach(const QString &pKey, map.keys()) { QString value; if (map.value(pKey).type() == QVariant::Bool) { value = map.value(pKey).toBool() ? i18n("yes") : i18n("no"); } else { value = map.value(pKey).toString(); } mUi->formOwner->addRow(translateKolabLDAPAttributeForDisplay(pKey), new QLabel(value)); } } } else { mUi->formOwner->addRow(translateLDAPAttributeForDisplay(key), new QLabel(list.join("\n"))); } } } void ResourceManagement::slotDateChanged(QDate start, QDate end) { int days = start.daysTo(end); if (days < 7) { end = start.addDays(7); } mAgendaView->showDates(start, end); } #include "resourcemanagement.moc" \ No newline at end of file diff --git a/korganizer/views/collectionview/quickview.cpp b/korganizer/views/collectionview/quickview.cpp index 3417fb1cfb..de3e43e43b 100644 --- a/korganizer/views/collectionview/quickview.cpp +++ b/korganizer/views/collectionview/quickview.cpp @@ -1,184 +1,189 @@ /* * Copyright 2014 Sandro Knauß * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ //http://stackoverflow.com/questions/18831242/qt-start-editing-of-cell-after-one-click #include "quickview.h" #include "ui_quickview.h" #include #include #include #include #include #include #include #include #include #include #include #include #include class FreebusyViewCalendar : public EventViews::ViewCalendar { public: virtual ~FreebusyViewCalendar() {}; virtual bool isValid(const KCalCore::Incidence::Ptr &incidence) const { - return incidence->uid().startsWith(QLatin1String("fb-")); + return isValid(incidence->uid()); + } + + virtual bool isValid(const QString &incidenceIdentifier) const + { + return incidenceIdentifier.startsWith(QLatin1String("fb-")); } virtual QString displayName(const KCalCore::Incidence::Ptr &incidence) const { Q_UNUSED(incidence); return i18n("Freebusycalendar from %1").arg(name); } virtual QColor resourceColor(const KCalCore::Incidence::Ptr &incidence) const { bool ok = false; int status = incidence->customProperty("FREEBUSY", "STATUS").toInt(&ok); if (!ok) { return QColor("#555"); } switch (status) { case KCalCore::FreeBusyPeriod::Busy: return QColor("#f00"); case KCalCore::FreeBusyPeriod::BusyTentative: case KCalCore::FreeBusyPeriod::BusyUnavailable: return QColor("#f70"); case KCalCore::FreeBusyPeriod::Free: return QColor("#0f0"); default: return QColor("#555"); } } virtual QString iconForIncidence(const KCalCore::Incidence::Ptr &incidence) const { return QString(); } virtual KCalCore::Calendar::Ptr getCalendar() const { return mCalendar; } KCalCore::Calendar::Ptr mCalendar; QString name; }; Quickview::Quickview(const Person &person, const Akonadi::Collection &col) : KDialog() , mUi(new Ui_quickview) , mPerson(person) , mCollection(col) , mDayRange(7) { setButtons(KDialog::Close); QWidget *w = new QWidget( this ); mUi->setupUi( w ); setMainWidget( w ); mAgendaView = new EventViews::AgendaView(QDate(), QDate(), false, false); //show fbcalendar for person in quickview if (!person.mail.isEmpty()) { FreeBusyItemModel *model = new FreeBusyItemModel(this); FreeBusyCalendar *fbCal = new FreeBusyCalendar(this); FreebusyViewCalendar *fbCalendar = new FreebusyViewCalendar(); KCalCore::Attendee::Ptr attendee(new KCalCore::Attendee(person.name, person.mail)); FreeBusyItem::Ptr freebusy( new FreeBusyItem( attendee, this )); fbCal->setModel(model); model->addItem(freebusy); fbCalendar->mCalendar = fbCal->calendar(); fbCalendar->name = attendee->fullName(); mAgendaView->addCalendar(EventViews::ViewCalendar::Ptr(fbCalendar)); } if (mCollection.isValid()) { //create etm for mCollection Akonadi::ChangeRecorder *monitor = new Akonadi::ChangeRecorder(this); Akonadi::ItemFetchScope scope; QStringList allMimeTypes; allMimeTypes << KCalCore::Event::eventMimeType() << KCalCore::Todo::todoMimeType() << KCalCore::Journal::journalMimeType(); scope.fetchFullPayload(true); scope.fetchAttribute(); monitor->setCollectionMonitored(mCollection); monitor->fetchCollection(true); monitor->setItemFetchScope(scope); monitor->setAllMonitored(true); foreach(const QString &mimetype, allMimeTypes) { monitor->setMimeTypeMonitored(mimetype, true); } Akonadi::ETMCalendar::Ptr calendar = Akonadi::ETMCalendar::Ptr(new Akonadi::ETMCalendar(monitor)); calendar->setCollectionFilteringEnabled(false); mAgendaView->setCalendar(calendar); } mUi->calender->addWidget( mAgendaView ); connect(mUi->mTodayBtn, SIGNAL(clicked(bool)), SLOT(onTodayClicked())); connect(mUi->mNextBtn, SIGNAL(clicked(bool)), SLOT(onNextClicked())); connect(mUi->mPreviousBtn, SIGNAL(clicked(bool)), SLOT(onPreviousClicked())); onTodayClicked(); } Quickview::~Quickview() { delete mUi; } void Quickview::onNextClicked() { QDate start = mAgendaView->startDate().addDays(mDayRange); mAgendaView->showDates(start, start.addDays(mDayRange-1)); } void Quickview::onPreviousClicked() { QDate start = mAgendaView->startDate().addDays(-mDayRange); mAgendaView->showDates(start, start.addDays(mDayRange-1)); } void Quickview::onTodayClicked() { QDate start = QDate::currentDate(); start = start.addDays(-QDate::currentDate().dayOfWeek()+1); mAgendaView->showDates(start, start.addDays(mDayRange-1)); } #include "quickview.moc"