File indexing completed on 2024-06-23 04:42:36
0001 // Copyright (c) 2018 Michael Bohlender <michael.bohlender@kdemail.net> 0002 // Copyright (c) 2018 Christian Mollekopf <mollekopf@kolabsys.com> 0003 // Copyright (c) 2018 RĂ©mi Nicole <minijackson@riseup.net> 0004 // Copyright (c) 2021 Carl Schwan <carlschwan@kde.org> 0005 // SPDX-FileCopyrightText: 2021 Claudio Cambra <claudio.cambra@gmail.com> 0006 // SPDX-License-Identifier: LGPL-2.0-or-later 0007 0008 #pragma once 0009 0010 #include "incidenceoccurrencemodel.h" 0011 #include <QAbstractItemModel> 0012 #include <QList> 0013 #include <QSharedPointer> 0014 #include <QTimer> 0015 //#include <kalendarconfig.h> 0016 0017 namespace KCalendarCore 0018 { 0019 class Incidence; 0020 } 0021 0022 /** 0023 * Each toplevel index represents a week. 0024 * The "incidences" roles provides a list of lists, where each list represents a visual line, 0025 * containing a number of events to display. 0026 */ 0027 class MultiDayIncidenceModel : public QAbstractItemModel 0028 { 0029 Q_OBJECT 0030 Q_PROPERTY(int periodLength READ periodLength WRITE setPeriodLength NOTIFY periodLengthChanged) 0031 Q_PROPERTY(MultiDayIncidenceModel::Filters filters READ filters WRITE setFilters NOTIFY filtersChanged) 0032 Q_PROPERTY(int incidenceCount READ incidenceCount NOTIFY incidenceCountChanged) 0033 Q_PROPERTY(IncidenceOccurrenceModel *model READ model WRITE setModel NOTIFY modelChanged) 0034 0035 public: 0036 enum Filter { 0037 AllDayOnly = 0x1, 0038 NoStartDateOnly = 0x2, 0039 MultiDayOnly = 0x3, 0040 }; 0041 Q_DECLARE_FLAGS(Filters, Filter) 0042 Q_FLAGS(Filters) 0043 Q_ENUM(Filter) 0044 0045 enum Roles { 0046 Incidences = IncidenceOccurrenceModel::LastRole, 0047 PeriodStartDate, 0048 }; 0049 0050 explicit MultiDayIncidenceModel(QObject *parent = nullptr); 0051 ~MultiDayIncidenceModel() override = default; 0052 0053 QModelIndex index(int row, int column, const QModelIndex &parent = {}) const override; 0054 QModelIndex parent(const QModelIndex &index) const override; 0055 0056 int rowCount(const QModelIndex &parent) const override; 0057 int columnCount(const QModelIndex &parent) const override; 0058 0059 QVariant data(const QModelIndex &index, int role) const override; 0060 0061 QHash<int, QByteArray> roleNames() const override; 0062 0063 IncidenceOccurrenceModel *model(); 0064 void setModel(IncidenceOccurrenceModel *model); 0065 int periodLength(); 0066 void setPeriodLength(int periodLength); 0067 MultiDayIncidenceModel::Filters filters(); 0068 void setFilters(MultiDayIncidenceModel::Filters filters); 0069 bool incidencePassesFilter(const QModelIndex &idx) const; 0070 Q_INVOKABLE int incidenceCount(); 0071 0072 Q_SIGNALS: 0073 void periodLengthChanged(); 0074 void filtersChanged(); 0075 void incidenceCountChanged(); 0076 void modelChanged(); 0077 0078 protected: 0079 void setIncidenceCount(int incidenceCount); 0080 0081 private: 0082 QTimer mRefreshTimer; 0083 QList<QModelIndex> sortedIncidencesFromSourceModel(const QDate &rowStart) const; 0084 QVariantList layoutLines(const QDate &rowStart) const; 0085 IncidenceOccurrenceModel *mSourceModel{nullptr}; 0086 int mPeriodLength{7}; 0087 MultiDayIncidenceModel::Filters m_filters; 0088 // KalendarConfig *m_config = nullptr; 0089 }; 0090 0091 Q_DECLARE_OPERATORS_FOR_FLAGS(MultiDayIncidenceModel::Filters)