Larger improvements

This commit is contained in:
feedc0de committed 2019-04-07 18:20:01 +02:00
1 parent b1ce4ecf64
commit 0704012542
22 files changed
+553 -185

No files matched your search

+104 -63
View File
@@ -9,23 +9,27 @@ ChecklistModel::ChecklistModel(const QStringList &items, QObject *parent) :
QAbstractListModel(parent)
{
for (const auto &item : items)
m_items.append(std::make_pair(item, true));
m_items.append({ item, item, true });
}
ChecklistModel::ChecklistModel(const QList<std::pair<QString, bool> > &items, QObject *parent) :
ChecklistModel::ChecklistModel(const QList<ChecklistItem> &items, QObject *parent) :
QAbstractListModel(parent),
m_items(items)
{
}
QStringList ChecklistModel::items() const
const QList<ChecklistModel::ChecklistItem> &ChecklistModel::items() const
{
QStringList items;
return m_items;
}
for (const auto &pair : m_items)
items.append(std::get<0>(pair));
void ChecklistModel::setItems(const QList<ChecklistItem> &items)
{
emit beginResetModel();
return items;
m_items = items;
emit endResetModel();
}
void ChecklistModel::setItems(const QStringList &items)
@@ -35,38 +39,93 @@ void ChecklistModel::setItems(const QStringList &items)
m_items.clear();
for (const auto &item : items)
m_items.append(std::make_pair(item, true));
m_items.append({ item, item, true });
emit endResetModel();
}
void ChecklistModel::setItems(const QList<std::pair<QString, bool> > &items)
{
emit beginResetModel();
m_items = items;
emit endResetModel();
}
QStringList ChecklistModel::enabledItems() const
QStringList ChecklistModel::itemTexts() const
{
QStringList items;
for (const auto &pair : m_items)
if (std::get<1>(pair))
items.append(std::get<0>(pair));
for (const auto &item : m_items)
items.append(item.displayText);
return items;
}
QStringList ChecklistModel::disabledItems() const
QVariantList ChecklistModel::itemDatas() const
{
QVariantList items;
for (const auto &item : m_items)
items.append(item.data);
return items;
}
QList<ChecklistModel::ChecklistItem> ChecklistModel::enabledItems() const
{
QList<ChecklistModel::ChecklistItem> items;
for (const auto &item : m_items)
if (item.checked)
items.append(item);
return items;
}
QList<ChecklistModel::ChecklistItem> ChecklistModel::disabledItems() const
{
QList<ChecklistModel::ChecklistItem> items;
for (const auto &item : m_items)
if (!item.checked)
items.append(item);
return items;
}
QStringList ChecklistModel::enabledTexts() const
{
QStringList items;
for (const auto &pair : m_items)
if (!std::get<1>(pair))
items.append(std::get<0>(pair));
for (const auto &item : m_items)
if (item.checked)
items.append(item.displayText);
return items;
}
QStringList ChecklistModel::disabledTexts() const
{
QStringList items;
for (const auto &item : m_items)
if (!item.checked)
items.append(item.displayText);
return items;
}
QVariantList ChecklistModel::enabledItemDatas() const
{
QVariantList items;
for (const auto &item : m_items)
if (item.checked)
items.append(item.data);
return items;
}
QVariantList ChecklistModel::disabledItemDatas() const
{
QVariantList items;
for (const auto &item : m_items)
if (!item.checked)
items.append(item.data);
return items;
}
@@ -75,57 +134,38 @@ int ChecklistModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid())
return 0;
return m_items.count();
}
QModelIndex ChecklistModel::sibling(int row, int column, const QModelIndex &idx) const
{
if (!idx.isValid() || column != 0 || row >= m_items.count() || row < 0)
return QModelIndex();
return createIndex(row, 0);
}
QMap<int, QVariant> ChecklistModel::itemData(const QModelIndex &index) const
{
if (!checkIndex(index, CheckIndexOption::IndexIsValid | CheckIndexOption::ParentIsInvalid))
return QMap<int, QVariant>{};
const auto &item = m_items.at(index.row());
return QMap<int, QVariant>{{
std::make_pair<int>(Qt::DisplayRole, std::get<0>(item)),
std::make_pair<int>(Qt::EditRole, std::get<0>(item)),
std::make_pair<int>(Qt::CheckStateRole, std::get<1>(item) ? Qt::Checked : Qt::Unchecked)
}};
}
bool ChecklistModel::setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles)
{
if (roles.isEmpty())
return false;
if (std::any_of(roles.keyBegin(), roles.keyEnd(), [](int role) { return role != Qt::CheckStateRole; }))
return false;
auto roleIter = roles.constFind(Qt::CheckStateRole);
Q_ASSERT(roleIter != roles.constEnd());
return setData(index, roleIter.value(), roleIter.key());
}
QVariant ChecklistModel::data(const QModelIndex &index, int role) const
{
if (index.row() < 0 || index.row() >= m_items.size())
return QVariant();
return {};
const auto &item = m_items.at(index.row());
if (role == Qt::DisplayRole || role == Qt::EditRole)
return std::get<0>(item);
if (role == Qt::CheckStateRole)
return std::get<1>(item) ? Qt::Checked : Qt::Unchecked;
switch (role)
{
case Qt::DisplayRole: return item.displayText;
case Qt::EditRole: return item.data;
case Qt::CheckStateRole: return item.checked ? Qt::Checked : Qt::Unchecked;
}
return QVariant();
}
bool ChecklistModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
if (index.row() >= 0 && index.row() < m_items.size() && role == Qt::CheckStateRole)
if (index.row() < 0 || index.row() >= m_items.size())
return false;
auto &item = m_items[index.row()];
switch (role)
{
auto &item = m_items[index.row()];
std::get<1>(item) = value.toBool();
case Qt::CheckStateRole:
item.checked = value.toBool();
emit dataChanged(index, index, { Qt::CheckStateRole });
return true;
}
@@ -137,5 +177,6 @@ Qt::ItemFlags ChecklistModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return QAbstractListModel::flags(index);
return QAbstractListModel::flags(index) | Qt::ItemIsUserCheckable;
}