| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #include "lc_layertreeitem.h" |
| | #include "rs_layer.h" |
| |
|
| | LC_LayerTreeItem::LC_LayerTreeItem(LC_LayerTreeItem *parent): |
| | m_parentItem { parent}{ |
| | } |
| |
|
| | LC_LayerTreeItem::LC_LayerTreeItem(const QString &itemName, RS_Layer *actualLayer, LC_LayerTreeItem *parent){ |
| | m_parentItem = parent; |
| | m_layer = actualLayer; |
| | name = itemName; |
| | m_indent = parent->getIndent() + 1; |
| | } |
| |
|
| | LC_LayerTreeItem::~LC_LayerTreeItem(){ |
| | qDeleteAll(m_childItems); |
| | } |
| |
|
| | void LC_LayerTreeItem::appendChild(LC_LayerTreeItem *item){ |
| | m_childItems.append(item); |
| | } |
| |
|
| | LC_LayerTreeItem *LC_LayerTreeItem::child(int row) const { |
| | return m_childItems.value(row); |
| | } |
| |
|
| | int LC_LayerTreeItem::childCount() const{ |
| | return m_childItems.count(); |
| | } |
| |
|
| | int LC_LayerTreeItem::childCountAll() const{ |
| | int result = childCount(); |
| | if (isVirtual()){ |
| | const int count = m_childItems.length(); |
| | for (int i = 0; i < count; i++) { |
| | LC_LayerTreeItem *child = m_childItems.at(i); |
| | result = result + (child->childCountAll()); |
| | } |
| | } |
| | return result; |
| | } |
| |
|
| | LC_LayerTreeItem *LC_LayerTreeItem::parent() const { |
| | return m_parentItem; |
| | } |
| |
|
| | int LC_LayerTreeItem::row() const{ |
| | if (m_parentItem) |
| | return m_parentItem->m_childItems.indexOf(const_cast<LC_LayerTreeItem *>(this)); |
| | return 0; |
| | } |
| |
|
| | bool LC_LayerTreeItem::isVirtual() const{ |
| | return this->m_layer == nullptr; |
| | } |
| | |
| | |
| | |
| | void LC_LayerTreeItem::sortChildren(){ |
| | int count = m_childItems.length(); |
| |
|
| | if (count > 0){ |
| | std::stable_sort(m_childItems.begin(), m_childItems.end(), [](LC_LayerTreeItem *l0, LC_LayerTreeItem *l1) -> bool{ |
| | return l0->getName() < l1->getName(); |
| | }); |
| |
|
| | for (int i = 0; i < count; i++) { |
| | LC_LayerTreeItem *child = m_childItems.at(i); |
| | child->sortChildren(); |
| | } |
| | } |
| | } |
| | |
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeItem::updateCalculatedFlagsForDescendentVirtualLayers(){ |
| | if (isVirtual()){ |
| | int count = m_childItems.length(); |
| | m_virtualConstruction = true; |
| | m_virtualLocked = true; |
| | m_virtualPrint = true; |
| | m_virtualVisible = true; |
| | for (int i = 0; i < count; i++) { |
| | LC_LayerTreeItem *child = m_childItems.at(i); |
| | child->updateCalculatedFlagsForDescendentVirtualLayers(); |
| |
|
| | m_virtualConstruction &= child->isConstruction(); |
| | m_virtualVisible = m_virtualVisible && child->isVisible(); |
| | m_virtualPrint &= child->isPrint(); |
| | m_virtualLocked &= child->isLocked(); |
| | } |
| | } |
| | } |
| | |
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeItem::collectLayers(QList<RS_Layer *> &result, LC_LayerTreeItemAcceptor *acceptor, bool includeSelf){ |
| | if (includeSelf){ |
| | if (m_layer){ |
| | if (acceptor->acceptLayerTreeItem(this)){ |
| | result << m_layer; |
| | } |
| | } |
| | } |
| |
|
| | int count = m_childItems.length(); |
| | for (int i = 0; i < count; i++) { |
| | LC_LayerTreeItem *child = m_childItems.at(i); |
| | if (child->isVirtual()){ |
| | child->collectLayers(result, acceptor); |
| | } else { |
| | if (acceptor->acceptLayerTreeItem(child)){ |
| | result << child->getLayer(); |
| | child->collectLayers(result, acceptor); |
| | } |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeItem::collectDescendantChildren(QList<LC_LayerTreeItem *> &result, LC_LayerTreeItemAcceptor *acceptor, bool includeSelf){ |
| | if (includeSelf){ |
| | result << this; |
| | } |
| |
|
| | int count = m_childItems.length(); |
| | for (int i = 0; i < count; i++) { |
| | LC_LayerTreeItem *child = m_childItems.at(i); |
| | if (acceptor->acceptLayerTreeItem(child)){ |
| | result << child; |
| | } |
| | if (child->childCount() > 0){ |
| | child->collectDescendantChildren(result, acceptor); |
| | } |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | LC_LayerTreeItem *LC_LayerTreeItem::findItemWithLayer(RS_Layer *source){ |
| | if (m_layer == source){ |
| | return this; |
| | } |
| | int count = m_childItems.length(); |
| | for (int i = 0; i < count; i++) { |
| | LC_LayerTreeItem *child = m_childItems.at(i); |
| | LC_LayerTreeItem *res = child->findItemWithLayer(source); |
| | if (res != nullptr){ |
| | return res; |
| | } |
| | } |
| | return nullptr; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeItem::collectPathToParent(QList<LC_LayerTreeItem *> &result, bool includeSelf){ |
| | if (includeSelf){ |
| | result << this; |
| | } |
| | LC_LayerTreeItem *parent = m_parentItem; |
| | while (parent != nullptr) { |
| | result << parent; |
| | parent = parent->parent(); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | bool LC_LayerTreeItem::isDescendantOf(const LC_LayerTreeItem *item) const { |
| | bool result = false; |
| | LC_LayerTreeItem *parent = m_parentItem; |
| | while (parent != nullptr) { |
| | if (parent == item){ |
| | result = true; |
| | break; |
| | } |
| | parent = parent->parent(); |
| | } |
| | return result; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | bool LC_LayerTreeItem::hasChildWithName(const QString &nameToFind, int layerTypeToFind) const { |
| | bool result = false; |
| | int count = m_childItems.length(); |
| | for (int i = 0; i < count; i++) { |
| | LC_LayerTreeItem *child = m_childItems.at(i); |
| | if (layerTypeToFind == child->getLayerType()){ |
| | if (child->getName() == nameToFind){ |
| | result = true; |
| | break; |
| | } |
| | } |
| | } |
| | return result; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | bool LC_LayerTreeItem::hasChildOfType(int type) const { |
| | bool result = false; |
| | int count = m_childItems.length(); |
| | for (int i = 0; i < count; i++) { |
| | LC_LayerTreeItem *child = m_childItems.at(i); |
| | if (child->getLayerType() == type){ |
| | result = true; |
| | break; |
| | } |
| | } |
| | return result; |
| | } |
| |
|
| | void LC_LayerTreeItem::setLayerType(int value){ |
| | m_layerType = value; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | LC_LayerTreeItem *LC_LayerTreeItem::getPrimaryItem() const { |
| | return m_primaryItem; |
| | } |
| |
|
| | void LC_LayerTreeItem::setPrimaryItem(LC_LayerTreeItem *item){ |
| | m_primaryItem = item; |
| | } |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeItem::markAsActivePath(){ |
| | m_partOfActivePath = true; |
| | LC_LayerTreeItem *parent = m_parentItem; |
| | while (parent != nullptr) { |
| | parent->m_partOfActivePath = true; |
| | parent = parent->parent(); |
| | } |
| | } |
| |
|
| | bool LC_LayerTreeItem::isPartOfActivePath() const{ |
| | return m_partOfActivePath; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | void LC_LayerTreeItem::rebuildActivePath(RS_Layer *layerToBeActive){ |
| |
|
| | |
| |
|
| | |
| | |
| | |
| | QList<LC_LayerTreeItem *> items = m_childItems; |
| | bool found = true; |
| | while (found) { |
| | int count = items.length(); |
| | found = false; |
| | for (int i = 0; i < count; i++) { |
| | LC_LayerTreeItem *child = items.at(i); |
| | if (child->isPartOfActivePath()){ |
| | child->m_partOfActivePath = false; |
| | child->setActiveLayer(false); |
| | items = child->m_childItems; |
| | found = true; |
| | break; |
| | } |
| | } |
| | } |
| |
|
| | auto *itemForActiveLayer = findItemWithLayer(layerToBeActive); |
| | if (itemForActiveLayer != nullptr){ |
| | itemForActiveLayer->setActiveLayer(true); |
| | itemForActiveLayer->markAsActivePath(); |
| | } |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | LC_LayerTreeItem *LC_LayerTreeItem::createLayerChild(const QString &childName, RS_Layer *childLayer){ |
| | auto *layerItem = new LC_LayerTreeItem(childName, childLayer, this); |
| | appendChild(layerItem); |
| | return layerItem; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | LC_LayerTreeItem *LC_LayerTreeItem::findPrimaryLayerChild(const QString &childNameToFind) const { |
| | LC_LayerTreeItem *result = nullptr; |
| | int count = m_childItems.length(); |
| | for (int i = 0; i < count; i++) { |
| | LC_LayerTreeItem *child = m_childItems.at(i); |
| | int type = child->getLayerType(); |
| | if (type == NORMAL){ |
| | QString childName = child->getName(); |
| | if (childNameToFind == childName){ |
| | result = child; |
| | break; |
| | } |
| | } |
| | } |
| | return result; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | LC_LayerTreeItem *LC_LayerTreeItem::getOrCreateVirtualChild(const QString &targetChildName){ |
| | LC_LayerTreeItem *result = nullptr; |
| | int count = m_childItems.length(); |
| | for (int i = 0; i < count; i++) { |
| | LC_LayerTreeItem *child = m_childItems.at(i); |
| | QString childName = child->getName(); |
| | if (targetChildName == childName){ |
| | result = child; |
| | break; |
| | } |
| | } |
| | if (result == nullptr){ |
| | result = new LC_LayerTreeItem(targetChildName, nullptr, this); |
| | result->setLayerType(VIRTUAL); |
| | appendChild(result); |
| | } |
| | return result; |
| | } |
| |
|
| | bool LC_LayerTreeItem::isVisible() const { |
| | if (isVirtual()){ |
| | return m_virtualVisible; |
| | } else { |
| | return !m_layer->isFrozen(); |
| | } |
| | } |
| |
|
| | bool LC_LayerTreeItem::isLocked() const { |
| | if (isVirtual()){ |
| | return m_virtualLocked; |
| | } else { |
| | return m_layer->isLocked(); |
| | } |
| | } |
| |
|
| | bool LC_LayerTreeItem::isPrint() const { |
| | if (isVirtual()){ |
| | return m_virtualPrint; |
| | } else { |
| | return m_layer->isPrint(); |
| | } |
| | } |
| |
|
| | bool LC_LayerTreeItem::isConstruction() const { |
| | if (isVirtual()){ |
| | return m_virtualConstruction; |
| | } else { |
| | return m_layer->isConstruction(); |
| | } |
| | } |
| |
|
| | bool LC_LayerTreeItem::isNotFrozen() const { |
| | return !m_layer->isFrozen(); |
| | } |
| |
|
| | QString LC_LayerTreeItem::getName() {return name;} |
| |
|
| | RS_Layer *LC_LayerTreeItem::getLayer() const {return this->m_layer;} |
| |
|
| | |
| | |
| | |
| | void LC_LayerTreeItem::invalidate(){ |
| | m_layerType = -1; |
| | int count = m_childItems.length(); |
| | for (int i = 0; i < count; i++) { |
| | LC_LayerTreeItem *child = m_childItems.at(i); |
| | child->invalidate(); |
| | } |
| | } |
| |
|
| | bool LC_LayerTreeItem::isInValid() const{ |
| | return m_layerType < 0; |
| | } |
| |
|