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;
}