[qet] [957] Depoussierage de la classe Terminal

[ Thread Index | Date Index | More lists.tuxfamily.org/qet Archives ]


Revision: 957
Author:   xavier
Date:     2010-04-18 22:48:15 +0200 (Sun, 18 Apr 2010)
Log Message:
-----------
Depoussierage de la classe Terminal

Modified Paths:
--------------
    branches/0.3/sources/conductor.cpp
    branches/0.3/sources/diagram.cpp
    branches/0.3/sources/diagramcommands.cpp
    branches/0.3/sources/editor/partterminal.cpp
    branches/0.3/sources/terminal.cpp
    branches/0.3/sources/terminal.h

Modified: branches/0.3/sources/conductor.cpp
===================================================================
--- branches/0.3/sources/conductor.cpp	2010-04-18 17:59:54 UTC (rev 956)
+++ branches/0.3/sources/conductor.cpp	2010-04-18 20:48:15 UTC (rev 957)
@@ -77,7 +77,7 @@
 	conductor_profiles.insert(Qt::BottomRightCorner, ConductorProfile());
 
 	// calcul du rendu du conducteur
-	priv_calculeConductor(terminal1 -> amarrageConductor(), terminal1 -> orientation(), terminal2 -> amarrageConductor(), terminal2 -> orientation());
+	priv_calculeConductor(terminal1 -> dockConductor(), terminal1 -> orientation(), terminal2 -> dockConductor(), terminal2 -> orientation());
 	setFlags(QGraphicsItem::ItemIsSelectable);
 	setAcceptsHoverEvents(true);
 	
@@ -113,13 +113,13 @@
 	// appelle la bonne fonction pour calculer l'aspect du conducteur
 	if (nbSegments() && !conductor_profiles[currentPathType()].isNull()) {
 		priv_modifieConductor(
-			terminal1 -> amarrageConductor(), terminal1 -> orientation(),
-			terminal2 -> amarrageConductor(), terminal2 -> orientation()
+			terminal1 -> dockConductor(), terminal1 -> orientation(),
+			terminal2 -> dockConductor(), terminal2 -> orientation()
 		);
 	} else {
 		priv_calculeConductor(
-			terminal1 -> amarrageConductor(), terminal1 -> orientation(),
-			terminal2 -> amarrageConductor(), terminal2 -> orientation()
+			terminal1 -> dockConductor(), terminal1 -> orientation(),
+			terminal2 -> dockConductor(), terminal2 -> orientation()
 		);
 	}
 	
@@ -139,13 +139,13 @@
 	QPointF p1, p2;
 	if (b == terminal1) {
 		p1 = newpos;
-		p2 = terminal2 -> amarrageConductor();
+		p2 = terminal2 -> dockConductor();
 	} else if (b == terminal2) {
-		p1 = terminal1 -> amarrageConductor();
+		p1 = terminal1 -> dockConductor();
 		p2 = newpos;
 	} else {
-		p1 = terminal1 -> amarrageConductor();
-		p2 = terminal2 -> amarrageConductor();
+		p1 = terminal1 -> dockConductor();
+		p2 = terminal2 -> dockConductor();
 	}
 	if (nbSegments() && !conductor_profiles[currentPathType()].isNull())
 		priv_modifieConductor(p1, terminal1 -> orientation(), p2, terminal2 -> orientation());
@@ -955,8 +955,8 @@
 	qreal width = 0.0, height = 0.0;
 	foreach (qreal t, segments_x) width  += t;
 	foreach (qreal t, segments_y) height += t;
-	QPointF t1 = terminal1 -> amarrageConductor();
-	QPointF t2 = terminal2 -> amarrageConductor();
+	QPointF t1 = terminal1 -> dockConductor();
+	QPointF t2 = terminal2 -> dockConductor();
 	qreal expected_width  = t2.x() - t1.x();
 	qreal expected_height = t2.y() - t1.y();
 	
@@ -1126,10 +1126,10 @@
 	// si le type de trajet correspond a l'actuel
 	if (currentPathType() == path_type) {
 		if (conductor_profiles[path_type].isNull()) {
-			priv_calculeConductor(terminal1 -> amarrageConductor(), terminal1 -> orientation(), terminal2 -> amarrageConductor(), terminal2 -> orientation());
+			priv_calculeConductor(terminal1 -> dockConductor(), terminal1 -> orientation(), terminal2 -> dockConductor(), terminal2 -> orientation());
 			modified_path = false;
 		} else {
-			priv_modifieConductor(terminal1 -> amarrageConductor(), terminal1 -> orientation(), terminal2 -> amarrageConductor(), terminal2 -> orientation());
+			priv_modifieConductor(terminal1 -> dockConductor(), terminal1 -> orientation(), terminal2 -> dockConductor(), terminal2 -> orientation());
 			modified_path = true;
 		}
 		if (type() == ConductorProperties::Multi) {
@@ -1383,7 +1383,7 @@
 
 /// @return le type de trajet actuel de ce conducteur
 Qt::Corner Conductor::currentPathType() const {
-	return(movementType(terminal1 -> amarrageConductor(), terminal2 -> amarrageConductor()));
+	return(movementType(terminal1 -> dockConductor(), terminal2 -> dockConductor()));
 }
 
 /// @return les profils de ce conducteur
@@ -1397,10 +1397,10 @@
 void Conductor::setProfiles(const ConductorProfilesGroup &cpg) {
 	conductor_profiles = cpg;
 	if (conductor_profiles[currentPathType()].isNull()) {
-		priv_calculeConductor(terminal1 -> amarrageConductor(), terminal1 -> orientation(), terminal2 -> amarrageConductor(), terminal2 -> orientation());
+		priv_calculeConductor(terminal1 -> dockConductor(), terminal1 -> orientation(), terminal2 -> dockConductor(), terminal2 -> orientation());
 		modified_path = false;
 	} else {
-		priv_modifieConductor(terminal1 -> amarrageConductor(), terminal1 -> orientation(), terminal2 -> amarrageConductor(), terminal2 -> orientation());
+		priv_modifieConductor(terminal1 -> dockConductor(), terminal1 -> orientation(), terminal2 -> dockConductor(), terminal2 -> orientation());
 		modified_path = true;
 	}
 	if (type() == ConductorProperties::Multi) {

Modified: branches/0.3/sources/diagram.cpp
===================================================================
--- branches/0.3/sources/diagram.cpp	2010-04-18 17:59:54 UTC (rev 956)
+++ branches/0.3/sources/diagram.cpp	2010-04-18 20:48:15 UTC (rev 957)
@@ -839,7 +839,7 @@
 					other_terminal = conductor -> terminal1;
 				}
 				// si les deux elements du conducteur sont deplaces
-				if (elements_to_move.contains(static_cast<Element *>(other_terminal -> parentItem()))) {
+				if (elements_to_move.contains(other_terminal -> parentElement())) {
 					conductors_to_move << conductor;
 				} else {
 					conductors_to_update.insert(conductor, terminal);
@@ -877,7 +877,7 @@
 	// recalcule les autres conducteurs
 	const QHash<Conductor *, Terminal *> &conductors_modify = conductorsToUpdate();
 	foreach(Conductor *conductor, conductors_modify.keys()) {
-		conductor -> updateWithNewPos(QRectF(), conductors_modify[conductor], conductors_modify[conductor] -> amarrageConductor());
+		conductor -> updateWithNewPos(QRectF(), conductors_modify[conductor], conductors_modify[conductor] -> dockConductor());
 	}
 	
 	// deplace les champs de texte

Modified: branches/0.3/sources/diagramcommands.cpp
===================================================================
--- branches/0.3/sources/diagramcommands.cpp	2010-04-18 17:59:54 UTC (rev 956)
+++ branches/0.3/sources/diagramcommands.cpp	2010-04-18 20:48:15 UTC (rev 957)
@@ -356,7 +356,7 @@
 		conductor -> updateWithNewPos(
 			QRectF(),
 			content_to_move.conductorsToUpdate[conductor],
-			content_to_move.conductorsToUpdate[conductor] -> amarrageConductor()
+			content_to_move.conductorsToUpdate[conductor] -> dockConductor()
 		);
 	}
 	

Modified: branches/0.3/sources/editor/partterminal.cpp
===================================================================
--- branches/0.3/sources/editor/partterminal.cpp	2010-04-18 17:59:54 UTC (rev 956)
+++ branches/0.3/sources/editor/partterminal.cpp	2010-04-18 20:48:15 UTC (rev 957)
@@ -95,14 +95,14 @@
 	t.setCosmetic(options && options -> levelOfDetail < 1.0);
 	
 	// dessin de la borne en rouge
-	t.setColor(isSelected() ? Terminal::couleur_neutre : Qt::red);
+	t.setColor(isSelected() ? Terminal::neutralColor : Qt::red);
 	p -> setPen(t);
 	p -> drawLine(QPointF(0.0, 0.0), second_point);
 	
 	// dessin du point d'amarrage au conducteur en bleu
-	t.setColor(isSelected() ? Qt::red : Terminal::couleur_neutre);
+	t.setColor(isSelected() ? Qt::red : Terminal::neutralColor);
 	p -> setPen(t);
-	p -> setBrush(Terminal::couleur_neutre);
+	p -> setBrush(Terminal::neutralColor);
 	p -> drawPoint(QPointF(0.0, 0.0));
 	p -> restore();
 }

Modified: branches/0.3/sources/terminal.cpp
===================================================================
--- branches/0.3/sources/terminal.cpp	2010-04-18 17:59:54 UTC (rev 956)
+++ branches/0.3/sources/terminal.cpp	2010-04-18 20:48:15 UTC (rev 957)
@@ -22,58 +22,48 @@
 #include "diagramcommands.h"
 #include "qetapp.h"
 
-QColor Terminal::couleur_neutre   = QColor(Qt::blue);
-QColor Terminal::couleur_autorise = QColor(Qt::darkGreen);
-QColor Terminal::couleur_prudence = QColor("#ff8000");
-QColor Terminal::couleur_interdit = QColor(Qt::red);
+QColor Terminal::neutralColor      = QColor(Qt::blue);
+QColor Terminal::allowedColor      = QColor(Qt::darkGreen);
+QColor Terminal::warningColor      = QColor("#ff8000");
+QColor Terminal::forbiddenColor    = QColor(Qt::red);
 const qreal Terminal::terminalSize = 4.0;
 
 /**
-	Fonction privee pour initialiser la borne.
+	Methode privee pour initialiser la borne.
 	@param pf  position du point d'amarrage pour un conducteur
 	@param o   orientation de la borne : Qt::Horizontal ou Qt::Vertical
 */
-void Terminal::initialise(QPointF pf, QET::Orientation o) {
+void Terminal::init(QPointF pf, QET::Orientation o) {
 	// definition du pount d'amarrage pour un conducteur
-	amarrage_conductor  = pf;
+	dock_conductor_  = pf;
 	
-	// definition de l'orientation de la terminal (par defaut : sud)
-	if (o < QET::North || o > QET::West) sens = QET::South;
-	else sens = o;
+	// definition de l'orientation de la borne (par defaut : sud)
+	if (o < QET::North || o > QET::West) ori_ = QET::South;
+	else ori_ = o;
 	
 	// calcul de la position du point d'amarrage a l'element
-	amarrage_elmt = amarrage_conductor;
-	switch(sens) {
-		case QET::North: amarrage_elmt += QPointF(0, Terminal::terminalSize);  break;
-		case QET::East : amarrage_elmt += QPointF(-Terminal::terminalSize, 0); break;
-		case QET::West : amarrage_elmt += QPointF(Terminal::terminalSize, 0);  break;
+	dock_elmt_ = dock_conductor_;
+	switch(ori_) {
+		case QET::North: dock_elmt_ += QPointF(0, Terminal::terminalSize);  break;
+		case QET::East : dock_elmt_ += QPointF(-Terminal::terminalSize, 0); break;
+		case QET::West : dock_elmt_ += QPointF(Terminal::terminalSize, 0);  break;
 		case QET::South:
-		default        : amarrage_elmt += QPointF(0, -Terminal::terminalSize);
+		default        : dock_elmt_ += QPointF(0, -Terminal::terminalSize);
 	}
 	
 	// par defaut : pas de conducteur
 	
 	// QRectF null
-	br = new QRectF();
-	terminal_precedente = NULL;
+	br_ = new QRectF();
+	previous_terminal_ = 0;
 	// divers
 	setAcceptsHoverEvents(true);
 	setAcceptedMouseButtons(Qt::LeftButton);
-	hovered = false;
+	hovered_ = false;
 	setToolTip(QObject::tr("Borne", "tooltip"));
 }
 
 /**
-	Constructeur par defaut
-*/
-Terminal::Terminal() :
-	QGraphicsItem(0, 0),
-	couleur_hovered(Terminal::couleur_neutre)
-{
-	initialise(QPointF(0.0, 0.0), QET::South);
-}
-
-/**
 	initialise une borne
 	@param pf  position du point d'amarrage pour un conducteur
 	@param o   orientation de la borne : Qt::Horizontal ou Qt::Vertical
@@ -82,9 +72,10 @@
 */
 Terminal::Terminal(QPointF pf, QET::Orientation o, Element *e, Diagram *s) :
 	QGraphicsItem(e, s),
-	couleur_hovered(Terminal::couleur_neutre)
+	parent_element_(e),
+	hovered_color_(Terminal::neutralColor)
 {
-	initialise(pf, o);
+	init(pf, o);
 }
 
 /**
@@ -97,9 +88,10 @@
 */
 Terminal::Terminal(qreal pf_x, qreal pf_y, QET::Orientation o, Element *e, Diagram *s) :
 	QGraphicsItem(e, s),
-	couleur_hovered(Terminal::couleur_neutre)
+	parent_element_(e),
+	hovered_color_(Terminal::neutralColor)
 {
-	initialise(QPointF(pf_x, pf_y), o);
+	init(QPointF(pf_x, pf_y), o);
 }
 
 /**
@@ -108,9 +100,8 @@
 	associes.
 */
 Terminal::~Terminal() {
-	//qDebug() << "Terminal::~Terminal" << (void *)this;
-	foreach(Conductor *c, liste_conductors) delete c;
-	delete br;
+	foreach(Conductor *c, conductors_) delete c;
+	delete br_;
 }
 
 /**
@@ -125,15 +116,15 @@
 		// orientations actuelle et par defaut de l'element
 		QET::Orientation ori_cur = elt -> orientation().current();
 		QET::Orientation ori_def = elt -> orientation().defaultOrientation();
-		if (ori_cur == ori_def) return(sens);
+		if (ori_cur == ori_def) return(ori_);
 		else {
 			// calcul l'angle de rotation implique par l'orientation de l'element parent
 			// angle de rotation de la borne sur la scene, divise par 90
-			int angle = ori_cur - ori_def + sens;
+			int angle = ori_cur - ori_def + ori_;
 			while (angle >= 4) angle -= 4;
 			return((QET::Orientation)angle);
 		}
-	} else return(sens);
+	} else return(ori_);
 }
 
 /**
@@ -152,7 +143,7 @@
 	
 	// verifie que la borne n'est pas deja reliee avec l'autre borne
 	bool deja_liees = false;
-	foreach (Conductor* conductor, liste_conductors) {
+	foreach (Conductor* conductor, conductors_) {
 		if (conductor -> terminal1 == autre_terminal || conductor -> terminal2 == autre_terminal) deja_liees = true;
 	}
 	
@@ -160,7 +151,7 @@
 	if (deja_liees) return(false);
 	
 	// sinon on ajoute le conducteur
-	liste_conductors.append(f);
+	conductors_.append(f);
 	return(true);
 }
 
@@ -169,10 +160,9 @@
 	@param f Conducteur a enlever
 */
 void Terminal::removeConductor(Conductor *f) {
-	//qDebug() << "Terminal::removeConductor" << (void *)this;
-	int index = liste_conductors.indexOf(f);
+	int index = conductors_.indexOf(f);
 	if (index == -1) return;
-	liste_conductors.removeAt(index);
+	conductors_.removeAt(index);
 }
 
 /**
@@ -214,8 +204,8 @@
 	p -> setRenderHint(QPainter::SmoothPixmapTransform, false);
 	
 	// on travaille avec les coordonnees de l'element parent
-	QPointF f = mapFromParent(amarrage_conductor);
-	QPointF e = mapFromParent(amarrage_elmt);
+	QPointF c = mapFromParent(dock_conductor_);
+	QPointF e = mapFromParent(dock_elmt_);
 	
 	QPen t;
 	t.setWidthF(1.0);
@@ -227,16 +217,16 @@
 	// dessin de la borne en rouge
 	t.setColor(Qt::red);
 	p -> setPen(t);
-	p -> drawLine(f, e);
+	p -> drawLine(c, e);
 	
 	// dessin du point d'amarrage au conducteur en bleu
-	t.setColor(couleur_hovered);
+	t.setColor(hovered_color_);
 	p -> setPen(t);
-	p -> setBrush(couleur_hovered);
-	if (hovered) {
+	p -> setBrush(hovered_color_);
+	if (hovered_) {
 		p -> setRenderHint(QPainter::Antialiasing, true);
-		p -> drawEllipse(QRectF(f.x() - 2.5, f.y() - 2.5, 5.0, 5.0));
-	} else p -> drawPoint(f);
+		p -> drawEllipse(QRectF(c.x() - 2.5, c.y() - 2.5, 5.0, 5.0));
+	} else p -> drawPoint(c);
 	
 	p -> restore();
 }
@@ -245,26 +235,25 @@
 	@return Le rectangle (en precision flottante) delimitant la borne et ses alentours.
 */
 QRectF Terminal::boundingRect() const {
-	if (br -> isNull()) {
-		qreal afx = amarrage_conductor.x();
-		qreal afy = amarrage_conductor.y();
-		qreal aex = amarrage_elmt.x();
-		qreal aey = amarrage_elmt.y();
-		QPointF origine;
-		origine = (afx <= aex && afy <= aey ? amarrage_conductor : amarrage_elmt);
-		origine += QPointF(-3.0, -3.0);
-		qreal w = qAbs((int)(afx - aex)) + 7;
-		qreal h = qAbs((int)(afy - aey)) + 7;
-		*br = QRectF(origine, QSizeF(w, h));
+	if (br_ -> isNull()) {
+		qreal dcx = dock_conductor_.x();
+		qreal dcy = dock_conductor_.y();
+		qreal dex = dock_elmt_.x();
+		qreal dey = dock_elmt_.y();
+		QPointF origin = (dcx <= dex && dcy <= dey ? dock_conductor_ : dock_elmt_);
+		origin += QPointF(-3.0, -3.0);
+		qreal w = qAbs((int)(dcx - dex)) + 7;
+		qreal h = qAbs((int)(dcy - dey)) + 7;
+		*br_ = QRectF(origin, QSizeF(w, h));
 	}
-	return(*br);
+	return(*br_);
 }
 
 /**
 	Gere l'entree de la souris sur la zone de la Borne.
 */
 void Terminal::hoverEnterEvent(QGraphicsSceneHoverEvent *) {
-	hovered = true;
+	hovered_ = true;
 	update();
 }
 
@@ -278,7 +267,7 @@
 	Gere le fait que la souris sorte de la zone de la Borne.
 */
 void Terminal::hoverLeaveEvent(QGraphicsSceneHoverEvent *) {
-	hovered = false;
+	hovered_ = false;
 	update();
 }
 
@@ -287,10 +276,10 @@
 	@param e L'evenement souris correspondant
 */
 void Terminal::mousePressEvent(QGraphicsSceneMouseEvent *e) {
-	if (Diagram *s = diagram()) {
-		s -> setConductorStart(mapToScene(QPointF(amarrage_conductor)));
-		s -> setConductorStop(e -> scenePos());
-		s -> setConductor(true);
+	if (Diagram *d = diagram()) {
+		d -> setConductorStart(mapToScene(QPointF(dock_conductor_)));
+		d -> setConductorStop(e -> scenePos());
+		d -> setConductor(true);
 		//setCursor(Qt::CrossCursor);
 	}
 }
@@ -304,21 +293,21 @@
 	//setCursor(Qt::CrossCursor);
 	
 	// d'un mouvement a l'autre, il faut retirer l'effet hover de la borne precedente
-	if (terminal_precedente != NULL) {
-		if (terminal_precedente == this) hovered = true;
-		else terminal_precedente -> hovered = false;
-		terminal_precedente -> couleur_hovered = terminal_precedente -> couleur_neutre;
-		terminal_precedente -> update();
+	if (previous_terminal_) {
+		if (previous_terminal_ == this) hovered_ = true;
+		else previous_terminal_ -> hovered_ = false;
+		previous_terminal_ -> hovered_color_ = previous_terminal_ -> neutralColor;
+		previous_terminal_ -> update();
 	}
 	
 	
-	Diagram *s = diagram();
-	if (!s) return;
+	Diagram *d = diagram();
+	if (!d) return;
 	// si la scene est un Diagram, on actualise le poseur de conducteur
-	s -> setConductorStop(e -> scenePos());
+	d -> setConductorStop(e -> scenePos());
 	
 	// on recupere la liste des qgi sous le pointeur
-	QList<QGraphicsItem *> qgis = s -> items(e -> scenePos());
+	QList<QGraphicsItem *> qgis = d -> items(e -> scenePos());
 	
 	/* le qgi le plus haut
 	   = le poseur de conductor
@@ -328,42 +317,27 @@
 	*/
 	Q_ASSERT_X(!(qgis.isEmpty()), "Terminal::mouseMoveEvent", "La liste d'items ne devrait pas etre vide");
 	
-	// s'il y a autre chose que le poseur de conducteur dans la liste
-	if (qgis.size() > 1) {
-		// on prend le deuxieme element de la liste
-		QGraphicsItem *qgi = qgis.at(1);
-		// si le qgi est une borne...
-		if (Terminal *p = qgraphicsitem_cast<Terminal *>(qgi)) {
-			// ...on lui applique l'effet hover approprie
-			if (p == this) {
-				// effet si l'on hover sur la borne de depart
-				couleur_hovered = couleur_interdit;
-			} else if (p -> parentItem() == parentItem()) {
-				// effet si l'on hover sur une borne du meme appareil
-				if (((Element *)parentItem()) -> internalConnections())
-					p -> couleur_hovered = p -> couleur_autorise;
-				else p -> couleur_hovered = p -> couleur_interdit;
-			} else if (p -> nbConductors()) {
-				// si la borne a deja un conducteur
-				// verifie que cette borne n'est pas deja reliee a l'autre borne
-				bool deja_reliee = false;
-				foreach (Conductor *f, liste_conductors) {
-					if (f -> terminal1 == p || f -> terminal2 == p) {
-						deja_reliee = true;
-						break;
-					}
-				}
-				// interdit si les bornes sont deja reliees, prudence sinon
-				p -> couleur_hovered = deja_reliee ? p -> couleur_interdit : p -> couleur_prudence;
-			} else {
-				// effet si on peut poser le conducteur
-				p -> couleur_hovered = p -> couleur_autorise;
-			}
-			terminal_precedente = p;
-			p -> hovered = true;
-			p -> update();
-		}
+	// s'il n'y rien d'autre que le poseur de conducteur dans la liste, on arrete la
+	if (qgis.size() <= 1) return;
+	
+	// sinon on prend le deuxieme element de la liste et on verifie s'il s'agit d'une borne
+	QGraphicsItem *qgi = qgis.at(1);
+	// si le qgi est une borne...
+	Terminal *other_terminal = qgraphicsitem_cast<Terminal *>(qgi);
+	if (!other_terminal) return;
+	previous_terminal_ = other_terminal;
+	
+	// s'il s'agit d'une borne, on lui applique l'effet hover approprie
+	if (!canBeLinkedTo(other_terminal)) {
+		other_terminal -> hovered_color_ = forbiddenColor;
+	} else if (other_terminal -> conductorsCount()) {
+		other_terminal -> hovered_color_ = warningColor;
+	} else {
+		other_terminal -> hovered_color_ = allowedColor;
 	}
+	
+	other_terminal -> hovered_ = true;
+	other_terminal -> update();
 }
 
 /**
@@ -372,32 +346,28 @@
 */
 void Terminal::mouseReleaseEvent(QGraphicsSceneMouseEvent *e) {
 	//setCursor(Qt::ArrowCursor);
-	terminal_precedente = NULL;
-	couleur_hovered  = couleur_neutre;
+	previous_terminal_ = 0;
+	hovered_color_  = neutralColor;
 	// verifie que la scene est bien un Diagram
-	if (Diagram *s = diagram()) {
+	if (Diagram *d = diagram()) {
 		// on arrete de dessiner l'apercu du conducteur
-		s -> setConductor(false);
+		d -> setConductor(false);
 		// on recupere l'element sous le pointeur lors du MouseReleaseEvent
-		QGraphicsItem *qgi = s -> itemAt(e -> scenePos());
+		QGraphicsItem *qgi = d -> itemAt(e -> scenePos());
 		// s'il n'y a rien, on arrete la
 		if (!qgi) return;
 		// idem si l'element obtenu n'est pas une borne
-		Terminal *p = qgraphicsitem_cast<Terminal *>(qgi);
-		if (!p) return;
+		Terminal *other_terminal = qgraphicsitem_cast<Terminal *>(qgi);
+		if (!other_terminal) return;
 		// on remet la couleur de hover a sa valeur par defaut
-		p -> couleur_hovered = p -> couleur_neutre;
-		// idem s'il s'agit de la borne actuelle
-		if (p == this) return;
-		// idem s'il s'agit d'une borne de l'element actuel et que l'element n'a pas le droit de relier ses propres bornes
-		bool cia = ((Element *)parentItem()) -> internalConnections();
-		if (!cia) foreach(QGraphicsItem *item, parentItem() -> children()) if (item == p) return;
-		// derniere verification : verifier que cette borne n'est pas deja reliee a l'autre borne
-		foreach (Conductor *f, liste_conductors) if (f -> terminal1 == p || f -> terminal2 == p) return;
+		other_terminal -> hovered_color_ = neutralColor;
+		other_terminal -> hovered_ = false;
+		// on s'arrete la s'il n'est pas possible de relier les bornes
+		if (!canBeLinkedTo(other_terminal)) return;
 		// autrement, on pose un conducteur
-		Conductor * new_conductor = new Conductor(this, p);
-		new_conductor -> setProperties(s -> defaultConductorProperties);
-		s -> undoStack().push(new AddConductorCommand(s, new_conductor));
+		Conductor *new_conductor = new Conductor(this, other_terminal);
+		new_conductor -> setProperties(d -> defaultConductorProperties);
+		d -> undoStack().push(new AddConductorCommand(d, new_conductor));
 	}
 }
 
@@ -407,23 +377,59 @@
 */
 void Terminal::updateConductor(QPointF newpos) {
 	if (!scene() || !parentItem()) return;
-	foreach (Conductor *conductor, liste_conductors) {
+	foreach (Conductor *conductor, conductors_) {
 		if (conductor -> isDestroyed()) continue;
 		if (newpos == QPointF()) conductor -> update(QRectF());
 		else {
 			// determine la translation subie par l'element parent
 			QPointF translation = newpos - parentItem() -> pos();
 			// rafraichit le conducteur en tenant compte de la translation
-			conductor -> updateWithNewPos(QRectF(), this, amarrageConductor() + translation);
+			conductor -> updateWithNewPos(QRectF(), this, dockConductor() + translation);
 		}
 	}
 }
 
 /**
+	@param other_terminal Autre borne
+	@return true si cette borne est reliee a other_terminal, false sion
+*/
+bool Terminal::isLinkedTo(Terminal *other_terminal) {
+	if (other_terminal == this) return(false);
+	
+	bool already_linked = false;
+	foreach (Conductor *c, conductors_) {
+		if (c -> terminal1 == other_terminal || c -> terminal2 == other_terminal) {
+			already_linked = true;
+			break;
+		}
+	}
+	return(already_linked);
+}
+
+/**
+	@param other_terminal Autre borne
+	@return true si cette borne peut etre reliee a other_terminal, false sion
+*/
+bool Terminal::canBeLinkedTo(Terminal *other_terminal) {
+	if (other_terminal == this) return(false);
+	
+	// l'autre borne appartient-elle au meme element ?
+	bool same_element = other_terminal -> parentElement() == parentElement();
+	// les connexions internes sont-elles autorisees ?
+	bool internal_connections_allowed = parentElement() -> internalConnections();
+	// les deux bornes sont-elles deja liees ?
+	bool already_linked = isLinkedTo(other_terminal);
+	// la liaison des deux bornes est-elle interdite ?
+	bool link_forbidden = (same_element && !internal_connections_allowed) || already_linked;
+	
+	return(!link_forbidden);
+}
+
+/**
 	@return La liste des conducteurs lies a cette borne
 */
 QList<Conductor *> Terminal::conductors() const {
-	return(liste_conductors);
+	return(conductors_);
 }
 
 /**
@@ -433,9 +439,9 @@
 */
 QDomElement Terminal::toXml(QDomDocument &doc) const {
 	QDomElement qdo = doc.createElement("terminal");
-	qdo.setAttribute("x", QString("%1").arg(amarrage_elmt.x()));
-	qdo.setAttribute("y",  QString("%1").arg(amarrage_elmt.y()));
-	qdo.setAttribute("orientation", sens);
+	qdo.setAttribute("x", QString("%1").arg(dock_elmt_.x()));
+	qdo.setAttribute("y",  QString("%1").arg(dock_elmt_.y()));
+	qdo.setAttribute("orientation", ori_);
 	return(qdo);
 }
 
@@ -482,13 +488,22 @@
 */
 bool Terminal::fromXml(QDomElement &terminal) {
 	return (
-		qFuzzyCompare(terminal.attribute("x").toDouble(), amarrage_elmt.x()) &&
-		qFuzzyCompare(terminal.attribute("y").toDouble(), amarrage_elmt.y()) &&
-		terminal.attribute("orientation").toInt() == sens
+		qFuzzyCompare(terminal.attribute("x").toDouble(), dock_elmt_.x()) &&
+		qFuzzyCompare(terminal.attribute("y").toDouble(), dock_elmt_.y()) &&
+		terminal.attribute("orientation").toInt() == ori_
 	);
 }
 
-/// @return le Diagram auquel cette borne appartient, ou 0 si cette borne est independant
+/**
+	@return le Diagram auquel cette borne appartient, ou 0 si cette borne est independant
+*/
 Diagram *Terminal::diagram() const {
 	return(qobject_cast<Diagram *>(scene()));
 }
+
+/**
+	@return L'element auquel cette borne est rattachee
+*/
+Element *Terminal::parentElement() const {
+	return(parent_element_);
+}

Modified: branches/0.3/sources/terminal.h
===================================================================
--- branches/0.3/sources/terminal.h	2010-04-18 17:59:54 UTC (rev 956)
+++ branches/0.3/sources/terminal.h	2010-04-18 20:48:15 UTC (rev 957)
@@ -15,9 +15,8 @@
 	You should have received a copy of the GNU General Public License
 	along with QElectroTech.  If not, see <http://www.gnu.org/licenses/>.
 */
-#ifndef BORNE_H
-#define BORNE_H
-#define TAILLE_BORNE 4
+#ifndef TERMINAL_H
+#define TERMINAL_H
 #include <QtGui>
 #include <QtXml>
 #include "qet.h"
@@ -25,14 +24,13 @@
 class Diagram;
 class Element;
 /**
-	Classe modelisant la "borne" d'un appareil, c'est-a-dire un
-	branchement possible pour un Conducteur.
+	Cette classe represente une borne d'un element, c'est-a-dire un
+	branchement possible pour un conducteur.
 */
 class Terminal : public QGraphicsItem {
 	
 	// constructeurs, destructeur
 	public:
-	Terminal();
 	Terminal(QPointF,      QET::Orientation, Element * = 0, Diagram * = 0);
 	Terminal(qreal, qreal, QET::Orientation, Element * = 0, Diagram * = 0);
 	virtual ~Terminal();
@@ -55,14 +53,17 @@
 	// methodes de manipulation des conducteurs lies a cette borne
 	bool addConductor(Conductor *);
 	void removeConductor(Conductor *);
-	int nbConductors() const;
+	int conductorsCount() const;
 	Diagram *diagram() const;
+	Element *parentElement() const;
 	
 	// methodes de lecture
 	QList<Conductor *> conductors() const;
 	QET::Orientation orientation() const;
-	QPointF amarrageConductor() const;
+	QPointF dockConductor() const;
 	void updateConductor(QPointF = QPointF());
+	bool isLinkedTo(Terminal *);
+	bool canBeLinkedTo(Terminal *);
 	
 	// methodes relatives a l'import/export au format XML
 	static bool valideXml(QDomElement  &);
@@ -86,44 +87,55 @@
 	
 	// differentes couleurs statiques utilisables pour l'effet "hover"
 	/// couleur par defaut
-	static QColor couleur_neutre;
+	static QColor neutralColor;
 	/// couleur indiquant une action autorisee
-	static QColor couleur_autorise;
+	static QColor allowedColor;
 	/// couleur indiquant une action autorisee mais pas forcement recommandee
-	static QColor couleur_prudence;
+	static QColor warningColor;
 	/// couleur indiquant une action interdite
-	static QColor couleur_interdit;
+	static QColor forbiddenColor;
 	
+	// attributs prives
 	private:
-	// coordonnees des points d'amarrage
-	QPointF amarrage_conductor;
-	QPointF amarrage_elmt;
-	// orientation de la borne
-	QET::Orientation sens;
-	// liste des conductors lies a cette borne
-	QList<Conductor *> liste_conductors;
-	// pointeur vers un rectangle correspondant au bounding rect ; permet de ne calculer le bounding rect qu'une seule fois ; le pointeur c'est parce que le compilo exige une methode const
-	QRectF *br;
-	Terminal *terminal_precedente;
-	bool hovered;
+	/// Pointeur vers l'element parent
+	Element *parent_element_;
+	/// coordonnees du point d'amarrage du conducteur
+	QPointF dock_conductor_;
+	/// coordonnees du point d'amarrage de l'element
+	QPointF dock_elmt_;
+	/// orientation de la borne
+	QET::Orientation ori_;
+	/// liste des conductors lies a cette borne
+	QList<Conductor *> conductors_;
+	/// pointeur vers un rectangle correspondant au bounding rect
+	/// permet de ne calculer le bounding rect qu'une seule fois
+	/// le pointeur c'est parce que le compilo exige une methode const
+	QRectF *br_;
+	/// Derniere borne mise en contact avec celle-ci
+	Terminal *previous_terminal_;
+	/// Booleen indiquant si le pointeur est au-dessus de la borne ou non
+	bool hovered_;
+	/// couleur de l'effet hover de la borne
+	QColor hovered_color_;
+	
+	// methodes privees
+	private:
 	// methode initialisant les differents membres de la borne
-	void initialise(QPointF, QET::Orientation);
-	// couleur de l'effet hover de la patte
-	QColor couleur_hovered;
+	void init(QPointF, QET::Orientation);
 };
 
 /**
 	@return Le nombre de conducteurs associes a la borne
 */
-inline int Terminal::nbConductors() const {
-	return(liste_conductors.size());
+inline int Terminal::conductorsCount() const {
+	return(conductors_.size());
 }
 
 /**
 	@return La position du point d'amarrage de la borne
 */
-inline QPointF Terminal::amarrageConductor() const {
-	return(mapToScene(amarrage_conductor));
+inline QPointF Terminal::dockConductor() const {
+	return(mapToScene(dock_conductor_));
 }
 
 #endif


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/