File indexing completed on 2024-05-12 05:21:25
0001 /* 0002 This file is part of KOrganizer. 0003 0004 SPDX-FileCopyrightText: 2001, 2003 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 "koviewmanager.h" 0011 #include "actionmanager.h" 0012 #include "akonadicollectionview.h" 0013 #include "calendarview.h" 0014 #include "datenavigator.h" 0015 #include "koglobals.h" 0016 #include "mainwindow.h" 0017 #include "prefs/koprefs.h" 0018 #include "views/agendaview/koagendaview.h" 0019 #include "views/journalview/kojournalview.h" 0020 #include "views/listview/kolistview.h" 0021 #include "views/monthview/monthview.h" 0022 #include "views/multiagendaview/multiagendaview.h" 0023 #include "views/timelineview/kotimelineview.h" 0024 #include "views/todoview/kotodoview.h" 0025 #include "views/whatsnextview/kowhatsnextview.h" 0026 #include "widgets/navigatorbar.h" 0027 0028 #include <Akonadi/EntityTreeModel> 0029 0030 #include <KActionCollection> 0031 #include <KMessageBox> 0032 #include <QTabWidget> 0033 0034 #include <KSharedConfig> 0035 #include <QAction> 0036 #include <QStackedWidget> 0037 0038 KOViewManager::KOViewManager(CalendarView *mainView) 0039 : QObject() 0040 , mMainView(mainView) 0041 { 0042 connect(mainView, &CalendarView::calendarAdded, this, &KOViewManager::addCalendar); 0043 connect(mainView, &CalendarView::calendarRemoved, this, &KOViewManager::removeCalendar); 0044 } 0045 0046 KOViewManager::~KOViewManager() = default; 0047 0048 KOrg::BaseView *KOViewManager::currentView() 0049 { 0050 return mCurrentView; 0051 } 0052 0053 void KOViewManager::readSettings(KConfig *config) 0054 { 0055 KConfigGroup generalConfig(config, QStringLiteral("General")); 0056 const QString view = generalConfig.readEntry("Current View"); 0057 0058 if (view == QLatin1StringView("WhatsNext")) { 0059 showWhatsNextView(); 0060 } else if (view == QLatin1StringView("OldMonth")) { 0061 // the oldmonth view is gone, so we assume the new month view 0062 showMonthView(); 0063 } else if (view == QLatin1StringView("List")) { 0064 showListView(); 0065 mListView->readSettings(config); 0066 } else if (view == QLatin1StringView("Journal")) { 0067 showJournalView(); 0068 } else if (view == QLatin1StringView("Todo")) { 0069 showTodoView(); 0070 } else if (view == QLatin1StringView("Timeline")) { 0071 showTimeLineView(); 0072 } else if (view == QLatin1StringView("Month")) { 0073 showMonthView(); 0074 } else { 0075 showAgendaView(); 0076 } 0077 0078 mRangeMode = RangeMode(generalConfig.readEntry("Range Mode", int(OTHER_RANGE))); 0079 0080 switch (mRangeMode) { 0081 case WORK_WEEK_RANGE: 0082 selectWorkWeek(); 0083 break; 0084 case WEEK_RANGE: 0085 selectWeek(); 0086 break; 0087 case NEXTX_RANGE: 0088 selectNextX(); 0089 break; 0090 case DAY_RANGE: 0091 selectDay(); 0092 break; 0093 case NO_RANGE: 0094 default: 0095 // Someone has been playing with the config file. 0096 mRangeMode = OTHER_RANGE; 0097 } 0098 } 0099 0100 void KOViewManager::writeSettings(KConfig *config) 0101 { 0102 KConfigGroup generalConfig(config, QStringLiteral("General")); 0103 QString view; 0104 if (mCurrentView == mWhatsNextView) { 0105 view = QStringLiteral("WhatsNext"); 0106 } else if (mCurrentView == mListView) { 0107 view = QStringLiteral("List"); 0108 } else if (mCurrentView == mJournalView) { 0109 view = QStringLiteral("Journal"); 0110 } else if (mCurrentView == mTodoView) { 0111 view = QStringLiteral("Todo"); 0112 } else if (mCurrentView == mTimelineView) { 0113 view = QStringLiteral("Timeline"); 0114 } else if (mCurrentView == mMonthView) { 0115 view = QStringLiteral("Month"); 0116 } else { 0117 view = QStringLiteral("Agenda"); 0118 } 0119 0120 generalConfig.writeEntry("Current View", view); 0121 0122 if (mAgendaView) { 0123 mAgendaView->writeSettings(config); 0124 } 0125 if (mListView) { 0126 mListView->writeSettings(config); 0127 } 0128 if (mTodoView) { 0129 mTodoView->saveLayout(config, QStringLiteral("Todo View")); 0130 } 0131 0132 // write out custom view configuration 0133 for (KOrg::BaseView *const baseView : std::as_const(mViews)) { 0134 KConfigGroup group = KSharedConfig::openConfig()->group(QLatin1StringView(baseView->identifier())); 0135 baseView->saveConfig(group); 0136 } 0137 0138 generalConfig.writeEntry("Range Mode", int(mRangeMode)); 0139 } 0140 0141 void KOViewManager::showView(KOrg::BaseView *view) 0142 { 0143 if (view == mCurrentView) { 0144 return; 0145 } 0146 0147 mCurrentView = view; 0148 mMainView->updateHighlightModes(); 0149 0150 if (mCurrentView && mCurrentView->isEventView()) { 0151 mLastEventView = mCurrentView; 0152 } 0153 0154 if (mAgendaView) { 0155 mAgendaView->deleteSelectedDateTime(); 0156 } 0157 0158 raiseCurrentView(); 0159 mMainView->processIncidenceSelection(Akonadi::Item(), QDate()); 0160 mMainView->updateView(); 0161 KOrg::MainWindow *w = ActionManager::findInstance(QUrl()); 0162 0163 if (w) { 0164 KActionCollection *ac = w->getActionCollection(); 0165 if (ac) { 0166 if (QAction *action = ac->action(QStringLiteral("configure_view"))) { 0167 action->setEnabled(view->hasConfigurationDialog()); 0168 } 0169 0170 const QStringList zoomActions = QStringList() << QStringLiteral("zoom_in_horizontally") << QStringLiteral("zoom_out_horizontally") 0171 << QStringLiteral("zoom_in_vertically") << QStringLiteral("zoom_out_vertically"); 0172 const QStringList rangeActions = QStringList() 0173 << QStringLiteral("select_workweek") << QStringLiteral("select_week") << QStringLiteral("select_day") << QStringLiteral("select_nextx"); 0174 0175 for (int i = 0; i < zoomActions.size(); ++i) { 0176 if (QAction *action = ac->action(zoomActions[i])) { 0177 action->setEnabled(view->supportsZoom()); 0178 } 0179 } 0180 0181 for (int i = 0; i < rangeActions.size(); ++i) { 0182 if (QAction *action = ac->action(rangeActions[i])) { 0183 action->setEnabled(view->supportsDateRangeSelection()); 0184 } 0185 } 0186 } 0187 } 0188 } 0189 0190 void KOViewManager::goMenu(bool enable) 0191 { 0192 KOrg::MainWindow *w = ActionManager::findInstance(QUrl()); 0193 if (w) { 0194 KActionCollection *ac = w->getActionCollection(); 0195 if (ac) { 0196 QAction *action = ac->action(QStringLiteral("go_today")); 0197 if (action) { 0198 action->setEnabled(enable); 0199 } 0200 action = ac->action(QStringLiteral("go_previous")); 0201 if (action) { 0202 action->setEnabled(enable); 0203 } 0204 action = ac->action(QStringLiteral("go_next")); 0205 if (action) { 0206 action->setEnabled(enable); 0207 } 0208 } 0209 } 0210 } 0211 0212 void KOViewManager::raiseCurrentView() 0213 { 0214 if (mCurrentView && mCurrentView->usesFullWindow()) { 0215 mMainView->showLeftFrame(false); 0216 if (mCurrentView == mTodoView) { 0217 mMainView->navigatorBar()->hide(); 0218 } else { 0219 mMainView->navigatorBar()->show(); 0220 } 0221 } else { 0222 mMainView->showLeftFrame(true); 0223 mMainView->navigatorBar()->hide(); 0224 } 0225 mMainView->viewStack()->setCurrentWidget(widgetForView(mCurrentView)); 0226 } 0227 0228 void KOViewManager::updateView() 0229 { 0230 if (mCurrentView) { 0231 mCurrentView->updateView(); 0232 } 0233 } 0234 0235 void KOViewManager::updateView(QDate start, QDate end, QDate preferredMonth) 0236 { 0237 if (mCurrentView && mCurrentView != mTodoView) { 0238 mCurrentView->setDateRange(QDateTime(start.startOfDay()), QDateTime(end.startOfDay()), preferredMonth); 0239 } else if (mTodoView) { 0240 mTodoView->updateView(); 0241 } 0242 } 0243 0244 void KOViewManager::connectView(KOrg::BaseView *view) 0245 { 0246 if (!view) { 0247 return; 0248 } 0249 0250 if (view->isEventView()) { 0251 connect(static_cast<KOEventView *>(view), &KOEventView::datesSelected, this, &KOViewManager::datesSelected); 0252 } 0253 0254 // selecting an incidence 0255 connect(view, &BaseView::incidenceSelected, mMainView, &CalendarView::processMainViewSelection); 0256 0257 // showing/editing/deleting an incidence. The calendar view takes care of the action. 0258 connect(view, &BaseView::showIncidenceSignal, mMainView, qOverload<const Akonadi::Item &>(&CalendarView::showIncidence)); 0259 connect(view, &BaseView::editIncidenceSignal, this, [this](const Akonadi::Item &i) { 0260 mMainView->editIncidence(i, false); 0261 }); 0262 connect(view, &BaseView::deleteIncidenceSignal, this, [this](const Akonadi::Item &i) { 0263 mMainView->deleteIncidence(i, false); 0264 }); 0265 connect(view, &BaseView::copyIncidenceSignal, mMainView, &CalendarView::copyIncidence); 0266 connect(view, &BaseView::cutIncidenceSignal, mMainView, &CalendarView::cutIncidence); 0267 connect(view, &BaseView::pasteIncidenceSignal, mMainView, &CalendarView::pasteIncidence); 0268 connect(view, &BaseView::toggleAlarmSignal, mMainView, &CalendarView::toggleAlarm); 0269 connect(view, &BaseView::toggleTodoCompletedSignal, mMainView, &CalendarView::toggleTodoCompleted); 0270 connect(view, &BaseView::toggleOccurrenceCompletedSignal, mMainView, &CalendarView::toggleOccurrenceCompleted); 0271 connect(view, &BaseView::copyIncidenceToResourceSignal, mMainView, &CalendarView::copyIncidenceToResource); 0272 connect(view, &BaseView::moveIncidenceToResourceSignal, mMainView, &CalendarView::moveIncidenceToResource); 0273 connect(view, &BaseView::dissociateOccurrencesSignal, mMainView, &CalendarView::dissociateOccurrences); 0274 0275 // signals to create new incidences 0276 connect(view, qOverload<>(&BaseView::newEventSignal), mMainView, qOverload<>(&CalendarView::newEvent)); 0277 connect(view, qOverload<const QDateTime &>(&BaseView::newEventSignal), mMainView, qOverload<const QDateTime &>(&CalendarView::newEvent)); 0278 connect(view, qOverload<const QDateTime &, const QDateTime &>(&BaseView::newEventSignal), this, [this](const QDateTime &s, const QDateTime &e) { 0279 mMainView->newEvent(s, e, false); 0280 }); 0281 connect(view, qOverload<const QDate &>(&BaseView::newEventSignal), mMainView, qOverload<const QDate &>(&CalendarView::newEvent)); 0282 0283 connect(view, qOverload<const QDate &>(&BaseView::newTodoSignal), mMainView, qOverload<const QDate &>(&CalendarView::newTodo)); 0284 connect(view, qOverload<const Akonadi::Item &>(&BaseView::newSubTodoSignal), mMainView, qOverload<const Akonadi::Item &>(&CalendarView::newSubTodo)); 0285 connect(view, &BaseView::newJournalSignal, mMainView, qOverload<const QDate &>(&CalendarView::newJournal)); 0286 0287 // reload settings 0288 connect(mMainView, &CalendarView::configChanged, view, &KOrg::BaseView::updateConfig); 0289 0290 // Notifications about added, changed and deleted incidences 0291 connect(mMainView, &CalendarView::dayPassed, view, &BaseView::dayPassed); 0292 connect(view, &BaseView::startMultiModify, mMainView, &CalendarView::startMultiModify); 0293 connect(view, &BaseView::endMultiModify, mMainView, &CalendarView::endMultiModify); 0294 0295 connect(mMainView, &CalendarView::newIncidenceChanger, view, &BaseView::setIncidenceChanger); 0296 0297 connect(mMainView, &CalendarView::calendarAdded, view, &BaseView::calendarAdded); 0298 connect(mMainView, &CalendarView::calendarRemoved, view, &BaseView::calendarRemoved); 0299 0300 view->setIncidenceChanger(mMainView->incidenceChanger()); 0301 } 0302 0303 void KOViewManager::connectTodoView(KOTodoView *todoView) 0304 { 0305 if (!todoView) { 0306 return; 0307 } 0308 0309 // SIGNALS/SLOTS FOR TODO VIEW 0310 connect(todoView, &KOTodoView::purgeCompletedSignal, mMainView, &CalendarView::purgeCompleted); 0311 connect(todoView, &KOTodoView::unSubTodoSignal, mMainView, &CalendarView::todo_unsub); 0312 connect(todoView, &KOTodoView::unAllSubTodoSignal, mMainView, &CalendarView::makeSubTodosIndependent); 0313 0314 connect(todoView, &KOTodoView::fullViewChanged, mMainView, &CalendarView::changeFullView); 0315 } 0316 0317 void KOViewManager::zoomInHorizontally() 0318 { 0319 if (mAgendaView == mCurrentView) { 0320 mAgendaView->zoomInHorizontally(); 0321 } 0322 } 0323 0324 void KOViewManager::zoomOutHorizontally() 0325 { 0326 if (mAgendaView == mCurrentView) { 0327 mAgendaView->zoomOutHorizontally(); 0328 } 0329 } 0330 0331 void KOViewManager::zoomInVertically() 0332 { 0333 if (mAgendaView == mCurrentView) { 0334 mAgendaView->zoomInVertically(); 0335 } 0336 } 0337 0338 void KOViewManager::zoomOutVertically() 0339 { 0340 if (mAgendaView == mCurrentView) { 0341 mAgendaView->zoomOutVertically(); 0342 } 0343 } 0344 0345 void KOViewManager::addView(KOrg::BaseView *view, bool isTab) 0346 { 0347 view->setModel(mMainView->calendar()->entityTreeModel()); 0348 connectView(view); 0349 mViews.append(view); 0350 const KConfigGroup group = KSharedConfig::openConfig()->group(QLatin1StringView(view->identifier())); 0351 view->restoreConfig(group); 0352 if (!isTab) { 0353 mMainView->viewStack()->addWidget(view); 0354 } 0355 for (const auto &calendar : mCalendars) { 0356 view->calendarAdded(calendar); 0357 } 0358 } 0359 0360 void KOViewManager::showMonthView() 0361 { 0362 if (!mMonthView) { 0363 mMonthView = new KOrg::MonthView(mMainView->viewStack()); 0364 mMonthView->setIdentifier("DefaultMonthView"); 0365 addView(mMonthView); 0366 connect(mMonthView, &MonthView::fullViewChanged, mMainView, &CalendarView::changeFullView); 0367 } 0368 goMenu(true); 0369 showView(mMonthView); 0370 } 0371 0372 void KOViewManager::showWhatsNextView() 0373 { 0374 if (!mWhatsNextView) { 0375 mWhatsNextView = new KOWhatsNextView(mMainView->viewStack()); 0376 mWhatsNextView->setIdentifier("DefaultWhatsNextView"); 0377 addView(mWhatsNextView); 0378 } 0379 goMenu(true); 0380 showView(mWhatsNextView); 0381 } 0382 0383 void KOViewManager::showListView() 0384 { 0385 if (!mListView) { 0386 mListView = new KOListView(mMainView->viewStack()); 0387 mListView->setIdentifier("DefaultListView"); 0388 addView(mListView); 0389 } 0390 goMenu(true); 0391 showView(mListView); 0392 } 0393 0394 void KOViewManager::showAgendaView() 0395 { 0396 const bool showBoth = KOPrefs::instance()->agendaViewCalendarDisplay() == KOPrefs::AllCalendarViews; 0397 const bool showMerged = showBoth || KOPrefs::instance()->agendaViewCalendarDisplay() == KOPrefs::CalendarsMerged; 0398 const bool showSideBySide = showBoth || KOPrefs::instance()->agendaViewCalendarDisplay() == KOPrefs::CalendarsSideBySide; 0399 0400 QWidget *parent = mMainView->viewStack(); 0401 if (showBoth) { 0402 if (!mAgendaViewTabs) { 0403 mAgendaViewTabs = new QTabWidget(mMainView->viewStack()); 0404 connect(mAgendaViewTabs, &QTabWidget::currentChanged, this, &KOViewManager::currentAgendaViewTabChanged); 0405 mMainView->viewStack()->addWidget(mAgendaViewTabs); 0406 0407 KConfigGroup viewConfig = KSharedConfig::openConfig()->group(QStringLiteral("Views")); 0408 mAgendaViewTabIndex = viewConfig.readEntry("Agenda View Tab Index", 0); 0409 } 0410 parent = mAgendaViewTabs; 0411 } 0412 0413 if (showMerged) { 0414 if (!mAgendaView) { 0415 mAgendaView = new KOAgendaView(parent); 0416 mAgendaView->setIdentifier("DefaultAgendaView"); 0417 0418 addView(mAgendaView, showBoth); 0419 0420 connect(mAgendaView, &KOAgendaView::zoomViewHorizontally, this, [this](const QDate &d, int n) { 0421 mMainView->dateNavigator()->selectDates(d, n, QDate()); 0422 }); 0423 auto config = KSharedConfig::openConfig(); 0424 mAgendaView->readSettings(config.data()); 0425 } 0426 if (showBoth && mAgendaViewTabs->indexOf(mAgendaView) < 0) { 0427 mAgendaViewTabs->addTab(mAgendaView, i18n("Merged calendar")); 0428 } else if (!showBoth && mMainView->viewStack()->indexOf(mAgendaView) < 0) { 0429 mAgendaView->setParent(parent); 0430 mMainView->viewStack()->addWidget(mAgendaView); 0431 } 0432 } 0433 0434 if (showSideBySide) { 0435 if (!mAgendaSideBySideView) { 0436 mAgendaSideBySideView = new MultiAgendaView(mMainView, parent); 0437 mAgendaSideBySideView->setIdentifier("DefaultAgendaSideBySideView"); 0438 mAgendaSideBySideView->setCollectionSelectionProxyModel(mMainView->calendar()->checkableProxyModel()); 0439 addView(mAgendaSideBySideView, showBoth); 0440 } 0441 if (showBoth && mAgendaViewTabs->indexOf(mAgendaSideBySideView) < 0) { 0442 mAgendaViewTabs->addTab(mAgendaSideBySideView, i18n("Calendars Side by Side")); 0443 mAgendaViewTabs->setCurrentIndex(mAgendaViewTabIndex); 0444 } else if (!showBoth && mMainView->viewStack()->indexOf(mAgendaSideBySideView) < 0) { 0445 mAgendaSideBySideView->setParent(parent); 0446 mMainView->viewStack()->addWidget(mAgendaSideBySideView); 0447 } 0448 } 0449 0450 goMenu(true); 0451 if (showBoth) { 0452 showView(static_cast<KOrg::BaseView *>(mAgendaViewTabs->currentWidget())); 0453 } else if (showMerged) { 0454 showView(mAgendaView); 0455 } else if (showSideBySide) { 0456 showView(mAgendaSideBySideView); 0457 } 0458 } 0459 0460 void KOViewManager::selectDay() 0461 { 0462 mRangeMode = DAY_RANGE; 0463 const QDate date = mMainView->activeDate(true); 0464 mMainView->dateNavigator()->selectDate(date); 0465 } 0466 0467 void KOViewManager::selectWorkWeek() 0468 { 0469 if (KOGlobals::self()->getWorkWeekMask() != 0) { 0470 mRangeMode = WORK_WEEK_RANGE; 0471 QDate date = mMainView->activeDate(); 0472 mMainView->dateNavigator()->selectWorkWeek(date); 0473 } else { 0474 KMessageBox::error(mMainView, 0475 i18n("Unable to display the work week since there are no work days configured. " 0476 "Please properly configure at least 1 work day in the Time and Date preferences.")); 0477 } 0478 } 0479 0480 void KOViewManager::selectWeek() 0481 { 0482 mRangeMode = WEEK_RANGE; 0483 QDate date = mMainView->activeDate(); 0484 mMainView->dateNavigator()->selectWeek(date); 0485 } 0486 0487 void KOViewManager::selectNextX() 0488 { 0489 mRangeMode = NEXTX_RANGE; 0490 mMainView->dateNavigator()->selectDates(QDate::currentDate(), KOPrefs::instance()->mNextXDays); 0491 } 0492 0493 void KOViewManager::showTodoView() 0494 { 0495 if (!mTodoView) { 0496 mTodoView = new KOTodoView(false /*not sidebar*/, mMainView->viewStack()); 0497 mTodoView->setIdentifier("DefaultTodoView"); 0498 addView(mTodoView); 0499 connectTodoView(mTodoView); 0500 0501 KSharedConfig::Ptr config = KSharedConfig::openConfig(); 0502 mTodoView->restoreLayout(config.data(), QStringLiteral("Todo View"), false); 0503 } 0504 goMenu(false); 0505 showView(mTodoView); 0506 } 0507 0508 void KOViewManager::showJournalView() 0509 { 0510 if (!mJournalView) { 0511 mJournalView = new KOJournalView(mMainView->viewStack()); 0512 mJournalView->setIdentifier("DefaultJournalView"); 0513 addView(mJournalView); 0514 } 0515 goMenu(true); 0516 showView(mJournalView); 0517 } 0518 0519 void KOViewManager::showTimeLineView() 0520 { 0521 if (!mTimelineView) { 0522 mTimelineView = new KOTimelineView(mMainView->viewStack()); 0523 mTimelineView->setIdentifier("DefaultTimelineView"); 0524 addView(mTimelineView); 0525 } 0526 goMenu(true); 0527 showView(mTimelineView); 0528 } 0529 0530 void KOViewManager::showEventView() 0531 { 0532 if (mLastEventView) { 0533 goMenu(true); 0534 showView(mLastEventView); 0535 } else { 0536 showAgendaView(); 0537 selectWeek(); 0538 } 0539 } 0540 0541 Akonadi::Item KOViewManager::currentSelection() 0542 { 0543 if (!mCurrentView) { 0544 return {}; 0545 } 0546 0547 Akonadi::Item::List incidenceList = mCurrentView->selectedIncidences(); 0548 if (incidenceList.isEmpty()) { 0549 return {}; 0550 } 0551 return incidenceList.first(); 0552 } 0553 0554 QDate KOViewManager::currentSelectionDate() 0555 { 0556 QDate qd; 0557 if (mCurrentView) { 0558 KCalendarCore::DateList qvl = mCurrentView->selectedIncidenceDates(); 0559 if (!qvl.isEmpty()) { 0560 qd = qvl.first(); 0561 } 0562 } 0563 return qd; 0564 } 0565 0566 void KOViewManager::setDocumentId(const QString &id) 0567 { 0568 if (mTodoView) { 0569 mTodoView->setDocumentId(id); 0570 } 0571 } 0572 0573 QWidget *KOViewManager::widgetForView(KOrg::BaseView *view) const 0574 { 0575 if (mAgendaViewTabs && mAgendaViewTabs->indexOf(view) >= 0) { 0576 return mAgendaViewTabs; 0577 } 0578 return view; 0579 } 0580 0581 void KOViewManager::currentAgendaViewTabChanged(int index) 0582 { 0583 KSharedConfig::Ptr config = KSharedConfig::openConfig(); 0584 KConfigGroup viewConfig(config, QStringLiteral("Views")); 0585 viewConfig.writeEntry("Agenda View Tab Index", mAgendaViewTabs->currentIndex()); 0586 0587 if (index > -1) { 0588 goMenu(true); 0589 QWidget *widget = mAgendaViewTabs->widget(index); 0590 if (widget) { 0591 showView(static_cast<KOrg::BaseView *>(widget)); 0592 } 0593 } 0594 } 0595 0596 void KOViewManager::addChange(EventViews::EventView::Change change) 0597 { 0598 for (BaseView *view : std::as_const(mViews)) { 0599 if (view) { 0600 view->setChanges(view->changes() | change); 0601 } 0602 } 0603 } 0604 0605 void KOViewManager::updateMultiCalendarDisplay() 0606 { 0607 if (agendaIsSelected()) { 0608 showAgendaView(); 0609 } else { 0610 updateView(); 0611 } 0612 } 0613 0614 bool KOViewManager::agendaIsSelected() const 0615 { 0616 return mCurrentView == mAgendaView || mCurrentView == mAgendaSideBySideView || (mAgendaViewTabs && mCurrentView == mAgendaViewTabs->currentWidget()); 0617 } 0618 0619 void KOViewManager::addCalendar(const Akonadi::CollectionCalendar::Ptr &calendar) 0620 { 0621 mCalendars.push_back(calendar); 0622 } 0623 0624 void KOViewManager::removeCalendar(const Akonadi::CollectionCalendar::Ptr &calendar) 0625 { 0626 mCalendars.removeAll(calendar); 0627 } 0628 0629 #include "moc_koviewmanager.cpp"