Legacy:Useful UWindow Extensions/Menus - Unreal Wiki

# Legacy:Useful UWindow Extensions/Menus

### From Unreal Wiki, The Unreal Engine Documentation Site

< Legacy:Useful UWindow Extensions

## Menu fixes

The pulldown menus in UWindow have a bug that allows you to open submenus only up to one level deep. If you try to open a submenu of a submenu all opened menus will disappear. These new menu classes allow as many submenus as you like and they will automatically show up in the right location, so all submenus stay on the screen.

    // EWindow by Wormbo
    //=============================================================================
    // EWindowPulldownMenu
    // This class can handle more than one submenu.
    //=============================================================================
    class EWindowPulldownMenu extends UWindowPulldownMenu;

    var EWindowPulldownMenu SubMenu;       // currently opened submenu
    var UWindowPulldownMenu ParentMenu;    // EWindowPulldownMenu(ParentMenu).SubMenu == Self
    var bool bOpenedToLeft;

    function Created()
    {
            SetAcceptsFocus();
            Super(UWindowListControl).Created();
            ItemHeight = LookAndFeel.Pulldown_ItemHeight;
            VBorder = LookAndFeel.Pulldown_VBorder;
            HBorder = LookAndFeel.Pulldown_HBorder;
            TextBorder = LookAndFeel.Pulldown_TextBorder;
    }

    function UWindowPulldownMenuItem AddMenuItem(string C, Texture G)
    {
            local UWindowPulldownMenuItem I;

            I = UWindowPulldownMenuItem(Items.Append(ListClass));

            I.Owner = Self;
            I.SetCaption(C);
            I.Graphic = G;

            EWindowPulldownMenuItem(I).AltValue = C;

            return I;
    }

    function FocusOtherWindow(UWindowWindow W)
    {
            local UWindowPulldownMenu M;
            local string tmp;

            Super(UWindowListControl).FocusOtherWindow(W);

            for (M = SubMenu; M != None; M = EWindowPulldownMenu(M).SubMenu)
                    if ( W == M )
                            return;

            if ( UWindowPulldownMenuItem(Owner) != None )
                    if ( UWindowPulldownMenuItem(Owner).Owner == W )
                            return;

            For (M = ParentMenu; M != None; M = EWindowPulldownMenu(M).ParentMenu) {
                    if ( W == M )
                            return;
                    if ( EWindowPulldownMenu(M) == None )
                            break;
            }

            if ( bWindowVisible )
                    CloseUp();
    }

    function Clear()
    {
            SubMenu = None;
            Super.Clear();
    }

    function BeforePaint(Canvas C, float X, float Y)
    {
            local float W, H, MaxWidth;
            local int Count;
            local UWindowPulldownMenuItem I;
            local EWindowPulldownMenu Parent;

            Parent = EWindowPulldownMenu(ParentMenu);

            MaxWidth = 100;
            Count = 0;

            C.Font = Root.Fonts[F_Normal];
            C.SetPos(0, 0);

            for (I = UWindowPulldownMenuItem(Items.Next); I != None; I = UWindowPulldownMenuItem(I.Next)) {
                    Count++;
                    TextSize(C, RemoveAmpersand(I.Caption), W, H);
                    if ( W > MaxWidth )
                            MaxWidth = W;
            }

            WinWidth = MaxWidth + (HBorder + TextBorder) * 2;
            WinHeight = ItemHeight * Count + VBorder * 2;

            // Take care of bHelp items
            if ( (UWindowMenuBarItem(Owner) != None && UWindowMenuBarItem(Owner).bHelp)
                            || WinLeft + WinWidth > ParentWindow.WinWidth )
                    WinLeft = ParentWindow.WinWidth - WinWidth;

            if ( ParentMenu != None && (WinWidth + WinLeft > ParentWindow.WinWidth
                            || ParentMenu.WinLeft + ParentMenu.WinWidth - ParentMenu.HBorder > WinLeft
                            || WinLeft + WinWidth > Root.WinWidth || (Parent != None && Parent.bOpenedToLeft))
                            && ParentMenu.WinLeft + ParentMenu.HBorder - WinWidth > 0 ) {
                    WinLeft = ParentMenu.WinLeft + ParentMenu.HBorder - WinWidth;
                    bOpenedToLeft = True;
            }

            if ( ParentMenu != None && WinTop + WinHeight > Root.WinHeight
                            && WinHeight < WinTop + ParentMenu.ItemHeight + 2 * VBorder )
                    WinTop -= WinHeight - ParentMenu.ItemHeight - 2 * VBorder;

            WinTop = Max(Min(WinTop, Root.WinHeight - WinHeight), 0);
            WinLeft = Max(Min(WinLeft, Root.WinWidth - WinWidth), 0);
    }

    defaultproperties
    {
         ListClass=Class'EWindowPulldownMenuItem'
    }

The right-click menu class is used for pop-up menus.

    // EWindow by Wormbo
    //=============================================================================
    // EWindowRightClickMenu
    // This class can handle more than one submenu.
    //=============================================================================
    class EWindowRightClickMenu extends EWindowPulldownMenu;

    function Created()
    {
            bTransient = True;
            Super.Created();
    }

    function RMouseDown(float X, float Y)
    {
            LMouseDown(X, Y);
    }

    function RMouseUp(float X, float Y)
    {
            LMouseUp(X, Y);
    }

    function CloseUp(optional bool bByOwner)
    {
            Super.CloseUp(bByOwner);
            HideWindow();
    }

The pulldown menu item is a UWindowList subclass that holds all the items of the menu including references to submenus.

    // EWindow by Wormbo
    //=============================================================================
    // EWindowPulldownMenuItem
    //=============================================================================
    class EWindowPulldownMenuItem extends UWindowPulldownMenuItem;

    var string AltValue;

    function Select()
    {
            if ( SubMenu != None ) {
                    SubMenu.WinLeft = Owner.WinLeft + Owner.WinWidth - Owner.HBorder;
                    SubMenu.WinTop = ItemTop - Owner.VBorder;

                    if ( EWindowPulldownMenu(Owner) != None )
                            EWindowPulldownMenu(Owner).SubMenu = EWindowPulldownMenu(SubMenu);
                    if ( EWindowPulldownMenu(SubMenu) != None )
                            EWindowPulldownMenu(SubMenu).ParentMenu = Owner;
                    SubMenu.ShowWindow();
            }
    }

    function DeSelect()
    {
            if ( SubMenu != None ) {
                    if ( EWindowPulldownMenu(Owner) != None && EWindowPulldownMenu(Owner).SubMenu == SubMenu )
                            EWindowPulldownMenu(Owner).SubMenu = None;
                    if ( EWindowPulldownMenu(SubMenu) != None )
                            EWindowPulldownMenu(SubMenu).ParentMenu = None;
                    SubMenu.DeSelect();
                    SubMenu.HideWindow();
            }
    }

##### Views

- Legacy
- Discussion
- Current revision

##### Search