7#ifndef __KIS_CATEGORIZED_LIST_MODEL_H
8#define __KIS_CATEGORIZED_LIST_MODEL_H
10#include <QAbstractListModel>
11#include <QSortFilterProxyModel>
20 IsHeaderRole = Qt::UserRole + 1,
21 ExpandCategoryRole = Qt::UserRole + 2,
22 SortRole = Qt::UserRole + 3,
23 isLockedRole = Qt::UserRole + 4,
24 isLockableRole = Qt::UserRole + 5,
25 isToggledRole = Qt::UserRole + 6
35 QModelIndex changedIndex(index(row));
36 Q_EMIT dataChanged(changedIndex, changedIndex);
40 beginInsertRows(QModelIndex(), row, row);
48 beginRemoveRows(QModelIndex(), row, row);
56template<
class TEntry,
class TEntryToQStringConverter>
78 int rowCount(
const QModelIndex& parent)
const override {
83 QVariant
data(
const QModelIndex& idx,
int role = Qt::DisplayRole)
const override {
84 if (!idx.isValid())
return QVariant();
98 case Qt::CheckStateRole:
114 bool setData(
const QModelIndex& idx,
const QVariant&
value,
int role = Qt::EditRole)
override {
115 if (!idx.isValid())
return false;
126 case Qt::CheckStateRole:
136 Q_EMIT dataChanged(idx, idx, roles);
140 Qt::ItemFlags
flags(
const QModelIndex& idx)
const override {
141 if (!idx.isValid())
return Qt::NoItemFlags;
147 Qt::ItemFlags
flags = Qt::NoItemFlags;
150 flags |= Qt::ItemIsEnabled;
154 flags |= Qt::ItemIsSelectable;
157 flags |= Qt::ItemIsUserCheckable;
164 QModelIndex
indexOf(
const TEntry& entry)
const {
171 bool entryAt(TEntry& entry, QModelIndex index)
const {
172 int row = index.row();
179 entry = *item->
data();
198template<
class TModel>
206 : QSortFilterProxyModel(parent)
219 for (
int i = 0; i < rowCount(); i++) {
220 QModelIndex index = this->index(i, 0);
222 if (entryAt(e, index) && e == entry) {
227 return QModelIndex();
231 QModelIndex srcIndex = mapToSource(index);
232 return m_model->entryAt(entry, srcIndex);
238 setSourceModel(model);
239 setSortRole(TModel::SortRole);
243 const QModelIndex &right,
244 const QString &priorityCategory)
const {
246 QString leftKey = sourceModel()->data(left, sortRole()).toString();
247 QString rightKey = sourceModel()->data(right, sortRole()).toString();
249 bool leftIsSpecial = leftKey.startsWith(priorityCategory);
250 bool rightIsSpecial = rightKey.startsWith(priorityCategory);
252 return leftIsSpecial != rightIsSpecial ?
253 leftIsSpecial : leftKey < rightKey;
257 TModel *m_model {
nullptr};
float value(const T *src, size_t ch)
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
void setChecked(bool value)
DataItem * parentCategory() const
void setExpanded(bool value)
int rowFromItem(DataItem *item) const
DataItem * fetchOneEntry(const TEntry &entry) const
DataItem * itemFromRow(int row) const
const SpecificCategoriesMapper * categoriesMapper() const
KisCategorizedListModel(QObject *parent=0)
QVariant data(const QModelIndex &idx, int role=Qt::DisplayRole) const override
bool entryAt(TEntry &entry, QModelIndex index) const
int rowCount(const QModelIndex &parent) const override
KisCategoriesMapper< TEntry, TEntryToQStringConverter > SpecificCategoriesMapper
Qt::ItemFlags flags(const QModelIndex &idx) const override
SpecificCategoriesMapper::DataItem DataItem
SpecificCategoriesMapper m_mapper
bool setData(const QModelIndex &idx, const QVariant &value, int role=Qt::EditRole) override
SpecificCategoriesMapper * categoriesMapper()
QModelIndex indexOf(const TEntry &entry) const
void initializeModel(TModel *model)
KisSortedCategorizedListModel(QObject *parent)
bool entryAt(Entry_Type &entry, QModelIndex index) const
QModelIndex indexOf(const Entry_Type &entry) const
bool lessThanPriority(const QModelIndex &left, const QModelIndex &right, const QString &priorityCategory) const
TModel::Entry_Type Entry_Type
void slotRowChanged(int row)
void slotBeginRemoveRow(int row)
void slotBeginInsertRow(int row)