void ribi::cmap::QtConceptMap::DeleteNode(QtNode * const qtnode) { #ifndef NDEBUG const int n_items_before = this->scene()->items().count(); #endif //Delete the edges connected to this node { const std::vector<QtEdge *> qtedges = GetQtEdges(); const std::size_t sz = qtedges.size(); for (std::size_t i=0; i!=sz; ++i) { QtEdge * const qtedge = qtedges[i]; assert(qtedge); if (qtedge->GetFrom() == qtnode || qtedge->GetTo() == qtnode) { DeleteEdge(qtedge); } } } //Remove from non-GUI, which removes the left-overs GetConceptMap()->DeleteNode(qtnode->GetNode()); //Remove node from GUI this->scene()->removeItem(qtnode); #ifndef NDEBUG const int n_items_after = this->scene()->items().count(); assert(n_items_before - n_items_after >= 1 && "At least one item is deleted: one node and x edges"); assert(Collect<QtNode>(this->scene()).size() == this->GetConceptMap()->GetNodes().size() && "GUI and non-GUI concept map must match"); #endif }
void ribi::cmap::QtConceptMap::CheckInvariants() const noexcept { #ifndef NDEBUG //If there is one QtEdge selected, its Edge must be able to been found try { const auto qtedge = ExtractTheOneSelectedQtEdge(*GetScene()); //The QtEdge its edge must be in the concept map //Can only compare IDs, as QtEdge::GetEdge() and its equivalent in the concept map may mismatch assert( has_custom_edge_with_my_edge( qtedge->GetEdge(), GetConceptMap(), [](const Edge& lhs, const Edge& rhs) { return lhs.GetId() == rhs.GetId(); } ) ); const auto edge = ExtractTheOneSelectedEdge(this->GetConceptMap(), *GetScene()); assert(qtedge->GetEdge().GetId() == edge.GetId()); } catch (...) {} //No problem //All QtNodes must have a scene { const auto qtnodes = GetQtNodes(scene()); for (const auto qtnode: qtnodes) { assert(qtnode); assert(qtnode->scene()); } } //All QtEdges, their QtNodes and Arrows must have a scene { const auto qtedges = GetQtEdges(scene()); for (const auto qtedge: qtedges) { assert(qtedge); assert(qtedge->scene()); assert(qtedge->GetArrow()); assert(qtedge->GetArrow()->scene()); assert(qtedge->GetQtNode()); assert(qtedge->GetQtNode()->scene()); assert(qtedge->GetFrom()); assert(qtedge->GetFrom()->scene()); assert(qtedge->GetTo()); assert(qtedge->GetTo()->scene()); } } #endif }