Pages

Tuesday, March 20, 2012

AS3: Custom Dropdown


Here is the code for the custom dropdown component.
/**
 * @file Sample.fla
 * @author Abhishek Kumar
 */
import com.engine.CDropdown;
import flash.display.MovieClip;

var cb:CDropdown = new CDropdown(dropdown_mc, onclick);
cb.attachListeners();

function onclick(mc:MovieClip):void
{
 trace(mc.name);
}

The pseudo code of application (Sample.fla) design architecture.
{
 movieclip: 'dropdown_mc'
 {
  movieclip: 'controller'
  {
   textfield: 'caption',
   frames: [up, over, down]
  }
  movieclip: 'dropdown'
  {
   movieclip: 'item0'
   { 
    textfield: 'caption',
    movieclip: 'selected',
    frames: [up, over, down]
   }
   movieclip: 'item1'
   { 
    textfield: 'caption',
    movieclip: 'selected',
    frames: [up, over, down]
   }
   movieclip: 'item2'
   { 
    textfield: 'caption',
    movieclip: 'selected',
    frames: [up, over, down]
   }
   movieclip: 'item3'
   { 
    textfield: 'caption',
    movieclip: 'selected',
    frames: [up, over, down]
   }
  }
 }
}

The source code of the component library.
/**
 * @file Dropdown.as
 * @author Abhishek Kumar
 */
package com.engine 
{
 import flash.display.MovieClip;
 
 public class CDropdown 
 {
  private var container:MovieClip;
  private var proceed:Function;
  
  private var controller:CButton;
  private var dropdown:CList;
  private var isopen:Boolean;
  
  public function CDropdown(mc:MovieClip, fn:Function) 
  {
   container = mc;
   proceed = fn;
   
   initialize();
  }
  
  private function initialize():void
  {  
   isopen = false;
   controller = new CButton(container.controller, onCick_controller);
   dropdown = new CList(container.dropdown, onClick_dropdown, 4);
   dropdown.hide();
  }
  
  public function attachListeners():void
  {
   controller.attachListeners();
  }
  
  public function detachListeners():void
  {
   controller.detachListeners();
  }
  
  private function onCick_controller(mc:MovieClip):void
  {
   if (isopen)
   {
    dropdown.hide();
    dropdown.detachListeners();
   }
   else
   {
    dropdown.attachListeners();
    dropdown.show(); 
   }
   isopen = !isopen;
  }
  
  private function onClick_dropdown(mc:MovieClip):void
  {
   proceed(mc);
  }
 }

}

/**
 * @file CList.as
 * @author Abhishek Kumar
 */
package com.engine 
{
 import flash.display.MovieClip;
 
 public class CList 
 {
  private var container:MovieClip;
  private var proceed:Function;
  
  private var items:Array;
  private var itemcount:int;
  
  public function CList(mc:MovieClip, fn:Function, icount:int) 
  {
   container = mc;
   proceed = fn;
   
   itemcount = icount;
   
   initialize();
  }
  
  private function initialize():void
  {  
   items = [];
   for (var i:int = 0; i < itemcount; i++)
   {
    if(container['item' + i].getChildByName('selected') != null)
    {
     container['item' + i].selected.visible = false;
    }    
    items[i] = new CButton(container['item' + i], onClick);
   }
  }
  
  public function attachListeners():void
  {
   for (var i:int = 0; i < itemcount; i++)
   {
    CButton(items[i]).attachListeners();
   }
  }
  
  public function detachListeners():void
  {
   for (var i:int = 0; i < itemcount; i++)
   {
    CButton(items[i]).detachListeners();
   }
  }
  
  private function onClick(mc:MovieClip):void
  {
   for (var i:int = 0; i < itemcount; i++)
   { 
    if(container['item' + i].getChildByName('selected') != null)
    {   
     container['item' + i].selected.visible = (mc.name == 'item' + i);
    }
   }
   proceed(mc);
  }
  
  public function show():void
  {
   container.visible = true;
  }
  
  public function hide():void
  {
   container.visible = false;
  }
  
 }

}

/**
 * @file CButton.as
 * @author Abhishek Kumar
 */
package com.engine 
{
 import flash.display.MovieClip;
 import flash.events.MouseEvent;
 public class CButton 
 {
  private var container:MovieClip;
  private var proceed:Function;
  
  public function CButton(mc:MovieClip, fn:Function) 
  {
   container = mc;
   proceed = fn;
   
   initialize();
  }
  
  private function initialize():void
  {   
   container.gotoAndStop('up');
   container.buttonMode = true;
   container.mouseChildren = false;
  }
  
  public function attachListeners():void
  {
   container.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
   container.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
   container.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
   container.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
  }
  
  public function detachListeners():void
  {
   container.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp);
   container.removeEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
   container.removeEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
   container.removeEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
  }
  
  private function onMouseUp(me:MouseEvent):void
  {
   container.gotoAndStop('up');
   proceed(me.target);
  }
  
  private function onMouseDown(me:MouseEvent):void
  {
   container.gotoAndStop('down');
  }
  
  private function onMouseOver(me:MouseEvent):void
  {
   container.gotoAndStop('over');
  }
  
  private function onMouseOut(me:MouseEvent):void
  {
   container.gotoAndStop('up');
  }
  
  public function show():void
  {
   container.visible = true;
  }
  
  public function hide():void
  {
   container.visible = false;
  }
  
 }

}

1 comment:

  1. Damn, why you don't publish the sources?!

    ReplyDelete