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 ¤tDate); 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 };