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)