3 pièce(s) jointe(s)
Bug positionnement dans menu "accordéon" multiniveau
Bonjour à tous!!
Tout d'abord, j'espère vraiment que vous réussirez à solutionner mon problème!!
Voici tout d'abord le code AS2, si vous voulez voir l'engin en situation, j'ai joint le XML, le fla (MovieClip inclus) et le swf...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
var menu_xml = new XML();
menu_xml.load("xmlTest.xml");
menu_xml.ignoreWhite = true;
//
menu_xml.onLoad = function() {
_global.nbrMenuFirstLevel = this.childNodes[0].childNodes.length;
_global.racine = this.childNodes[0];
for (i=0; i<nbrMenuFirstLevel; i++) {
_root.attachMovie("etiquette","menuItem"+i,i);
_root["menuItem"+i]._x = 8;
_root["menuItem"+i]._y = 30+(i*19);
_root["menuItem"+i].nomElement = racine.childNodes[i].attributes.title;
_root["menuItem"+i].derouleur.Enfants = racine.childNodes[i].childNodes;
_root["menuItem"+i].derouleur.niveau1 = _root["menuItem"+i];
_root["menuItem"+i].derouleur.profondeur = 1;
_root["menuItem"+i].derouleur.y = _root["menuItem"+i]._y
_root["menuItem"+i].derouleur.onPress = generateSubMenu;
}
};
//
getProps = function (table, resultats, position, toExclude) {
for (prop in table) {
if (typeof(table[prop]) == "movieclip" && prop.substr(0, 8) == "menuItem") {
if (table[prop] != toExclude) {
trace(table+"."+prop+" Name:"+table[prop].nomElement+" H:"+table[prop].derouleur.y+" Position:"+position);
if ( table[prop].derouleur.y > position ) {
resultats.push(table[prop]);
} else {
getProps(table[prop], resultats, position);
}
}
}
}
};
replacerMenus = function (elt) {
var decalY = 0;
var resultats = [];
getProps(_root, resultats, elt.derouleur.y, elt);
for ( i=0; i<resultats.length; i++ ) {
resultats[i]._y += 19*elt.derouleur.Enfants.length;
resultats[i].derouleur.y += 19;
}
/*_global.destinationsMenus = [];
for (i=0; i<nbrMenuFirstLevel; i++) {
placeMenu = 30+decalY;
destinationsMenus.push(placeMenu);
decalY += _root["menuItem"+i]._height;
}
for (i=0; i<nbrMenuFirstLevel; i++) {
_root["menuItem"+i].numeroEntree = i;
_root["menuItem"+i].onEnterFrame = function() {
this._y += (destinationsMenus[this.numeroEntree]-this._y)*0.2;
};
}*/
};
generateSubMenu = function () {
if (this._currentframe == 1) {
this.gotoAndStop(2);
for (i=0; i<this.Enfants.length; i++) {
tempo = this.niveau1.attachMovie("etiquette", "menuItem"+i, i);
tempo._x = 10*this.profondeur;
tempo._y = 19+(i*19);
tempo.derouleur.profondeur = this.profondeur+1;
tempo.nomElement = this.Enfants[i].attributes.title;
tempo.derouleur.niveau1 = this.niveau1["menuItem"+i];
tempo.derouleur.Enfants = this.Enfants[i].childNodes;
tempo.derouleur.y = this.y+tempo._y
tempo.derouleur.onPress = generateSubMenu;
}
replacerMenus(this.niveau1);
} else {
this.gotoAndStop(1);
var resultats = [];
for (i=0; i<this.Enfants.length; i++) {
this.niveau1["menuItem"+i].removeMovieClip();
}
getProps(_root, resultats, this.y);
for ( i=0; i<resultats.length; i++ )
resultats[i].derouleur.y -= 19;
}
//
}; |
Je vous avouerai que ce n'est pas mon code le plus propre, mais bon, il faut que ça marche D'ABORD, l'optimisation vient après...
Le problème étant somewhat difficult à expliquer (je ne vois pas comment faire pour que mon explication soit claire et compréhensible), je vous recommande vivement de downloader le swf et le xml pour comprendre le bug de fonctionnement (le fla pour des tests si vous voulez, il y a un MovieClip inclus (invisible sur la scène))...
Vous voyez??
- Le "dépliage" du 1er niveau fonctionne (éléments-fils visibles, et élément-frère descendu)
- Le "repliage" de ce même 1er niveau pas. L'élément-frère de celui sur lequel on a cliqué continue à descendre au lieu de remonter à sa position initiale.
- Le "dépliage" du 2ème niveau fonctionne(il n'y a pas d'enfant pour les 2 premiers noeuds de niveau 2), mais l'affichage des enfants du 3ème noeud de niveau 2 se fait beaucoup trop bas)
- Le repliage du niveau 2 pose le même problème que pour le niveau 1.
Et les mêmes problèmes surviennent pour les niveau 3 et 4.
J'ai essayé de faire un code "récurssif" au maximum histoire de ne pas avoir à recoder un tel menu si la structure du XML venait à changer...
Bref, je ne demande pas que mon menu soit 100% fonctionnel, mais j'aimerais que vous m'aidez à résoudre le problème de repliage. Pourquoi les éléments-frères ne remontent-ils pas correctement??
Le reste, je chercherai par moi-même avant de faire éventuellement à nouveau appel à vous... :)
Merci d'avance pour votre aide!! ;)