diff --git a/diagram.cpp b/diagram.cpp index d2b305bcb..95ce14b1d 100644 --- a/diagram.cpp +++ b/diagram.cpp @@ -618,10 +618,25 @@ DiagramContent Diagram::content() const { @return le contenu selectionne du schema. */ DiagramContent Diagram::selectedContent() { + invalidateMovedElements(); DiagramContent dc; dc.elements = elementsToMove().toList(); dc.textFields = textsToMove().toList(); dc.conductorsToMove = conductorsToMove().toList(); dc.conductorsToUpdate = conductorsToUpdate(); + + // recupere les conducteurs selectionnes isoles (= non deplacables mais supprimables) + foreach(QGraphicsItem *qgi, items()) { + if (Conductor *c = qgraphicsitem_cast(qgi)) { + if ( + c -> isSelected() &&\ + !c -> terminal1 -> parentItem() -> isSelected() &&\ + !c -> terminal2 -> parentItem() -> isSelected() + ) { + dc.otherConductors << c; + } + } + } + invalidateMovedElements(); return(dc); } diff --git a/diagramcommands.cpp b/diagramcommands.cpp index e3c798069..03a7aaa67 100644 --- a/diagramcommands.cpp +++ b/diagramcommands.cpp @@ -124,13 +124,13 @@ DeleteElementsCommand::DeleteElementsCommand( removed_content(content), diagram(dia) { - setText(QObject::tr("supprimer ") + removed_content.sentence(true)); - diagram -> qgiManager().manage(removed_content.items()); + setText(QObject::tr("supprimer ") + removed_content.sentence(DiagramContent::All)); + diagram -> qgiManager().manage(removed_content.items(DiagramContent::All)); } /// Destructeur DeleteElementsCommand::~DeleteElementsCommand() { - diagram -> qgiManager().release(removed_content.items()); + diagram -> qgiManager().release(removed_content.items(DiagramContent::All)); } /// annule les suppressions @@ -141,7 +141,7 @@ void DeleteElementsCommand::undo() { } // remet les conducteurs - foreach(Conductor *c, removed_content.conductors()) { + foreach(Conductor *c, removed_content.conductors(DiagramContent::AnyConductor)) { diagram -> addItem(c); c -> terminal1 -> addConductor(c); c -> terminal2 -> addConductor(c); @@ -156,7 +156,7 @@ void DeleteElementsCommand::undo() { /// refait les suppressions void DeleteElementsCommand::redo() { // enleve les conducteurs - foreach(Conductor *c, removed_content.conductors()) { + foreach(Conductor *c, removed_content.conductors(DiagramContent::AnyConductor)) { c -> terminal1 -> removeConductor(c); c -> terminal2 -> removeConductor(c); diagram -> removeItem(c); @@ -189,15 +189,17 @@ PasteDiagramCommand::PasteDiagramCommand( QUndoCommand(parent), content(c), diagram(dia), + filter(DiagramContent::Elements|DiagramContent::TextFields|DiagramContent::ConductorsToMove), first_redo(true) { - setText(QObject::tr("coller ") + content.sentence()); - diagram -> qgiManager().manage(content.items()); + + setText(QObject::tr("coller ") + content.sentence(filter)); + diagram -> qgiManager().manage(content.items(filter)); } /// Destructeur PasteDiagramCommand::~PasteDiagramCommand() { - diagram -> qgiManager().release(content.items()); + diagram -> qgiManager().release(content.items(filter)); } /// annule le coller @@ -251,7 +253,7 @@ CutDiagramCommand::CutDiagramCommand( ) : DeleteElementsCommand(dia, content, parent) { - setText(QObject::tr("couper ") + content.sentence(true)); + setText(QObject::tr("couper ") + content.sentence(DiagramContent::All)); } /// Destructeur @@ -277,7 +279,7 @@ MoveElementsCommand::MoveElementsCommand( movement(m), first_redo(true) { - setText(QObject::tr("d\351placer ") + content_to_move.sentence()); + setText(QObject::tr("d\351placer ") + content_to_move.sentence(DiagramContent::Elements|DiagramContent::TextFields|DiagramContent::ConductorsToUpdate|DiagramContent::ConductorsToMove)); } /// Destructeur diff --git a/diagramcommands.h b/diagramcommands.h index 5c327f957..f6af48709 100644 --- a/diagramcommands.h +++ b/diagramcommands.h @@ -130,6 +130,8 @@ class PasteDiagramCommand : public QUndoCommand { DiagramContent content; /// schema sur lequel on colle les elements et conducteurs Diagram *diagram; + /// entien pour filtrer le contenu du schema + int filter; /// booleen pour empecher le premier appel a redo bool first_redo; }; diff --git a/diagramcontent.cpp b/diagramcontent.cpp index d04b8b88f..30224e8ee 100644 --- a/diagramcontent.cpp +++ b/diagramcontent.cpp @@ -17,7 +17,8 @@ DiagramContent::DiagramContent(const DiagramContent &other) : elements(other.elements), textFields(other.textFields), conductorsToUpdate(other.conductorsToUpdate), - conductorsToMove(other.conductorsToMove) + conductorsToMove(other.conductorsToMove), + otherConductors(other.otherConductors) { } @@ -28,10 +29,15 @@ DiagramContent::~DiagramContent() { } /** + @param filter Types de conducteurs desires @return tous les conducteurs */ -QList DiagramContent::conductors() const { - return(conductorsToMove + conductorsToUpdate.keys()); +QList DiagramContent::conductors(int filter) const { + QList result; + if (filter & ConductorsToMove) result += conductorsToMove; + if (filter & ConductorsToUpdate) result += conductorsToUpdate.keys(); + if (filter & OtherConductors) result += otherConductors; + return(result); } /** @@ -42,50 +48,66 @@ void DiagramContent::clear() { textFields.clear(); conductorsToUpdate.clear(); conductorsToMove.clear(); + otherConductors.clear(); } /** + @param filter Types desires @return la liste des items formant le contenu du schema */ -QList DiagramContent::items() const { +QList DiagramContent::items(int filter) const { QList items_list; - foreach(QGraphicsItem *qgi, conductors()) items_list << qgi; - foreach(QGraphicsItem *qgi, elements) items_list << qgi; - foreach(QGraphicsItem *qgi, textFields) items_list << qgi; + foreach(QGraphicsItem *qgi, conductors(filter)) items_list << qgi; + if (filter & Elements) foreach(QGraphicsItem *qgi, elements) items_list << qgi; + if (filter & TextFields) foreach(QGraphicsItem *qgi, textFields) items_list << qgi; return(items_list); } /** - @param include_updated_conductors true pour compter les conducteurs mis a jour, false sinon + @param filter Types desires @return le nombre d'items formant le contenu du schema */ -int DiagramContent::count(bool include_updated_conductors) const { - int conductors_count = conductorsToMove.count(); - if (include_updated_conductors) conductors_count += conductorsToUpdate.count(); - - return( - elements.count() - + textFields.count() - + conductors_count - + conductorsToUpdate.count() - ); +int DiagramContent::count(int filter) const { + int count = 0; + if (filter & Elements) count += elements.count(); + if (filter & TextFields) count += textFields.count(); + if (filter & ConductorsToMove) count += conductorsToMove.count(); + if (filter & ConductorsToUpdate) count += conductorsToUpdate.count(); + if (filter & OtherConductors) count += otherConductors.count(); + return(count); } /** Permet de composer rapidement la proposition "x elements, y conducteurs et z champs de texte". - @param include_updated_conductors true pour compter les conducteurs mis a jour, false sinon + @param filter Types desires @return la proposition decrivant le contenu. */ -QString DiagramContent::sentence(bool include_updated_conductors) const { - int conductors_count = conductorsToMove.count(); - if (include_updated_conductors) conductors_count += conductorsToUpdate.count(); +QString DiagramContent::sentence(int filter) const { + int elements_count = (filter & Elements) ? elements.count() : 0; + int conductors_count = conductors(filter).count(); + int textfields_count = (filter & TextFields) ? textFields.count() : 0; return( QET::ElementsAndConductorsSentence( - elements.count(), + elements_count, conductors_count, - textFields.count() + textfields_count ) ); } + +/** + Permet de debugger un contenu de schema + @param d Object QDebug a utiliser pour l'affichage des informations de debug + @param c Contenu de schema a debugger +*/ +QDebug &operator<<(QDebug d, DiagramContent &c) { + d << "DiagramContent {" << "\n"; + d << " elements :" << c.elements << "\n"; + d << " conductorsToUpdate :" << c.conductorsToUpdate.keys() << "\n"; + d << " conductorsToMove :" << c.conductorsToMove << "\n"; + d << " otherConductors :" << c.otherConductors << "\n"; + d << "}"; + return(d.space()); +} diff --git a/diagramcontent.h b/diagramcontent.h index df4e6b953..9fa6fe0e9 100644 --- a/diagramcontent.h +++ b/diagramcontent.h @@ -21,6 +21,17 @@ class DiagramContent { DiagramContent(const DiagramContent &); ~DiagramContent(); + /// Permet de filtrer facilement les differentes parties d'un schema + enum Filter { + Elements = 1, + TextFields = 2, + ConductorsToMove = 4, + ConductorsToUpdate = 8, + OtherConductors = 16, + AnyConductor = 28, + All = 31 + }; + /// Elements de texte du schema QList elements; /// Champs de texte du schema @@ -29,11 +40,14 @@ class DiagramContent { QHash conductorsToUpdate; /// Conducteurs a deplacer du schema QList conductorsToMove; + /// Conducteurs isoles (ni a deplacer, ni a mettre a jour) + QList otherConductors; - QList conductors() const; - QList items() const; - QString sentence(bool = false) const; - int count(bool = false) const; + QList conductors(int = AnyConductor) const; + QList items(int = All) const; + QString sentence(int = All) const; + int count(int = All) const; void clear(); }; +QDebug &operator<<(QDebug, DiagramContent &); #endif diff --git a/diagramview.cpp b/diagramview.cpp index 4bffde296..c1391132c 100644 --- a/diagramview.cpp +++ b/diagramview.cpp @@ -76,11 +76,6 @@ void DiagramView::selectInvert() { Supprime les composants selectionnes */ void DiagramView::deleteSelection() { - // si un item a le focus et que ce slot est appele, c'est sans doute parce - // que la touche suppr a ete enfoncee pour effacer une lettre et non la - // selection - if (scene -> focusItem()) return; - DiagramContent removed_content = scene -> selectedContent(); scene -> clearSelection(); scene -> undoStack().push(new DeleteElementsCommand(scene, removed_content)); @@ -197,9 +192,9 @@ void DiagramView::zoomReset() { */ void DiagramView::cut() { copy(); - DiagramContent removed_content = scene -> selectedContent(); + DiagramContent cut_content = scene -> selectedContent(); scene -> clearSelection(); - scene -> undoStack().push(new CutDiagramCommand(scene, scene -> selectedContent())); + scene -> undoStack().push(new CutDiagramCommand(scene, cut_content)); } /**