// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "AllEventsModel.hpp" #include "application-calendar/widgets/AllEventsItem.hpp" #include "application-calendar/widgets/CalendarStyle.hpp" #include "module-apps/application-calendar/data/CalendarData.hpp" #include "module-apps/application-calendar/ApplicationCalendar.hpp" #include #include #include AllEventsModel::AllEventsModel(app::Application *app) : DatabaseModel(app), app::AsyncCallbackReceiver{app} { application = app; assert(app != nullptr); } unsigned int AllEventsModel::requestRecordsCount() { return recordsCount; } void AllEventsModel::requestRecords(const uint32_t offset, const uint32_t limit) { auto query = std::make_unique(offset, limit); auto task = app::AsyncQuery::createFromQuery(std::move(query), db::Interface::Name::Events); task->setCallback([this](auto response) { return handleQueryResponse(response); }); task->execute(application, this); } unsigned int AllEventsModel::getMinimalItemHeight() const { return style::window::label::big_h; } gui::ListItem *AllEventsModel::getItem(gui::Order order) { auto record = getRecord(order); if (record == nullptr) { LOG_DEBUG("Empty record in AllEventsModel::GetItem"); return nullptr; } auto *item = new gui::AllEventsItem(); item->setEvent(record); item->activatedCallback = [=](gui::Item &item) { LOG_INFO("Switch to event details window"); auto rec = std::make_unique(*record); auto data = std::make_unique(std::move(rec)); application->switchWindow(style::window::calendar::name::details_window, std::move(data)); return true; }; return item; } bool AllEventsModel::updateRecords(std::vector records) { DatabaseModel::updateRecords(std::move(records)); list->onProviderDataUpdate(); return true; } auto AllEventsModel::handleQueryResponse(db::QueryResult *queryResult) -> bool { auto response = dynamic_cast(queryResult); assert(response != nullptr); auto records = response->getResult(); list->setElementsCount(response->getCountResult()); auto app = dynamic_cast(application); assert(application != nullptr); if (records.empty()) { if (app->getEquivalentToEmptyWindow() == EquivalentWindow::AllEventsWindow) { auto filter = TimePointNow(); app->switchToNoEventsWindow(utils::translate("app_calendar_title_main"), filter); } } auto eventShift = app->getEventShift(); if (eventShift) { for (auto &record : records) { record.date_from += std::chrono::hours(eventShift); record.date_till += std::chrono::hours(eventShift); } } return this->updateRecords(std::move(records)); }