/// <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; } }
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()}" ); } }
/// <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; }
/// <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; } }
/// <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; } }
/// <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]; }
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; } }
/// <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; } }