#ifndef NAMESPACEITEMMODEL_H #define NAMESPACEITEMMODEL_H #include #include "PgNamespace.h" #include #include class PgNamespaceContainer; class NamespaceItemModel: public QAbstractItemModel { public: NamespaceItemModel(QObject *parent = 0); void init(std::shared_ptr ns); virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; virtual QModelIndex parent(const QModelIndex &index) const override; virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override; virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override; virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; virtual bool setData(const QModelIndex &index, const QVariant &value, int role) override; virtual Qt::ItemFlags flags(const QModelIndex &index) const override; template void getCheckedNamespaces(I inserter) const { for (auto g : groups) for (auto l : g->leaves) if (l->checked) inserter = l->ns.oid; } private: class Node { public: virtual ~Node() {} virtual int getRowCount() const = 0; virtual Qt::CheckState getCheckState() const = 0; }; class GroupNode; class LeafNode: public Node { public: std::weak_ptr parent; bool checked = false; PgNamespace ns; LeafNode(std::weak_ptr p, const PgNamespace &nspace) : parent(p) , ns(nspace) {} virtual int getRowCount() const override { return 0; } virtual Qt::CheckState getCheckState() const override { return checked ? Qt::Checked : Qt::Unchecked; } bool operator < (const LeafNode &rhs) const { return ns.name < rhs.ns.name; } }; class GroupNode: public Node { public: using LeafVec = std::vector>; QString name; LeafVec leaves; GroupNode(QString n) : name(n) {} virtual int getRowCount() const override { return leaves.size(); } void sortLeaves() { std::sort(leaves.begin(), leaves.end(), [] (auto l, auto r) -> bool { return *l < *r; }); } virtual Qt::CheckState getCheckState() const override { bool some_checked = false; bool some_unchecked = false; for (auto l : leaves) { if (l->checked) some_checked = true; else some_unchecked = true; } Qt::CheckState result; if (some_checked && some_unchecked) result = Qt::PartiallyChecked; else if (some_checked) result = Qt::Checked; else result = Qt::Unchecked; return result; } }; using GroupVec = std::vector>; GroupVec groups; }; #endif // NAMESPACEITEMMODEL_H