Files
MuditaOS/module-apps/apps-common/DatabaseModel.hpp
Lefucjusz d90576e4e6 [MOS-972] Fixed missing contact entries when scrolling phonebook
Fix of the issue that in some cases contact entry
would not be displayed on any page in case it
was on the boundary of two pages.
2023-07-21 13:31:45 +02:00

89 lines
2.1 KiB
C++

// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#pragma once
#include <module-gui/gui/widgets/ListItemProvider.hpp>
#include <cstdint>
#include <vector>
#include <utility>
#include <algorithm>
#include <apps-common/ApplicationCommon.hpp>
namespace app
{
template <class T>
class DatabaseModel
{
protected:
ApplicationCommon *application = nullptr;
unsigned int recordsCount = std::numeric_limits<unsigned int>::max();
int modelIndex = 0;
std::vector<std::shared_ptr<T>> records;
public:
explicit DatabaseModel(ApplicationCommon *app) : application{app}
{}
virtual ~DatabaseModel()
{
clear();
}
virtual bool updateRecords(std::vector<T> dbRecords)
{
modelIndex = 0;
records.clear();
assert(dbRecords.size() <= recordsCount);
if (dbRecords.empty()) {
LOG_INFO("DB is empty");
return false;
}
for (const auto &dbRecord : dbRecords) {
records.push_back(std::make_shared<T>(dbRecord));
}
return true;
}
void clear()
{
records.clear();
recordsCount = 0;
}
std::shared_ptr<T> getRecord(gui::Order order)
{
int index = 0;
switch (order) {
case gui::Order::Next:
index = modelIndex;
modelIndex++;
break;
case gui::Order::Previous:
index = records.size() - 1 + modelIndex;
modelIndex--;
break;
default:
break;
}
if (!isIndexValid(index)) {
return nullptr;
}
return records[index];
}
[[nodiscard]] bool isIndexValid(unsigned int index) const noexcept
{
return index < records.size();
}
};
} /* namespace app */