void RMemoryStorage::selectEntities(const QSet<REntity::Id>& entityIds, bool add, QSet<REntity::Id>* affectedEntities) { if (!add) { // deselect all first: QHash<RObject::Id, QSharedPointer<REntity> >::iterator it; for (it = entityMap.begin(); it != entityMap.end(); ++it) { QSharedPointer<REntity> e = *it; if (!e.isNull() && e->isSelected() && !entityIds.contains(e->getId())) { setEntitySelected(e, false, affectedEntities); } } } QSet<REntity::Id>::const_iterator it; for (it = entityIds.constBegin(); it != entityIds.constEnd(); ++it) { QSharedPointer<REntity> e = queryEntityDirect(*it); if (!e.isNull() && !e->isSelected() && !isLayerLocked(e->getLayerId()) && !isLayerFrozen(e->getLayerId())) { setEntitySelected(e, true, affectedEntities); } } }
/** * Checks recursively, if the given block is allowed to contain * references to the potential child block. * * \return true if a recusrion has been found. */ bool RMemoryStorage::checkRecursion( RBlock::Id blockId, RBlock::Id potentialChildBlockId) { if (blockId==potentialChildBlockId) { return true; } // iterate through all entities inside potential child block and check // if anything refers back to the given block: QSet<REntity::Id> ids = queryBlockEntities(potentialChildBlockId); QSet<REntity::Id>::iterator it; for (it = ids.begin(); it != ids.end(); ++it) { QSharedPointer<REntity> e = queryEntityDirect(*it); QSharedPointer<RBlockReferenceEntity> blockRef = e.dynamicCast< RBlockReferenceEntity> (); if (blockRef.isNull()) { continue; } if (blockRef->getReferencedBlockId() == blockId) { return true; } if (checkRecursion(blockId, blockRef->getReferencedBlockId())) { return true; } } return false; }
bool RMemoryStorage::deleteObject(RObject::Id objectId) { // TODO: save original object for rollback: if (inTransaction) { //transactionObjectMap.insert(objectId, QSharedPointer<RObject>()); } objectMap.remove(objectId); if (entityMap.contains(objectId)) { entityMap.remove(objectId); } if (blockMap.contains(objectId)) { blockMap.remove(objectId); } if (layerMap.contains(objectId)) { layerMap.remove(objectId); } QSharedPointer<REntity> entity = queryEntityDirect(objectId); if (!entity.isNull()) { blockEntityMap.remove(entity->getBlockId(), entity); //qDebug() << "deleteObject: removed " << entity->getId() << " from block " << entity->getBlockId(); } return true; }
/** * Selects first the top most parent in the entity hierarchy and then * all children of it. This is necessary for attributes which are * children of block references. */ void RMemoryStorage::setEntitySelected(QSharedPointer<REntity> entity, bool on, QSet<REntity::Id>* affectedEntities, bool onlyDescend) { // disabled: // attributes can be selected individually to edit their attributes // if (!onlyDescend) { // // entity has a parent: select parent instead // // (select block ref for attribute): // REntity::Id parentId = entity->getParentId(); // QSharedPointer<REntity> parent = queryEntityDirect(parentId); // if (!parent.isNull()) { // setEntitySelected(parent, on, affectedEntities); // return; // } // } entity->setSelected(on); if (affectedEntities!=NULL) { affectedEntities->insert(entity->getId()); } // if this is a parent, select all child entities (attributes for block ref): if (hasChildEntities(entity->getId())) { QSet<REntity::Id> childIds = queryChildEntities(entity->getId()); QSet<REntity::Id>::iterator it; for (it=childIds.begin(); it!=childIds.end(); it++) { REntity::Id childId = *it; QSharedPointer<REntity> child = queryEntityDirect(childId); if (child.isNull()) { continue; } setEntitySelected(child, on, affectedEntities, true); } } }
void RMemoryStorage::deselectEntities(const QSet<REntity::Id>& entityIds, QSet<REntity::Id>* affectedEntities) { QSet<REntity::Id>::const_iterator it; for (it = entityIds.constBegin(); it != entityIds.constEnd(); ++it) { QSharedPointer<REntity> e = queryEntityDirect(*it); if (!e.isNull() && e->isSelected()) { setEntitySelected(e, false, affectedEntities); } } }
QList<REntity::Id> RStorage::orderBackToFront(const QSet<REntity::Id>& entityIds) const { QMap<int, REntity::Id> res; QSet<REntity::Id>::const_iterator it; //maxDrawOrder = 0; for (it = entityIds.begin(); it != entityIds.end(); ++it) { QSharedPointer<REntity> e = queryEntityDirect(*it); if (!e.isNull()) { res.insertMulti(e->getDrawOrder(), *it); //maxDrawOrder = qMax(e->getDrawOrder()+1, maxDrawOrder); } } return res.values(); }
int RStorage::getMinDrawOrder() { QSet<REntity::Id> entityIds = queryAllEntities(false, false); QSet<REntity::Id>::const_iterator it; int minDrawOrder = maxDrawOrder; for (it = entityIds.begin(); it != entityIds.end(); ++it) { QSharedPointer<REntity> e = queryEntityDirect(*it); if (!e.isNull()) { if (e->getDrawOrder()<minDrawOrder) { minDrawOrder = e->getDrawOrder(); } } } return minDrawOrder - 1; }
bool RMemoryStorage::isSelected(REntity::Id entityId) { QSharedPointer<REntity> e = queryEntityDirect(entityId); return (!e.isNull() && e->isSelected()); }