Exemple #1
0
            /// <summary>
            /// Handles input for comboboxes
            /// </summary>
            private void HandleComboInput()
            {
                IBlockMember blockMember = listBody[selectionIndex].AssocMember;
                var          comboBox    = blockMember as IBlockComboBox;

                if (listBody[selectionIndex].PropertyOpen)
                {
                    if (lastPropValue == null)
                    {
                        lastPropValue = comboBox.Value;
                    }

                    if (BvBinds.ScrollUp.IsPressed || BvBinds.ScrollDown.IsPressed)
                    {
                        var entries = comboBox.ComboEntries as List <KeyValuePair <long, StringBuilder> >;
                        int index   = (int)comboBox.Value;

                        if (BvBinds.ScrollUp.IsNewPressed || BvBinds.ScrollUp.IsPressedAndHeld)
                        {
                            index = MathHelper.Clamp(index + 1, 0, entries.Count - 1);
                        }
                        else if (BvBinds.ScrollDown.IsNewPressed || BvBinds.ScrollDown.IsPressedAndHeld)
                        {
                            index = MathHelper.Clamp(index - 1, 0, entries.Count - 1);
                        }

                        comboBox.Value = index;
                    }
                }
                else if (lastPropValue != null && lastPropValue is long && BvBinds.Cancel.IsReleased)
                {
                    comboBox.Value = (long)lastPropValue;
                }
            }
Exemple #2
0
            private void HandleTextInput()
            {
                PropertyListEntry selection = listBody[selectionIndex];

                if (listBody[selectionIndex].PropertyOpen)
                {
                    if (lastPropValue == null)
                    {
                        lastPropValue = selection.ValueText.ToString();
                    }

                    if (BindManager.IsChatOpen)
                    {
                        if (!selection.InputOpen)
                        {
                            IBlockMember blockMember = selection.AssocMember;
                            selection.ValueText.SetText(blockMember.ValueText, selectedFormat);
                            selection.OpenInput();
                            selection.WaitingForChatInput = false;
                        }
                    }
                    else
                    {
                        selection.ValueText.SetText(textEntryWarning, selectedFormat);
                        selection.WaitingForChatInput = true;
                    }
                }
                else if (lastPropValue != null && lastPropValue is string && BvBinds.Cancel.IsReleased)
                {
                    selection.SetValueText(lastPropValue as string);
                }
            }
        /// <summary>
        /// Selects all valid block properties for duplication. If includeName == false, the name property
        /// will be excluded, where applicable.
        /// </summary>
        public int SelectAllProperties(bool includeName = true)
        {
            ClearSelection();
            int count = 0;

            for (int i = 0; i < dupeEntries.Count; i++)
            {
                BlockPropertyDupeEntry entry  = dupeEntries[i];
                IBlockMember           member = Block.BlockMembers[i];

                if (!includeName && i == 0 && (member.PropName == "Name" || member.PropName == "CustomName"))
                {
                    entry.isSelectedForDuplication = false;
                }
                else if (entry.canDuplicate && member.Enabled)
                {
                    entry.isSelectedForDuplication = true;
                    count++;
                }

                dupeEntries[i] = entry;
            }

            return(count);
        }
        /// <summary>
        /// Saves serialized copies of the properties currently selcted for duplication.
        /// </summary>
        public int CopySelectedProperties()
        {
            var propertyList = copiedProperties.propertyList;

            propertyList.Clear();

            copiedProperties.blockTypeID = Block.TypeID;

            for (int i = 0; i < dupeEntries.Count; i++)
            {
                BlockPropertyDupeEntry entry  = dupeEntries[i];
                IBlockMember           member = Block.BlockMembers[i];

                if (entry.isSelectedForDuplication && entry.canDuplicate && member.Enabled)
                {
                    var          property = member as IBlockProperty;
                    PropertyData?data     = property.GetPropertyData();

                    if (data != null)
                    {
                        propertyList.Add(data.Value);
                    }
                }
            }

            ClearSelection();

            return(propertyList.Count);
        }
            public void OpenBlockMemberWidget(IBlockMember member)
            {
                switch (member.ValueType)
                {
                case BlockMemberValueTypes.Color:
                    OpenWidget(colorWidget, member);
                    break;

                case BlockMemberValueTypes.ColorHSV:
                    OpenWidget(colorWidgetHSV, member);
                    break;

                case BlockMemberValueTypes.Combo:
                    OpenWidget(comboWidget, member);
                    break;

                case BlockMemberValueTypes.Float:
                    OpenWidget(floatWidget, member);
                    break;

                case BlockMemberValueTypes.Text:
                    OpenWidget(textWidget, member);
                    break;

                default:
                    throw new Exception(
                              $"Widget for block value type {member?.ValueType} is unsupported.\n" +
                              $"Member Type: {member?.GetType()}"
                              );
                }
            }
Exemple #6
0
        /// <summary>
        /// Updates list of prioritized members from existing weights, excluding disabled members.
        /// </summary>
        public void UpdatePrioritizedMembers(int limit)
        {
            int remaining = limit;

            priorityList.Clear();

            for (int i = weightedIndices.Count - 1; i >= 0; i--)
            {
                uint         weightedIndex = weightedIndices[i];
                int          weight        = (int)((weightedIndex >> 16) & 0xFFFF);
                int          index         = (int)(weightedIndex & 0xFFFF);
                IBlockMember member        = blockMembers[index];

                if (member.Enabled && weight > 0)
                {
                    priorityList.Add(index);

                    remaining--;

                    if (remaining <= 0)
                    {
                        break;
                    }
                }
            }

            // Sort by index to restore normal order
            priorityList.Sort();
            prioritizedMembers.Clear();

            foreach (int index in priorityList)
            {
                prioritizedMembers.Add(index);
            }
        }
            public void OpenMenu()
            {
                if (!IsOpen)
                {
                    CloseMenu();
                    UpdateConfig();

                    for (int i = 0; i < Target.BlockMembers.Count; i++)
                    {
                        IBlockMember blockMember = Target.BlockMembers[i];

                        if (blockMember is IBlockColor)
                        {
                            // Assign an entry for each color channel
                            var colorMember = blockMember as IBlockColor;
                            var entry       = entryPool.Get();
                            entry.SetMember(Target, colorMember.ColorChannels[0], i);
                            listBody.Add(entry);

                            entry = entryPool.Get();
                            entry.SetMember(Target, colorMember.ColorChannels[1], i);
                            listBody.Add(entry);

                            entry = entryPool.Get();
                            entry.SetMember(Target, colorMember.ColorChannels[2], i);
                            listBody.Add(entry);
                        }
                        else if (blockMember is IBlockColorHSV)
                        {
                            // Assign an entry for each color channel
                            var colorMember = blockMember as IBlockColorHSV;
                            var entry       = entryPool.Get();
                            entry.SetMember(Target, colorMember.ColorChannels[0], i);
                            listBody.Add(entry);

                            entry = entryPool.Get();
                            entry.SetMember(Target, colorMember.ColorChannels[1], i);
                            listBody.Add(entry);

                            entry = entryPool.Get();
                            entry.SetMember(Target, colorMember.ColorChannels[2], i);
                            listBody.Add(entry);
                        }
                        else
                        {
                            var entry = entryPool.Get();
                            entry.SetMember(Target, blockMember, i);
                            listBody.Add(entry);
                        }
                    }

                    listWrapTimer.Restart();
                    IsOpen           = true;
                    peekBody.Visible = false;
                    listBody.Visible = true;
                }

                Visible = true;
            }
        /// <summary>
        /// Sets the selection <see cref="BlockPropertyDupeEntry"/> at the corresponding index.
        /// Will not allow unsupported/disabled properties to be selected for duplication.
        /// </summary>
        public void SetMemberSelection(int index, bool isSelected)
        {
            BlockPropertyDupeEntry entry  = dupeEntries[index];
            IBlockMember           member = Block.BlockMembers[index];

            entry.isSelectedForDuplication = isSelected && entry.canDuplicate && member.Enabled;
            dupeEntries[index]             = entry;
        }
Exemple #9
0
            /// <summary>
            /// Handles input for actions in list
            /// </summary>
            private void HandleActionInput()
            {
                if (listBody[selectionIndex].PropertyOpen)
                {
                    IBlockMember blockMember = listBody[selectionIndex].AssocMember;
                    var          member      = blockMember as IBlockAction;

                    member.Action();
                    listBody[selectionIndex].PropertyOpen = false;
                }
            }
Exemple #10
0
            /// <summary>
            /// Handles input for color values in list
            /// </summary>
            private void HandleColorInput()
            {
                IBlockMember blockMember = listBody[selectionIndex].AssocMember;
                var          colorMember = blockMember as IBlockNumericValue <byte>;

                if (listBody[selectionIndex].PropertyOpen)
                {
                    if (lastPropValue == null)
                    {
                        lastPropValue = colorMember.Value;
                    }

                    if (BindManager.IsChatOpen)
                    {
                        HandleTextInput();
                    }
                    else
                    {
                        int offset = 1;

                        if (BvBinds.MultZ.IsPressed)
                        {
                            offset *= incrZ;
                        }
                        else if (BvBinds.MultY.IsPressed)
                        {
                            offset *= incrY;
                        }
                        else if (BvBinds.MultXOrMouse.IsPressed)
                        {
                            offset *= incrX;
                        }

                        byte color = colorMember.Value;

                        if (BvBinds.ScrollUp.IsNewPressed || BvBinds.ScrollUp.IsPressedAndHeld)
                        {
                            colorMember.Value = (byte)MathHelper.Clamp(color + offset, 0, 255);
                        }
                        else if (BvBinds.ScrollDown.IsNewPressed || BvBinds.ScrollDown.IsPressedAndHeld)
                        {
                            colorMember.Value = (byte)MathHelper.Clamp(color - offset, 0, 255);
                        }
                    }
                }
                else if (lastPropValue != null && lastPropValue is byte && BvBinds.Cancel.IsReleased)
                {
                    colorMember.Value = (byte)lastPropValue;
                }
            }
Exemple #11
0
        /// <summary>
        /// Assigns weight to each block member from current priority table
        /// </summary>
        private void GetMemberPriorities()
        {
            for (uint i = 0; i < blockMembers.Count; i++)
            {
                IBlockMember member = blockMembers[(int)i];
                uint         priority;

                if (!priorityMap.TryGetValue(member.PropName, out priority) &&
                    !defaultPriorities.TryGetValue(member.PropName, out priority))
                {
                    priority = 1;
                }

                weightedIndices.Add((priority << 16) | i);
            }

            // Sort ascending to restore index order
            weightedIndices.Sort();
        }
        /// <summary>
        /// Assigns the given <see cref="PropertyBlock"/> as the current target and generates
        /// a parallel list of dupe entries correspondin to its block members.
        /// </summary>
        public void UpdateBlockMembers()
        {
            Reset();

            // Clear backup if target changes
            if (backup.Item1 != Block.TBlock)
            {
                backup.Item1             = null;
                backup.Item2.blockTypeID = null;
                backup.Item2.propertyList.Clear();
            }

            for (int i = 0; i < Block.BlockMembers.Count; i++)
            {
                IBlockMember member       = Block.BlockMembers[i];
                bool         canDuplicate = member is IBlockProperty;
                var          entry        = new BlockPropertyDupeEntry(canDuplicate);

                dupeEntries.Add(entry);
            }
        }
 public override void Reset()
 {
     MemberIndex = -1;
     BlockMember = null;
     target      = null;
 }
 /// <summary>
 /// Sets block property member
 /// </summary>
 public void SetMember(int index, IPropertyBlock target)
 {
     MemberIndex = index;
     this.target = target;
     BlockMember = target.BlockMembers[MemberIndex];
 }
Exemple #15
0
            private void HandlePropertySelectionInput()
            {
                var          selection   = listBody[selectionIndex];
                IBlockMember blockMember = selection.AssocMember;

                if (BvBinds.Select.IsReleased)
                {
                    selection.PropertyOpen = !selection.PropertyOpen;
                }
                else if (BvBinds.Cancel.IsReleased)
                {
                    selection.PropertyOpen = false;
                }
                else if (!selection.PropertyOpen && BindManager.IsChatOpen &&
                         MyAPIGateway.Input.IsNewGameControlPressed(MyStringId.Get("CHAT_SCREEN")) &&
                         blockMember is IBlockTextMember)
                {
                    selection.PropertyOpen = true;
                }

                // Close text input on chat close or property deselect
                if ((!BindManager.IsChatOpen && selection.InputOpen) ||
                    (!selection.PropertyOpen && (selection.WaitingForChatInput || selection.InputOpen)))
                {
                    // If no input was recieved, don't write anything
                    if (!selection.WaitingForChatInput)
                    {
                        selection.SetValueText(selection.ValueText.ToString());
                    }

                    selection.WaitingForChatInput = false;
                    selection.PropertyOpen        = false;
                    selection.CloseInput();
                }

                // Handle input for selected entry
                if ((selection.PropertyOpen || lastPropValue != null))
                {
                    if (blockMember is IBlockAction)
                    {
                        HandleActionInput();
                    }
                    else if (blockMember is IBlockNumericValue <float> )
                    {
                        HandleFloatInput();
                    }
                    else if (blockMember is IBlockNumericValue <byte> )
                    {
                        HandleColorInput();
                    }
                    else if (blockMember is IBlockComboBox)
                    {
                        HandleComboInput();
                    }
                    else if (blockMember is IBlockTextMember)
                    {
                        HandleTextInput();
                    }
                }

                if (selection.PropertyOpen)
                {
                    MenuState         |= QuickActionMenuState.PropertyOpen;
                    highlightBox.Color = highlightFocusColor;
                }
                else
                {
                    MenuState         &= ~QuickActionMenuState.PropertyOpen;
                    lastPropValue      = null;
                    highlightBox.Color = highlightColor;
                }
            }
Exemple #16
0
            /// <summary>
            /// Handles input for fp values in list
            /// </summary>
            private void HandleFloatInput()
            {
                IBlockMember blockMember = listBody[selectionIndex].AssocMember;
                var          floatMember = blockMember as IBlockNumericValue <float>;

                if (listBody[selectionIndex].PropertyOpen)
                {
                    if (lastPropValue == null)
                    {
                        lastPropValue = floatMember.Value;
                    }

                    if (BindManager.IsChatOpen)
                    {
                        HandleTextInput();
                    }
                    else if (BvBinds.ScrollUp.IsPressed || BvBinds.ScrollDown.IsPressed)
                    {
                        double absRange = Math.Abs(floatMember.MaxValue - floatMember.MinValue),
                               logRange = Math.Ceiling(Math.Log10(absRange)),
                               offset, value;

                        if (absRange > floatPropLogThreshold)
                        {
                            offset = .1;
                            value  = (float)(Math.Log10(Math.Abs(floatMember.Value - floatMember.MinValue) + 1d) / logRange);
                        }
                        else
                        {
                            value  = floatMember.Value;
                            offset = floatMember.Increment;
                        }

                        if ((floatMember.Flags & BlockPropertyFlags.CanUseMultipliers) > 0)
                        {
                            float mult = 1f;

                            if (BvBinds.MultZ.IsPressed)
                            {
                                mult = BvConfig.Current.block.floatMult.Z;
                            }
                            else if (BvBinds.MultY.IsPressed)
                            {
                                mult = BvConfig.Current.block.floatMult.Y;
                            }
                            else if (BvBinds.MultXOrMouse.IsPressed)
                            {
                                mult = BvConfig.Current.block.floatMult.X;
                            }

                            if ((floatMember.Flags & BlockPropertyFlags.IsIntegral) == 0 ||
                                MathHelper.IsEqual((float)(mult * offset), (int)(mult * offset)))
                            {
                                offset *= mult;
                            }
                        }

                        if (double.IsInfinity(value))
                        {
                            value = 0d;
                        }

                        if (BvBinds.ScrollUp.IsNewPressed || BvBinds.ScrollUp.IsPressedAndHeld)
                        {
                            value += offset;
                        }
                        else if (BvBinds.ScrollDown.IsNewPressed || BvBinds.ScrollDown.IsPressedAndHeld)
                        {
                            value -= offset;
                        }

                        if (absRange > floatPropLogThreshold)
                        {
                            value = (Math.Pow(10d, value * logRange) - 1d + floatMember.MinValue);
                        }

                        floatMember.Value = (float)MathHelper.Clamp(value, floatMember.MinValue, floatMember.MaxValue);
                    }
                }
                else if (lastPropValue != null && lastPropValue is float && BvBinds.Cancel.IsReleased)
                {
                    floatMember.Value = (float)lastPropValue;
                }
            }