Ejemplo n.º 1
0
        /// <summary>
        /// Creates a new checkbox bound to a boolean-valued property or field. Labels are taken from attributes.
        /// </summary>
        /// <param name="memberAccessExpr">A simple member access expression for accessing the property/field you want to bind this control to. For example, <c>() => IEModOptions.YourProperty</c></param>
        /// <returns></returns>
        public GameObject Checkbox(Expression <Func <bool> > memberAccessExpr)
        {
            /*
             * //+ Reference
             *  FixBackerNamesChbox.transform.parent = ModPage;
             *      FixBackerNamesChbox.name = "FixBackerNames";
             *      FixBackerNamesChbox.transform.localScale = new Vector3 (1, 1, 1);
             *      FixBackerNamesChbox.transform.localPosition = new Vector3 (-210, 150, 0);
             *      StringId++;
             *      FixBackerNamesChbox.Component<UIOptionsTag> ().CheckboxLabel = new GUIDatabaseString (StringId);
             *      StringId++;
             *      FixBackerNamesChbox.Component<UIOptionsTag> ().TooltipString = new GUIDatabaseString (StringId);
             *      FixBackerNamesChbox.Component<UIOptionsTag> ().Checkbox.startsChecked = PlayerPrefs.GetInt ("FixBackerNames", 0) > 0 ? true : false;
             *      FixBackerNamesChbox.Component<UIOptionsTag> ().Checkbox.onStateChange = (UICheckbox.OnStateChange) new UICheckbox.OnStateChange((test, state) => {
             */
            if (ExampleCheckbox == null)
            {
                throw IEDebug.Exception(null, "You must initialize the ExampleCheckbox to create a check box.", null);
            }
            var asMemberExpr = (MemberExpression)memberAccessExpr.Body;
            var member       = asMemberExpr.Member;

            IEDebug.Log("Creating Checkbox : {0}", member.Name);
            var setter = ReflectHelper.CreateSetter(memberAccessExpr);
            var chBox  = (UIOptionsTag)Object.Instantiate(ExampleCheckbox);

            chBox.transform.parent = CurrentParent;
            var getter = ReflectHelper.CreateGetter(memberAccessExpr);

            chBox.name = asMemberExpr.Member.Name;

            chBox.transform.localScale    = new Vector3(1, 1, 1);
            chBox.transform.localPosition = new Vector3(0, 0, 0);
            var label = ReflectHelper.GetLabelInfo(member);
            var desc  = ReflectHelper.GetDescriptionInfo(member);

            chBox.CheckboxLabel = IEModString.Register(label);
            chBox.TooltipString = IEModString.Register(desc);

            chBox.Checkbox.startsChecked  = getter();
            chBox.Checkbox.onStateChange += (sender, state) => setter(state);

            IEDebug.Log("IEMod created: " + chBox.name);
            return(chBox.gameObject);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Creates a dropdown bound to a field or property. You need to supply a collection of dropdown choices.
        /// </summary>
        public GameObject Dropdown <T>(Expression <Func <T> > memberAccessExpr,
                                       IEnumerable <IEDropdownChoice> choices,
                                       int width, int labelWidth,
                                       string label   = null,
                                       string tooltip = null
                                       )
        {
            #region Old code

            /*
             * //+ FOR REFERENCE:
             * const int nerfedXPTableWidth = 515;
             * UIDropdownMenu drop;
             * nerfedXPTableDropdown.transform.GetChild(1).GetChild(0).localScale = new Vector3(nerfedXPTableWidth, 32, 1); // width of combobox
             * nerfedXPTableDropdown.transform.GetChild(1).GetChild(3).localPosition = new Vector3(nerfedXPTableWidth - 27, 10, 0); // position of down arrow
             * nerfedXPTableDropdown.transform.GetChild(1).GetChild(2).GetChild(0).localScale = new Vector3(nerfedXPTableWidth, 37, 0); // width of dropdown
             * nerfedXPTableDropdown.transform.GetChild(1).Component<UIDropdownMenu>().OptionRootText.lineWidth = nerfedXPTableWidth;
             * nerfedXPTableDropdown.transform.GetChild(1).Component<UIDropdownMenu>().SelectedText.lineWidth = nerfedXPTableWidth;
             * nerfedXPTableDropdown.transform.GetChild(1).Component<UIDropdownMenu>().OptionGrid.cellWidth = nerfedXPTableWidth;
             * nerfedXPTableDropdown.transform.GetChild(1).Component<UIDropdownMenu>().Options = nerfedXPTableChoices;
             * //nerfedXPTableDropdown.transform.GetChild(1).Component<UIDropdownMenu>().SelectedItem = nerfedXPTableChoices[PlayerPrefs.GetInt("NerfedXPTableSetting")];
             * //nerfedXPTableDropdown.transform.GetChild(1).Component<UIDropdownMenu>().OnDropdownOptionChangedEvent += new UIDropdownMenu.DropdownOptionChanged(OnNerfedXPTableSettingChanged);
             * nerfedXPTableDropdown.transform.GetChild(0).Component<UILabel>().lineWidth = 300;
             * nerfedXPTableDropdown.transform.GetChild(0).Component<UILabel>().shrinkToFit = false;
             * nerfedXPTableDropdown.transform.GetChild(0).Component<GUIStringLabel>().DatabaseString = new GUIDatabaseString(++StringId);
             * nerfedXPTableDropdown.Component<UIOptionsTag>().TooltipString = new GUIDatabaseString(++StringId);
             * // end of adding dropdown
             */

            #endregion

            if (ExampleDropdown == null)
            {
                throw IEDebug.Exception(null, "You must initialize the ExampleDropdown to create a dropdown.", null);
            }
            var pos          = new Vector3(0, 0, 0);
            var getter       = ReflectHelper.CreateGetter(memberAccessExpr);
            var setter       = ReflectHelper.CreateSetter(memberAccessExpr);
            var asMemberExpr = (MemberExpression)memberAccessExpr.Body;
            var comboBox     = (UIOptionsTag)Object.Instantiate(ExampleDropdown);
            comboBox.transform.parent = CurrentParent;
            //+ Basic setup

            comboBox.name = asMemberExpr.Member.Name;
            //! You have to explicitly set localPosition and localScale to something after Instantiate!!!
            //! Otherwise, the UI will broken, but no exception will be reported.
            comboBox.transform.localPosition = pos;
            comboBox.transform.localScale    = new Vector3(1, 1, 1);

            var dropdown = comboBox.transform.ComponentsInDescendants <UIDropdownMenu>(true).Single();
            label   = label ?? ReflectHelper.GetLabelInfo(asMemberExpr.Member);
            tooltip = tooltip ?? ReflectHelper.GetDescriptionInfo(asMemberExpr.Member);

            //+ Set the labels
            //There are multiple things called Label in this visual tree, but only one with a GUIStringLabel component.
            var guiLabel = comboBox.transform.ComponentsInDescendants <GUIStringLabel>(true).Single();
            if (labelWidth > 0)
            {
                guiLabel.DatabaseString = IEModString.Register(label);
                var uiLabel = guiLabel.gameObject.Component <UILabel>();
                uiLabel.lineWidth = labelWidth;
            }
            else
            {
                guiLabel.DatabaseString = IEModString.Register("");
                var uiLabel = guiLabel.gameObject.Component <UILabel>();
                uiLabel.lineWidth = labelWidth;
            }

            var uiTag = comboBox.Component <UIOptionsTag>();
            uiTag.TooltipString = IEModString.Register(tooltip);

            //+ set the choices and SelectedItem
            var choicesArr = choices.ToArray();
            dropdown.Options      = choicesArr.ToArray();
            dropdown.SelectedItem = choicesArr.SingleOrDefault(x => object.Equals(x.Value, getter())) ?? dropdown.Options[0];

            //+ Set position and scale
            //To get the names, I used the GetChild calls as reference, and dumped the comboBox to the log using UnityObjectDumper.
            var comboBoxBackground = comboBox.Descendant("Background");
            comboBoxBackground.transform.localScale = new Vector3(width, 32, 1);             //this is the width of the combobox

            var arrowThing = comboBox.Descendant("ArrowPivot");
            arrowThing.transform.localPosition = new Vector3(width - 27, 10, 0);
            dropdown.OptionRootText.lineWidth  = width;
            dropdown.SelectedText.lineWidth    = width;
            dropdown.OptionGrid.cellWidth      = width;
            var optGrid = dropdown.OptionGrid;
            //+ Set the default handler that binds the control to the member
            dropdown.OnDropdownOptionChangedEvent += option => {
                var asChoice = (IEDropdownChoice)option;
                setter((T)asChoice.Value);
            };

            return(comboBox.gameObject);
        }