File indexing completed on 2024-04-28 04:40:43

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 #include <QQmlParserStatus>
0011 
0012 class InfiniteCalendarViewModel : public QAbstractListModel, public QQmlParserStatus
0013 {
0014     Q_OBJECT
0015     // Amount of dates to add each time the model adds more dates
0016     Q_PROPERTY(int datesToAdd READ datesToAdd WRITE setDatesToAdd NOTIFY datesToAddChanged)
0017     Q_PROPERTY(int scale READ scale WRITE setScale NOTIFY scaleChanged)
0018     Q_PROPERTY(QDateTime currentDate READ currentDate WRITE setCurrentDate NOTIFY currentDateChanged)
0019     Q_PROPERTY(QDateTime minimumDate READ minimumDate WRITE setMinimumDate NOTIFY minimumDateChanged)
0020     Q_PROPERTY(QDateTime maximumDate READ maximumDate WRITE setMaximumDate NOTIFY maximumDateChanged)
0021 
0022 public:
0023     // The decade scale is designed to be used in a 4x3 grid, so shows 12 years at a time
0024     enum Scale { WeekScale, MonthScale, YearScale, DecadeScale };
0025     Q_ENUM(Scale);
0026 
0027     enum Roles {
0028         StartDateRole = Qt::UserRole + 1,
0029         FirstDayOfMonthRole,
0030         SelectedMonthRole,
0031         SelectedYearRole,
0032     };
0033     Q_ENUM(Roles);
0034 
0035     explicit InfiniteCalendarViewModel(QObject *parent = nullptr);
0036     ~InfiniteCalendarViewModel() = default;
0037 
0038     void setup();
0039     QVariant data(const QModelIndex &idx, int role) const override;
0040     QHash<int, QByteArray> roleNames() const override;
0041     int rowCount(const QModelIndex &parent = {}) const override;
0042 
0043     void classBegin() override;
0044     void componentComplete() override;
0045 
0046     QDateTime currentDate() const;
0047     void setCurrentDate(const QDateTime &currentDate);
0048 
0049     QDateTime minimumDate() const;
0050     void setMinimumDate(const QDateTime &minimumDate);
0051 
0052     QDateTime maximumDate() const;
0053     void setMaximumDate(const QDateTime &maximumDate);
0054 
0055     Q_INVOKABLE void addDates(bool atEnd, const QDateTime startFrom = {});
0056 
0057     int datesToAdd() const;
0058     void setDatesToAdd(int datesToAdd);
0059 
0060     int scale();
0061     void setScale(int scale);
0062 
0063 Q_SIGNALS:
0064     void datesToAddChanged();
0065     void scaleChanged();
0066     void currentDateChanged();
0067     void minimumDateChanged();
0068     void maximumDateChanged();
0069 
0070 private:
0071     void addWeekDates(bool atEnd, const QDateTime &startFrom);
0072     void addMonthDates(bool atEnd, const QDateTime &startFrom);
0073     void addYearDates(bool atEnd, const QDateTime &startFrom);
0074     void addDecadeDates(bool atEnd, const QDateTime &startFrom);
0075 
0076     QDateTime m_currentDate;
0077     QDateTime m_minimumDate;
0078     QDateTime m_maximumDate;
0079     QVector<QDateTime> m_startDates;
0080     QVector<QDateTime> m_firstDayOfMonthDates;
0081     QLocale m_locale;
0082     int m_datesToAdd = 10;
0083     int m_scale = MonthScale;
0084     bool m_isCompleted = false;
0085 };