From b7fb9280032bde10ab942d0f2eeae50366a3dfda Mon Sep 17 00:00:00 2001 From: Minijackson Date: Tue, 10 Apr 2018 16:19:58 +0200 Subject: Implement the EventTreeModel + move test data in that model --- framework/src/domain/eventtreemodel.cpp | 249 ++++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100644 framework/src/domain/eventtreemodel.cpp (limited to 'framework/src/domain/eventtreemodel.cpp') diff --git a/framework/src/domain/eventtreemodel.cpp b/framework/src/domain/eventtreemodel.cpp new file mode 100644 index 00000000..784a40f9 --- /dev/null +++ b/framework/src/domain/eventtreemodel.cpp @@ -0,0 +1,249 @@ +/* + Copyright (c) 2016 Michael Bohlender + Copyright (c) 2016 Christian Mollekopf + + 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. +*/ + +#include "eventtreemodel.h" + +#include +#include +#include + +#include +#include +#include + +EventTreeModel::EventTreeModel(QObject *parent) : QAbstractItemModel(parent), partitionedEvents(7) +{ + Sink::Query query; + query.request(); + query.request(); + query.request(); + query.request(); + + eventModel = Sink::Store::loadModel(query); + + QObject::connect(eventModel.data(), &QAbstractItemModel::dataChanged, this, &EventTreeModel::partitionData); + + Sink::Store::synchronize(Sink::Query()); + + partitionData(); +} + +void EventTreeModel::partitionData() +{ + SinkLog() << "Partitioning event data"; + + for (int i = 0; i < 7; ++i) { + SinkLog() << "Clearing #" << i; + partitionedEvents[i].clear(); + } + + for (int i = 0; i < eventModel->rowCount(); ++i) { + auto event = eventModel->index(i, 0).data(Sink::Store::DomainObjectRole).value(); + int dayOfWeek = event->getStartTime().date().dayOfWeek(); + + Q_ASSERT(dayOfWeek != 0); + + SinkLog() << "Adding event in bucket #" << dayOfWeek; + + partitionedEvents[dayOfWeek - 1].append(event); + } + + // auto bottomRight = index(partitionedEvents[6].size(), eventModel->columnCount() - 1, index(6, + // 0)); + emit dataChanged({}, {}); +} + +QModelIndex EventTreeModel::index(int row, int column, const QModelIndex &parent) const +{ + SinkLog() << "Calling EventTreeModel::index with" << row << column << parent.isValid(); + + if (!hasIndex(row, column, parent)) { + return {}; + } + + if (!parent.isValid()) { + // Asking for a LocalEventListModel + + // TODO: Assuming week view + if (!(0 <= row && row <= 6)) { + return {}; + } + + return createIndex(row, column, DAY_ID); + } + + // Asking for an Event + auto day = static_cast(parent.internalId()); + + Q_ASSERT(0 <= day && day <= 6); + if (row >= partitionedEvents[day].size()) { + return {}; + } + + return createIndex(row, column, day); +} + +QModelIndex EventTreeModel::parent(const QModelIndex &index) const +{ + SinkLog() << "Calling GlobalEventListModel::parent with index:" << index.row() << index.column(); + + if (!index.isValid()) { + return {}; + } + + if (index.internalId() == DAY_ID) { + return {}; + } + + auto day = index.internalId(); + + return this->index(day, 0); +} + +int EventTreeModel::rowCount(const QModelIndex &parent) const +{ + if (!parent.isValid()) { + return 7; + } + + auto day = parent.internalId(); + + return partitionedEvents[day].size(); +} + +int EventTreeModel::columnCount(const QModelIndex &parent) const +{ + if (!parent.isValid()) { + return 1; + } + + return eventModel->columnCount(); +} + +bool EventTreeModel::hasChildren(const QModelIndex &parent) const +{ + return parent.internalId() == DAY_ID; +} + +QVariant EventTreeModel::data(const QModelIndex &id, int role) const +{ + if (hasChildren(id)) { + auto day = id.row(); + + switch (role) { + case Qt::DisplayRole: + switch (day) { + case 0: + return "Monday"; + case 1: + return "Tuesday"; + case 2: + return "Wednesday"; + case 3: + return "Thursday"; + case 4: + return "Friday"; + case 5: + return "Saturday"; + case 6: + return "Sunday"; + default: + SinkWarning() << "Unknown day"; + return {}; + } + case Events: + //{ + // auto result = QVariantList{}; + + // for (int i = 0; i < partitionedEvents[day].size(); ++i) { + // auto eventId = index(i, 0, id); + // SinkLog() << "Appending event:" << data(eventId, Summary); + // result.append(QVariantMap{ + // {"text", data(eventId, Summary)}, + // {"description", data(eventId, Description)}, + // {"starts", data(eventId, StartTime)}, + // {"duration", data(eventId, Duration)}, + // {"color", "#123"}, + // {"indention", 0}, + // }); + // } + + // return result; + //} + return QVariantList{ + QVariantMap{ + {"summary", "Hello, World!"}, + {"text", "Hello, World!"}, + {"description", "This is Hello, world!"}, + {"starts", 4}, + {"duration", 3}, + {"color", "#123"}, + {"indention", 0}, + }, + QVariantMap{ + {"summary", "Hello, World!"}, + {"text", "Hello, World!"}, + {"description", "This is Hello, world!"}, + {"starts", 8}, + {"duration", 3}, + {"color", "#456"}, + {"indention", 1}, + }, + }; + default: + SinkWarning() << "Unknown role for day:" << QMetaEnum::fromType().valueToKey(role); + return {}; + } + } + + auto day = static_cast(id.internalId()); + SinkLog() << "Fetching data for day" << day; + auto event = partitionedEvents[day].at(id.row()); + + switch (role) { + case Summary: + return event->getSummary(); + case Description: + return event->getDescription(); + case StartTime: + return event->getStartTime(); + case Duration: { + auto start = event->getStartTime(); + auto end = event->getEndTime(); + return start.secsTo(end) / 3600; + } + default: + SinkWarning() << "Unknown role for event:" << QMetaEnum::fromType().valueToKey(role); + return {}; + } +} + +QHash EventTreeModel::roleNames() const +{ + QHash roles; + + roles[Events] = "events"; + roles[Summary] = "summary"; + roles[Description] = "description"; + roles[StartTime] = "starts"; + roles[Duration] = "duration"; + + return roles; +} -- cgit v1.2.3