Shape* CustomGraphicsScene::takeShape(Shape* _shape, bool _removeCardFlows) { if (m_shapes.contains(_shape)) { // // При необходимости соединяем между собой окружающие карточку элементы // if (_removeCardFlows) { // // ... если это карточка, конечно // if (CardShape* cardShape = dynamic_cast<CardShape*>(_shape)) { // // Определяем элементы, с которыми соединена карточка, чтобы соеденить их между собой // Flow* startFlow = cardFlow(cardShape, CARD_ON_FLOW_END); Flow* endFlow = nullptr; if (hasCards(cardShape)) { endFlow = cardFlow(lastCard(cardShape), CARD_ON_FLOW_START); } else { endFlow = cardFlow(cardShape, CARD_ON_FLOW_START); } // // ... если есть связь в оба конца, соединяем карточки на концах этих связей // if (startFlow != nullptr && endFlow != nullptr) { startFlow->setEndShape(endFlow->endShape()); removeShape(endFlow); } // // ... если есть связь только в начале, просто уберём эту связь // else if (startFlow != nullptr) { removeShape(startFlow); } // // ... если есть связь только в конце, просто уберём эту связь // else { removeShape(endFlow); } } } // // Извлекаем фигуру // disconnect(_shape, SIGNAL(stateIsAboutToBeChangedByUser()), this, SIGNAL(stateChangedByUser())); m_shapes.removeAll(_shape); // // ... извлекаем все вложенные карточки // for (QGraphicsItem* childItem : _shape->childItems()) { if (CardShape* childCard = dynamic_cast<CardShape*>(childItem)) { const bool DONT_REMOVE_FLOWS = false; takeShape(childCard, DONT_REMOVE_FLOWS); } } return _shape; } return NULL; }