diff --git a/diagramcommands.cpp b/diagramcommands.cpp index 40bda9651..af9429555 100644 --- a/diagramcommands.cpp +++ b/diagramcommands.cpp @@ -421,3 +421,54 @@ void ChangeInsetCommand::undo() { void ChangeInsetCommand::redo() { diagram -> border_and_inset.importInset(new_inset); } + +/** + Constructeur + @param dia Schema modifie + @param parent QUndoCommand parent +*/ +ChangeBorderCommand::ChangeBorderCommand(Diagram *dia, QUndoCommand *parent) : + QUndoCommand(QObject::tr("modifier les dimensions du sch\351ma"), parent), + diagram(dia), + columnsCountDifference(0), + columnsHeightDifference(0.0), + columnsWidthDifference(0.0), + headersHeightDifference(0.0) +{ +} + +/// Destructeur +ChangeBorderCommand::~ChangeBorderCommand() { +} + +/** + Applique les changements au schema + @param coeff comme les changements s'expriment sous forme de nombres dont + il suffit d'inverser le signe pour les annuler, ces valeurs sont ici + multipliees par le coefficient passe en parametre avant d'etre appliquees. + Pour resumer : 1 pour refaire, -1 pour annuler. +*/ +void ChangeBorderCommand::applyChanges(int coeff) { + // reference vers l'objet border_and_inset du schema + BorderInset &border = diagram -> border_and_inset; + if (columnsCountDifference) { + border.setNbColumns(border.nbColumn() + (columnsCountDifference * coeff)); + } + if (columnsHeightDifference) { + border.setColumnsHeight(border.columnsHeight() + (columnsHeightDifference * coeff)); + } + if (columnsWidthDifference) { + border.setColumnsWidth(border.columnsWidth() + (columnsWidthDifference * coeff)); + } + if (headersHeightDifference) { + border.setColumnsHeaderHeight(border.columnsHeaderHeight() + (headersHeightDifference * coeff)); + } +} + +void ChangeBorderCommand::undo() { + applyChanges(-1); +} + +void ChangeBorderCommand::redo() { + applyChanges(1); +} diff --git a/diagramcommands.h b/diagramcommands.h index bb8a782d8..bfe00dafb 100644 --- a/diagramcommands.h +++ b/diagramcommands.h @@ -253,11 +253,48 @@ class ChangeInsetCommand : public QUndoCommand { // attributs private: - /// DiagramTextItem modifie + /// Schema modifie Diagram *diagram; - /// texte avant changement + /// proprietes avant changement InsetProperties old_inset; - /// texte apres changement + /// proprietes apres changement InsetProperties new_inset; }; + +/** + Cette classe represente l'action de modifier : + -le nombre de colonnes d'un schema + -la hauteur des colonnes + -la largeur des colonnes + -la hauteur des en-tetes des colonnes +*/ +class ChangeBorderCommand : public QUndoCommand { + // constructeurs, destructeur + public: + ChangeBorderCommand(Diagram *, QUndoCommand * = 0); + virtual ~ChangeBorderCommand(); + private: + ChangeBorderCommand(const ChangeBorderCommand &); + + // methodes + public: + virtual void undo(); + virtual void redo(); + private: + virtual void applyChanges(int = 1); + + // attributs + private: + /// Diagram modifie + Diagram *diagram; + public: + /// Nombre de colonnes ajoutees / enlevees + int columnsCountDifference; + /// Delta pour la hauteur des colonnes + qreal columnsHeightDifference; + /// Delta pour la largeur des colonnes + qreal columnsWidthDifference; + /// Delta pour la hauteur des entetes des colonnes + qreal headersHeightDifference; +}; #endif diff --git a/diagramview.cpp b/diagramview.cpp index 0e3665f50..453cee030 100644 --- a/diagramview.cpp +++ b/diagramview.cpp @@ -524,30 +524,36 @@ bool DiagramView::hasSelectedItems() { Ajoute une colonne au schema. */ void DiagramView::addColumn() { - scene -> border_and_inset.addColumn(); + ChangeBorderCommand *cbc = new ChangeBorderCommand(scene); + cbc -> columnsCountDifference = 1; + scene -> undoStack().push(cbc); } /** Enleve une colonne au schema. */ void DiagramView::removeColumn() { - scene -> border_and_inset.removeColumn(); + ChangeBorderCommand *cbc = new ChangeBorderCommand(scene); + cbc -> columnsCountDifference = -1; + scene -> undoStack().push(cbc); } /** Agrandit le schema en hauteur */ void DiagramView::expand() { - qreal new_height = scene -> border_and_inset.columnsHeight() + 20.0; - scene -> border_and_inset.setColumnsHeight(new_height); + ChangeBorderCommand *cbc = new ChangeBorderCommand(scene); + cbc -> columnsHeightDifference = 20.0; + scene -> undoStack().push(cbc); } /** Retrecit le schema en hauteur */ void DiagramView::shrink() { - qreal new_height = scene -> border_and_inset.columnsHeight() - 20.0; - scene -> border_and_inset.setColumnsHeight(new_height); + ChangeBorderCommand *cbc = new ChangeBorderCommand(scene); + cbc -> columnsHeightDifference = 20.0; + scene -> undoStack().push(cbc); } /**