Skip to content
Snippets Groups Projects
Commit a550996a authored by Emmanuel Lepage Vallee's avatar Emmanuel Lepage Vallee
Browse files

collection: Finish support for collection categories

Refs #68098
parent 1b178b25
No related branches found
No related tags found
No related merge requests found
...@@ -82,22 +82,27 @@ void CollectionInterface::addChildren(CollectionInterface* c) ...@@ -82,22 +82,27 @@ void CollectionInterface::addChildren(CollectionInterface* c)
bool CollectionInterface::add(ItemBase<QObject>* base) bool CollectionInterface::add(ItemBase<QObject>* base)
{ {
return d_ptr->m_pAdd(base); return d_ptr->m_fAdd(base);
} }
bool CollectionInterface::save(ItemBase<QObject>* base) bool CollectionInterface::save(ItemBase<QObject>* base)
{ {
return d_ptr->m_pSave(base); return d_ptr->m_fSave(base);
} }
bool CollectionInterface::edit(ItemBase<QObject>* base) bool CollectionInterface::edit(ItemBase<QObject>* base)
{ {
return d_ptr->m_pEdit(base); return d_ptr->m_fEdit(base);
} }
bool CollectionInterface::remove(ItemBase<QObject>* base) bool CollectionInterface::remove(ItemBase<QObject>* base)
{ {
return d_ptr->m_pRemove(base); return d_ptr->m_fRemove(base);
}
int CollectionInterface::size() const
{
return d_ptr->m_fSize();
} }
QMetaObject CollectionInterface::metaObject() QMetaObject CollectionInterface::metaObject()
......
...@@ -159,6 +159,12 @@ public: ...@@ -159,6 +159,12 @@ public:
*/ */
virtual bool clear ( ); virtual bool clear ( );
/**
* Return the number of elements tracked by this collection.
* This can usually be extracted from editor<T>()->items().size();
*/
virtual int size() const;
/** /**
* Return a pointer to the model implementing the CollectionManager. * Return a pointer to the model implementing the CollectionManager.
*/ */
......
...@@ -36,10 +36,11 @@ public: ...@@ -36,10 +36,11 @@ public:
///Use Qt introspection to make sure casting is valid ///Use Qt introspection to make sure casting is valid
QMetaObject m_pEditorType; QMetaObject m_pEditorType;
std::function<bool(ItemBase<QObject>*)> m_pAdd ; std::function<bool(ItemBase<QObject>*)> m_fAdd ;
std::function<bool(ItemBase<QObject>*)> m_pSave ; std::function<bool(ItemBase<QObject>*)> m_fSave ;
std::function<bool(ItemBase<QObject>*)> m_pEdit ; std::function<bool(ItemBase<QObject>*)> m_fEdit ;
std::function<bool(ItemBase<QObject>*)> m_pRemove ; std::function<bool(ItemBase<QObject>*)> m_fRemove ;
std::function<int() > m_fSize ;
}; };
template<typename T> template<typename T>
...@@ -52,18 +53,21 @@ d_ptr(new CollectionInterfacePrivate()) ...@@ -52,18 +53,21 @@ d_ptr(new CollectionInterfacePrivate())
d_ptr->m_pEditor = (void*) editor; d_ptr->m_pEditor = (void*) editor;
//The cast is safe because the metatype is checked earlier //The cast is safe because the metatype is checked earlier
d_ptr->m_pAdd = [editor](ItemBase<QObject>* item)->bool { d_ptr->m_fAdd = [editor](ItemBase<QObject>* item)->bool {
return editor->addNew(static_cast<T*>(item)); return editor->addNew(static_cast<T*>(item));
}; };
d_ptr->m_pSave = [editor](ItemBase<QObject>* item)->bool { d_ptr->m_fSave = [editor](ItemBase<QObject>* item)->bool {
return editor->edit(static_cast<T*>(item)); return editor->edit(static_cast<T*>(item));
}; };
d_ptr->m_pEdit = [editor](ItemBase<QObject>* item)->bool { d_ptr->m_fEdit = [editor](ItemBase<QObject>* item)->bool {
return editor->edit(static_cast<T*>(item)); return editor->edit(static_cast<T*>(item));
}; };
d_ptr->m_pRemove = [editor](ItemBase<QObject>* item)->bool { d_ptr->m_fRemove = [editor](ItemBase<QObject>* item)->bool {
return editor->remove(static_cast<T*>(item)); return editor->remove(static_cast<T*>(item));
}; };
d_ptr->m_fSize = [editor]()->int {
return editor->items().size();
};
} }
template<typename T> template<typename T>
......
...@@ -33,7 +33,6 @@ CollectionModelPrivate::CollectionModelPrivate(CollectionModel* parent) : QObjec ...@@ -33,7 +33,6 @@ CollectionModelPrivate::CollectionModelPrivate(CollectionModel* parent) : QObjec
CollectionModel::CollectionModel(QObject* parent) : QAbstractTableModel(parent), d_ptr(new CollectionModelPrivate(this)) CollectionModel::CollectionModel(QObject* parent) : QAbstractTableModel(parent), d_ptr(new CollectionModelPrivate(this))
{ {
connect(PersonModel::instance(),SIGNAL(newBackendAdded(CollectionInterface*)),d_ptr.data(),SLOT(slotUpdate()));
load(); load();
} }
...@@ -76,28 +75,34 @@ QVariant CollectionModel::data (const QModelIndex& idx, int role) const ...@@ -76,28 +75,34 @@ QVariant CollectionModel::data (const QModelIndex& idx, int role) const
if (idx.isValid()) { if (idx.isValid()) {
CollectionModelPrivate::ProxyItem* item = static_cast<CollectionModelPrivate::ProxyItem*>(idx.internalPointer()); CollectionModelPrivate::ProxyItem* item = static_cast<CollectionModelPrivate::ProxyItem*>(idx.internalPointer());
if (idx.column() > 0) if (idx.column() > 0 && item->collection)
return d_ptr->m_lExtensions[idx.column()-1]->data(item->collection,idx,role); return d_ptr->m_lExtensions[idx.column()-1]->data(item->collection,idx,role);
switch(role) { if (item->collection) {
case Qt::DisplayRole: switch(role) {
return item->collection->name(); case Qt::DisplayRole:
break; return item->collection->name();
case Qt::DecorationRole: break;
return item->collection->icon(); case Qt::DecorationRole:
break; return item->collection->icon();
// case Qt::CheckStateRole: break;
// return item->collection->isEnabled()?Qt::Checked:Qt::Unchecked; case Qt::UserRole:
case Qt::CheckStateRole: { return 'x'+QString::number(item->collection->size());
if (ItemModelStateSerializationDelegate::instance()) break;
return ItemModelStateSerializationDelegate::instance()->isChecked(item->collection)?Qt::Checked:Qt::Unchecked; case Qt::CheckStateRole: {
if (ItemModelStateSerializationDelegate::instance()) //TODO do better than that
return ItemModelStateSerializationDelegate::instance()->isChecked(item->collection)?Qt::Checked:Qt::Unchecked;
}
};
}
else {
switch(role) {
case Qt::DisplayRole:
return item->m_AltName;
break;
} }
}; }
} }
//else {
// CollectionModelPrivate::ProxyItem* item = static_cast<CollectionModelPrivate::ProxyItem*>(idx.internalPointer());
// return item->model->data(item->model->index(item->row,item->col));
//}
return QVariant(); return QVariant();
} }
...@@ -108,7 +113,7 @@ int CollectionModel::rowCount (const QModelIndex& parent) const ...@@ -108,7 +113,7 @@ int CollectionModel::rowCount (const QModelIndex& parent) const
} }
else { else {
CollectionModelPrivate::ProxyItem* item = static_cast<CollectionModelPrivate::ProxyItem*>(parent.internalPointer()); CollectionModelPrivate::ProxyItem* item = static_cast<CollectionModelPrivate::ProxyItem*>(parent.internalPointer());
return item->collection->children().size(); return item->m_Children.size();
} }
} }
...@@ -123,6 +128,11 @@ Qt::ItemFlags CollectionModel::flags(const QModelIndex& idx) const ...@@ -123,6 +128,11 @@ Qt::ItemFlags CollectionModel::flags(const QModelIndex& idx) const
if (!idx.isValid()) if (!idx.isValid())
return 0; return 0;
CollectionModelPrivate::ProxyItem* item = static_cast<CollectionModelPrivate::ProxyItem*>(idx.internalPointer()); CollectionModelPrivate::ProxyItem* item = static_cast<CollectionModelPrivate::ProxyItem*>(idx.internalPointer());
//Categories can only be displayed
if (!item->collection)
return Qt::ItemIsEnabled;
if (idx.column() > 0) { if (idx.column() > 0) {
//Make sure the cell is disabled if the row is //Make sure the cell is disabled if the row is
Qt::ItemFlags f = d_ptr->m_lExtensions[idx.column()-1]->flags(item->collection,idx); Qt::ItemFlags f = d_ptr->m_lExtensions[idx.column()-1]->flags(item->collection,idx);
...@@ -140,12 +150,12 @@ bool CollectionModel::setData (const QModelIndex& idx, const QVariant &value, in ...@@ -140,12 +150,12 @@ bool CollectionModel::setData (const QModelIndex& idx, const QVariant &value, in
Q_UNUSED(role) Q_UNUSED(role)
if (idx.isValid() && idx.column() > 0) { if (idx.isValid() && idx.column() > 0) {
CollectionModelPrivate::ProxyItem* item = static_cast<CollectionModelPrivate::ProxyItem*>(idx.internalPointer()); CollectionModelPrivate::ProxyItem* item = static_cast<CollectionModelPrivate::ProxyItem*>(idx.internalPointer());
return d_ptr->m_lExtensions[idx.column()-1]->setData(item->collection,idx,value,role); return (!item->collection)?false : d_ptr->m_lExtensions[idx.column()-1]->setData(item->collection,idx,value,role);
} }
if (role == Qt::CheckStateRole && idx.column() == 0) { if (role == Qt::CheckStateRole && idx.column() == 0) {
CollectionModelPrivate::ProxyItem* item = static_cast<CollectionModelPrivate::ProxyItem*>(idx.internalPointer()); CollectionModelPrivate::ProxyItem* item = static_cast<CollectionModelPrivate::ProxyItem*>(idx.internalPointer());
if (item) { if (item && item->collection) {
const bool old = item->collection->isEnabled(); const bool old = item->collection->isEnabled();
ItemModelStateSerializationDelegate::instance()->setChecked(item->collection,value==Qt::Checked); ItemModelStateSerializationDelegate::instance()->setChecked(item->collection,value==Qt::Checked);
emit dataChanged(index(idx.row(),0),index(idx.row(),columnCount()-1)); emit dataChanged(index(idx.row(),0),index(idx.row(),columnCount()-1));
...@@ -177,12 +187,9 @@ QModelIndex CollectionModel::index( int row, int column, const QModelIndex& pare ...@@ -177,12 +187,9 @@ QModelIndex CollectionModel::index( int row, int column, const QModelIndex& pare
if (row < parentItem->m_Children.size()) if (row < parentItem->m_Children.size())
item = parentItem->m_Children[row]; item = parentItem->m_Children[row];
else { else {
item = new CollectionModelPrivate::ProxyItem(); return QModelIndex();
item->parent = parentItem;
item->collection = parentItem->collection->children()[row];
parentItem->m_Children << item;
} }
item->row = row; item->row = row; //FIXME dead code?
item->col = column; item->col = column;
return createIndex(row,column,item); return createIndex(row,column,item);
} }
...@@ -191,15 +198,9 @@ QModelIndex CollectionModel::index( int row, int column, const QModelIndex& pare ...@@ -191,15 +198,9 @@ QModelIndex CollectionModel::index( int row, int column, const QModelIndex& pare
if (row < d_ptr->m_lTopLevelBackends.size()) if (row < d_ptr->m_lTopLevelBackends.size())
item = d_ptr->m_lTopLevelBackends[row]; item = d_ptr->m_lTopLevelBackends[row];
else { else {
return QModelIndex();
if (row >= PersonModel::instance()->collections().size())
return QModelIndex();
item = new CollectionModelPrivate::ProxyItem();
item->collection = PersonModel::instance()->collections()[row];
d_ptr->m_lTopLevelBackends << item;
} }
item->row = row; item->row = row; //FIXME dead code?
item->col = column; item->col = column;
return createIndex(item->row,item->col,item); return createIndex(item->row,item->col,item);
} }
...@@ -286,26 +287,34 @@ void CollectionModelPrivate::registerNew(CollectionInterface* col) ...@@ -286,26 +287,34 @@ void CollectionModelPrivate::registerNew(CollectionInterface* col)
if (!col) if (!col)
return; return;
ProxyItem* item = new ProxyItem(); ProxyItem* cat = m_hCategories[col->category()];
if (col->parent()) { if (col->category().isEmpty()){
ProxyItem* p = m_hBackendsNodes[col->parent()]; //TODO implement a default category
item->parent = p;
item->row = p->m_Children.size();
item->col = 0;
q_ptr->beginInsertRows(q_ptr->createIndex(p->row,p->col,p),p->m_Children.size(),p->m_Children.size());
p->m_Children << item;
q_ptr->endInsertRows();
} }
else {
item->parent = nullptr; if (!cat) {
item->row = m_lTopLevelBackends.size(); cat = new ProxyItem();
item->col = 0; cat->parent = nullptr;
cat->row = m_lTopLevelBackends.size();
cat->col = 0;
cat->m_AltName = col->category();
cat->collection = nullptr;
q_ptr->beginInsertRows(QModelIndex(),m_lTopLevelBackends.size(),m_lTopLevelBackends.size()); q_ptr->beginInsertRows(QModelIndex(),m_lTopLevelBackends.size(),m_lTopLevelBackends.size());
m_lTopLevelBackends << item; m_lTopLevelBackends << cat;
q_ptr->endInsertRows(); q_ptr->endInsertRows();
} }
ProxyItem* item = new ProxyItem();
ProxyItem* par = col->parent()?m_hBackendsNodes[col->parent()] : cat;
item->parent = par;
item->row = par->m_Children.size();
item->col = 0;
q_ptr->beginInsertRows(q_ptr->createIndex(par->row,par->col,par),par->m_Children.size(),par->m_Children.size());
par->m_Children << item;
q_ptr->endInsertRows();
item->collection = col ; item->collection = col ;
m_hBackendsNodes[col] = item; m_hBackendsNodes[col] = item;
......
...@@ -44,11 +44,13 @@ public: ...@@ -44,11 +44,13 @@ public:
CollectionInterface* collection; CollectionInterface* collection;
ProxyItem* parent; ProxyItem* parent;
QVector<ProxyItem*> m_Children; QVector<ProxyItem*> m_Children;
QString m_AltName;
}; };
QHash<CollectionInterface*,ProxyItem*> m_hBackendsNodes; QHash<CollectionInterface*,ProxyItem*> m_hBackendsNodes;
QVector<ProxyItem*> m_lTopLevelBackends; QVector<ProxyItem*> m_lTopLevelBackends;
QVector<CollectionExtensionInterface*> m_lExtensions; QVector<CollectionExtensionInterface*> m_lExtensions;
QHash<QString,ProxyItem*> m_hCategories;
static CollectionModel* m_spInstance; static CollectionModel* m_spInstance;
//Helper //Helper
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment