File indexing completed on 2024-05-12 16:14:33

0001 // SPDX-FileCopyrightText: 2021 Claudio Cambra <claudio.cambra@gmail.com>
0002 // SPDX-License-Identifier: LGPL-2.1-or-later
0003 
0004 #pragma once
0005 
0006 #include <QAbstractItemModel>
0007 #include <QCalendar>
0008 #include <QDateTime>
0009 #include <QLocale>
0010 
0011 class InfiniteCalendarViewModel : public QAbstractListModel
0012 {
0013     Q_OBJECT
0014     // Amount of dates to add each time the model adds more dates
0015     Q_PROPERTY(int datesToAdd READ datesToAdd WRITE setDatesToAdd NOTIFY datesToAddChanged)
0016     Q_PROPERTY(int scale READ scale WRITE setScale NOTIFY scaleChanged)
0017 
0018 public:
0019     // The decade scale is designed to be used in a 4x3 grid, so shows 12 years at a time
0020     enum Scale { WeekScale, MonthScale, YearScale, DecadeScale };
0021     Q_ENUM(Scale);
0022 
0023     enum Roles {
0024         StartDateRole = Qt::UserRole + 1,
0025         FirstDayOfMonthRole,
0026         SelectedMonthRole,
0027         SelectedYearRole,
0028     };
0029     Q_ENUM(Roles);
0030 
0031     explicit InfiniteCalendarViewModel(QObject *parent = nullptr);
0032     ~InfiniteCalendarViewModel() = default;
0033 
0034     void setup();
0035     QVariant data(const QModelIndex &idx, int role) const override;
0036     QHash<int, QByteArray> roleNames() const override;
0037     int rowCount(const QModelIndex &parent = {}) const override;
0038 
0039     Q_INVOKABLE void addDates(bool atEnd, const QDate startFrom = QDate());
0040     void addWeekDates(bool atEnd, const QDate &startFrom);
0041     void addMonthDates(bool atEnd, const QDate &startFrom);
0042     void addYearDates(bool atEnd, const QDate &startFrom);
0043     void addDecadeDates(bool atEnd, const QDate &startFrom);
0044 
0045     int datesToAdd() const;
0046     void setDatesToAdd(int datesToAdd);
0047 
0048     int scale();
0049     void setScale(int scale);
0050 
0051 Q_SIGNALS:
0052     void datesToAddChanged();
0053     void scaleChanged();
0054 
0055 private:
0056     QVector<QDate> m_startDates;
0057     QVector<QDate> m_firstDayOfMonthDates;
0058     QLocale m_locale;
0059     int m_datesToAdd = 10;
0060     int m_scale = MonthScale;
0061 };