diff --git a/diagram.cpp b/diagram.cpp index 6da0f7269..05315eb99 100644 --- a/diagram.cpp +++ b/diagram.cpp @@ -37,9 +37,10 @@ Diagram::Diagram(QObject *parent) : draw_grid(true), use_border(true), moved_elements_fetched(false), - qgi_manager(this), draw_terminals(true) { + undo_stack = new QUndoStack(); + qgi_manager = new QGIManager(this); setBackgroundBrush(Qt::white); conductor_setter = new QGraphicsLineItem(0, 0); conductor_setter -> setZValue(1000000); @@ -59,8 +60,23 @@ Diagram::Diagram(QObject *parent) : Destructeur */ Diagram::~Diagram() { - if (conductor_setter -> scene()) removeItem(conductor_setter); - delete conductor_setter; + // suppression de la liste des annulations - l'undo stack fait appel au qgimanager pour supprimer certains elements + delete undo_stack; + // suppression du QGIManager - tous les elements qu'il connait sont supprimes + delete qgi_manager; + + // recense les items supprimables + QList deletable_items; + foreach(QGraphicsItem *qgi, items()) { + if (qgi -> parentItem()) continue; + if (qgraphicsitem_cast(qgi)) continue; + deletable_items << qgi; + } + + // suppression des items supprimables + foreach(QGraphicsItem *qgi_d, deletable_items) { + delete qgi_d; + } } /** @@ -469,7 +485,7 @@ bool Diagram::fromXml(QDomDocument &document, QPointF position, bool consider_in */ void Diagram::diagramTextChanged(DiagramTextItem *text_item, const QString &old_text, const QString &new_text) { if (!text_item) return; - undo_stack.push(new ChangeDiagramTextCommand(text_item, old_text, new_text)); + undo_stack -> push(new ChangeDiagramTextCommand(text_item, old_text, new_text)); } /** diff --git a/diagram.h b/diagram.h index ae8431979..7f757b819 100644 --- a/diagram.h +++ b/diagram.h @@ -75,8 +75,8 @@ class Diagram : public QGraphicsScene { QSet conductors_to_move; QHash conductors_to_update; QSet texts_to_move; - QGIManager qgi_manager; - QUndoStack undo_stack; + QGIManager *qgi_manager; + QUndoStack *undo_stack; bool draw_terminals; // methodes @@ -253,12 +253,12 @@ inline const QSet &Diagram::textsToMove() { /// @return la pile d'annulations de ce schema inline QUndoStack &Diagram::undoStack() { - return(undo_stack); + return(*undo_stack); } /// @return le egstionnaire de QGraphicsItem de ce schema inline QGIManager &Diagram::qgiManager() { - return(qgi_manager); + return(*qgi_manager); } /// @return true si les bornes sont affichees, false sinon diff --git a/diagramview.cpp b/diagramview.cpp index b77da5c35..c0cbaba22 100644 --- a/diagramview.cpp +++ b/diagramview.cpp @@ -30,6 +30,7 @@ @param parent Le QWidegt parent de cette vue de schema */ DiagramView::DiagramView(QWidget *parent) : QGraphicsView(parent), is_adding_text(false) { + setAttribute(Qt::WA_DeleteOnClose, true); setInteractive(true); setCacheMode(QGraphicsView::CacheBackground); setOptimizationFlags(QGraphicsView::DontSavePainterState|QGraphicsView::DontAdjustForAntialiasing); @@ -422,10 +423,8 @@ void DiagramView::closeEvent(QCloseEvent *event) { default: retour = true; // l'utilisateur dit non ou ferme le dialogue: c'est reussi } } - if (retour) { - event -> accept(); - delete this; - } else event -> ignore(); + if (retour) event -> accept(); + else event -> ignore(); }