connexions.js (5694B)
1 jQuery.fn.preparerBlocConnexions = function(arg) { 2 $(this).find('.port') 3 .bind('mousedown click', uiLierBlocs); 4 5 if (arg == 'edition') { 6 $(this).find('table.ports:first > tbody, table.ports:last > tbody') 7 .sortable({ 8 //axis: 'y', 9 scroll: false, 10 appendTo: 'body', 11 cursorAt: {top:7, left:7}, // Hack-o-matic 7 & 7 pour que le symbole soit centré sous le curseur 12 helper: function (ev, elem) { 13 // height: auto pour conter jquery qui force une hauteur malgrè l'option 14 // forceHelperSize: false. 15 return $('<div class="port" style="height: auto"><div class="symbole"/></div>'); 16 }, 17 start: function(ev, ui) { 18 $(ui.placeholder) 19 .css('visibility', '') 20 .css('height', '') 21 .append('<td class="port sortie"><div class="symbole placeholder"></td>'); 22 }, 23 }) 24 .bind('sortstart', uiLierBlocs) 25 .bind('sort sortstop', function() { 26 $(this).parents('.bloc:first').trigger('changer'); 27 }); 28 } 29 30 return $(this); 31 } 32 33 function uiActualiserLien(_de, _vers, segments) { 34 if ($(_de).centerX() < $(_vers).centerX()) { 35 de = $(_de); 36 vers = $(_vers); 37 } else { 38 de = $(_vers); 39 vers = $(_de); 40 } 41 segments = $(segments); 42 var segment1 = segments.find('.segment-1'); 43 var segment2 = segments.find('.segment-2'); 44 var segment3 = segments.find('.segment-3'); 45 46 $(segment1) 47 .width((vers.centerX() - de.centerX()) / 2) 48 .position({my: 'left center', at: 'center', of: de}); 49 $(segment3) 50 .width((vers.centerX() - de.centerX()) / 2) 51 .position({my: 'right center', at: 'center', of: vers}); 52 53 var neg = segment3.centerY() - segment1.centerY(); 54 55 $(segment2) 56 .height((neg > 0) ? segment3.bottomY() - segment1.topY() : segment1.bottomY() - segment3.topY()) 57 .position({ 58 my: (neg > 0) ? 'center top' : 'center bottom', 59 at: (neg > 0) ? 'right top' : 'right bottom', 60 of: (neg > 0) ? segment1 : segment1 61 }); 62 } 63 64 function uiLierBlocs(ev) { 65 /* Hack pour ne pas capturer le clic après un sort */ 66 if (ev.type == 'mousedown') { 67 lienBlocsActif.pret = true; 68 return true; 69 } else if (ev.type == 'sortstart') { 70 lienBlocsActif.pret = false; 71 return true; 72 } else { 73 if (!lienBlocsActif.actif && !lienBlocsActif.pret) { 74 lienBlocsActif.pret = true; 75 return true; 76 } else { 77 /* Fin du hack non-capture de clic après sort */ 78 if (!lienBlocsActif.actif) { 79 lienBlocsActif.actif = true; 80 81 var segments = $('#modele-lien-blocs') 82 .jqote() 83 .toDom() 84 .appendTo($(this).parents('.editionBloc').first()); 85 86 var start = $(this); 87 88 var elems = $(this) 89 .parents(".editionBloc.bloc") 90 .add(segments); 91 92 lienBlocsActif.start = start; 93 lienBlocsActif.elems = elems; 94 lienBlocsActif.segments = segments; 95 96 elems.bind('mousemove.creerLien', function (event) { 97 uiActualiserLien(start, event, segments); 98 }); 99 /*elems.bind('mousedown.creerLien', function (event) {*/ 100 elems.bind('click.creerLien', function (event) { 101 lienBlocsActif.elems.unbind('.creerLien'); 102 segments.remove(); 103 lienBlocsActif.actif = false; 104 return false; 105 }); 106 } else { 107 // Création du lien 108 var lien = { 109 start: $(lienBlocsActif.start), 110 end: $(this), 111 segments: $(lienBlocsActif.segments) 112 }; 113 114 // Un lien a été créé, on est à l'écoute de nouveaux liens 115 // (et non plus à l'écoute de la fin d'une connexion) 116 lienBlocsActif.elems.unbind('.creerLien'); 117 lienBlocsActif.actif = false; 118 119 if ((lien.start.parents('.bloc:first')[0] == lien.end.parents('.bloc:first')[0]) 120 /*|| (lien.start.hasClass('entree') && lien.end.hasClass('entree')) 121 || (lien.start.hasClass('sortie') && lien.end.hasClass('sortie'))*/) { 122 log("Connexion impossible !"); 123 lien.segments.remove(); 124 return; 125 } 126 127 // Mise à jour des positions des segments lors des drag, etc. 128 lien.start.parents('.bloc:first') 129 .add(lien.end.parents('.bloc:first')) 130 .bind('changer reduire dragstart drag dragstop resizestart resize resizestop', function (event) { 131 uiActualiserLien(lien.start, lien.end, lien.segments); 132 }); 133 134 // Et on re-dessine le lien bien en place maintenant que la cible 135 // est un port et non plus la souris. 136 uiActualiserLien(lien.start, lien.end, lien.segments); 137 138 log("Connexion."); 139 } 140 141 return false; 142 } 143 } 144 }