File indexing completed on 2024-06-16 04:57:15

0001 /*
0002   This file is part of KOrganizer.
0003   SPDX-FileCopyrightText: 2001 Cornelius Schumacher <schumacher@kde.org>
0004   SPDX-FileCopyrightText: 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
0005 
0006   SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
0007 */
0008 
0009 #include "koagendaview.h"
0010 #include "koeventpopupmenu.h"
0011 #include "prefs/koprefs.h"
0012 
0013 #include <EventViews/AgendaView>
0014 
0015 #include <QHBoxLayout>
0016 
0017 class KOAgendaViewPrivate
0018 {
0019 public:
0020     KOAgendaViewPrivate(bool isSideBySide, KOAgendaView *parent)
0021         : q(parent)
0022     {
0023         mAgendaView =
0024             new EventViews::AgendaView(KOPrefs::instance()->eventViewsPreferences(), QDate::currentDate(), QDate::currentDate(), true, isSideBySide, parent);
0025         mPopup = q->eventPopup();
0026     }
0027 
0028     ~KOAgendaViewPrivate()
0029     {
0030         delete mAgendaView;
0031         delete mPopup;
0032     }
0033 
0034     EventViews::AgendaView *mAgendaView = nullptr;
0035     KOEventPopupMenu *mPopup = nullptr;
0036 
0037 private:
0038     KOAgendaView *const q;
0039 };
0040 
0041 KOAgendaView::KOAgendaView(QWidget *parent, bool isSideBySide)
0042     : KOEventView(parent)
0043     , d(new KOAgendaViewPrivate(isSideBySide, this))
0044 {
0045     auto layout = new QHBoxLayout(this);
0046     layout->setContentsMargins({});
0047     layout->addWidget(d->mAgendaView);
0048 
0049     connect(d->mAgendaView, &EventViews::AgendaView::zoomViewHorizontally, this, &KOAgendaView::zoomViewHorizontally);
0050 
0051     connect(d->mAgendaView, &EventViews::AgendaView::timeSpanSelectionChanged, this, &KOAgendaView::timeSpanSelectionChanged);
0052 
0053     connect(d->mAgendaView, &EventViews::AgendaView::showIncidencePopupSignal, d->mPopup, &KOEventPopupMenu::showIncidencePopup);
0054 
0055     connect(d->mAgendaView, &EventViews::AgendaView::showNewEventPopupSignal, this, &KOAgendaView::showNewEventPopup);
0056 
0057     connect(d->mAgendaView, &EventViews::EventView::datesSelected, this, &KOEventView::datesSelected);
0058 
0059     connect(d->mAgendaView, &EventViews::EventView::shiftedEvent, this, &KOEventView::shiftedEvent);
0060 
0061     connect(d->mAgendaView, &EventViews::EventView::incidenceSelected, this, &KOrg::BaseView::incidenceSelected);
0062 
0063     connect(d->mAgendaView, &EventViews::EventView::showIncidenceSignal, this, &KOrg::BaseView::showIncidenceSignal);
0064 
0065     connect(d->mAgendaView, &EventViews::EventView::editIncidenceSignal, this, &KOrg::BaseView::editIncidenceSignal);
0066 
0067     connect(d->mAgendaView, &EventViews::EventView::deleteIncidenceSignal, this, &KOrg::BaseView::deleteIncidenceSignal);
0068 
0069     connect(d->mAgendaView, &EventViews::EventView::cutIncidenceSignal, this, &KOrg::BaseView::cutIncidenceSignal);
0070 
0071     connect(d->mAgendaView, &EventViews::EventView::copyIncidenceSignal, this, &KOrg::BaseView::copyIncidenceSignal);
0072 
0073     connect(d->mAgendaView, &EventViews::EventView::pasteIncidenceSignal, this, &KOrg::BaseView::pasteIncidenceSignal);
0074 
0075     connect(d->mAgendaView, &EventViews::EventView::toggleAlarmSignal, this, &KOrg::BaseView::toggleAlarmSignal);
0076 
0077     connect(d->mAgendaView, &EventViews::EventView::toggleTodoCompletedSignal, this, &KOrg::BaseView::toggleTodoCompletedSignal);
0078 
0079     connect(d->mAgendaView, &EventViews::EventView::copyIncidenceToResourceSignal, this, &KOrg::BaseView::copyIncidenceToResourceSignal);
0080 
0081     connect(d->mAgendaView, &EventViews::EventView::moveIncidenceToResourceSignal, this, &KOrg::BaseView::moveIncidenceToResourceSignal);
0082 
0083     connect(d->mAgendaView, &EventViews::EventView::dissociateOccurrencesSignal, this, &KOrg::BaseView::dissociateOccurrencesSignal);
0084 
0085     connect(d->mAgendaView, qOverload<>(&EventViews::AgendaView::newEventSignal), this, qOverload<>(&KOAgendaView::newEventSignal));
0086 
0087     connect(d->mAgendaView, qOverload<const QDate &>(&EventViews::AgendaView::newEventSignal), this, qOverload<const QDate &>(&KOAgendaView::newEventSignal));
0088 
0089     connect(d->mAgendaView,
0090             qOverload<const QDateTime &>(&EventViews::AgendaView::newEventSignal),
0091             this,
0092             qOverload<const QDateTime &>(&KOAgendaView::newEventSignal));
0093 
0094     connect(d->mAgendaView,
0095             qOverload<const QDateTime &, const QDateTime &>(&EventViews::AgendaView::newEventSignal),
0096             this,
0097             qOverload<const QDateTime &, const QDateTime &>(&KOAgendaView::newEventSignal));
0098 
0099     connect(d->mAgendaView, &EventViews::EventView::newTodoSignal, this, &KOrg::BaseView::newTodoSignal);
0100 
0101     connect(d->mAgendaView, &EventViews::EventView::newSubTodoSignal, this, &KOrg::BaseView::newSubTodoSignal);
0102 
0103     connect(d->mAgendaView, &EventViews::EventView::newJournalSignal, this, &KOrg::BaseView::newJournalSignal);
0104 
0105     d->mAgendaView->show();
0106 }
0107 
0108 KOAgendaView::~KOAgendaView() = default;
0109 
0110 void KOAgendaView::setModel(QAbstractItemModel *model)
0111 {
0112     KOEventView::setModel(model);
0113     d->mAgendaView->setModel(model);
0114 }
0115 
0116 void KOAgendaView::zoomInVertically()
0117 {
0118     d->mAgendaView->zoomInVertically();
0119 }
0120 
0121 void KOAgendaView::zoomOutVertically()
0122 {
0123     d->mAgendaView->zoomOutVertically();
0124 }
0125 
0126 void KOAgendaView::zoomInHorizontally(QDate date)
0127 {
0128     d->mAgendaView->zoomInHorizontally(date);
0129 }
0130 
0131 void KOAgendaView::zoomOutHorizontally(QDate date)
0132 {
0133     d->mAgendaView->zoomOutHorizontally(date);
0134 }
0135 
0136 void KOAgendaView::zoomView(const int delta, const QPoint &pos, const Qt::Orientation orient)
0137 {
0138     d->mAgendaView->zoomView(delta, pos, orient);
0139 }
0140 
0141 void KOAgendaView::enableAgendaUpdate(bool enable)
0142 {
0143     d->mAgendaView->enableAgendaUpdate(enable);
0144 }
0145 
0146 int KOAgendaView::maxDatesHint() const
0147 {
0148     // Not sure about the max number of events, so return 0 for now.
0149     return 0;
0150 }
0151 
0152 int KOAgendaView::currentDateCount() const
0153 {
0154     return d->mAgendaView->currentDateCount();
0155 }
0156 
0157 Akonadi::Item::List KOAgendaView::selectedIncidences()
0158 {
0159     return d->mAgendaView->selectedIncidences();
0160 }
0161 
0162 KCalendarCore::DateList KOAgendaView::selectedIncidenceDates()
0163 {
0164     return d->mAgendaView->selectedIncidenceDates();
0165 }
0166 
0167 bool KOAgendaView::eventDurationHint(QDateTime &startDt, QDateTime &endDt, bool &allDay)
0168 {
0169     return d->mAgendaView->eventDurationHint(startDt, endDt, allDay);
0170 }
0171 
0172 /** returns if only a single cell is selected, or a range of cells */
0173 bool KOAgendaView::selectedIsSingleCell()
0174 {
0175     return d->mAgendaView->selectedIsSingleCell();
0176 }
0177 
0178 void KOAgendaView::updateView()
0179 {
0180     d->mAgendaView->updateView();
0181 }
0182 
0183 void KOAgendaView::updateConfig()
0184 {
0185     d->mAgendaView->updateConfig();
0186 }
0187 
0188 void KOAgendaView::showDates(const QDate &start, const QDate &end, const QDate &)
0189 {
0190     d->mAgendaView->showDates(start, end);
0191 }
0192 
0193 void KOAgendaView::showIncidences(const Akonadi::Item::List &incidences, const QDate &date)
0194 {
0195     d->mAgendaView->showIncidences(incidences, date);
0196 }
0197 
0198 void KOAgendaView::changeIncidenceDisplayAdded(const Akonadi::Item &)
0199 {
0200     // Do nothing, EventViews::AgendaView knows when items change
0201 }
0202 
0203 void KOAgendaView::changeIncidenceDisplay(const Akonadi::Item &, Akonadi::IncidenceChanger::ChangeType)
0204 {
0205     // Do nothing, EventViews::AgendaView knows when items change
0206 }
0207 
0208 CalendarSupport::CalPrinter::PrintType KOAgendaView::printType() const
0209 {
0210     // If up to three days are selected, use day style, otherwise week
0211     if (currentDateCount() <= 3) {
0212         return CalendarSupport::CalPrinter::Day;
0213     } else {
0214         return CalendarSupport::CalPrinter::Week;
0215     }
0216 }
0217 
0218 void KOAgendaView::readSettings()
0219 {
0220     d->mAgendaView->readSettings();
0221 }
0222 
0223 void KOAgendaView::readSettings(KConfig *config)
0224 {
0225     d->mAgendaView->readSettings(config);
0226 }
0227 
0228 void KOAgendaView::writeSettings(KConfig *config)
0229 {
0230     d->mAgendaView->writeSettings(config);
0231 }
0232 
0233 void KOAgendaView::clearSelection()
0234 {
0235     d->mAgendaView->clearSelection();
0236 }
0237 
0238 void KOAgendaView::deleteSelectedDateTime()
0239 {
0240     d->mAgendaView->deleteSelectedDateTime();
0241 }
0242 
0243 void KOAgendaView::setIncidenceChanger(Akonadi::IncidenceChanger *changer)
0244 {
0245     d->mAgendaView->setIncidenceChanger(changer);
0246 }
0247 
0248 QDateTime KOAgendaView::selectionStart()
0249 {
0250     return d->mAgendaView->selectionStart();
0251 }
0252 
0253 QDateTime KOAgendaView::selectionEnd()
0254 {
0255     return d->mAgendaView->selectionEnd();
0256 }
0257 
0258 bool KOAgendaView::selectedIsAllDay()
0259 {
0260     return d->mAgendaView->selectedIsAllDay();
0261 }
0262 
0263 void KOAgendaView::setTypeAheadReceiver(QObject *o)
0264 {
0265     d->mAgendaView->setTypeAheadReceiver(o);
0266 }
0267 
0268 void KOAgendaView::setChanges(EventViews::EventView::Changes changes)
0269 {
0270     // Only ConfigChanged and FilterChanged should go from korg->AgendaView
0271     // All other values are already detected inside AgendaView.
0272     // We could just pass "changes", but korganizer does a very bad job at
0273     // determining what changed, for example if you move an incidence
0274     // the BaseView::setDateRange(...) is called causing DatesChanged
0275     // flag to be on, when no dates changed.
0276     EventViews::EventView::Changes c;
0277     if (changes.testFlag(EventViews::EventView::ConfigChanged)) {
0278         c = EventViews::EventView::ConfigChanged;
0279     }
0280 
0281     if (changes.testFlag(EventViews::EventView::FilterChanged)) {
0282         c |= EventViews::EventView::FilterChanged;
0283     }
0284 
0285     d->mAgendaView->setChanges(c | d->mAgendaView->changes());
0286 }
0287 
0288 void KOAgendaView::setDateRange(const QDateTime &start, const QDateTime &end, const QDate &)
0289 {
0290     d->mAgendaView->setDateRange(start, end);
0291 }
0292 
0293 void KOAgendaView::calendarAdded(const Akonadi::CollectionCalendar::Ptr &calendar)
0294 {
0295     d->mAgendaView->addCalendar(calendar);
0296 }
0297 
0298 void KOAgendaView::calendarRemoved(const Akonadi::CollectionCalendar::Ptr &calendar)
0299 {
0300     d->mAgendaView->removeCalendar(calendar);
0301 }
0302 
0303 #include "moc_koagendaview.cpp"