grunt.js (3422B)
1 Raphael.fn.marginText = function (x,y,text,margin) { 2 margin = isNaN(+margin) ? 10 : margin; 3 var t = this.text(0,0,text); 4 var size = t.getBBox(); 5 t.translate(margin+x-size.x, margin+y-size.y); 6 // TODO : surcharger les méthodes permettant de faire un set! sur x et y. 7 var getBBox = t.getBBox; 8 t.getBBox = function() { 9 var bBox = getBBox.call(this); 10 bBox.x -= margin; 11 bBox.y -= margin; 12 bBox.width += 2*margin; 13 bBox.height += 2*margin; 14 return bBox 15 }; 16 return t; 17 }; 18 19 function floorCeil(a,b,c,d) { 20 var x1 = a; 21 var y1 = b; 22 var x2 = a+c; 23 var y2 = b+d; 24 25 } 26 27 Raphael.fn.boundingRect = function(margin) { 28 margin = +margin || 0; 29 var set = this.set(); 30 set.push.apply(set,arguments); 31 var size = set.getBBox(); 32 var rect = this.rect(size.x-margin, size.y-margin, size.width+2*margin, size.height+2*margin); 33 /* Pour des bords nets : rect.node.style.shapeRendering = "crispEdges"; */ 34 rect.set = this.set().push(rect,set); 35 return rect; 36 }; 37 38 function Block(name) { 39 this.name = name; 40 this.draw = function(x,y) { 41 var name = r.text(x,y,this.name); 42 var block = r.boundingRect(10, name).insertBefore(name).attr({ 43 stroke: this.borderColor, 44 fill: this.fillColor 45 }); 46 var start = function () { 47 this.oldDx = 0; 48 this.oldDy = 0; 49 this.firstMove = true; 50 this.toFront(); 51 }; 52 var move = function (dx, dy) { 53 if (this.firstMove) { this.firstMove = false; this.attr({opacity: 0.5}); } 54 this.translate(dx-this.oldDx, dy-this.oldDy); 55 this.oldDx = dx; 56 this.oldDy = dy; 57 }; 58 var up = function () { 59 this.attr({opacity: 1}); 60 }; 61 block.set.drag(move, start, up, block.set, block.set, block.set); 62 return block.set; 63 }; 64 }; 65 66 // Colors 67 Block.prototype.borderColor = "#000"; 68 Block.prototype.fillColor = "#ff8"; 69 70 function init() { 71 $('noscript').hide(); 72 r = Raphael("ide", 640, 480); 73 b1 = new Block("Block 1").draw(150, 100); 74 b2 = new Block("My pretty block").draw(30, 200); 75 } 76 77 new Event.observe(window, 'load', init); 78 79 /* Modèle 80 [World]<>-[BlockDef|name,inputPorts,outputPorts]-[Graph] 81 Graph = ??? des ports et des blocs… 82 83 Algorithme d'évaluation : 84 85 Pour instancier une définition de bloc : 86 - Instancier le bloc à partir de sa définition 87 - Pour chaque sous-bloc de la définition, on a dans l'instance un slot d'instance pour le sous-bloc (vide au départ). 88 - Pour chaque port de sortie de chaque sous-bloc, on a dans l'instance un slot de port (vide au départ) (peut être stocké directement dans les ports de sortie de l'instance). 89 - Pour chaque port d'entrée du bloc, on a dans l'instance un slot de port (vide au départ). 90 91 Pour évaluer la valeur d'un port de sortie d'un bloc (inst) : 92 - Chercher quel sous-bloc & port est connecté à ce port de sortie 93 - Si le slot de ce sous-bloc est vide, instancier le sous-bloc et stocker l'isntance dans le slot 94 - Si le slot de port de sortie de ce sous-bloc est vide : 95 - Calculer la valeur du port de sortie souhaité de ce sous-bloc 96 - Stocker la valeur ainsi calculée dans le slot de port de sortie qu'on cherchait au départ 97 - Renvoyer la valeur ainsi calculée. 98 99 Pour évaluer la valeur d'un port d'entrée d'un bloc (inst) : 100 - Dans l'instance de bloc contenant celle-ci, 101 - Chercher le sous-bloc / le port d'entrée connecté au notre. 102 - Calculer cette valeur 103 - Soit en récursion pour calculer le port d'entrée du parent 104 - Soit en récursion pour calculer le port de sortie du bloc voisin au notre. 105 */