File indexing completed on 2024-05-12 12:41:35
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 };