From b8d76329bced92d712185e5588dfd6061e8fe0f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Nicole?= Date: Tue, 17 Apr 2018 14:30:27 +0200 Subject: Implement PeriodDayEventModel Summary: Implements a model to load events. When finished, should fix T8225 TODO: - Use the parent / children model in qml, instead of relying on the ".events" attribute (using DelegateModel I think) Reviewers: cmollekopf Tags: #kube Maniphest Tasks: T8225 Differential Revision: https://phabricator.kde.org/D12089 --- framework/src/domain/perioddayeventmodel.h | 129 +++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 framework/src/domain/perioddayeventmodel.h (limited to 'framework/src/domain/perioddayeventmodel.h') diff --git a/framework/src/domain/perioddayeventmodel.h b/framework/src/domain/perioddayeventmodel.h new file mode 100644 index 00000000..e116d9a2 --- /dev/null +++ b/framework/src/domain/perioddayeventmodel.h @@ -0,0 +1,129 @@ +/* + Copyright (c) 2018 Michael Bohlender + Copyright (c) 2018 Christian Mollekopf + Copyright (c) 2018 Rémi Nicole + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published by + the Free Software Foundation; either version 2 of the License, or (at your + option) any later version. + + This library is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public + License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to the + Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. +*/ + +#pragma once + +#include + +#include +#include +#include +#include + +#include + +// Facility used to get a restricted period into a Sink model comprised of +// events, partitioned according to the day the events take place. +// +// Model Format +// ============ +// +// Day 0 +// |--- Event 0 starting at `periodStart + 0d` +// |--- Event 1 starting at `periodStart + 0d` +// '--- Event 2 starting at `periodStart + 0d` +// Day 1 +// '--- Event 0 starting at `periodStart + 1d` +// Day 2 +// Day 3 +// |--- Event 0 starting at `periodStart + 3d` +// '--- Event 1 starting at `periodStart + 3d` +// Day 4 +// ⋮ +// +// Implementation notes +// ==================== +// +// On the model side +// ----------------- +// +// Columns are never used. +// +// Top-level items just contains the ".events" attribute, and their rows +// correspond to their offset compared to the start of the period (in number of +// days). In that case the internalId contains DAY_ID. +// +// Direct children are events, and their rows corresponds to their index in +// their partition. In that case no internalId / internalPointer is used. +// +// Internally: +// ----------- +// +// On construction and on dataChanged, all events are processed and partitioned +// in partitionedEvents: +// +// QVector< QList > +// ~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// | | +// | '--- List of event pointers for that day +// '--- Partition / day +// +class PeriodDayEventModel : public QAbstractItemModel +{ + Q_OBJECT + + Q_PROPERTY(QVariant start READ periodStart WRITE setPeriodStart) + Q_PROPERTY(int length READ periodLength WRITE setPeriodLength) + +public: + using Event = Sink::ApplicationDomain::Event; + + enum Roles + { + Events = Qt::UserRole + 1, + Summary, + Description, + StartTime, + Duration, + }; + Q_ENUM(Roles); + PeriodDayEventModel(QObject *parent = nullptr); + ~PeriodDayEventModel() = default; + + QModelIndex index(int row, int column, const QModelIndex &parent = {}) const override; + QModelIndex parent(const QModelIndex &index) const override; + + int rowCount(const QModelIndex &parent) const override; + int columnCount(const QModelIndex &parent) const override; + + QVariant data(const QModelIndex &index, int role) const override; + + QHash roleNames() const override; + + QDate periodStart() const; + void setPeriodStart(const QDate &); + void setPeriodStart(const QVariant &); + int periodLength() const; + void setPeriodLength(int); + +private: + void partitionData(); + + int bucketOf(const QDate &candidate) const; + + QDate mPeriodStart; + int mPeriodLength = 7; + + QSharedPointer eventModel; + QVector>> partitionedEvents; + + static const constexpr quintptr DAY_ID = std::numeric_limits::max(); +}; -- cgit v1.2.3