File indexing completed on 2025-03-09 04:51:39

0001 /*
0002   This file is part of KOrganizer.
0003 
0004   SPDX-FileCopyrightText: 2000, 2001, 2003 Cornelius Schumacher <schumacher@kde.org>
0005   SPDX-FileCopyrightText: 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
0006   SPDX-FileCopyrightText: 2005 Rafal Rzepecki <divide@users.sourceforge.net>
0007   SPDX-FileCopyrightText: 2008 Thomas Thrainer <tom_t@gmx.at>
0008 
0009   SPDX-License-Identifier: GPL-2.0-or-later WITH Qt-Commercial-exception-1.0
0010 */
0011 
0012 #include "kotodoview.h"
0013 #include "koeventpopupmenu.h"
0014 #include "prefs/koprefs.h"
0015 
0016 #include <CalendarSupport/CalPrinter>
0017 
0018 #include <Akonadi/CalendarUtils>
0019 #include <Akonadi/EntityTreeModel>
0020 
0021 #include <QVBoxLayout>
0022 
0023 KOTodoView::KOTodoView(bool sidebarView, QWidget *parent)
0024     : BaseView(parent)
0025 {
0026     auto eventPopup = new KOEventPopupMenu(this);
0027     mView = new EventViews::TodoView(KOPrefs::instance()->eventViewsPreferences(), sidebarView, parent);
0028     auto layout = new QVBoxLayout(this);
0029     layout->addWidget(mView);
0030     connect(mView, &EventViews::TodoView::printTodo, this, [this]() {
0031         printTodo();
0032     });
0033     connect(mView, &EventViews::TodoView::printPreviewTodo, this, &KOTodoView::printPreviewTodo);
0034     connect(mView, &EventViews::TodoView::purgeCompletedSignal, this, &KOTodoView::purgeCompletedSignal);
0035 
0036     connect(mView, &EventViews::EventView::incidenceSelected, this, &BaseView::incidenceSelected);
0037 
0038     connect(mView, &EventViews::EventView::showIncidenceSignal, this, &BaseView::showIncidenceSignal);
0039 
0040     connect(mView, &EventViews::EventView::editIncidenceSignal, this, &BaseView::editIncidenceSignal);
0041 
0042     connect(mView, &EventViews::EventView::deleteIncidenceSignal, this, &BaseView::deleteIncidenceSignal);
0043 
0044     connect(mView, &EventViews::EventView::cutIncidenceSignal, this, &BaseView::cutIncidenceSignal);
0045 
0046     connect(mView, &EventViews::EventView::copyIncidenceSignal, this, &BaseView::copyIncidenceSignal);
0047 
0048     connect(mView, &EventViews::EventView::pasteIncidenceSignal, this, &BaseView::pasteIncidenceSignal);
0049 
0050     connect(mView, &EventViews::EventView::toggleAlarmSignal, this, &BaseView::toggleAlarmSignal);
0051 
0052     connect(mView, &EventViews::EventView::toggleTodoCompletedSignal, this, &BaseView::toggleTodoCompletedSignal);
0053 
0054     connect(mView, &EventViews::EventView::copyIncidenceToResourceSignal, this, &BaseView::copyIncidenceToResourceSignal);
0055 
0056     connect(mView, &EventViews::EventView::moveIncidenceToResourceSignal, this, &BaseView::moveIncidenceToResourceSignal);
0057 
0058     connect(mView, &EventViews::EventView::dissociateOccurrencesSignal, this, &BaseView::dissociateOccurrencesSignal);
0059 
0060     connect(mView, qOverload<>(&EventViews::TodoView::newEventSignal), this, qOverload<>(&KOTodoView::newEventSignal));
0061 
0062     connect(mView, qOverload<const QDate &>(&EventViews::TodoView::newEventSignal), this, qOverload<const QDate &>(&KOTodoView::newEventSignal));
0063 
0064     connect(mView, qOverload<const QDateTime &>(&EventViews::TodoView::newEventSignal), this, qOverload<const QDateTime &>(&KOTodoView::newEventSignal));
0065 
0066     connect(mView,
0067             qOverload<const QDateTime &, const QDateTime &>(&EventViews::TodoView::newEventSignal),
0068             this,
0069             qOverload<const QDateTime &, const QDateTime &>(&KOTodoView::newEventSignal));
0070 
0071     connect(mView, &EventViews::EventView::newTodoSignal, this, &BaseView::newTodoSignal);
0072 
0073     connect(mView, &EventViews::EventView::newSubTodoSignal, this, &BaseView::newSubTodoSignal);
0074 
0075     connect(mView, &EventViews::TodoView::fullViewChanged, this, &KOTodoView::fullViewChanged);
0076 
0077     connect(mView, &EventViews::TodoView::unSubTodoSignal, this, &KOTodoView::unSubTodoSignal);
0078     connect(mView, &EventViews::TodoView::unAllSubTodoSignal, this, &KOTodoView::unAllSubTodoSignal);
0079 
0080     connect(mView,
0081             static_cast<void (EventViews::TodoView::*)(const Akonadi::Item &)>(&EventViews::TodoView ::createEvent),
0082             eventPopup,
0083             static_cast<void (KOEventPopupMenu::*)(const Akonadi::Item &)>(&KOEventPopupMenu::createEvent));
0084     connect(mView,
0085             static_cast<void (EventViews::TodoView::*)(const Akonadi::Item &)>(&EventViews::TodoView ::createNote),
0086             eventPopup,
0087             static_cast<void (KOEventPopupMenu::*)(const Akonadi::Item &)>(&KOEventPopupMenu::createNote));
0088 }
0089 
0090 KOTodoView::~KOTodoView() = default;
0091 
0092 void KOTodoView::setModel(QAbstractItemModel *model)
0093 {
0094     BaseView::setModel(model);
0095     mView->setModel(model);
0096 }
0097 
0098 void KOTodoView::calendarAdded(const Akonadi::CollectionCalendar::Ptr &calendar)
0099 {
0100     BaseView::calendarAdded(calendar);
0101     mView->addCalendar(calendar);
0102 }
0103 
0104 void KOTodoView::calendarRemoved(const Akonadi::CollectionCalendar::Ptr &calendar)
0105 {
0106     BaseView::calendarRemoved(calendar);
0107     mView->removeCalendar(calendar);
0108 }
0109 
0110 Akonadi::Item::List KOTodoView::selectedIncidences()
0111 {
0112     return mView->selectedIncidences();
0113 }
0114 
0115 KCalendarCore::DateList KOTodoView::selectedIncidenceDates()
0116 {
0117     return {};
0118 }
0119 
0120 void KOTodoView::setIncidenceChanger(Akonadi::IncidenceChanger *changer)
0121 {
0122     BaseView::setIncidenceChanger(changer);
0123     mView->setIncidenceChanger(changer);
0124 }
0125 
0126 void KOTodoView::showDates(const QDate &start, const QDate &end, const QDate &)
0127 {
0128     // There is nothing to do here for the Todo View
0129     Q_UNUSED(start)
0130     Q_UNUSED(end)
0131 }
0132 
0133 void KOTodoView::showIncidences(const Akonadi::Item::List &incidenceList, const QDate &date)
0134 {
0135     Q_UNUSED(incidenceList)
0136     Q_UNUSED(date)
0137 }
0138 
0139 void KOTodoView::updateView()
0140 {
0141     // View is always updated, it's connected to ETM.
0142 }
0143 
0144 void KOTodoView::changeIncidenceDisplay(const Akonadi::Item &, Akonadi::IncidenceChanger::ChangeType)
0145 {
0146     // Don't do anything, model is connected to ETM, it's up to date
0147 }
0148 
0149 void KOTodoView::updateConfig()
0150 {
0151     mView->updateConfig();
0152 }
0153 
0154 void KOTodoView::clearSelection()
0155 {
0156     mView->clearSelection();
0157 }
0158 
0159 void KOTodoView::printTodo()
0160 {
0161     printTodo(false);
0162 }
0163 
0164 void KOTodoView::printPreviewTodo()
0165 {
0166     printTodo(true);
0167 }
0168 
0169 void KOTodoView::printTodo(bool preview)
0170 {
0171     const Akonadi::Item::List selectedItems = mView->selectedIncidences();
0172     if (selectedItems.count() != 1) {
0173         return;
0174     }
0175 
0176     Akonadi::Item todoItem = selectedItems.first();
0177     KCalendarCore::Todo::Ptr todo = Akonadi::CalendarUtils::todo(todoItem);
0178     Q_ASSERT(todo);
0179 
0180     const auto calendar = calendarForCollection(todoItem.storageCollectionId());
0181 
0182     CalendarSupport::CalPrinter printer(this, calendar, true);
0183     connect(this, &KOTodoView::configChanged, &printer, &CalendarSupport::CalPrinter::updateConfig);
0184 
0185     KCalendarCore::Incidence::List selectedIncidences;
0186     selectedIncidences.append(todo);
0187 
0188     QDate todoDate;
0189     if (todo->hasStartDate()) {
0190         todoDate = todo->dtStart().date();
0191     } else {
0192         todoDate = todo->dtDue().date();
0193     }
0194 
0195     printer.print(CalendarSupport::CalPrinterBase::Incidence, todoDate, todoDate, selectedIncidences, preview);
0196 }
0197 
0198 void KOTodoView::getHighlightMode(bool &highlightEvents, bool &highlightTodos, bool &highlightJournals)
0199 {
0200     highlightTodos = KOPrefs::instance()->mHighlightTodos;
0201     highlightEvents = !highlightTodos;
0202     highlightJournals = false;
0203 }
0204 
0205 void KOTodoView::saveViewState()
0206 {
0207     mView->saveViewState();
0208 }
0209 
0210 void KOTodoView::restoreViewState()
0211 {
0212     mView->restoreViewState();
0213 }
0214 
0215 void KOTodoView::restoreLayout(KConfig *config, const QString &group, bool minimalDefaults)
0216 {
0217     mView->restoreLayout(config, group, minimalDefaults);
0218 }
0219 
0220 void KOTodoView::saveLayout(KConfig *config, const QString &group) const
0221 {
0222     mView->saveLayout(config, group);
0223 }
0224 
0225 bool KOTodoView::usesFullWindow()
0226 {
0227     return mView->usesFullWindow();
0228 }
0229 
0230 CalendarSupport::CalPrinterBase::PrintType KOTodoView::printType() const
0231 {
0232     return CalendarSupport::CalPrinterBase::Todolist;
0233 }
0234 
0235 #include "moc_kotodoview.cpp"