File indexing completed on 2024-05-12 05:10:50
0001 /* 0002 * SPDX-FileCopyrightText: 2010 Casey Link <unnamedrambler@gmail.com> 0003 * SPDX-FileCopyrightText: 2010 Klaralvdalens Datakonsult AB, a KDAB Group company <info@kdab.net> 0004 * SPDX-FileCopyrightText: 2009-2010 Tobias Koenig <tokoe@kde.org> 0005 * 0006 * SPDX-License-Identifier: LGPL-2.0-or-later 0007 */ 0008 0009 #include "standardcalendaractionmanager.h" 0010 0011 #include <Akonadi/EntityTreeModel> 0012 0013 #include <KActionCollection> 0014 #include <KCalendarCore/Event> 0015 #include <KCalendarCore/Journal> 0016 #include <KLocalizedString> 0017 #include <QAction> 0018 0019 #include <QItemSelectionModel> 0020 0021 using namespace Akonadi; 0022 0023 class Akonadi::StandardCalendarActionManagerPrivate 0024 { 0025 public: 0026 StandardCalendarActionManagerPrivate(KActionCollection *actionCollection, QWidget *parentWidget, StandardCalendarActionManager *parent) 0027 : mActionCollection(actionCollection) 0028 , mParentWidget(parentWidget) 0029 , mParent(parent) 0030 { 0031 mGenericManager = new StandardActionManager(actionCollection, parentWidget); 0032 mParent->connect(mGenericManager, &StandardActionManager::actionStateUpdated, mParent, &StandardCalendarActionManager::actionStateUpdated); 0033 mGenericManager->setMimeTypeFilter(QStringList() << QStringLiteral("text/calendar")); 0034 mGenericManager->setCapabilityFilter(QStringList() << QStringLiteral("Resource")); 0035 } 0036 0037 ~StandardCalendarActionManagerPrivate() 0038 { 0039 delete mGenericManager; 0040 } 0041 0042 void updateGenericAction(StandardActionManager::Type type) 0043 { 0044 switch (type) { 0045 case Akonadi::StandardActionManager::CreateCollection: 0046 mGenericManager->action(Akonadi::StandardActionManager::CreateCollection)->setText(i18n("Add Folder...")); 0047 mGenericManager->action(Akonadi::StandardActionManager::CreateCollection) 0048 ->setWhatsThis(i18n("Add a new calendar folder to the currently selected calendar folder.")); 0049 mGenericManager->setContextText(StandardActionManager::CreateCollection, StandardActionManager::DialogTitle, i18nc("@title:window", "New Folder")); 0050 0051 mGenericManager->setContextText(StandardActionManager::CreateCollection, 0052 StandardActionManager::ErrorMessageText, 0053 ki18n("Could not create calendar folder: %1")); 0054 0055 mGenericManager->setContextText(StandardActionManager::CreateCollection, 0056 StandardActionManager::ErrorMessageTitle, 0057 i18nc("@title:window", "Calendar Folder Creation Failed")); 0058 mGenericManager->action(Akonadi::StandardActionManager::CreateCollection) 0059 ->setProperty("ContentMimeTypes", 0060 QStringList() << QStringLiteral("inode/directory") << QStringLiteral("application/x-vnd.akonadi.calendar.todo") 0061 << QStringLiteral("application/x-vnd.akonadi.calendar.event") 0062 << QStringLiteral("application/x-vnd.akonadi.calendar.journal")); 0063 0064 break; 0065 case Akonadi::StandardActionManager::CopyCollections: 0066 mGenericManager->setActionText(Akonadi::StandardActionManager::CopyCollections, ki18np("Copy Folder", "Copy %1 Folders")); 0067 mGenericManager->action(Akonadi::StandardActionManager::CopyCollections) 0068 ->setWhatsThis(i18n("Copy the selected calendar folders to the clipboard.")); 0069 break; 0070 case Akonadi::StandardActionManager::DeleteCollections: 0071 mGenericManager->setActionText(Akonadi::StandardActionManager::DeleteCollections, ki18np("Delete Folder", "Delete %1 Folders")); 0072 mGenericManager->action(Akonadi::StandardActionManager::DeleteCollections) 0073 ->setWhatsThis(i18n("Delete the selected calendar folders from the calendar.")); 0074 mGenericManager->setContextText(StandardActionManager::DeleteCollections, 0075 StandardActionManager::MessageBoxText, 0076 ki18np("Do you really want to delete this calendar folder and all its sub-folders?", 0077 "Do you really want to delete %1 calendar folders and all their sub-folders?")); 0078 0079 mGenericManager->setContextText(StandardActionManager::DeleteCollections, 0080 StandardActionManager::MessageBoxTitle, 0081 ki18ncp("@title:window", "Delete Calendar Folder?", "Delete Calendar Folders?")); 0082 0083 mGenericManager->setContextText(StandardActionManager::DeleteCollections, 0084 StandardActionManager::ErrorMessageText, 0085 ki18n("Could not delete calendar folder: %1")); 0086 0087 mGenericManager->setContextText(StandardActionManager::DeleteCollections, 0088 StandardActionManager::ErrorMessageTitle, 0089 i18nc("@title:window", "Calendar Folder Deletion Failed")); 0090 0091 break; 0092 case Akonadi::StandardActionManager::SynchronizeCollections: 0093 mGenericManager->setActionText(Akonadi::StandardActionManager::SynchronizeCollections, ki18np("Update Folder", "Update %1 Folders")); 0094 mGenericManager->action(Akonadi::StandardActionManager::SynchronizeCollections) 0095 ->setWhatsThis(i18n("Update the content of the selected calendar folders.")); 0096 0097 break; 0098 case Akonadi::StandardActionManager::CutCollections: 0099 mGenericManager->setActionText(Akonadi::StandardActionManager::CutCollections, ki18np("Cut Folder", "Cut %1 Folders")); 0100 mGenericManager->action(Akonadi::StandardActionManager::CutCollections)->setWhatsThis(i18n("Cut the selected calendar folders from the calendar.")); 0101 break; 0102 case Akonadi::StandardActionManager::CollectionProperties: 0103 mGenericManager->action(Akonadi::StandardActionManager::CollectionProperties)->setText(i18n("Folder Properties...")); 0104 mGenericManager->action(Akonadi::StandardActionManager::CollectionProperties) 0105 ->setWhatsThis(i18n("Open a dialog to edit the properties of the selected calendar folder.")); 0106 mGenericManager->setContextText(StandardActionManager::CollectionProperties, 0107 StandardActionManager::DialogTitle, 0108 ki18nc("@title:window", "Properties of Calendar Folder %1")); 0109 break; 0110 case Akonadi::StandardActionManager::CopyItems: 0111 mGenericManager->setActionText(Akonadi::StandardActionManager::CopyItems, ki18np("Copy Event", "Copy %1 Events")); 0112 mGenericManager->action(Akonadi::StandardActionManager::CopyItems)->setWhatsThis(i18n("Copy the selected events to the clipboard.")); 0113 0114 break; 0115 case Akonadi::StandardActionManager::DeleteItems: 0116 mGenericManager->setActionText(Akonadi::StandardActionManager::DeleteItems, ki18np("Delete Event", "Delete %1 Events")); 0117 mGenericManager->action(Akonadi::StandardActionManager::DeleteItems)->setWhatsThis(i18n("Delete the selected events from the calendar.")); 0118 mGenericManager->setContextText(StandardActionManager::DeleteItems, 0119 StandardActionManager::MessageBoxText, 0120 ki18np("Do you really want to delete the selected event?", "Do you really want to delete %1 events?")); 0121 0122 mGenericManager->setContextText(StandardActionManager::DeleteItems, 0123 StandardActionManager::MessageBoxTitle, 0124 ki18ncp("@title:window", "Delete Event?", "Delete Events?")); 0125 0126 mGenericManager->setContextText(StandardActionManager::DeleteItems, StandardActionManager::ErrorMessageText, ki18n("Could not delete event: %1")); 0127 0128 mGenericManager->setContextText(StandardActionManager::DeleteItems, 0129 StandardActionManager::ErrorMessageTitle, 0130 i18nc("@title:window", "Event Deletion Failed")); 0131 break; 0132 0133 case Akonadi::StandardActionManager::CutItems: 0134 mGenericManager->setActionText(Akonadi::StandardActionManager::CutItems, ki18np("Cut Event", "Cut %1 Events")); 0135 mGenericManager->action(Akonadi::StandardActionManager::CutItems)->setWhatsThis(i18n("Cut the selected events from the calendar.")); 0136 break; 0137 case Akonadi::StandardActionManager::CreateResource: 0138 mGenericManager->action(Akonadi::StandardActionManager::CreateResource)->setText(i18n("Add &Calendar...")); 0139 mGenericManager->action(Akonadi::StandardActionManager::CreateResource) 0140 ->setWhatsThis(i18n("Add a new calendar<p>" 0141 "You will be presented with a dialog where you can select " 0142 "the type of the calendar that shall be added.</p>")); 0143 mGenericManager->setContextText(StandardActionManager::CreateResource, StandardActionManager::DialogTitle, i18nc("@title:window", "Add Calendar")); 0144 0145 mGenericManager->setContextText(StandardActionManager::CreateResource, 0146 StandardActionManager::ErrorMessageText, 0147 ki18n("Could not create calendar: %1")); 0148 0149 mGenericManager->setContextText(StandardActionManager::CreateResource, 0150 StandardActionManager::ErrorMessageTitle, 0151 i18nc("@title:window", "Calendar Creation Failed")); 0152 0153 break; 0154 case Akonadi::StandardActionManager::DeleteResources: 0155 0156 mGenericManager->setActionText(Akonadi::StandardActionManager::DeleteResources, ki18np("&Delete Calendar", "&Delete %1 Calendars")); 0157 mGenericManager->action(Akonadi::StandardActionManager::DeleteResources) 0158 ->setWhatsThis(i18n("Delete the selected calendars<p>" 0159 "The currently selected calendars will be deleted, " 0160 "along with all the events, todos and journals they contain.</p>")); 0161 mGenericManager->setContextText(StandardActionManager::DeleteResources, 0162 StandardActionManager::MessageBoxText, 0163 ki18np("Do you really want to delete this calendar?", "Do you really want to delete %1 calendars?")); 0164 0165 mGenericManager->setContextText(StandardActionManager::DeleteResources, 0166 StandardActionManager::MessageBoxTitle, 0167 ki18ncp("@title:window", "Delete Calendar?", "Delete Calendars?")); 0168 0169 break; 0170 case Akonadi::StandardActionManager::ResourceProperties: 0171 mGenericManager->action(Akonadi::StandardActionManager::ResourceProperties)->setText(i18n("Calendar Properties...")); 0172 mGenericManager->action(Akonadi::StandardActionManager::ResourceProperties) 0173 ->setWhatsThis(i18n("Open a dialog to edit properties of the selected calendar.")); 0174 break; 0175 case Akonadi::StandardActionManager::SynchronizeResources: 0176 0177 mGenericManager->setActionText(Akonadi::StandardActionManager::SynchronizeResources, ki18np("Update Calendar", "Update %1 Calendars")); 0178 mGenericManager->action(Akonadi::StandardActionManager::SynchronizeResources) 0179 ->setWhatsThis(i18n("Updates the content of all folders of the selected calendars.")); 0180 break; 0181 case Akonadi::StandardActionManager::CopyItemToMenu: 0182 mGenericManager->action(Akonadi::StandardActionManager::CopyItemToMenu)->setText(i18n("&Copy to Calendar")); 0183 mGenericManager->action(Akonadi::StandardActionManager::CopyItemToMenu)->setWhatsThis(i18n("Copy the selected event to a different calendar.")); 0184 break; 0185 case Akonadi::StandardActionManager::MoveItemToMenu: 0186 mGenericManager->action(Akonadi::StandardActionManager::MoveItemToMenu)->setText(i18n("&Move to Calendar")); 0187 mGenericManager->action(Akonadi::StandardActionManager::MoveItemToMenu)->setWhatsThis(i18n("Move the selected event to a different calendar.")); 0188 break; 0189 case StandardActionManager::Paste: 0190 mGenericManager->setContextText(StandardActionManager::Paste, StandardActionManager::ErrorMessageText, ki18n("Could not paste event: %1")); 0191 0192 mGenericManager->setContextText(StandardActionManager::Paste, StandardActionManager::ErrorMessageTitle, i18nc("@title:window", "Paste Failed")); 0193 break; 0194 case Akonadi::StandardActionManager::SynchronizeCollectionTree: 0195 mGenericManager->action(Akonadi::StandardActionManager::SynchronizeCollectionTree)->setText(i18n("Update Available Calendars")); 0196 mGenericManager->action(Akonadi::StandardActionManager::SynchronizeCollectionTree)->setWhatsThis(i18n("Updates the tree of available calendars.")); 0197 0198 break; 0199 default: 0200 break; 0201 } 0202 } 0203 0204 void updateGenericAllActions() 0205 { 0206 updateGenericAction(StandardActionManager::CreateCollection); 0207 updateGenericAction(StandardActionManager::CopyCollections); 0208 updateGenericAction(StandardActionManager::DeleteCollections); 0209 updateGenericAction(StandardActionManager::SynchronizeCollections); 0210 updateGenericAction(StandardActionManager::CollectionProperties); 0211 updateGenericAction(StandardActionManager::CopyItems); 0212 updateGenericAction(StandardActionManager::Paste); 0213 updateGenericAction(StandardActionManager::DeleteItems); 0214 updateGenericAction(StandardActionManager::ManageLocalSubscriptions); 0215 updateGenericAction(StandardActionManager::AddToFavoriteCollections); 0216 updateGenericAction(StandardActionManager::RemoveFromFavoriteCollections); 0217 updateGenericAction(StandardActionManager::RenameFavoriteCollection); 0218 updateGenericAction(StandardActionManager::CopyCollectionToMenu); 0219 updateGenericAction(StandardActionManager::CopyItemToMenu); 0220 updateGenericAction(StandardActionManager::MoveItemToMenu); 0221 updateGenericAction(StandardActionManager::MoveCollectionToMenu); 0222 updateGenericAction(StandardActionManager::CutItems); 0223 updateGenericAction(StandardActionManager::CutCollections); 0224 updateGenericAction(StandardActionManager::CreateResource); 0225 updateGenericAction(StandardActionManager::DeleteResources); 0226 updateGenericAction(StandardActionManager::ResourceProperties); 0227 updateGenericAction(StandardActionManager::SynchronizeResources); 0228 updateGenericAction(StandardActionManager::ToggleWorkOffline); 0229 updateGenericAction(StandardActionManager::CopyCollectionToDialog); 0230 updateGenericAction(StandardActionManager::MoveCollectionToDialog); 0231 updateGenericAction(StandardActionManager::CopyItemToDialog); 0232 updateGenericAction(StandardActionManager::MoveItemToDialog); 0233 updateGenericAction(StandardActionManager::SynchronizeCollectionsRecursive); 0234 updateGenericAction(StandardActionManager::MoveCollectionsToTrash); 0235 updateGenericAction(StandardActionManager::MoveItemsToTrash); 0236 updateGenericAction(StandardActionManager::RestoreCollectionsFromTrash); 0237 updateGenericAction(StandardActionManager::RestoreItemsFromTrash); 0238 updateGenericAction(StandardActionManager::MoveToTrashRestoreCollection); 0239 updateGenericAction(StandardActionManager::MoveToTrashRestoreCollectionAlternative); 0240 updateGenericAction(StandardActionManager::MoveToTrashRestoreItem); 0241 updateGenericAction(StandardActionManager::MoveToTrashRestoreItemAlternative); 0242 updateGenericAction(StandardActionManager::SynchronizeFavoriteCollections); 0243 updateGenericAction(StandardActionManager::SynchronizeCollectionTree); 0244 } 0245 0246 static bool hasWritableCollection(const QModelIndex &index, const QString &mimeType) 0247 { 0248 const auto collection = index.data(Akonadi::EntityTreeModel::CollectionRole).value<Akonadi::Collection>(); 0249 if (collection.isValid()) { 0250 if (collection.contentMimeTypes().contains(mimeType) && (collection.rights() & Akonadi::Collection::CanCreateItem)) { 0251 return true; 0252 } 0253 } 0254 0255 const QAbstractItemModel *model = index.model(); 0256 if (!model) { 0257 return false; 0258 } 0259 0260 for (int row = 0; row < model->rowCount(index); ++row) { 0261 if (hasWritableCollection(model->index(row, 0, index), mimeType)) { 0262 return true; 0263 } 0264 } 0265 0266 return false; 0267 } 0268 0269 [[nodiscard]] bool hasWritableCollection(const QString &mimeType) const 0270 { 0271 if (!mCollectionSelectionModel) { 0272 return false; 0273 } 0274 0275 const QAbstractItemModel *collectionModel = mCollectionSelectionModel->model(); 0276 for (int row = 0; row < collectionModel->rowCount(); ++row) { 0277 if (hasWritableCollection(collectionModel->index(row, 0, QModelIndex()), mimeType)) { 0278 return true; 0279 } 0280 } 0281 0282 return false; 0283 } 0284 0285 void updateActions() 0286 { 0287 if (!mItemSelectionModel) { 0288 return; 0289 } 0290 0291 // update action labels 0292 const int itemCount = mItemSelectionModel->selectedRows().count(); 0293 if (itemCount == 1) { 0294 const QModelIndex index = mItemSelectionModel->selectedRows().at(0); 0295 if (index.isValid()) { 0296 const QString mimeType = index.data(EntityTreeModel::MimeTypeRole).toString(); 0297 if (mimeType == KCalendarCore::Event::eventMimeType()) { 0298 if (mGenericManager->action(Akonadi::StandardActionManager::CopyItems)) { 0299 mGenericManager->setActionText(Akonadi::StandardActionManager::CopyItems, ki18np("Copy Event", "Copy %1 Events")); 0300 } 0301 QAction *act = mGenericManager->action(Akonadi::StandardActionManager::CopyItemToMenu); 0302 if (act) { 0303 act->setText(i18n("Copy Event To")); 0304 } 0305 act = mGenericManager->action(Akonadi::StandardActionManager::CopyItemToDialog); 0306 if (act) { 0307 act->setText(i18n("Copy Event To")); 0308 } 0309 if (mGenericManager->action(Akonadi::StandardActionManager::DeleteItems)) { 0310 mGenericManager->setActionText(Akonadi::StandardActionManager::DeleteItems, ki18np("Delete Event", "Delete %1 Events")); 0311 } 0312 if (mGenericManager->action(Akonadi::StandardActionManager::CutItems)) { 0313 mGenericManager->setActionText(Akonadi::StandardActionManager::CutItems, ki18np("Cut Event", "Cut %1 Events")); 0314 } 0315 act = mGenericManager->action(Akonadi::StandardActionManager::MoveItemToMenu); 0316 if (act) { 0317 act->setText(i18n("Move Event To")); 0318 } 0319 act = mGenericManager->action(Akonadi::StandardActionManager::MoveItemToDialog); 0320 if (act) { 0321 act->setText(i18n("Move Event To")); 0322 } 0323 act = mActions.value(StandardCalendarActionManager::EditIncidence); 0324 if (act) { 0325 act->setText(i18n("Edit Event...")); 0326 } 0327 } else if (mimeType == KCalendarCore::Todo::todoMimeType()) { 0328 if (mGenericManager->action(Akonadi::StandardActionManager::CopyItems)) { 0329 mGenericManager->setActionText(Akonadi::StandardActionManager::CopyItems, ki18np("Copy To-do", "Copy %1 To-dos")); 0330 } 0331 QAction *act = mGenericManager->action(Akonadi::StandardActionManager::CopyItemToMenu); 0332 if (act) { 0333 act->setText(i18n("Copy To-do To")); 0334 } 0335 act = mGenericManager->action(Akonadi::StandardActionManager::CopyItemToDialog); 0336 if (act) { 0337 act->setText(i18n("Copy To-do To")); 0338 } 0339 if (mGenericManager->action(Akonadi::StandardActionManager::DeleteItems)) { 0340 mGenericManager->setActionText(Akonadi::StandardActionManager::DeleteItems, ki18np("Delete To-do", "Delete %1 To-dos")); 0341 } 0342 if (mGenericManager->action(Akonadi::StandardActionManager::CutItems)) { 0343 mGenericManager->setActionText(Akonadi::StandardActionManager::CutItems, ki18np("Cut To-do", "Cut %1 To-dos")); 0344 } 0345 act = mGenericManager->action(Akonadi::StandardActionManager::MoveItemToMenu); 0346 if (act) { 0347 act->setText(i18n("Move To-do To")); 0348 } 0349 act = mGenericManager->action(Akonadi::StandardActionManager::MoveItemToDialog); 0350 if (act) { 0351 act->setText(i18n("Move To-do To")); 0352 } 0353 act = mActions.value(StandardCalendarActionManager::EditIncidence); 0354 if (act) { 0355 act->setText(i18n("Edit To-do...")); 0356 } 0357 } else if (mimeType == KCalendarCore::Journal::journalMimeType()) { 0358 if (mGenericManager->action(Akonadi::StandardActionManager::CopyItems)) { 0359 mGenericManager->setActionText(Akonadi::StandardActionManager::CopyItems, ki18np("Copy Journal", "Copy %1 Journals")); 0360 } 0361 QAction *act = mGenericManager->action(Akonadi::StandardActionManager::CopyItemToMenu); 0362 if (act) { 0363 act->setText(i18n("Copy Journal To")); 0364 } 0365 act = mGenericManager->action(Akonadi::StandardActionManager::CopyItemToDialog); 0366 if (act) { 0367 act->setText(i18n("Copy Journal To")); 0368 } 0369 if (mGenericManager->action(Akonadi::StandardActionManager::DeleteItems)) { 0370 mGenericManager->setActionText(Akonadi::StandardActionManager::DeleteItems, ki18np("Delete Journal", "Delete %1 Journals")); 0371 } 0372 if (mGenericManager->action(Akonadi::StandardActionManager::CutItems)) { 0373 mGenericManager->setActionText(Akonadi::StandardActionManager::CutItems, ki18np("Cut Journal", "Cut %1 Journals")); 0374 } 0375 act = mGenericManager->action(Akonadi::StandardActionManager::MoveItemToMenu); 0376 if (act) { 0377 act->setText(i18n("Move Journal To")); 0378 } 0379 act = mGenericManager->action(Akonadi::StandardActionManager::MoveItemToDialog); 0380 if (act) { 0381 act->setText(i18n("Move Journal To")); 0382 } 0383 act = mActions.value(StandardCalendarActionManager::EditIncidence); 0384 if (act) { 0385 act->setText(i18n("Edit Journal...")); 0386 } 0387 } 0388 } 0389 } 0390 0391 // update action states 0392 QAction *act = mActions.value(StandardCalendarActionManager::CreateEvent); 0393 if (act) { 0394 act->setEnabled(hasWritableCollection(KCalendarCore::Event::eventMimeType())); 0395 } 0396 act = mActions.value(StandardCalendarActionManager::CreateTodo); 0397 if (act) { 0398 act->setEnabled(hasWritableCollection(KCalendarCore::Todo::todoMimeType())); 0399 } 0400 act = mActions.value(StandardCalendarActionManager::CreateJournal); 0401 if (act) { 0402 act->setEnabled(hasWritableCollection(KCalendarCore::Journal::journalMimeType())); 0403 } 0404 0405 act = mActions.value(StandardCalendarActionManager::EditIncidence); 0406 if (act) { 0407 bool canEditItem = true; 0408 0409 // only one selected item can be edited 0410 canEditItem = canEditItem && (itemCount == 1); 0411 0412 // check whether parent collection allows changing the item 0413 const QModelIndexList rows = mItemSelectionModel->selectedRows(); 0414 if (rows.count() == 1) { 0415 const QModelIndex index = rows.first(); 0416 const auto parentCollection = index.data(EntityTreeModel::ParentCollectionRole).value<Collection>(); 0417 if (parentCollection.isValid()) { 0418 canEditItem = canEditItem && (parentCollection.rights() & Collection::CanChangeItem); 0419 } 0420 } 0421 0422 act->setEnabled(canEditItem); 0423 } 0424 0425 act = mActions.value(StandardCalendarActionManager::CreateSubTodo); 0426 if (act) { 0427 act->setEnabled(false); 0428 } 0429 0430 if (itemCount == 1) { 0431 const Akonadi::Item item = mGenericManager->selectedItems().at(0); 0432 if (item.isValid() && item.hasPayload<KCalendarCore::Todo::Ptr>()) { 0433 if (QAction *actSubTodo = mActions.value(StandardCalendarActionManager::CreateSubTodo)) { 0434 actSubTodo->setEnabled(hasWritableCollection(KCalendarCore::Todo::todoMimeType())); 0435 } 0436 } 0437 } 0438 0439 Q_EMIT mParent->actionStateUpdated(); 0440 } 0441 0442 void slotCreateEvent() 0443 { 0444 // dummy as long as there are no editors available in kdepimlibs/ 0445 } 0446 0447 void slotCreateTodo() 0448 { 0449 // dummy as long as there are no editors available in kdepimlibs/ 0450 } 0451 0452 void slotCreateSubTodo() 0453 { 0454 // dummy as long as there are no editors available in kdepimlibs/ 0455 } 0456 0457 void slotCreateJournal() 0458 { 0459 // dummy as long as there are no editors available in kdepimlibs/ 0460 } 0461 0462 void slotEditIncidence() 0463 { 0464 // dummy as long as there are no editors available in kdepimlibs/ 0465 } 0466 0467 KActionCollection *mActionCollection = nullptr; 0468 QWidget *mParentWidget = nullptr; 0469 StandardActionManager *mGenericManager = nullptr; 0470 QItemSelectionModel *mCollectionSelectionModel = nullptr; 0471 QItemSelectionModel *mItemSelectionModel = nullptr; 0472 QHash<StandardCalendarActionManager::Type, QAction *> mActions; 0473 QSet<StandardCalendarActionManager::Type> mInterceptedActions; 0474 StandardCalendarActionManager *const mParent; 0475 }; 0476 0477 Akonadi::StandardCalendarActionManager::StandardCalendarActionManager(KActionCollection *actionCollection, QWidget *parent) 0478 : QObject(parent) 0479 , d(new StandardCalendarActionManagerPrivate(actionCollection, parent, this)) 0480 { 0481 } 0482 0483 StandardCalendarActionManager::~StandardCalendarActionManager() = default; 0484 0485 void StandardCalendarActionManager::setCollectionSelectionModel(QItemSelectionModel *selectionModel) 0486 { 0487 d->mCollectionSelectionModel = selectionModel; 0488 d->mGenericManager->setCollectionSelectionModel(selectionModel); 0489 0490 connect(selectionModel->model(), &QAbstractItemModel::rowsInserted, this, [this]() { 0491 d->updateActions(); 0492 }); 0493 connect(selectionModel->model(), &QAbstractItemModel::rowsRemoved, this, [this]() { 0494 d->updateActions(); 0495 }); 0496 connect(selectionModel, &QItemSelectionModel::selectionChanged, this, [this]() { 0497 d->updateActions(); 0498 }); 0499 d->updateActions(); 0500 } 0501 0502 void StandardCalendarActionManager::setItemSelectionModel(QItemSelectionModel *selectionModel) 0503 { 0504 d->mItemSelectionModel = selectionModel; 0505 d->mGenericManager->setItemSelectionModel(selectionModel); 0506 0507 connect(selectionModel, &QItemSelectionModel::selectionChanged, this, [this]() { 0508 d->updateActions(); 0509 }); 0510 0511 d->updateActions(); 0512 } 0513 0514 QAction *StandardCalendarActionManager::createAction(StandardCalendarActionManager::Type type) 0515 { 0516 QAction *action = d->mActions.value(type); 0517 if (action) { 0518 return action; 0519 } 0520 0521 switch (type) { 0522 case CreateEvent: 0523 action = new QAction(d->mParentWidget); 0524 action->setIcon(QIcon::fromTheme(QStringLiteral("appointment-new"))); 0525 action->setText(i18n("New E&vent...")); 0526 action->setWhatsThis(i18n("Create a new event")); 0527 d->mActions.insert(CreateEvent, action); 0528 d->mActionCollection->addAction(QStringLiteral("akonadi_event_create"), action); 0529 connect(action, &QAction::triggered, this, [this]() { 0530 d->slotCreateEvent(); 0531 }); 0532 break; 0533 case CreateTodo: 0534 action = new QAction(d->mParentWidget); 0535 action->setIcon(QIcon::fromTheme(QStringLiteral("task-new"))); 0536 action->setText(i18n("New &To-do...")); 0537 action->setWhatsThis(i18n("Create a new To-do")); 0538 d->mActions.insert(CreateTodo, action); 0539 d->mActionCollection->addAction(QStringLiteral("akonadi_todo_create"), action); 0540 connect(action, &QAction::triggered, this, [this]() { 0541 d->slotCreateTodo(); 0542 }); 0543 break; 0544 case CreateSubTodo: 0545 action = new QAction(d->mParentWidget); 0546 action->setText(i18n("New Su&b-to-do...")); 0547 action->setWhatsThis(i18n("Create a new Sub-to-do")); 0548 d->mActions.insert(CreateSubTodo, action); 0549 d->mActionCollection->addAction(QStringLiteral("akonadi_subtodo_create"), action); 0550 connect(action, &QAction::triggered, this, [this]() { 0551 d->slotCreateSubTodo(); 0552 }); 0553 break; 0554 case CreateJournal: 0555 action = new QAction(d->mParentWidget); 0556 action->setIcon(QIcon::fromTheme(QStringLiteral("journal-new"))); 0557 action->setText(i18n("New &Journal...")); 0558 action->setWhatsThis(i18n("Create a new Journal")); 0559 d->mActions.insert(CreateJournal, action); 0560 d->mActionCollection->addAction(QStringLiteral("akonadi_journal_create"), action); 0561 connect(action, &QAction::triggered, this, [this]() { 0562 d->slotCreateJournal(); 0563 }); 0564 break; 0565 case EditIncidence: 0566 action = new QAction(d->mParentWidget); 0567 action->setText(i18n("&Edit...")); 0568 action->setWhatsThis(i18n("Edit the selected incidence.")); 0569 d->mActions.insert(EditIncidence, action); 0570 d->mActionCollection->addAction(QStringLiteral("akonadi_incidence_edit"), action); 0571 connect(action, &QAction::triggered, this, [this]() { 0572 d->slotEditIncidence(); 0573 }); 0574 break; 0575 default: 0576 Q_ASSERT(false); // should never happen 0577 break; 0578 } 0579 0580 return action; 0581 } 0582 0583 QAction *StandardCalendarActionManager::createAction(StandardActionManager::Type type) 0584 { 0585 QAction *act = d->mGenericManager->action(type); 0586 if (!act) { 0587 act = d->mGenericManager->createAction(type); 0588 } 0589 d->updateGenericAction(type); 0590 return act; 0591 } 0592 0593 void StandardCalendarActionManager::createAllActions() 0594 { 0595 createAction(CreateEvent); 0596 createAction(CreateTodo); 0597 createAction(CreateSubTodo); 0598 createAction(CreateJournal); 0599 createAction(EditIncidence); 0600 0601 d->mGenericManager->createAllActions(); 0602 d->updateGenericAllActions(); 0603 d->updateActions(); 0604 } 0605 0606 QAction *StandardCalendarActionManager::action(StandardCalendarActionManager::Type type) const 0607 { 0608 return d->mActions.value(type); 0609 } 0610 0611 QAction *StandardCalendarActionManager::action(StandardActionManager::Type type) const 0612 { 0613 return d->mGenericManager->action(type); 0614 } 0615 0616 void StandardCalendarActionManager::setActionText(StandardActionManager::Type type, const KLocalizedString &text) 0617 { 0618 d->mGenericManager->setActionText(type, text); 0619 } 0620 0621 void StandardCalendarActionManager::interceptAction(StandardCalendarActionManager::Type type, bool intercept) 0622 { 0623 if (intercept) { 0624 d->mInterceptedActions.insert(type); 0625 } else { 0626 d->mInterceptedActions.remove(type); 0627 } 0628 } 0629 0630 void StandardCalendarActionManager::interceptAction(StandardActionManager::Type type, bool intercept) 0631 { 0632 d->mGenericManager->interceptAction(type, intercept); 0633 } 0634 0635 Akonadi::Collection::List StandardCalendarActionManager::selectedCollections() const 0636 { 0637 return d->mGenericManager->selectedCollections(); 0638 } 0639 0640 Akonadi::Item::List StandardCalendarActionManager::selectedItems() const 0641 { 0642 return d->mGenericManager->selectedItems(); 0643 } 0644 0645 void StandardCalendarActionManager::setContextText(StandardActionManager::Type type, StandardActionManager::TextContext context, const QString &text) 0646 { 0647 d->mGenericManager->setContextText(type, context, text); 0648 } 0649 0650 void StandardCalendarActionManager::setContextText(StandardActionManager::Type type, StandardActionManager::TextContext context, const KLocalizedString &text) 0651 { 0652 d->mGenericManager->setContextText(type, context, text); 0653 } 0654 0655 void StandardCalendarActionManager::setCollectionPropertiesPageNames(const QStringList &names) 0656 { 0657 d->mGenericManager->setCollectionPropertiesPageNames(names); 0658 } 0659 0660 #include "moc_standardcalendaractionmanager.cpp"