Пример #1
0
	protected void AddInsertMenuItems(ref CtxMenu.Item[] items)
	{
		int inserts = 0;
		
		if (items != null)
		{
			for (int idx=0; idx < items.Length; idx++)
			{
				if (items[idx].isSelected)
				{
					items[idx].isSelected = false;
					CtxMenu.Item newItem = new CtxMenu.Item();
					newItem.id = NextHighestItemID(ref items);
					ArrayUtility.Insert<CtxMenu.Item>(ref items, idx, newItem);
					++inserts;
				}
			}
		}

		if (inserts == 0)
		{
			CtxMenu.Item newItem = new CtxMenu.Item();
			newItem.id = NextHighestItemID(ref items);
			if (items == null)
			{
				items = new CtxMenu.Item[1];
				items[0] = newItem;
			}
			else
				ArrayUtility.Add<CtxMenu.Item>(ref items, newItem);
		}
	}
Пример #2
0
    private void __InitializeContextMenu() {      // IMPROVE use of string
        _ctxObject = gameObject.GetSafeMonoBehaviour<CtxObject>();
        _ctxObject.offsetMenu = true;

        if (_playerFleetMenu == null) {
            _playerFleetMenu = GuiManager.Instance.gameObject.GetSafeMonoBehavioursInChildren<CtxMenu>().Single(menu => menu.gameObject.name == "PlayerFleetMenu");

            // NOTE: Cannot set CtxMenu.items from here as CtxMenu.Awake sets defaultItems = items (null) before I can set items programmatically.
            // Accordingly, the work around is to either use the editor to set the items, or have every CtxObject set their menuItems programmatically.
            // I've chosen to use the editor for now, and to verify my editor settings from here using ValidateShipMenuItems()
            var desiredfleetMenuItems = new CtxMenu.Item[_playerFleetMenuOrders.Length];
            for (int i = 0; i < _playerFleetMenuOrders.Length; i++) {
                var item = new CtxMenu.Item();
                item.text = _playerFleetMenuOrders[i].GetValueName();    // IMPROVE GetDescription would be better for the context menu display
                item.id = i;
                desiredfleetMenuItems[i] = item;
            }
            var editorPopulatedMenuItems = _playerFleetMenu.items;
            ValidateMenuItems(editorPopulatedMenuItems, desiredfleetMenuItems);

            _lowestUnusedItemId = _playerFleetMenu.items.Length;
        }

        _ctxObject.contextMenu = _playerFleetMenu;
        D.Assert(_ctxObject.contextMenu != null, "{0}.contextMenu on {1} is null.".Inject(typeof(CtxObject).Name, Presenter.FullName));

        EventDelegate.Add(_ctxObject.onShow, OnContextMenuShow);
        EventDelegate.Add(_ctxObject.onSelection, OnContextMenuSelection);
        EventDelegate.Add(_ctxObject.onHide, OnContextMenuHide);
    }
Пример #3
0
    protected void AddInsertMenuItems(ref CtxMenu.Item[] items)
    {
        int inserts = 0;

        if (items != null)
        {
            for (int idx = 0; idx < items.Length; idx++)
            {
                if (items[idx].isSelected)
                {
                    items[idx].isSelected = false;
                    CtxMenu.Item newItem = new CtxMenu.Item();
                    newItem.id = NextHighestItemID(ref items);
                    ArrayUtility.Insert <CtxMenu.Item>(ref items, idx, newItem);
                    ++inserts;
                }
            }
        }

        if (inserts == 0)
        {
            CtxMenu.Item newItem = new CtxMenu.Item();
            newItem.id = NextHighestItemID(ref items);
            if (items == null)
            {
                items    = new CtxMenu.Item[1];
                items[0] = newItem;
            }
            else
            {
                ArrayUtility.Add <CtxMenu.Item>(ref items, newItem);
            }
        }
    }
Пример #4
0
 /// <summary>
 /// Assign a new icon sprite to this menu item.
 /// </summary>
 /// <param name='items'>
 /// The array of items to search.
 /// </param>
 /// <param name='id'>
 /// The menu item id number.
 /// </param>
 /// <param name='icon'>
 /// The name of the sprite to assign. Note that the sprite must be in the atlas
 /// used by this context menu. Refer to the NGUI documentation for more information.
 /// </param>
 public static void SetIcon(CtxMenu.Item[] items, int id, string icon)
 {
     CtxMenu.Item item = FindItemRecursively(items, id);
     if (item != null)
     {
         item.icon = icon;
     }
 }
Пример #5
0
 /// <summary>
 /// Assigns a new text string to the specified menu item. If this is a localized
 /// menu, you should only assign key strings and allow the localization
 /// logic to update the visible text.
 /// </summary>
 /// <param name='items'>
 /// The array of items to search.
 /// </param>
 /// <param name='id'>
 /// The menu item id number.
 /// </param>
 /// <param name='text'>
 /// The text that will be displayed for this menu item.
 /// </param>
 public static void SetText(CtxMenu.Item[] items, int id, string text)
 {
     CtxMenu.Item item = FindItemRecursively(items, id);
     if (item != null)
     {
         item.text = text;
     }
 }
Пример #6
0
 /// <summary>
 /// Sets the disabled state for the specified menu item.
 /// </summary>
 /// <param name='id'>
 /// The menu item id number.
 /// </param>
 /// <param name='items'>
 /// The array of items to search.
 /// </param>
 /// <param name='isDisabled'>
 /// The desired disable state.
 /// </param>
 public static void SetDisabled(CtxMenu.Item[] items, int id, bool isDisabled)
 {
     CtxMenu.Item item = FindItemRecursively(items, id);
     if (item != null)
     {
         item.isDisabled = isDisabled;
     }
 }
Пример #7
0
    /// <summary>
    /// Retrieve the name of the icon sprite displayed by this menu item.
    /// </summary>
    /// <returns>
    /// The icon sprite name.
    /// </returns>
    /// <param name='items'>
    /// The array of items to search.
    /// </param>
    /// <param name='id'>
    /// The menu item id number.
    /// </param>
    public static string GetIcon(CtxMenu.Item[] items, int id)
    {
        CtxMenu.Item item = FindItemRecursively(items, id);
        if (item != null)
        {
            return(item.icon);
        }

        return(null);
    }
Пример #8
0
    /// <summary>
    /// Determines whether the specified menu item is disabled.
    /// </summary>
    /// <returns>
    /// <c>true</c> if the specified menu item is disabled; otherwise, <c>false</c>.
    /// </returns>
    /// <param name='items'>
    /// The array of items to search.
    /// </param>
    /// <param name='id'>
    /// The menu item id number.
    /// </param>
    public static bool IsDisabled(CtxMenu.Item[] items, int id)
    {
        CtxMenu.Item item = FindItemRecursively(items, id);
        if (item != null)
        {
            return(item.isDisabled);
        }

        return(false);
    }
Пример #9
0
 /// <summary>
 /// Sets the checkmark state for the specified menu item. Note that this flag
 /// will be ignored if the item didn't originally have its 'checkable' flag set.
 /// If this item is part of a mutex group, then the other items in the group
 /// will be unchecked when this item is checked.
 /// </summary>
 /// <param name='items'>
 /// The array of items to search.
 /// </param>
 /// <param name='id'>
 /// The menu item id number.
 /// </param>
 /// <param name='isChecked'>
 /// The desired checkmark state.
 /// </param>
 public static void SetChecked(CtxMenu.Item[] items, int id, bool isChecked)
 {
     CtxMenu.Item item = FindItemRecursively(items, id);
     if (item != null && item.isCheckable)
     {
         item.isChecked = isChecked;
         if (item.mutexGroup >= 0)
         {
             MutexItems(items, id, item.mutexGroup);
         }
     }
 }
Пример #10
0
    public void OnShowMenu(CtxObject obj)
    {
        if (menuItems == null)
        {
            int cnt = (int)MenuItemID.Count;
            menuItems = new CtxMenu.Item[cnt];
            for (int i = 0; i < cnt; i++)
            {
                MenuItemID itemID = (MenuItemID)i;

                menuItems[i]      = new CtxMenu.Item();
                menuItems[i].text = ItemText(itemID);
                if (menuItems[i].text.StartsWith("Separator"))
                {
                    menuItems[i].isSeparator = true;
                }
                else
                {
                    menuItems[i].id = i;
                }
            }

            menuItems[(int)MenuItemID.Small].isCheckable  = true;
            menuItems[(int)MenuItemID.Medium].isCheckable = true;
            menuItems[(int)MenuItemID.Large].isCheckable  = true;

            menuItems[(int)MenuItemID.Small].mutexGroup  = 0;
            menuItems[(int)MenuItemID.Medium].mutexGroup = 0;
            menuItems[(int)MenuItemID.Large].mutexGroup  = 0;

            menuItems[(int)MenuItemID.Stealth].isCheckable = true;
            menuItems[(int)MenuItemID.Shield].isCheckable  = true;
        }

        if (transform.localScale.x == 1f)
        {
            CtxHelper.SetChecked(menuItems, (int)MenuItemID.Small, true);
        }
        else if (transform.localScale.x == 2f)
        {
            CtxHelper.SetChecked(menuItems, (int)MenuItemID.Medium, true);
        }
        else
        {
            CtxHelper.SetChecked(menuItems, (int)MenuItemID.Large, true);
        }

        menuItems[(int)MenuItemID.Stealth].isChecked = stealthOn;
        menuItems[(int)MenuItemID.Shield].isChecked  = shieldOn;

        obj.menuItems = menuItems;
    }
Пример #11
0
    /// <summary>
    /// Retrieve the menu item descriptor with the specified id. If this menu has
    /// submenus, the search will recurse into the child menus after searching all
    /// of the items in the current menu.
    /// </summary>
    /// <returns>
    /// The menu item descriptor instance.
    /// </returns>
    /// <param name='items'>
    /// The array of items to search.
    /// </param>
    /// <param name='id'>
    /// The menu item id number.
    /// </param>
    public static CtxMenu.Item FindItemRecursively(CtxMenu.Item[] itemsArray, int id)
    {
        bool hasSubmenus = false;

        foreach (CtxMenu.Item item in itemsArray)
        {
            if (item.id == id)
            {
                return(item);
            }

#if CTX_NO_SERIALIZATION_FIX
            if (item.submenuItems != null || item.submenu)
#else
            if (item.submenu)
#endif
            { hasSubmenus = true; }
        }

        if (hasSubmenus)
        {
            foreach (CtxMenu.Item item in itemsArray)
            {
#if CTX_NO_SERIALIZATION_FIX
                if (item.submenuItems != null)
                {
                    CtxMenu.Item res = FindItemRecursively(item.submenuItems, id);
                    if (res != null)
                    {
                        return(res);
                    }
                }
#endif
                if (item.submenu != null)
                {
                    CtxMenu.Item res = FindItemRecursively(item.submenu.items, id);
                    if (res != null)
                    {
                        return(res);
                    }
                }
            }
        }

        return(null);
    }
Пример #12
0
    void BuildMenu()
    {
        int baseItem = base.MenuItemCount;

        if (menuItems == null)
        {
            int itemCnt = baseItem + 1;
            menuItems = new CtxMenu.Item[itemCnt];

            for (int i = 0; i < itemCnt; i++)
            {
                menuItems[i] = new CtxMenu.Item();
            }
        }

        base.FillMenuItems(menuItems);

        menuItems[baseItem].text      = "Transport";
        menuItems[baseItem].isSubmenu = true;
        menuItems[baseItem].submenu   = commandSubmenu;

#if CTX_NO_SERIALIZATION_FIX
        CtxMenu.Item[] submenuItems = new CtxMenu.Item[3];
        menuItems[baseItem].submenuItems = submenuItems;
#else
        CtxMenu.Item[] submenuItems = new CtxMenu.Item[3];
        commandSubmenu.items = submenuItems;
#endif

        for (int i = 0; i < 3; i++)
        {
            submenuItems[i]    = new CtxMenu.Item();
            submenuItems[i].id = (int)Commands.LandAtWhiteHouse + i;
        }

        submenuItems[0].text = "Land At White House";
        submenuItems[1].text = "Deploy Grays";
        submenuItems[2].text = "Recover Grays";
    }
Пример #13
0
    void BuildMenu()
    {
        int baseItem = base.MenuItemCount;

        if (menuItems == null)
        {
            int itemCnt = baseItem + 1;
            menuItems = new CtxMenu.Item[itemCnt];

            for (int i = 0; i < itemCnt; i++)
            {
                menuItems[i] = new CtxMenu.Item();
            }
        }

        base.FillMenuItems(menuItems);

        menuItems[baseItem].text      = "Enforcer";
        menuItems[baseItem].isSubmenu = true;
        menuItems[baseItem].submenu   = commandSubmenu;

#if CTX_NO_SERIALIZATION_FIX
        CtxMenu.Item[] submenuItems = new CtxMenu.Item[3];
        menuItems[baseItem].submenuItems = submenuItems;
#else
        CtxMenu.Item[] submenuItems = new CtxMenu.Item[3];
        commandSubmenu.items = submenuItems;
#endif

        for (int i = 0; i < 3; i++)
        {
            submenuItems[i]    = new CtxMenu.Item();
            submenuItems[i].id = (int)Commands.AttackMilitary + i;
        }

        submenuItems[0].text = "Attack Military";
        submenuItems[1].text = "Attack Civilians";
        submenuItems[2].text = "Deploy Ultimate Weapon";
    }
Пример #14
0
    void BuildMenu()
    {
        int baseItem = base.MenuItemCount;

        if (menuItems == null)
        {
            int itemCnt = baseItem + 1;
            menuItems = new CtxMenu.Item[itemCnt];

            for (int i = 0; i < itemCnt; i++)
            {
                menuItems[i] = new CtxMenu.Item();
            }
        }

        base.FillMenuItems(menuItems);

        menuItems[baseItem].text      = "Spy";
        menuItems[baseItem].isSubmenu = true;
        menuItems[baseItem].submenu   = commandSubmenu;

#if CTX_NO_SERIALIZATION_FIX
        CtxMenu.Item[] submenuItems = new CtxMenu.Item[3];
        menuItems[baseItem].submenuItems = submenuItems;
#else
        CtxMenu.Item[] submenuItems = new CtxMenu.Item[3];
        commandSubmenu.items = submenuItems;
#endif

        for (int i = 0; i < 3; i++)
        {
            submenuItems[i]    = new CtxMenu.Item();
            submenuItems[i].id = (int)Commands.FakeAutopsy + i;
        }

        submenuItems[0].text = "Fake Autopsy";
        submenuItems[1].text = "Make Crop Circles";
        submenuItems[2].text = "Buzz Radar Towers";
    }
Пример #15
0
    void BuildMenu()
    {
        int baseItem = base.MenuItemCount;

        if (menuItems == null)
        {
            int itemCnt = baseItem + 1;
            menuItems = new CtxMenu.Item[itemCnt];

            for (int i = 0; i < itemCnt; i++)
            {
                menuItems[i] = new CtxMenu.Item();
            }
        }

        base.FillMenuItems(menuItems);

        menuItems[baseItem].text      = "Abductor";
        menuItems[baseItem].isSubmenu = true;
        menuItems[baseItem].submenu   = commandSubmenu;

#if CTX_NO_SERIALIZATION_FIX
        CtxMenu.Item[] submenuItems = new CtxMenu.Item[3];
        menuItems[baseItem].submenuItems = submenuItems;
#else
        CtxMenu.Item[] submenuItems = new CtxMenu.Item[3];
        commandSubmenu.items = submenuItems;
#endif

        for (int i = 0; i < 3; i++)
        {
            submenuItems[i]    = new CtxMenu.Item();
            submenuItems[i].id = (int)Commands.AbductSpecimens + i;
        }

        submenuItems[0].text = "Abduct Specimens";
        submenuItems[1].text = "Erase Memory";
        submenuItems[2].text = "Use 'Probe' Device";
    }
Пример #16
0
    void BuildMenu()
    {
        int baseItem = base.MenuItemCount;

        if (menuItems == null)
        {
            int itemCnt = baseItem + 1;
            menuItems = new CtxMenu.Item[itemCnt];

            for (int i = 0; i < itemCnt; i++)
            {
                menuItems[i] = new CtxMenu.Item();
            }
        }

        base.FillMenuItems(menuItems);

        menuItems[baseItem].text      = "Scout";
        menuItems[baseItem].isSubmenu = true;
        menuItems[baseItem].submenu   = commandSubmenu;

#if CTX_NO_SERIALIZATION_FIX
        CtxMenu.Item[] submenuItems = new CtxMenu.Item[3];
        menuItems[baseItem].submenuItems = submenuItems;
#else
        CtxMenu.Item[] submenuItems = new CtxMenu.Item[3];
        commandSubmenu.items = submenuItems;
#endif

        for (int i = 0; i < 3; i++)
        {
            submenuItems[i]    = new CtxMenu.Item();
            submenuItems[i].id = (int)Commands.BuzzAirliners + i;
        }

        submenuItems[0].text = "Buzz Airliners";
        submenuItems[1].text = "Fly in Circles";
        submenuItems[2].text = "Hover Aimlessly";
    }
Пример #17
0
 /// <summary>
 /// Adds the optimal focus distance item to the menu operator menu without regard
 /// to whether the MenuOperator is owned by the user.
 /// </summary>
 private void AddOptimalFocusDistanceItemToMenu() {
     _optimalFocusDistanceItemID = _nextAvailableItemId;
     CtxMenu.Item optimalFocusDistanceItem = new CtxMenu.Item() {
         text = SetOptimalFocusDistanceItemText,
         id = _optimalFocusDistanceItemID
     };
     // many SelectedItems will not offer any other menuItems to select
     var menuItems = (_ctxObject.menuItems != null) ? _ctxObject.menuItems.ToList() : new List<CtxMenu.Item>(1);
     menuItems.Add(optimalFocusDistanceItem);
     _ctxObject.menuItems = menuItems.ToArray();
     _nextAvailableItemId++; // probably not necessary as this is the last item being added
 }
Пример #18
0
    private void PopulateMenu_UserRemoteBaseIsSelected() {
        var topLevelMenuItems = new List<CtxMenu.Item>();
        var selectedItemDistanceLabel = CreateRemoteSelectedItemDistanceLabel();
        topLevelMenuItems.Add(selectedItemDistanceLabel);
        foreach (var directive in UserRemoteBaseDirectives) {
            int topLevelItemID = _nextAvailableItemId;
            var topLevelItem = new CtxMenu.Item() {
                text = TopLevelMenuItemTextFormat.Inject(directive.GetValueName()),
                id = topLevelItemID
            };
            topLevelMenuItems.Add(topLevelItem);
            _directiveLookup.Add(topLevelItemID, directive);
            _nextAvailableItemId++;

            topLevelItem.isDisabled = IsUserRemoteBaseMenuItemDisabledFor(directive);
        }
        _ctxObject.menuItems = topLevelMenuItems.ToArray();
    }
Пример #19
0
 private CtxMenu.Item CreateRemoteSelectedItemDistanceLabel() {
     float distanceToSelectedItem = GetDistanceTo(_remoteUserOwnedSelectedItem);
     var menuItem = new CtxMenu.Item() {
         text = SelectedItemDistanceTextFormat.Inject(distanceToSelectedItem)
     };
     menuItem.id = -1;   // needed to get spacing right
     menuItem.isDisabled = true;
     return menuItem;
 }
Пример #20
0
	protected void EditMenuItem(CtxMenu.Item item, UIAtlas atlas)
	{
		if (item == null)
			return;
		
		GUILayoutOption[] itemSpriteOpt = { GUILayout.Height(16f), GUILayout.Width(140f) };
		GUILayoutOption[] itemSpriteDelOpt = { GUILayout.Height(16f), GUILayout.Width(60f) };
		
		Color normalColor, disabledColor;
		
		Rect box = EditorGUILayout.BeginVertical();
		GUILayout.Space(4f);
		GUI.Box(box, "");
		
		EditorGUILayout.BeginHorizontal();
		item.isSelected = EditorGUILayout.Toggle(item.isSelected, GUILayout.Width(12f));
		
		EditorGUIUtility.labelWidth = 64f;
		CtxMenu.ItemStyle itemStyle = (CtxMenu.ItemStyle)EditorGUILayout.EnumMaskField("Style", item.style,
			GUILayout.Width(188f));
		
		if (item.style != itemStyle)
		{
			RegisterUndo();
			
			bool wasSubmenu = item.isSubmenu;
			
			item.style = itemStyle;
			
			if (item.isSubmenu && ! wasSubmenu)
				item.id = -1;
		}
		
		if (item.isCheckable)
		{
			EditorGUIUtility.labelWidth = 44f;
			int mutexGroup = EditorGUILayout.IntField("Mutex", item.mutexGroup, GUILayout.Width(88f));
			if (mutexGroup != item.mutexGroup)
			{
				RegisterUndo();
				item.mutexGroup = mutexGroup;
			}
		}
		 
		EditorGUIUtility.labelWidth = 80f;
		EditorGUILayout.EndHorizontal();

		if ((item.style & CtxMenu.ItemStyle.Separator) != (CtxMenu.ItemStyle)0)
			item.id = -1;
		else
		{
			EditorGUILayout.BeginHorizontal();
			string text = EditorGUILayout.TextField("    Text", item.text, GUILayout.Width(204f));
			if (item.text != text)
			{
				RegisterUndo();
				item.text = text;
			}
		
			EditorGUIUtility.labelWidth = 32f;
			GUILayout.Space(12f);
			int itemId = EditorGUILayout.IntField("ID", item.id, GUILayout.Width(76f));
			if (item.id != itemId)
			{
				RegisterUndo();
				item.id = itemId;
			}
			EditorGUIUtility.labelWidth = 80f;
			
			EditorGUILayout.EndHorizontal();

			EditorGUILayout.BeginHorizontal();
			GUILayout.Label("    Icon", GUILayout.Width(76f));
	
			string iconTitle = item.icon;
			if (string.IsNullOrEmpty(iconTitle))
				iconTitle = "...";
			
			if (GUILayout.Button(iconTitle, itemSpriteOpt))
			{
				currentItem = item;
				NGUISettings.atlas = atlas;
				SpriteSelector.Show(OnItemIcon);
			}

			GUILayout.Space(12f);
			if (GUILayout.Button("None", itemSpriteDelOpt))
			{
				if (! string.IsNullOrEmpty(item.icon))
					RegisterUndo();
				
				item.icon = "";
			}
			
			EditorGUILayout.EndHorizontal();
			
			if (! string.IsNullOrEmpty(item.icon))
			{
				EditorGUILayout.BeginHorizontal();
				normalColor = EditorGUILayout.ColorField("    Normal", item.spriteColor, GUILayout.Width(140f));
				if (normalColor != item.spriteColor)
				{
					RegisterUndo();
					item.spriteColor = normalColor;
				}
				GUILayout.Space(32f);
				disabledColor = EditorGUILayout.ColorField("Disabled", item.spriteColorDisabled, GUILayout.Width(140f));
				if (item.spriteColorDisabled != disabledColor)
				{
					RegisterUndo();
					item.spriteColorDisabled = disabledColor;
				}
				EditorGUILayout.EndHorizontal();
			}
			
			if (item.isSubmenu)
			{
				CtxMenu submenu = (CtxMenu)EditorGUILayout.ObjectField("    Submenu", item.submenu, typeof(CtxMenu), true, GUILayout.Width(317f));
				if (item.submenu != submenu)
				{
					RegisterUndo();
					item.submenu = submenu;
				}
				
				if (submenu != null)
					EditMenuItemList(ref item.submenuItems, submenu.atlas, false, ref item.isEditingItems);
			}
		}
		
		GUILayout.Space(4f);
		EditorGUILayout.EndVertical();
		GUILayout.Space(4f);
	}
Пример #21
0
    protected void EditMenuItem(CtxMenu.Item item, UIAtlas atlas)
    {
        if (item == null)
        {
            return;
        }

        GUILayoutOption[] itemSpriteOpt    = { GUILayout.Height(16f), GUILayout.Width(140f) };
        GUILayoutOption[] itemSpriteDelOpt = { GUILayout.Height(16f), GUILayout.Width(60f) };

        Color normalColor, disabledColor;

        Rect box = EditorGUILayout.BeginVertical();

        GUILayout.Space(4f);
        GUI.Box(box, "");

        EditorGUILayout.BeginHorizontal();
        item.isSelected = EditorGUILayout.Toggle(item.isSelected, GUILayout.Width(12f));

        EditorGUIUtility.labelWidth = 64f;
        CtxMenu.ItemStyle itemStyle = (CtxMenu.ItemStyle)EditorGUILayout.EnumFlagsField("Style", item.style,
                                                                                        GUILayout.Width(188f));

        if (item.style != itemStyle)
        {
            RegisterUndo();

            bool wasSubmenu = item.isSubmenu;

            item.style = itemStyle;

            if (item.isSubmenu && !wasSubmenu)
            {
                item.id = -1;
            }
        }

        if (item.isCheckable)
        {
            EditorGUIUtility.labelWidth = 44f;
            int mutexGroup = EditorGUILayout.IntField("Mutex", item.mutexGroup, GUILayout.Width(88f));
            if (mutexGroup != item.mutexGroup)
            {
                RegisterUndo();
                item.mutexGroup = mutexGroup;
            }
        }

        EditorGUIUtility.labelWidth = 80f;
        EditorGUILayout.EndHorizontal();

        if ((item.style & CtxMenu.ItemStyle.Separator) != (CtxMenu.ItemStyle) 0)
        {
            item.id = -1;
        }
        else
        {
            EditorGUILayout.BeginHorizontal();
            string text = EditorGUILayout.TextField("    Text", item.text, GUILayout.Width(204f));
            if (item.text != text)
            {
                RegisterUndo();
                item.text = text;
            }

            EditorGUIUtility.labelWidth = 32f;
            GUILayout.Space(12f);
            int itemId = EditorGUILayout.IntField("ID", item.id, GUILayout.Width(76f));
            if (item.id != itemId)
            {
                RegisterUndo();
                item.id = itemId;
            }
            EditorGUIUtility.labelWidth = 80f;

            EditorGUILayout.EndHorizontal();

            EditorGUILayout.BeginHorizontal();
            GUILayout.Label("    Icon", GUILayout.Width(76f));

            string iconTitle = item.icon;
            if (string.IsNullOrEmpty(iconTitle))
            {
                iconTitle = "...";
            }

            if (GUILayout.Button(iconTitle, itemSpriteOpt))
            {
                currentItem        = item;
                NGUISettings.atlas = atlas;
                SpriteSelector.Show(OnItemIcon);
            }

            GUILayout.Space(12f);
            if (GUILayout.Button("None", itemSpriteDelOpt))
            {
                if (!string.IsNullOrEmpty(item.icon))
                {
                    RegisterUndo();
                }

                item.icon = "";
            }

            EditorGUILayout.EndHorizontal();

            if (!string.IsNullOrEmpty(item.icon))
            {
                EditorGUILayout.BeginHorizontal();
                normalColor = EditorGUILayout.ColorField("    Normal", item.spriteColor, GUILayout.Width(140f));
                if (normalColor != item.spriteColor)
                {
                    RegisterUndo();
                    item.spriteColor = normalColor;
                }
                GUILayout.Space(32f);
                disabledColor = EditorGUILayout.ColorField("Disabled", item.spriteColorDisabled, GUILayout.Width(140f));
                if (item.spriteColorDisabled != disabledColor)
                {
                    RegisterUndo();
                    item.spriteColorDisabled = disabledColor;
                }
                EditorGUILayout.EndHorizontal();
            }

            if (item.isSubmenu)
            {
                CtxMenu submenu = (CtxMenu)EditorGUILayout.ObjectField("    Submenu", item.submenu, typeof(CtxMenu), true, GUILayout.Width(317f));
                if (item.submenu != submenu)
                {
                    RegisterUndo();
                    item.submenu = submenu;

#if CTX_NO_SERIALIZATION_FIX
                    if (submenu.items == null || submenu.items.Length == 0)
                    {
                        Debug.Log("Wizzy Submenu Item Transfer Test!!!!");

                        if (item.submenuItems != null && item.submenuItems.Length > 0)
                        {
                            Debug.Log("Wizzy Submenu Item Transfer!!!!");
                            submenu.items     = item.submenuItems;
                            item.submenuItems = null;

                            EditorUtility.SetDirty(submenu);
                            EditorUtility.SetDirty(target);
                        }
                    }
#endif
                }

                if (submenu != null)
#if CTX_NO_SERIALIZATION_FIX
                { EditMenuItemList(ref item.submenuItems, submenu.atlas, false, ref item.isEditingItems); }
#else
                { EditMenuItemList(ref submenu.items, submenu.atlas, false, ref item.isEditingItems); }
#endif
            }
        }

        GUILayout.Space(4f);
        EditorGUILayout.EndVertical();
        GUILayout.Space(4f);
    }
Пример #22
0
    private void InitializeContextMenu() {    // IMPROVE use of strings
        UnityUtility.ValidateComponentPresence<Collider>(gameObject);
        _ctxObject = gameObject.GetSafeMonoBehaviour<CtxObject>();
        _ctxObject.offsetMenu = true;

        if (_shipMenu == null) {
            _shipMenu = GuiManager.Instance.gameObject.GetSafeMonoBehavioursInChildren<CtxMenu>()
                .Single(menu => menu.gameObject.name.Equals("ShipMenu"));

            // NOTE: Cannot set CtxMenu.items from here as CtxMenu.Awake sets defaultItems = items (null) before I can set items programmatically.
            // Accordingly, the work around is to either use the editor to set the items, or have every CtxObject set their menuItems programmatically.
            // I've chosen to use the editor for now, and to verify my editor settings from here using ValidateShipMenuItems()
            var desiredShipMenuItems = new CtxMenu.Item[_shipMenuOrders.Length];
            for (int i = 0; i < _shipMenuOrders.Length; i++) {
                var item = new CtxMenu.Item();
                item.text = _shipMenuOrders[i].GetValueName();    // IMPROVE GetDescription would be better for the context menu display
                item.id = i;
                desiredShipMenuItems[i] = item;
            }
            var editorPopulatedShipMenuItems = _shipMenu.items;
            ValidateShipMenuItems(editorPopulatedShipMenuItems, desiredShipMenuItems);

            _lowestUnusedItemId = _shipMenu.items.Length;
        }
        if (_subMenuLookup == null) {
            _subMenuLookup = new Dictionary<ShipDirective, CtxMenu>(_shipMenuOrders.Length);
            var availableSubMenus = GuiManager.Instance.gameObject.GetSafeMonoBehavioursInChildren<CtxMenu>()
                .Where(menu => menu.gameObject.name.Equals("SubMenu")).ToArray();
            D.Assert(_shipMenuOrders.Length <= availableSubMenus.Length);
            for (int i = 0; i < _shipMenuOrders.Length; i++) {
                _subMenuLookup.Add(_shipMenuOrders[i], availableSubMenus[i]);
            }
        }
        if (_subMenuOrderLookup == null) {
            _subMenuOrderLookup = new Dictionary<ValueRange<int>, ShipDirective>();
        }
        if (_joinableFleetLookup == null) {
            _joinableFleetLookup = new Dictionary<int, FleetCmdModel>();
        }
        if (_disbandRefitBaseLookup == null) {
            _disbandRefitBaseLookup = new Dictionary<int, AUnitBaseCmdModel>();
        }

        _ctxObject.contextMenu = _shipMenu;

        EventDelegate.Add(_ctxObject.onShow, OnContextMenuShow);
        EventDelegate.Add(_ctxObject.onSelection, OnContextMenuSelection);
        EventDelegate.Add(_ctxObject.onHide, OnContextMenuHide);
    }
Пример #23
0
    private void PopulateSubMenus() {
        //D.Log("ShipMenu.items length = {0}.", _shipMenu.items.Length);
        foreach (var order in _shipMenuOrders) {
            int orderItemID = _shipMenuOrders.IndexOf(order);
            CtxMenu subMenu = _subMenuLookup[order];
            switch (order) {
                case ShipDirective.Join:
                    //D.Log("JoinFleet order ID = {0}.", orderItemID);
                    FleetCmdModel[] joinableFleets = FindObjectsOfType<FleetCmdModel>().Where(f => f.Owner.IsPlayer).Except(Presenter.Model.UnitCommand as FleetCmdModel).ToArray();
                    var joinFleetSubmenuItemCount = joinableFleets.Length;

                    if (joinFleetSubmenuItemCount > Constants.Zero) {
                        var joinFleetItem = _shipMenu.items[orderItemID];
                        joinFleetItem.isSubmenu = true;
                        joinFleetItem.submenu = subMenu;
                        var joinFleetSubmenuItems = new CtxMenu.Item[joinFleetSubmenuItemCount];
                        for (int i = 0; i < joinFleetSubmenuItemCount; i++) {
                            joinFleetSubmenuItems[i] = new CtxMenu.Item();

                            joinFleetSubmenuItems[i].text = joinableFleets[i].Data.ParentName;
                            int subMenuItemId = i + _lowestUnusedItemId; // submenu item IDs can't interfere with IDs already assigned
                            joinFleetSubmenuItems[i].id = subMenuItemId;
                            _joinableFleetLookup.Add(subMenuItemId, joinableFleets[i]);
                            //D.Log("{0}.submenu ID {1} = {2}.", Presenter.FullName, joinFleetSubmenuItems[i].id, joinFleetSubmenuItems[i].text);
                        }
                        subMenu.items = joinFleetSubmenuItems;
                        //joinFleetItem.submenuItems = joinFleetSubmenuItems;   // removed in Contextual1.2.9 to fix Unity Serialization Depth error msg
                        int lastUsedSubMenuID = _lowestUnusedItemId + joinFleetSubmenuItemCount - 1;
                        _subMenuOrderLookup.Add(new ValueRange<int>(_lowestUnusedItemId, lastUsedSubMenuID), order);
                        _lowestUnusedItemId = lastUsedSubMenuID + 1;
                    }
                    else {
                        _shipMenu.items[orderItemID].isDisabled = true;
                    }
                    break;
                case ShipDirective.Disband:
                //TODO
                case ShipDirective.Refit:
                    //TODO
                    D.Warn("{0} is not yet implemented.", order.GetValueName());
                    break;
                case ShipDirective.None:
                default:
                    throw new NotImplementedException(ErrorMessages.UnanticipatedSwitchValue.Inject(order));
            }
        }
    }
Пример #24
0
    protected void FillMenuItems(CtxMenu.Item[] items)
    {
        items[0].text        = "Small";
        items[0].isCheckable = true;
        items[0].mutexGroup  = 0;
        items[0].id          = (int)MenuCommands.Small;

        items[1].text        = "Medium";
        items[1].isCheckable = true;
        items[1].mutexGroup  = 0;
        items[1].id          = (int)MenuCommands.Medium;

        items[2].text        = "Large";
        items[2].isCheckable = true;
        items[2].mutexGroup  = 0;
        items[2].id          = (int)MenuCommands.Large;

        float s = transform.localScale.x;

        if (s < 1f)
        {
            items[0].isChecked = true;
        }
        else if (s > 1f)
        {
            items[2].isChecked = true;
        }
        else
        {
            items[1].isChecked = true;
        }

        items[3].isSeparator = true;

        items[4].text      = "Color Scheme";
        items[4].isSubmenu = true;
        items[4].submenu   = colorSubmenu;

        if (submenuItems == null)
        {
            submenuItems = new CtxMenu.Item[5];
            for (int i = 0; i < 5; i++)
            {
                submenuItems[i] = new CtxMenu.Item();
            }
        }

#if CTX_NO_SERIALIZATION_FIX
        items[4].submenuItems = submenuItems;
#else
        colorSubmenu.items = submenuItems;
#endif

        int matID = FindMaterialIndex();

        for (int i = 0; i < 5; i++)
        {
            submenuItems[i].isCheckable = true;
            submenuItems[i].mutexGroup  = 0;
            submenuItems[i].id          = (int)MenuCommands.ColorScheme1 + i;

            if (i == matID)
            {
                submenuItems[i].isChecked = true;
            }
        }

        submenuItems[0].text = "Mirage";
        submenuItems[1].text = "Vinyard";
        submenuItems[2].text = "Sunset";
        submenuItems[3].text = "Holly";
        submenuItems[4].text = "Embers";
    }
Пример #25
0
    protected virtual void PopulateMenu_UserRemoteFleetIsSelected() {   // IMPROVE temp virtual to allow SectorCtxControl to override
        var topLevelMenuItems = new List<CtxMenu.Item>();
        var selectedItemDistanceLabel = CreateRemoteSelectedItemDistanceLabel();
        topLevelMenuItems.Add(selectedItemDistanceLabel);
        foreach (var directive in UserRemoteFleetDirectives) {
            int topLevelItemID = _nextAvailableItemId;
            var topLevelItem = new CtxMenu.Item() {
                text = TopLevelMenuItemTextFormat.Inject(directive.GetValueName()),
                id = topLevelItemID
            };
            topLevelMenuItems.Add(topLevelItem);
            _directiveLookup.Add(topLevelItemID, directive);
            _nextAvailableItemId++;

            topLevelItem.isDisabled = IsUserRemoteFleetMenuItemDisabledFor(directive);
        }
        _ctxObject.menuItems = topLevelMenuItems.ToArray();
    }