Refactorings of namespace filter
Moved details from header to cpp Refactored use of dynamic_cast into virtual calls on the *Node objects.
This commit is contained in:
parent
590a02599d
commit
206d734ff5
2 changed files with 148 additions and 150 deletions
|
|
@ -6,6 +6,14 @@
|
|||
#include <vector>
|
||||
#include <iterator>
|
||||
|
||||
namespace NamespaceItemModel_impl {
|
||||
|
||||
class Node;
|
||||
class LeafNode;
|
||||
class GroupNode;
|
||||
|
||||
}
|
||||
|
||||
class PgNamespaceContainer;
|
||||
|
||||
class NamespaceItemModel: public QAbstractItemModel {
|
||||
|
|
@ -24,97 +32,10 @@ public:
|
|||
virtual bool setData(const QModelIndex &index, const QVariant &value, int role) override;
|
||||
virtual Qt::ItemFlags flags(const QModelIndex &index) const override;
|
||||
|
||||
template <typename I>
|
||||
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<GroupNode> parent;
|
||||
bool checked = false;
|
||||
|
||||
PgNamespace ns;
|
||||
LeafNode(std::weak_ptr<GroupNode> 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<std::shared_ptr<LeafNode>>;
|
||||
|
||||
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<std::shared_ptr<GroupNode>>;
|
||||
using GroupVec = std::vector<std::shared_ptr<NamespaceItemModel_impl::GroupNode>>;
|
||||
|
||||
GroupVec groups;
|
||||
|
||||
};
|
||||
|
||||
#endif // NAMESPACEITEMMODEL_H
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue