48 lines
1.2 KiB
C++
48 lines
1.2 KiB
C++
#include "LayerTree.h"
|
|
|
|
LayerTree::LayerTree(QObject* parent)
|
|
: LayerTreeGroup("__root__", parent)
|
|
{
|
|
setVisible(Qt::Checked);
|
|
}
|
|
|
|
LayerTree::~LayerTree()
|
|
{
|
|
}
|
|
|
|
void LayerTree::setChildrenVisible(LayerTreeNode* n, Qt::CheckState state)
|
|
{
|
|
if (!n) return;
|
|
const auto& cs = n->children();
|
|
for (LayerTreeNode* c : cs) {
|
|
c->setVisible(state);
|
|
setChildrenVisible(c, state);
|
|
}
|
|
}
|
|
|
|
void LayerTree::updateParentVisibleFromChildren(LayerTreeNode* p)
|
|
{
|
|
if (!p) return;
|
|
if (p->childCount() == 0) return;
|
|
|
|
int checked = 0, unchecked = 0, partial = 0;
|
|
const auto& cs = p->children();
|
|
for (LayerTreeNode* c : cs) {
|
|
auto s = c->visible();
|
|
if (s == Qt::Checked) checked++;
|
|
else if (s == Qt::Unchecked) unchecked++;
|
|
else partial++;
|
|
}
|
|
|
|
Qt::CheckState newState;
|
|
if (partial > 0) newState = Qt::PartiallyChecked;
|
|
else if (checked > 0 && unchecked == 0) newState = Qt::Checked;
|
|
else if (unchecked > 0 && checked == 0) newState = Qt::Unchecked;
|
|
else newState = Qt::PartiallyChecked;
|
|
|
|
if (p->visible() != newState) {
|
|
p->setVisible(newState);
|
|
updateParentVisibleFromChildren(p->parentNode());
|
|
}
|
|
}
|