예제 #1
0
        public static void DropdownSingle
        (
            Vector2 position,
            SingleCallback callback,
            IEnumerable <DropdownOption <T> > options,
            DropdownOption <T> selectedOption,
            DropdownOption <T> noneOption,
            bool hasMultipleDifferentValues
        )
        {
            bool hasOptions = options != null && options.Any();

            GenericMenu menu = new GenericMenu();

            GenericMenu.MenuFunction2 menuCallback = (o) => { GUI.changed = true; callback((T)o); };

            if (noneOption != null)
            {
                bool on = !hasMultipleDifferentValues && (selectedOption == null || EqualityComparer <T> .Default.Equals(selectedOption.value, noneOption.value));

                menu.AddItem(new GUIContent(noneOption.label), on, menuCallback, noneOption.value);
            }

            if (noneOption != null && hasOptions)
            {
                menu.AddSeparator("");
            }

            if (hasOptions)
            {
                foreach (var option in options)
                {
                    bool on = !hasMultipleDifferentValues && (selectedOption != null && EqualityComparer <T> .Default.Equals(selectedOption.value, option.value));

                    menu.AddItem(new GUIContent(option.label), on, menuCallback, option.value);
                }
            }

            menu.DropDown(new Rect(position, Vector2.zero));
        }
예제 #2
0
        /// <summary>
        /// Render an editor popup and return the newly selected option.
        /// </summary>
        /// <param name="position">The position of the control.</param>
        /// <param name="callback">The function called when a value is selected.</param>
        /// <param name="options">The list of available options.</param>
        /// <param name="selectedOption">The selected option, or null for none.</param>
        /// <param name="noneOption">The option for "no selection", or null for none.</param>
        /// <param name="hasMultipleDifferentValues">Whether the content has multiple different values.</param>
        /// <param name="allowOuterOption">Whether a selected option not in range should be allowed.</param>
        public static void PopupSingle
        (
            Rect position,
            SingleCallback callback,
            IEnumerable <DropdownOption <T> > options,
            DropdownOption <T> selectedOption,
            DropdownOption <T> noneOption,
            bool hasMultipleDifferentValues,
            bool allowOuterOption = true
        )
        {
            string label;

            if (hasMultipleDifferentValues)
            {
                label = "\u2014";                 // Em Dash
            }
            else if (selectedOption == null)
            {
                if (noneOption != null)
                {
                    label = noneOption.label;
                }
                else
                {
                    label = string.Empty;
                }
            }
            else
            {
                label = selectedOption.label;
            }

            if (GUI.Button(position, label, EditorStyles.popup))
            {
                DropdownSingle
                (
                    new Vector2(position.xMin, position.yMax),
                    callback,
                    options,
                    selectedOption,
                    noneOption,
                    hasMultipleDifferentValues
                );
            }
            else if (selectedOption != null && !options.Select(o => o.value).Contains(selectedOption.value) && !allowOuterOption)
            {
                // Selected option isn't in range

                if (hasMultipleDifferentValues)
                {
                    // Do nothing
                }
                else if (noneOption != null)
                {
                    callback(noneOption.value);
                }
                else
                {
                    callback(default(T));
                }
            }
        }