diff --git a/src/declarativeimports/calendar/calendar.h b/src/declarativeimports/calendar/calendar.h --- a/src/declarativeimports/calendar/calendar.h +++ b/src/declarativeimports/calendar/calendar.h @@ -22,6 +22,7 @@ #define CALENDAR_H #include +#include #include #include #include @@ -29,9 +30,11 @@ #include "daydata.h" #include "daysmodel.h" -class Calendar : public QObject +class Calendar : public QObject, public QQmlParserStatus { Q_OBJECT + Q_INTERFACES(QQmlParserStatus) + /** * This property is used to determine which data from which month to show, it ensures * the day passed in the QDate is visible @@ -138,6 +141,9 @@ explicit Calendar(QObject *parent = 0); + void classBegin() override; + void componentComplete() override; + // Displayed date QDate displayedDate() const; void setDisplayedDate(const QDate &dateTime); @@ -202,6 +208,8 @@ void updateData(); private: + bool m_ready = false; + QDate m_displayedDate; QDate m_today; Types m_types; diff --git a/src/declarativeimports/calendar/calendar.cpp b/src/declarativeimports/calendar/calendar.cpp --- a/src/declarativeimports/calendar/calendar.cpp +++ b/src/declarativeimports/calendar/calendar.cpp @@ -39,6 +39,17 @@ // connect(m_dayHelper, SIGNAL(calendarChanged()), this, SLOT(updateData())); } +void Calendar::classBegin() +{ + +} + +void Calendar::componentComplete() +{ + m_ready = true; + updateData(); +} + QDate Calendar::displayedDate() const { return m_displayedDate; @@ -215,12 +226,13 @@ void Calendar::updateData() { - if (m_days == 0 || m_weeks == 0) { + if (!m_ready || m_days == 0 || m_weeks == 0) { return; } + const bool needsModelReset = m_dayList.isEmpty(); + m_dayList.clear(); - m_weekList = QJsonArray(); int totalDays = m_days * m_weeks; @@ -291,13 +303,24 @@ } } + const QJsonArray oldWeekList = m_weekList; + m_weekList = QJsonArray(); + // Fill weeksModel with the week numbers for (int i = mondayOffset; i < numOfDaysInCalendar; i += 7) { const DayData &data = m_dayList.at(i); m_weekList.append(QDate(data.yearNumber, data.monthNumber, data.dayNumber).weekNumber()); } - emit weeksModelChanged(); - m_daysModel->update(); + + if (m_weekList != oldWeekList) { + emit weeksModelChanged(); + } + + if (needsModelReset) { + m_daysModel->update(DaysModel::UpdateType::ModelReset); + } else { + m_daysModel->update(DaysModel::UpdateType::DataChanged); + } // qDebug() << "---------------------------------------------------------------"; // qDebug() << "Date obj: " << m_displayedDate; diff --git a/src/declarativeimports/calendar/daysmodel.h b/src/declarativeimports/calendar/daysmodel.h --- a/src/declarativeimports/calendar/daysmodel.h +++ b/src/declarativeimports/calendar/daysmodel.h @@ -33,6 +33,11 @@ Q_OBJECT public: + enum class UpdateType { + DataChanged, + ModelReset + }; + enum Roles { isCurrent = Qt::UserRole + 1, //containsHolidayItems, @@ -58,7 +63,7 @@ void agendaUpdated(const QDate &updatedDate); public Q_SLOTS: - void update(); + void update(UpdateType type = UpdateType::DataChanged); private Q_SLOTS: void onDataReady(const QMultiHash &data); diff --git a/src/declarativeimports/calendar/daysmodel.cpp b/src/declarativeimports/calendar/daysmodel.cpp --- a/src/declarativeimports/calendar/daysmodel.cpp +++ b/src/declarativeimports/calendar/daysmodel.cpp @@ -90,12 +90,16 @@ return QVariant(); } -void DaysModel::update() +void DaysModel::update(UpdateType type) { if (m_data->size() <= 0) { return; } + if (type == UpdateType::ModelReset) { + beginResetModel(); + } + m_eventsData.clear(); const QDate modelFirstDay(m_data->at(0).yearNumber, m_data->at(0).monthNumber, m_data->at(0).dayNumber); @@ -106,8 +110,13 @@ } } - // We always have 42 items (or weeks * num of days in week) so we only have to tell the view that the data changed. - emit dataChanged(index(0, 0), index(m_data->count() - 1, 0)); + if (type == UpdateType::ModelReset) { + endResetModel(); + } else if (type == UpdateType::DataChanged) { + // after we populated the model once, we always have 42 items (or weeks * num of days in week) + // so we only have to tell the view that the data changed. + emit dataChanged(index(0, 0), index(m_data->count() - 1, 0)); + } } void DaysModel::onDataReady(const QMultiHash &data) @@ -239,7 +248,7 @@ connect(m_pluginsManager, &EventPluginsManager::eventRemoved, this, &DaysModel::onEventRemoved); connect(m_pluginsManager, &EventPluginsManager::pluginsChanged, - this, &DaysModel::update); + this, [this] { update(); }); QMetaObject::invokeMethod(this, "update", Qt::QueuedConnection); }