Allow a trigger button to be set.
- When the menu hides, if the trigger is a toggle, it will be de-selected. - If the menu is up and you mouseDown on the trigger, it will supress the menu from re-popping by blocking the CLICK that comes on the trigger. Jesus this was complicated to get right. For a while I was trying stuff with MethodQueue, but we react to the MOUSE_DOWN and the CLICK doesn't get generated until some time later. git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@813 ed5b42cb-e716-0410-a449-f6a68f950b19
This commit is contained in:
@@ -26,10 +26,12 @@ import flash.display.DisplayObjectContainer;
|
|||||||
|
|
||||||
import flash.events.Event;
|
import flash.events.Event;
|
||||||
import flash.events.IEventDispatcher;
|
import flash.events.IEventDispatcher;
|
||||||
|
import flash.events.MouseEvent;
|
||||||
|
|
||||||
import flash.geom.Point;
|
import flash.geom.Point;
|
||||||
import flash.geom.Rectangle;
|
import flash.geom.Rectangle;
|
||||||
|
|
||||||
|
import mx.controls.Button;
|
||||||
import mx.controls.Menu;
|
import mx.controls.Menu;
|
||||||
import mx.controls.listClasses.BaseListData;
|
import mx.controls.listClasses.BaseListData;
|
||||||
import mx.controls.listClasses.IListItemRenderer;
|
import mx.controls.listClasses.IListItemRenderer;
|
||||||
@@ -178,6 +180,7 @@ public class CommandMenu extends Menu
|
|||||||
verticalScrollPolicy = ScrollPolicy.OFF;
|
verticalScrollPolicy = ScrollPolicy.OFF;
|
||||||
variableRowHeight = true;
|
variableRowHeight = true;
|
||||||
addEventListener(MenuEvent.ITEM_CLICK, itemClicked);
|
addEventListener(MenuEvent.ITEM_CLICK, itemClicked);
|
||||||
|
addEventListener(MenuEvent.MENU_HIDE, menuHidden);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -189,6 +192,17 @@ public class CommandMenu extends Menu
|
|||||||
return CommandMenuItemRenderer;
|
return CommandMenuItemRenderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure the button that popped-up this menu, which enables two features:
|
||||||
|
* 1) If the button is clicked again while the menu is up, it won't re-trigger, the menu will
|
||||||
|
* just close.
|
||||||
|
* 2) However the menu closes, if the button is a toggle, it will be de-selected.
|
||||||
|
*/
|
||||||
|
public function setTriggerButton (trigger :Button) :void
|
||||||
|
{
|
||||||
|
_trigger = trigger;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures the event dispatcher to be used when dispatching this menu's command events.
|
* Configures the event dispatcher to be used when dispatching this menu's command events.
|
||||||
* Normally they will be dispatched on our parent (usually the SystemManager or something).
|
* Normally they will be dispatched on our parent (usually the SystemManager or something).
|
||||||
@@ -276,6 +290,17 @@ public class CommandMenu extends Menu
|
|||||||
maxHeight = fitting.height;
|
maxHeight = fitting.height;
|
||||||
y = fitting.y;
|
y = fitting.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set up some stuff to clean up and behave
|
||||||
|
systemManager.topLevelSystemManager.getSandboxRoot().addEventListener(
|
||||||
|
MouseEvent.MOUSE_DOWN, handleMouseDownOutside, false, 1, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
override public function hide () :void
|
||||||
|
{
|
||||||
|
super.hide();
|
||||||
|
systemManager.topLevelSystemManager.getSandboxRoot().removeEventListener(
|
||||||
|
MouseEvent.MOUSE_DOWN, handleMouseDownOutside);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -342,6 +367,37 @@ public class CommandMenu extends Menu
|
|||||||
// else: no warning. There may be non-command menu items mixed in.
|
// else: no warning. There may be non-command menu items mixed in.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles MenuEvent.MENU_HIDE.
|
||||||
|
*/
|
||||||
|
protected function menuHidden (event :MenuEvent) :void
|
||||||
|
{
|
||||||
|
// don't react to submenu hides
|
||||||
|
if ((event.menu == this) && (_trigger != null) && _trigger.toggle) {
|
||||||
|
_trigger.selected = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle a down-popping click outside the menu.
|
||||||
|
*/
|
||||||
|
protected function handleMouseDownOutside (event :MouseEvent) :void
|
||||||
|
{
|
||||||
|
if (event.target == _trigger) {
|
||||||
|
_trigger.addEventListener(
|
||||||
|
MouseEvent.CLICK, handleTriggerClick, false, int.MAX_VALUE, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Suppress the click that wants to land on the trigger button.
|
||||||
|
*/
|
||||||
|
protected function handleTriggerClick (event :MouseEvent) :void
|
||||||
|
{
|
||||||
|
event.stopImmediatePropagation();
|
||||||
|
_trigger.removeEventListener(MouseEvent.CLICK, handleTriggerClick);
|
||||||
|
}
|
||||||
|
|
||||||
// from ScrollableArrowMenu..
|
// from ScrollableArrowMenu..
|
||||||
override mx_internal function openSubMenu (row :IListItemRenderer) :void
|
override mx_internal function openSubMenu (row :IListItemRenderer) :void
|
||||||
{
|
{
|
||||||
@@ -473,6 +529,7 @@ public class CommandMenu extends Menu
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected var _dispatcher :IEventDispatcher;
|
protected var _dispatcher :IEventDispatcher;
|
||||||
|
protected var _trigger :Button;
|
||||||
protected var _lefting :Boolean = false;
|
protected var _lefting :Boolean = false;
|
||||||
protected var _upping :Boolean = false;
|
protected var _upping :Boolean = false;
|
||||||
protected var _fitting :Rectangle = null;
|
protected var _fitting :Rectangle = null;
|
||||||
|
|||||||
Reference in New Issue
Block a user