Allow the creator to specify their own bounds if they don't want submenus to be constrained by the
stage. git-svn-id: svn+ssh://src.earth.threerings.net/nenya/trunk@519 ed5b42cb-e716-0410-a449-f6a68f950b19
This commit is contained in:
@@ -117,6 +117,17 @@ public class CommandMenu extends Menu
|
|||||||
_dispatcher = dispatcher;
|
_dispatcher = dispatcher;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a Rectangle (in stage coords) that the menu will attempt to keep submenus positioned
|
||||||
|
* within. If a submenu is too large to fit, it will position it in the lower right corner
|
||||||
|
* of this Rectangle (or top if popping upwards, or left if popping leftwards). This
|
||||||
|
* value defaults to the stage bounds.
|
||||||
|
*/
|
||||||
|
public function setBounds (fitting :Rectangle) :void
|
||||||
|
{
|
||||||
|
_fitting = fitting;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Actually pop up the menu. This can be used instead of show().
|
* Actually pop up the menu. This can be used instead of show().
|
||||||
*/
|
*/
|
||||||
@@ -244,7 +255,8 @@ public class CommandMenu extends Menu
|
|||||||
var submenu :Menu = IMenuItemRenderer(row).menu;
|
var submenu :Menu = IMenuItemRenderer(row).menu;
|
||||||
var lefting :Boolean = _lefting;
|
var lefting :Boolean = _lefting;
|
||||||
var upping :Boolean = _upping;
|
var upping :Boolean = _upping;
|
||||||
var fitting :Rectangle = new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
|
var fitting :Rectangle = _fitting != null ? _fitting :
|
||||||
|
new Rectangle(0, 0, stage.stageWidth, stage.stageHeight);
|
||||||
if (submenu.x + submenu.getExplicitOrMeasuredWidth() > fitting.right) {
|
if (submenu.x + submenu.getExplicitOrMeasuredWidth() > fitting.right) {
|
||||||
lefting = true;
|
lefting = true;
|
||||||
}
|
}
|
||||||
@@ -264,11 +276,11 @@ public class CommandMenu extends Menu
|
|||||||
// if we've poped out of the boundaries, just snap it to the lower right corner, or upper
|
// if we've poped out of the boundaries, just snap it to the lower right corner, or upper
|
||||||
// if upping, left if lefting
|
// if upping, left if lefting
|
||||||
if (submenu.x < fitting.left) {
|
if (submenu.x < fitting.left) {
|
||||||
submenu.x = lefting ? 0 : Math.max(
|
submenu.x = lefting ? fitting.left : Math.max(
|
||||||
fitting.right - submenu.getExplicitOrMeasuredWidth(), fitting.left);
|
fitting.right - submenu.getExplicitOrMeasuredWidth(), fitting.left);
|
||||||
}
|
}
|
||||||
if (submenu.y < fitting.top) {
|
if (submenu.y < fitting.top) {
|
||||||
submenu.y = upping ? 0 : Math.max(
|
submenu.y = upping ? fitting.top : Math.max(
|
||||||
fitting.bottom - submenu.getExplicitOrMeasuredHeight(), fitting.top);
|
fitting.bottom - submenu.getExplicitOrMeasuredHeight(), fitting.top);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -323,5 +335,6 @@ public class CommandMenu extends Menu
|
|||||||
protected var _dispatcher :IEventDispatcher;
|
protected var _dispatcher :IEventDispatcher;
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user