/* 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; }