Ajout d'un menu contextuel sur le schema

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@202 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
xavierqet
2007-11-02 18:04:13 +00:00
parent 937f732782
commit 4fa3e665d9
5 changed files with 84 additions and 30 deletions

View File

@@ -404,7 +404,7 @@ bool Diagram::fromXml(QDomDocument &document, QPointF position, bool consider_in
foreach (Element *added_element, added_elements) added_items << added_element; foreach (Element *added_element, added_elements) added_items << added_element;
foreach (DiagramTextItem *added_text, added_texts) added_items << added_text; foreach (DiagramTextItem *added_text, added_texts) added_items << added_text;
foreach (QGraphicsItem *item, added_items) { foreach (QGraphicsItem *item, added_items) {
QPointF csg = item -> mapToScene(item -> boundingRect().topLeft()); QPointF csg = item -> mapToScene(item -> boundingRect()).boundingRect().topLeft();
qreal px = csg.x(); qreal px = csg.x();
qreal py = csg.y(); qreal py = csg.y();
if (!init) { if (!init) {

View File

@@ -138,9 +138,9 @@ DeleteElementsCommand::DeleteElementsCommand(
/// Destructeur /// Destructeur
DeleteElementsCommand::~DeleteElementsCommand() { DeleteElementsCommand::~DeleteElementsCommand() {
foreach(QGraphicsItem *qgi, removed_elements) diagram -> qgiManager().release(qgi);
foreach(QGraphicsItem *qgi, removed_conductors) diagram -> qgiManager().release(qgi);
foreach(QGraphicsItem *qgi, removed_texts) diagram -> qgiManager().release(qgi); foreach(QGraphicsItem *qgi, removed_texts) diagram -> qgiManager().release(qgi);
foreach(QGraphicsItem *qgi, removed_conductors) diagram -> qgiManager().release(qgi);
foreach(QGraphicsItem *qgi, removed_elements) diagram -> qgiManager().release(qgi);
} }
/// annule les suppressions /// annule les suppressions
@@ -213,9 +213,9 @@ PasteDiagramCommand::PasteDiagramCommand(
/// Destructeur /// Destructeur
PasteDiagramCommand::~PasteDiagramCommand() { PasteDiagramCommand::~PasteDiagramCommand() {
foreach(QGraphicsItem *qgi, elements) diagram -> qgiManager().release(qgi);
foreach(QGraphicsItem *qgi, conductors) diagram -> qgiManager().release(qgi);
foreach(QGraphicsItem *qgi, texts) diagram -> qgiManager().release(qgi); foreach(QGraphicsItem *qgi, texts) diagram -> qgiManager().release(qgi);
foreach(QGraphicsItem *qgi, conductors) diagram -> qgiManager().release(qgi);
foreach(QGraphicsItem *qgi, elements) diagram -> qgiManager().release(qgi);
} }
/// annule le coller /// annule le coller

View File

@@ -31,6 +31,10 @@ DiagramView::DiagramView(QWidget *parent) : QGraphicsView(parent), is_adding_tex
adjustSceneRect(); adjustSceneRect();
updateWindowTitle(); updateWindowTitle();
context_menu = new QMenu(this);
paste_here = new QAction(QIcon(":/ico/paste.png"), tr("Coller ici"), this);
connect(paste_here, SIGNAL(triggered()), this, SLOT(pasteHere()));
connect(scene, SIGNAL(selectionEmptinessChanged()), this, SLOT(slot_selectionChanged())); connect(scene, SIGNAL(selectionEmptinessChanged()), this, SLOT(slot_selectionChanged()));
connect(&(scene -> border_and_inset), SIGNAL(borderChanged(QRectF, QRectF)), this, SLOT(adjustSceneRect())); connect(&(scene -> border_and_inset), SIGNAL(borderChanged(QRectF, QRectF)), this, SLOT(adjustSceneRect()));
connect(&(scene -> undoStack()), SIGNAL(cleanChanged(bool)), this, SLOT(updateWindowTitle())); connect(&(scene -> undoStack()), SIGNAL(cleanChanged(bool)), this, SLOT(updateWindowTitle()));
@@ -244,48 +248,42 @@ void DiagramView::copy() {
} }
/** /**
importe les elements contenus dans le presse-papier dans le schema Importe les elements contenus dans le presse-papier dans le schema
@param pos coin superieur gauche (en coordonnees de la scene) du rectangle
englobant le contenu colle
@param clipboard_mode Type de presse-papier a prendre en compte
*/ */
void DiagramView::paste() { void DiagramView::paste(const QPointF &pos, QClipboard::Mode clipboard_mode) {
QString texte_presse_papier; QString texte_presse_papier = QApplication::clipboard() -> text(clipboard_mode);
if ((texte_presse_papier).isEmpty()) return;
QDomDocument document_xml; QDomDocument document_xml;
if ((texte_presse_papier = QApplication::clipboard() -> text()).isEmpty()) return;
if (!document_xml.setContent(texte_presse_papier)) return; if (!document_xml.setContent(texte_presse_papier)) return;
// listes pour recupere les elements et conducteurs ajoutes au schema par le coller // listes pour recupere les elements et conducteurs ajoutes au schema par le coller
QList<Element *> elements_pasted; QList<Element *> elements_pasted;
QList<Conductor *> conductors_pasted; QList<Conductor *> conductors_pasted;
QList<DiagramTextItem *> texts_pasted; QList<DiagramTextItem *> texts_pasted;
scene -> fromXml(document_xml, QPointF(), false, &elements_pasted, &conductors_pasted, &texts_pasted); scene -> fromXml(document_xml, pos, false, &elements_pasted, &conductors_pasted, &texts_pasted);
// si quelque chose a effectivement ete ajoute au schema, on cree // si quelque chose a effectivement ete ajoute au schema, on cree un objet d'annulation
if (elements_pasted.count() || conductors_pasted.count()) { if (elements_pasted.count() || conductors_pasted.count() || texts_pasted.count()) {
scene -> clearSelection(); scene -> clearSelection();
scene -> undoStack().push(new PasteDiagramCommand(scene, elements_pasted, conductors_pasted, texts_pasted)); scene -> undoStack().push(new PasteDiagramCommand(scene, elements_pasted, conductors_pasted, texts_pasted));
} }
} }
/// Colle le contenu du presse-papier sur le schema a la position de la souris
void DiagramView::pasteHere() {
paste(mapToScene(paste_here_pos));
}
/** /**
gere les clics et plus particulierement le clic du milieu (= coller pour X11) gere les clics et plus particulierement le clic du milieu (= coller pour X11)
*/ */
void DiagramView::mousePressEvent(QMouseEvent *e) { void DiagramView::mousePressEvent(QMouseEvent *e) {
if (e -> buttons() == Qt::MidButton) { if (e -> buttons() == Qt::MidButton) {
QString texte_presse_papier; paste(mapToScene(e -> pos()), QClipboard::Selection);
QDomDocument document_xml;
if ((texte_presse_papier = QApplication::clipboard() -> text(QClipboard::Selection)).isEmpty()) return;
if (!document_xml.setContent(texte_presse_papier)) return;
// listes pour recupere les elements et conducteurs ajoutes au schema par le coller
QList<Element *> elements_pasted;
QList<Conductor *> conductors_pasted;
QList<DiagramTextItem *> texts_pasted;
scene -> fromXml(document_xml, mapToScene(e -> pos()), false, &elements_pasted, &conductors_pasted, &texts_pasted);
// si quelque chose a effectivement ete ajoute au schema, on cree
if (elements_pasted.count() || conductors_pasted.count()) {
scene -> clearSelection();
scene -> undoStack().push(new PasteDiagramCommand(scene, elements_pasted, conductors_pasted, texts_pasted));
}
} else { } else {
if (is_adding_text && e -> buttons() == Qt::LeftButton) { if (is_adding_text && e -> buttons() == Qt::LeftButton) {
DiagramTextItem *dti = new DiagramTextItem(); DiagramTextItem *dti = new DiagramTextItem();
@@ -813,3 +811,52 @@ bool DiagramView::event(QEvent *e) {
void DiagramView::addText() { void DiagramView::addText() {
is_adding_text = true; is_adding_text = true;
} }
/**
Gere le menu contextuel
@param e Evenement decrivant la demande de menu contextuel
*/
void DiagramView::contextMenuEvent(QContextMenuEvent *e) {
if (QGraphicsItem *qgi = scene -> itemAt(mapToScene(e -> pos()))) {
if (!qgi -> isSelected()) scene -> clearSelection();
qgi -> setSelected(true);
}
if (QETDiagramEditor *qde = diagramEditor()) {
context_menu -> clear();
if (scene -> selectedItems().isEmpty()) {
paste_here_pos = e -> pos();
context_menu -> addAction(paste_here);
context_menu -> addSeparator();
context_menu -> addAction(qde -> infos_diagram);
context_menu -> addAction(qde -> add_column);
context_menu -> addAction(qde -> remove_column);
context_menu -> addAction(qde -> expand_diagram);
context_menu -> addAction(qde -> shrink_diagram);
} else {
context_menu -> addAction(qde -> cut);
context_menu -> addAction(qde -> copy);
context_menu -> addSeparator();
context_menu -> addAction(qde -> delete_selection);
context_menu -> addAction(qde -> rotate_selection);
context_menu -> addSeparator();
context_menu -> addAction(qde -> conductor_prop);
context_menu -> addAction(qde -> conductor_reset);
}
// affiche le menu contextuel
context_menu -> popup(e -> globalPos());
}
e -> accept();
}
/// @return l'editeur de schemas parent ou 0
QETDiagramEditor *DiagramView::diagramEditor() const {
// remonte la hierarchie des widgets
QWidget *w = const_cast<DiagramView *>(this);
while (w -> parentWidget() && !w -> isWindow()) {
w = w -> parentWidget();
}
// la fenetre est supposee etre un QETDiagramEditor
return(qobject_cast<QETDiagramEditor *>(w));
}

View File

@@ -2,6 +2,7 @@
#define DIAGRAMVIEW_H #define DIAGRAMVIEW_H
#include <QtGui> #include <QtGui>
class Diagram; class Diagram;
class QETDiagramEditor;
/** /**
Classe representant graphiquement un schema electrique Classe representant graphiquement un schema electrique
*/ */
@@ -22,6 +23,9 @@ class DiagramView : public QGraphicsView {
private: private:
Diagram *scene; Diagram *scene;
QMenu *context_menu;
QAction *paste_here;
QPoint paste_here_pos;
bool is_adding_text; bool is_adding_text;
// methodes // methodes
@@ -38,10 +42,12 @@ class DiagramView : public QGraphicsView {
void expand(); void expand();
void shrink(); void shrink();
Diagram *diagram() { return(scene); } Diagram *diagram() { return(scene); }
QETDiagramEditor *diagramEditor() const;
bool hasSelectedItems(); bool hasSelectedItems();
void addText(); void addText();
protected: protected:
virtual void contextMenuEvent(QContextMenuEvent *);
virtual void wheelEvent(QWheelEvent *); virtual void wheelEvent(QWheelEvent *);
virtual bool event(QEvent *); virtual bool event(QEvent *);
@@ -76,7 +82,8 @@ class DiagramView : public QGraphicsView {
void zoomReset(); void zoomReset();
void cut(); void cut();
void copy(); void copy();
void paste(); void paste(const QPointF & = QPointF(), QClipboard::Mode = QClipboard::Clipboard);
void pasteHere();
void adjustSceneRect(); void adjustSceneRect();
void updateWindowTitle(); void updateWindowTitle();
void editConductor(); void editConductor();

View File

@@ -74,7 +74,7 @@ class QETDiagramEditor : public QMainWindow {
void slot_addText(); void slot_addText();
// attributs // attributs
private: public:
// Actions faisables au travers de menus dans l'application QElectroTech // Actions faisables au travers de menus dans l'application QElectroTech
QActionGroup *grp_visu_sel; QActionGroup *grp_visu_sel;
QAction *mode_selection; QAction *mode_selection;