Eventviews

mainwindow.cpp
1/*
2 SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.net>
3 SPDX-FileContributor: Kevin Krammer <krake@kdab.com>
4
5 SPDX-License-Identifier: GPL-2.0-or-later
6*/
7
8#include "mainwindow.h"
9
10#include "settings.h"
11
12#include "agenda/agenda.h"
13#include "agenda/agendaview.h"
14#include "calendarview_debug.h"
15#include "month/monthview.h"
16#include "multiagenda/multiagendaview.h"
17#include "prefs.h"
18#include "timeline/timelineview.h"
19
20#include <Akonadi/Collection>
21#include <Akonadi/CollectionFilterProxyModel>
22#include <Akonadi/ControlGui>
23#include <Akonadi/EntityTreeModel>
24#include <Akonadi/IncidenceChanger>
25#include <Akonadi/ItemFetchScope>
26#include <Akonadi/Monitor>
27
28#include <CalendarSupport/CollectionSelection>
29
30#include <KCalendarCore/Event>
31
32#include <KCheckableProxyModel>
33
34using namespace Akonadi;
35using namespace CalendarSupport;
36using namespace EventViews;
37
38MainWindow::MainWindow(const QStringList &viewNames)
39 : QMainWindow()
40 , mViewNames(viewNames)
41 , mIncidenceChanger(nullptr)
42 , mSettings(nullptr)
43 , mViewPreferences(nullptr)
44{
45 mUi.setupUi(this);
46 mUi.tabWidget->clear();
47
48 connect(mUi.addViewMenu, &QMenu::triggered, this, &MainWindow::addViewTriggered);
49
51
52 setGeometry(0, 0, 800, 600);
54}
55
56MainWindow::~MainWindow()
57{
58 delete mViewPreferences;
59 delete mSettings;
60}
61
62void MainWindow::addView(const QString &viewName)
63{
64 EventView *eventView = nullptr;
65
66 const auto start = QDateTime::currentDateTime().addDays(-1);
67 const auto end = QDateTime::currentDateTime().addDays(1);
68
69 if (viewName == QLatin1StringView("agenda")) {
70 eventView = new AgendaView(start.date(), end.date(), true, false, this);
71 } else if (viewName == QLatin1StringView("multiagenda")) {
72 eventView = new MultiAgendaView(this);
73 } else if (viewName == QLatin1StringView("month")) {
74 eventView = new MonthView(MonthView::Visible, this);
75 } else if (viewName == QLatin1StringView("timeline")) {
76 eventView = new TimelineView(this);
77 }
78
79 if (eventView) {
80 eventView->setPreferences(*mViewPreferences);
81 eventView->setIncidenceChanger(mIncidenceChanger);
82 eventView->updateConfig();
83
84 for (const auto &calendar : mCalendars) {
85 eventView->addCalendar(calendar);
86 }
87
88 eventView->setDateRange(start, end);
89
90 mUi.tabWidget->addTab(eventView, viewName);
91 mEventViews.push_back(eventView);
92 } else {
93 qCCritical(CALENDARVIEW_LOG) << "Cannot create view" << viewName;
94 }
95}
96
97void MainWindow::delayedInit()
98{
99 // create our application settings
100 mSettings = new Settings;
101
102 // create view preferences so that matching values are retrieved from
103 // application settings
104 mViewPreferences = new PrefsPtr(new Prefs(mSettings));
105
106 mMonitor = new Akonadi::Monitor(this);
107 for (const auto &mt : KCalendarCore::Incidence::mimeTypes()) {
108 mMonitor->setMimeTypeMonitored(mt);
109 }
110 mMonitor->itemFetchScope().fetchFullPayload();
112 mEtm = new Akonadi::EntityTreeModel(mMonitor, this);
113
114 auto collectionProxy = new Akonadi::CollectionFilterProxyModel(mEtm);
115 collectionProxy->addMimeTypeFilters(KCalendarCore::Incidence::mimeTypes());
116 collectionProxy->setSourceModel(mEtm);
117
118 auto selectionModel = new QItemSelectionModel(collectionProxy, mEtm);
119
120 auto checkableProxy = new KCheckableProxyModel(mEtm);
121 checkableProxy->setSourceModel(collectionProxy);
122 checkableProxy->setSelectionModel(selectionModel);
123
124 mUi.calendarView->setModel(checkableProxy);
125
126 CalendarSupport::CollectionSelection *collectionSelection = new CalendarSupport::CollectionSelection(selectionModel, this);
127 EventViews::EventView::setGlobalCollectionSelection(collectionSelection);
128
129 connect(collectionSelection, &CalendarSupport::CollectionSelection::collectionSelected, this, &MainWindow::collectionSelected);
130 connect(collectionSelection, &CalendarSupport::CollectionSelection::collectionDeselected, this, &MainWindow::collectionDeselected);
131
132 for (const auto &collection : collectionSelection->selectedCollections()) {
133 collectionSelected(collection);
134 }
135
136 mIncidenceChanger = new IncidenceChanger(this);
137
138 for (const QString &viewName : std::as_const(mViewNames)) {
139 addView(viewName);
140 }
141}
142
143void MainWindow::addViewTriggered(QAction *action)
144{
145 QString viewName = action->text().toLower();
146 viewName.remove(QLatin1Char('&'));
147 addView(viewName);
148}
149
150void MainWindow::collectionSelected(const Akonadi::Collection &col)
151{
152 qDebug() << "Collection selected id=" << col.id() << "name=" << col.displayName();
153 auto calendar = Akonadi::CollectionCalendar::Ptr::create(mEtm, col);
154 mCalendars.push_back(calendar);
155
156 for (auto view : mEventViews) {
157 view->addCalendar(calendar);
158 view->updateView();
159 }
160}
161
162void MainWindow::collectionDeselected(const Akonadi::Collection &col)
163{
164 qDebug() << "Collection deselected id=" << col.id() << "name=" << col.displayName();
165 auto calendar = std::find_if(mCalendars.begin(), mCalendars.end(), [col](const auto &cal) {
166 return cal->collection() == col;
167 });
168 if (calendar == mCalendars.cend()) {
169 return;
170 }
171
172 const auto start = QDateTime::currentDateTime().addDays(-1);
173 const auto end = QDateTime::currentDateTime().addDays(1);
174
175 for (auto view : mEventViews) {
176 view->removeCalendar(*calendar);
177 view->updateView();
178 }
179
180 mCalendars.erase(calendar);
181}
182#include "moc_mainwindow.cpp"
QString displayName() const
static void widgetNeedsAkonadi(QWidget *widget)
void setAncestorRetrieval(AncestorRetrieval ancestorDepth)
void fetchFullPayload(bool fetch=true)
void setMimeTypeMonitored(const QString &mimetype, bool monitored=true)
ItemFetchScope & itemFetchScope()
AgendaView is the agenda-like view that displays events in a single or multi-day view.
Definition agendaview.h:67
EventView is the abstract base class from which all other calendar views for event data are derived.
Definition eventview.h:67
virtual void setDateRange(const QDateTime &start, const QDateTime &end, const QDate &preferredMonth=QDate())
virtual void updateConfig()
Re-reads the configuration and picks up relevant changes which are applicable to the view.
virtual void setIncidenceChanger(Akonadi::IncidenceChanger *changer)
Assign a new incidence change helper object.
Shows one agenda for every resource side-by-side.
This class provides a view showing which blocks of time are occupied by events in the user's calendar...
static QStringList mimeTypes()
Q_SCRIPTABLE Q_NOREPLY void start()
Namespace EventViews provides facilities for displaying incidences, including events,...
Definition agenda.h:33
const QList< QKeySequence > & end()
QDateTime addDays(qint64 ndays) const const
QDateTime currentDateTime()
iterator begin()
const_iterator cend() const const
iterator end()
iterator erase(const_iterator begin, const_iterator end)
void push_back(parameter_type value)
void triggered(QAction *action)
bool invokeMethod(QObject *context, Functor &&function, FunctorReturnType *ret)
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
QSharedPointer< T > create(Args &&... args)
QString & remove(QChar ch, Qt::CaseSensitivity cs)
QueuedConnection
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
void setupUi(QWidget *widget)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:12:29 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.