Hello ! I'm trying to build a 2 level menu, and its submenus are quite big,
they contain a lot of sub-items.

I'm trying to find a simple way to do it (actually I just want that it work)
, but I'm having lots of problems.

As you will be able to see in the code below, I'm placing the dynamically
created subMenu mc inside the "menuItem" mc.

Each "aba" mc should get their width and height according to the w and h of
the subMenu it contains.

i've erased the biggest part of the code so I can concentrate in this
problem.

you can see it here: http://iialves.com/apres/
here is the code:

var xmlPath:String = "menu.xml";
var myXMLLoader:URLLoader = new URLLoader();
var menuItems:XMLList;
var totalMenuItems:int;

var menu_mc:MovieClip = new MovieClip();
var square:MovieClip;
var menuArray:Array = new Array;
//var subMenuArray:Array = new Array;

var itemWidth:Number;

// MENU (INDEX)
function processXML (e:Event):void{
    var myXML:XML = new XML(e.target.data);
//    myXML.ignoreWhitespace = true;
    menuItems = myXML.children(); //substitui myXML.IMAGE; parece fazer a
mesma coisa
    totalMenuItems = menuItems.length();
    myXMLLoader.removeEventListener(Event.COMPLETE, processXML);
    myXMLLoader = null;
    iniciarMenu();
}

function iniciarMenu ():void{
    for (var i:Number = 0; i < totalMenuItems; i++){

        var menuItem:MenuItem = new MenuItem();
        menuItem.bt_title._txt.autoSize =  TextFieldAutoSize.LEFT;
        menuItem.bt_title._txt.text = menuitems[...@label;
        menuItem.bt_title._txt.antiAliasType = AntiAliasType.ADVANCED;

        itemWidth = stage.stageWidth/totalMenuItems;
        menuItem.menufill.width = itemWidth;

        menuItem.x = i*(stage.stageWidth/totalMenuItems);

        menuItem.mouseChildren = true;
        menuItem.bt_title.mouseEnabled = false;
        menuItem.bt_title.mouseChildren = false;
        menuItem.menufill.mouseEnabled = false;
        menuItem.aba.mouseEnabled = false;

        menuItem.indice = i;

        var subMenu:MovieClip = new MovieClip();
        subMenu.name = "sub_menu";  // Is there something wrong with this?
        subMenu.alpha = 0;
        subMenu.visible = false;
        subMenu.mouseChildren = false;
//        subMenu.mouseEnabled = false;

        menuItem.addChild(subMenu);

        menuArray[i] = menuItem;
        menu_mc.addChild(menuItem);

        createSubMenu(i);

        menuItem.aba.alpha = 0;
        menuItem.aba.width = subMenu.width;
        menuItem.aba.height = 45 + subMenu.height;


//        subMenu.addEventListener(MouseEvent.MOUSE_OVER, mouseOverSub);
    }

    menu_mc.addEventListener(MouseEvent.MOUSE_OVER, mouseOverItem);
    menu_mc.addEventListener(MouseEvent.MOUSE_OUT, mouseOutItem);
    menu_mc.addEventListener(MouseEvent.CLICK, itemClicked);

//    stage.dispatchEvent(new Event(Event.RESIZE));
}

function createSubMenu(i:int):void{
    var subItems:XMLList = menuItems[i].children();

    var rows:int = 11;
    var yCounter:Number = 0;
    var xCounter:Number = 0;

    for (var j:Number = 0; j < subItems.length(); j++){

        var subMenuItem:SubMenuItem = new SubMenuItem();
        subMenuItem.bt_title._txt.autoSize =  TextFieldAutoSize.LEFT;
        subMenuItem.bt_title._txt.text = subItems[j];

        if (subitems[...@level == 1){
        subMenuItem.bt_title._txt.textColor = 0xCCCCCC;
        }
        if (subitems[...@level == 2){
        subMenuItem.bt_title._txt.textColor = 0xD0F858;
        }
        if (subitems[...@level == 3){
        subMenuItem.bt_title._txt.x += 10;
        }

        subMenuItem.bt_title._txt.antiAliasType = AntiAliasType.ADVANCED;

        subMenuItem.y = 45 + yCounter*(subMenuItem.height);
        subMenuItem.x = xCounter*subMenuItem.width;

//        subMenuItem.addEventListener(MouseEvent.MOUSE_OVER, mouseOverSub);

        if (yCounter > rows){
            yCounter = 0;
            xCounter ++;
        } else{
            yCounter ++;
        }

        subMenuItem.mouseChildren = false;
//        subMenuItem.mouseEnabled = false;

// "getChildAt(3)" refers to the the movieclip "sub_menu"
// because "menuArray[i].sub_menu" returns "undefined". why?
        menuArray[i].getChildAt(3).addChild(subMenuItem);

    }
//        subMenu.addEventListener(MouseEvent.MOUSE_OVER, mouseOverSub);
}

function mouseOverSub(e:MouseEvent):void {
    trace (" MOUSE OVER SUBMENU ITEM FINALLY WORKS ");
}

function mouseOverItem(e:Event):void {
    var item:MenuItem = e.target as MenuItem;

    trace ("ch2.name: " + item.getChildAt(2).name); //returns "bt_title"
    trace (item.bt_title); //returns "[object MovieClip]"  great.
    trace ("ch3.name: " + item.getChildAt(3).name); //returns "sub_menu"
    trace (item.sub_menu); //returns "undefined"       WHY????????

    item.aba.visible = true;
    item.aba.alpha = 1;
    item.getChildAt(3).visible = true;
    item.getChildAt(3).alpha = 1;
}

function mouseOutItem(e:Event):void {
    var item:MenuItem = e.target as MenuItem;

    item.aba.visible = false;
    item.aba.alpha = 0;
    item.getChildAt(3).visible = true;
    item.getChildAt(3).alpha = 0;
}

function itemClicked(e:Event):void {
//     var item:MenuItem = e.target as MenuItem;
    trace (e.target.name);
}

myXMLLoader.load(new URLRequest(xmlPath));
myXMLLoader.addEventListener(Event.COMPLETE, processXML);

menu_mc.x = 0;
menu_mc.y = 0;
menu_mc.buttonMode = true;
addChild(menu_mc);


Why do I get this error when I move the cursor over the sub_menu mc?
(shouldn't it be still OVER the "menuItem" mc, as the "aba" mc is stretchd
out to embrace the "sub_menu"?):

TypeError: Error #1009: Não é possível acessar uma propriedade ou um método
de uma referência de objeto nula.
    at ApresentacaoTesteResumo_fla::MainTimeline/mouseOverItem()
TypeError: Error #1009: Não é possível acessar uma propriedade ou um método
de uma referência de objeto nula.
    at ApresentacaoTesteResumo_fla::MainTimeline/mouseOutItem()

I really really extremely appreciate the patience and any help is welcome!!
Isaac
_______________________________________________
Flashcoders mailing list
Flashcoders@chattyfig.figleaf.com
http://chattyfig.figleaf.com/mailman/listinfo/flashcoders

Reply via email to