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"