File indexing completed on 2024-05-12 05:21:24
0001 /* 0002 This file is part of KOrganizer. 0003 0004 SPDX-FileCopyrightText: 2001 Cornelius Schumacher <schumacher@kde.org> 0005 SPDX-FileCopyrightText: 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com> 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0 0008 */ 0009 0010 #include "kodialogmanager.h" 0011 #include "calendarview.h" 0012 #include "dialog/filtereditdialog.h" 0013 #include "dialog/searchdialog.h" 0014 #include "prefs/koprefs.h" 0015 0016 #include <CalendarSupport/ArchiveDialog> 0017 #include <PimCommon/PimUtil> 0018 0019 #include <IncidenceEditor/IncidenceDialog> 0020 #include <IncidenceEditor/IncidenceDialogFactory> 0021 0022 #include <Akonadi/CalendarUtils> 0023 #include <Akonadi/Item> 0024 #include <Akonadi/TagManagementDialog> 0025 0026 #include <KCalendarCore/Visitor> 0027 0028 #include <KCMultiDialog> 0029 #include <KPluginMetaData> 0030 #include <QPushButton> 0031 0032 using namespace KOrg; 0033 0034 // FIXME: Handle KOEventViewerDialogs in dialog manager. 0035 0036 class KODialogManager::DialogManagerVisitor : public KCalendarCore::Visitor 0037 { 0038 public: 0039 DialogManagerVisitor() = default; 0040 0041 bool act(KCalendarCore::IncidenceBase::Ptr &incidence, KODialogManager *manager) 0042 { 0043 mDialogManager = manager; 0044 return incidence->accept(*this, incidence); 0045 } 0046 0047 protected: 0048 KODialogManager *mDialogManager = nullptr; 0049 }; 0050 0051 KODialogManager::KODialogManager(CalendarView *mainView) 0052 : QObject() 0053 , mMainView(mainView) 0054 { 0055 } 0056 0057 KODialogManager::~KODialogManager() 0058 { 0059 delete mOptionsDialog; 0060 delete mSearchDialog; 0061 delete mArchiveDialog; 0062 delete mFilterEditDialog; 0063 delete mCategoryEditDialog; 0064 } 0065 0066 void KODialogManager::showOptionsDialog() 0067 { 0068 if (!mOptionsDialog) { 0069 mOptionsDialog = new KCMultiDialog(mMainView); 0070 connect(mOptionsDialog, qOverload<>(&KCMultiDialog::configCommitted), mMainView, &CalendarView::updateConfig); 0071 const QList<KPluginMetaData> availablePlugins = KPluginMetaData::findPlugins(QStringLiteral("pim6/kcms/korganizer")); 0072 for (const KPluginMetaData &metaData : availablePlugins) { 0073 mOptionsDialog->addModule(metaData); 0074 } 0075 } 0076 0077 mOptionsDialog->show(); 0078 mOptionsDialog->raise(); 0079 } 0080 0081 void KODialogManager::showCategoryEditDialog() 0082 { 0083 createCategoryEditor(); 0084 mCategoryEditDialog->exec(); 0085 } 0086 0087 void KODialogManager::showSearchDialog() 0088 { 0089 if (!mSearchDialog) { 0090 mSearchDialog = new SearchDialog(mMainView); 0091 connect(mMainView->calendar().data(), &Akonadi::ETMCalendar::calendarChanged, mSearchDialog, &SearchDialog::updateView); 0092 connect(mSearchDialog, &SearchDialog::showIncidenceSignal, mMainView, qOverload<const Akonadi::Item &>(&CalendarView::showIncidence)); 0093 connect(mSearchDialog, &SearchDialog::editIncidenceSignal, mMainView, [this](const Akonadi::Item &i) { 0094 mMainView->editIncidence(i); 0095 }); 0096 connect(mSearchDialog, &SearchDialog::deleteIncidenceSignal, mMainView, [this](const Akonadi::Item &i) { 0097 mMainView->deleteIncidence(i, false); 0098 }); 0099 } 0100 // make sure the widget is on top again 0101 mSearchDialog->show(); 0102 mSearchDialog->raise(); 0103 } 0104 0105 void KODialogManager::showArchiveDialog() 0106 { 0107 if (!mArchiveDialog) { 0108 mArchiveDialog = new CalendarSupport::ArchiveDialog(mMainView->calendar(), mMainView->incidenceChanger()); 0109 connect(mArchiveDialog, &CalendarSupport::ArchiveDialog::eventsDeleted, mMainView, qOverload<>(&CalendarView::updateView)); 0110 connect(mArchiveDialog, &CalendarSupport::ArchiveDialog::autoArchivingSettingsModified, mMainView, &CalendarView::slotAutoArchivingSettingsModified); 0111 } 0112 mArchiveDialog->show(); 0113 mArchiveDialog->raise(); 0114 0115 // Workaround. 0116 QApplication::restoreOverrideCursor(); 0117 } 0118 0119 void KODialogManager::showFilterEditDialog(QList<KCalendarCore::CalFilter *> *filters) 0120 { 0121 createCategoryEditor(); 0122 if (!mFilterEditDialog) { 0123 mFilterEditDialog = new FilterEditDialog(filters, mMainView); 0124 connect(mFilterEditDialog, &FilterEditDialog::filterChanged, mMainView, &CalendarView::updateFilter); 0125 connect(mFilterEditDialog, &FilterEditDialog::editCategories, mCategoryEditDialog.data(), &QWidget::show); 0126 } 0127 mFilterEditDialog->show(); 0128 mFilterEditDialog->raise(); 0129 } 0130 0131 IncidenceEditorNG::IncidenceDialog *KODialogManager::createDialog(const Akonadi::Item &item) 0132 { 0133 const KCalendarCore::Incidence::Ptr incidence = Akonadi::CalendarUtils::incidence(item); 0134 if (!incidence) { 0135 return nullptr; 0136 } 0137 0138 IncidenceEditorNG::IncidenceDialog *dialog = IncidenceEditorNG::IncidenceDialogFactory::create( 0139 /*needs initial saving=*/false, 0140 incidence->type(), 0141 mMainView->incidenceChanger(), 0142 mMainView); 0143 0144 return dialog; 0145 } 0146 0147 void KODialogManager::connectTypeAhead(IncidenceEditorNG::IncidenceDialog *dialog, KOEventView *view) 0148 { 0149 if (dialog && view) { 0150 view->setTypeAheadReceiver(dialog->typeAheadReceiver()); 0151 } 0152 } 0153 0154 void KODialogManager::updateSearchDialog() 0155 { 0156 if (mSearchDialog) { 0157 mSearchDialog->updateView(); 0158 } 0159 } 0160 0161 void KODialogManager::createCategoryEditor() 0162 { 0163 if (!mCategoryEditDialog) { 0164 mCategoryEditDialog = new Akonadi::TagManagementDialog(mMainView); 0165 QDialogButtonBox *buttons = mCategoryEditDialog->buttons(); 0166 if (buttons) { 0167 buttons->setStandardButtons(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help); 0168 connect(buttons->button(QDialogButtonBox::Help), &QPushButton::clicked, this, &KODialogManager::slotHelp); 0169 } 0170 mCategoryEditDialog->setModal(true); 0171 } 0172 } 0173 0174 void KODialogManager::slotHelp() 0175 { 0176 PimCommon::Util::invokeHelp(QStringLiteral("korganizer/categories-view.html")); 0177 } 0178 0179 #include "moc_kodialogmanager.cpp"