camper/src/calendarlistmodel.cpp

87 lines
2.0 KiB
C++
Raw Normal View History

#include "calendarlistmodel.h"
#include <QSqlQuery>
#include <QVariant>
#include "database.h"
struct CalendarListModel::Calendar
{
QString name;
};
CalendarListModel::CalendarListModel(QObject *parent)
: QAbstractListModel{parent}
, m_calendars{}
{
fetch();
}
CalendarListModel::~CalendarListModel()
{
qDeleteAll(m_calendars);
}
QVariant CalendarListModel::headerData(int section, Qt::Orientation orientation, int role) const
{
if (role != Qt::DisplayRole) {
return {};
}
return section;
}
int CalendarListModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid()) {
return 0;
}
return m_calendars.count();
}
QHash<int, QByteArray> CalendarListModel::roleNames() const
{
QHash<int, QByteArray> roles = QAbstractItemModel::roleNames();
roles[Name] = "name";
return roles;
}
void CalendarListModel::fetch()
{
Database::query([]() {
QSqlQuery query("select label from campsite order by label");
QVector<Calendar> calendars;
while (query.next()) {
Calendar calendar{query.value(0).toString()};
calendars.append(calendar);
}
return calendars;
}).then([this](const QVector<Calendar> &calendars) {
if (calendars.empty()) {
return;
}
beginInsertRows(QModelIndex(), 0, calendars.count() - 1);
for (const Calendar &calendar : calendars) {
m_calendars.append(new Calendar(calendar));
}
endInsertRows();
});
}
QVariant CalendarListModel::data(const QModelIndex &index, int role) const
{
if (!checkIndex(index,
QAbstractItemModel::CheckIndexOption::IndexIsValid
| QAbstractItemModel::CheckIndexOption::ParentIsInvalid)) {
return {};
}
Calendar *calendar = m_calendars.at(index.row());
switch (role) {
case Name:
return calendar->name;
}
return {};
}
#include "moc_calendarlistmodel.cpp"