From bbc8fcaefa1cc4c8dafb4d1453990154c7b00d3c Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Sun, 5 Aug 2018 12:21:13 +0200 Subject: A calendar filter --- framework/src/domain/daylongeventmodel.cpp | 15 +++++++++ framework/src/domain/daylongeventmodel.h | 5 +++ framework/src/domain/perioddayeventmodel.cpp | 14 +++++++++ framework/src/domain/perioddayeventmodel.h | 5 +++ framework/src/entitymodel.cpp | 47 +++++++++++++++++++++++++++- framework/src/entitymodel.h | 32 ++++++++++++++++--- framework/src/frameworkplugin.cpp | 1 + 7 files changed, 114 insertions(+), 5 deletions(-) (limited to 'framework/src') diff --git a/framework/src/domain/daylongeventmodel.cpp b/framework/src/domain/daylongeventmodel.cpp index 7775310b..53b50652 100644 --- a/framework/src/domain/daylongeventmodel.cpp +++ b/framework/src/domain/daylongeventmodel.cpp @@ -99,6 +99,10 @@ bool DayLongEventModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourc auto idx = sourceModel()->index(sourceRow, 0, sourceParent); auto event = idx.data(Sink::Store::DomainObjectRole).value(); + if (!mCalendarFilter.contains(event->getCalendar())) { + return false; + } + auto eventStart = event->getStartTime().date(); auto eventEnd = event->getEndTime().date(); @@ -141,3 +145,14 @@ void DayLongEventModel::setPeriodLength(int length) mPeriodLength = length; invalidateFilter(); } + +QSet DayLongEventModel::calendarFilter() const +{ + return mCalendarFilter; +} + +void DayLongEventModel::setCalendarFilter(const QSet &filter) +{ + mCalendarFilter = filter; + invalidateFilter(); +} diff --git a/framework/src/domain/daylongeventmodel.h b/framework/src/domain/daylongeventmodel.h index 12827bef..cd7f4e4b 100644 --- a/framework/src/domain/daylongeventmodel.h +++ b/framework/src/domain/daylongeventmodel.h @@ -35,6 +35,7 @@ class KUBE_EXPORT DayLongEventModel : public QSortFilterProxyModel Q_PROPERTY(QVariant start READ periodStart WRITE setPeriodStart) Q_PROPERTY(int length READ periodLength WRITE setPeriodLength) + Q_PROPERTY(QSet calendarFilter READ calendarFilter WRITE setCalendarFilter) public: using Event = Sink::ApplicationDomain::Event; @@ -64,11 +65,15 @@ public: int periodLength() const; void setPeriodLength(int); + QSet calendarFilter() const; + void setCalendarFilter(const QSet &); + private: QByteArray getColor(const QByteArray &calendar) const; QSharedPointer mModel; QSharedPointer mCalendarCache; + QSet mCalendarFilter; QDate mPeriodStart; int mPeriodLength = 7; diff --git a/framework/src/domain/perioddayeventmodel.cpp b/framework/src/domain/perioddayeventmodel.cpp index ed853129..149c0fcb 100644 --- a/framework/src/domain/perioddayeventmodel.cpp +++ b/framework/src/domain/perioddayeventmodel.cpp @@ -83,6 +83,9 @@ void PeriodDayEventModel::partitionData() SinkWarning() << "Invalid date in the eventModel, ignoring..."; continue; } + if (!mCalendarFilter.contains(event->getCalendar())) { + continue; + } int bucket = bucketOf(eventDate); SinkTrace() << "Adding event:" << event->getSummary() << "in bucket #" << bucket; @@ -322,3 +325,14 @@ void PeriodDayEventModel::setPeriodLength(int length) mPeriodLength = length; updateQuery(); } + +QSet PeriodDayEventModel::calendarFilter() const +{ + return mCalendarFilter; +} + +void PeriodDayEventModel::setCalendarFilter(const QSet &filter) +{ + mCalendarFilter = filter; + updateQuery(); +} diff --git a/framework/src/domain/perioddayeventmodel.h b/framework/src/domain/perioddayeventmodel.h index 2d1d0177..2f53486c 100644 --- a/framework/src/domain/perioddayeventmodel.h +++ b/framework/src/domain/perioddayeventmodel.h @@ -86,6 +86,7 @@ class KUBE_EXPORT PeriodDayEventModel : public QAbstractItemModel Q_PROPERTY(QVariant start READ periodStart WRITE setPeriodStart) Q_PROPERTY(int length READ periodLength WRITE setPeriodLength) + Q_PROPERTY(QSet calendarFilter READ calendarFilter WRITE setCalendarFilter) public: using Event = Sink::ApplicationDomain::Event; @@ -122,6 +123,9 @@ public: int periodLength() const; void setPeriodLength(int); + QSet calendarFilter() const; + void setCalendarFilter(const QSet &); + private: void updateQuery(); void partitionData(); @@ -137,6 +141,7 @@ private: QSharedPointer eventModel; QVector>> partitionedEvents; QSharedPointer mCalendarCache; + QSet mCalendarFilter; static const constexpr quintptr DAY_ID = std::numeric_limits::max(); }; diff --git a/framework/src/entitymodel.cpp b/framework/src/entitymodel.cpp index 5a79fdf2..e2a4ea2d 100644 --- a/framework/src/entitymodel.cpp +++ b/framework/src/entitymodel.cpp @@ -36,7 +36,7 @@ EntityModel::~EntityModel() } -QHash< int, QByteArray > EntityModel::roleNames() const +QHash EntityModel::roleNames() const { return mRoleNames; } @@ -152,3 +152,48 @@ QVariantMap EntityModel::data(int row) const } return map; } + + +CheckableEntityModel::CheckableEntityModel(QObject *parent) : EntityModel(parent) +{ +} + +CheckableEntityModel::~CheckableEntityModel() +{ + +} + +QHash CheckableEntityModel::roleNames() const +{ + auto roleNames = EntityModel::roleNames(); + roleNames.insert(Qt::CheckStateRole, "checked"); + return roleNames; +} + +QVariant CheckableEntityModel::data(const QModelIndex &index, int role) const +{ + if (role == Qt::CheckStateRole) { + const auto identifier = EntityModel::data(index, Qt::UserRole + 1).toByteArray(); + return mCheckedEntities.contains(identifier); + } + return EntityModel::data(index, role); +} + +bool CheckableEntityModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if (role == Qt::CheckStateRole) { + const auto identifier = EntityModel::data(index, Qt::UserRole + 1).toByteArray(); + if (value.toBool()) { + mCheckedEntities.insert(identifier); + } else { + mCheckedEntities.remove(identifier); + } + emit checkedEntitiesChanged(); + } + return EntityModel::setData(index, value, role); +} + +QSet CheckableEntityModel::checkedEntities() const +{ + return mCheckedEntities; +} diff --git a/framework/src/entitymodel.h b/framework/src/entitymodel.h index add66d78..e8c294a0 100644 --- a/framework/src/entitymodel.h +++ b/framework/src/entitymodel.h @@ -21,6 +21,8 @@ #include "kube_export.h" #include #include +#include +#include namespace Sink { class Query; @@ -43,13 +45,12 @@ public: SuccessStatus, }; Q_ENUMS(Status) - EntityModel(QObject *parent = Q_NULLPTR); - ~EntityModel(); + virtual ~EntityModel(); - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE; + virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - QHash roleNames() const Q_DECL_OVERRIDE; + virtual QHash roleNames() const override; void setAccountId(const QString &); QString accountId() const; @@ -74,3 +75,26 @@ private: QString mAccountId; QString mType; }; + + +class KUBE_EXPORT CheckableEntityModel : public EntityModel { + + Q_OBJECT + + Q_PROPERTY (QSet checkedEntities READ checkedEntities NOTIFY checkedEntitiesChanged) +public: + CheckableEntityModel(QObject *parent = Q_NULLPTR); + virtual ~CheckableEntityModel(); + + QHash roleNames() const override; + QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; + + QSet checkedEntities() const; + +signals: + void checkedEntitiesChanged(); + +private: + QSet mCheckedEntities; +}; diff --git a/framework/src/frameworkplugin.cpp b/framework/src/frameworkplugin.cpp index 5fc4eb27..f0261206 100644 --- a/framework/src/frameworkplugin.cpp +++ b/framework/src/frameworkplugin.cpp @@ -174,6 +174,7 @@ void FrameworkPlugin::registerTypes (const char *uri) qmlRegisterType(uri, 1, 0, "TextDocumentHandler"); qmlRegisterType(uri, 1, 0, "LogModel"); qmlRegisterType(uri, 1, 0, "EntityModel"); + qmlRegisterType(uri, 1, 0, "CheckableEntityModel"); qmlRegisterType(uri, 1, 0, "AccountFactory"); qmlRegisterType(uri, 1, 0, "AccountsModel"); -- cgit v1.2.3