public override void HandleInput(InputManager input) { base.HandleInput(input); Vector2f mousePos; bool mouse = input.GetMousePosition(out mousePos); Vector2i origin = new Vector2i(0, 0); MenuComponent bubble = parent; while (bubble != null) { origin += bubble.position; bubble = bubble.parent; } bool collided = BoundingBox.CheckPointMenuCollision(mousePos.X, mousePos.Y, collisionBox, new Vector2f((position + origin).X, (origin + position).Y)); if (mouse && (fieldState == FieldState.Normal || fieldState == FieldState.Modified) && collided && input.GetMouseClicked(InputBindings.primary, true)) { fieldState = FieldState.Focused; } if (fieldState == FieldState.Focused) { string updated; if (input.GetKeyPressed(InputBindings.backSpace, true)) { if (fieldValue.Length > 1) { fieldValue = fieldValue.Substring(0, fieldValue.Length - 1); parseField(tag, fieldValue, out updated); textField.SetText(updated); fieldValue = updated; } else { fieldValue = ""; parseField(tag, fieldValue, out updated); textField.SetText(fieldValue); fieldValue = updated; } } else { string inputString = input.GetKeyString(true); fieldValue = fieldValue + inputString; if (inputString != "") { bool success = parseField.Invoke(tag, fieldValue, out updated); textField.SetText(updated); fieldValue = updated; } } } if (fieldState == FieldState.Focused && !collided && input.GetMouseClickedIgnoreConsume(InputBindings.primary)) { fieldState = FieldState.Modified; } }
public override void Draw(RenderTexture gui, Vector2i origin, RenderStates guiState) { RectangleShape frame = new RectangleShape(new Vector2f(32, 32)); frame.FillColor = Color.Red; Vector2f pos = new Vector2f((position + origin).X, (origin + position).Y); for (int i = 0; i < inventory.Count; i++) { frame.Position = pos + new Vector2f((i * 32) % (int)size.X, ((i * 32) / (int)size.X) * 32); gui.Draw(frame); if (inventory[i] != null) { Sprite itemSprite = inventory[i].item.itemSprite.GetSprite(); itemSprite.Position = pos + new Vector2f((i * 32) % (int)size.X, (i * 32) / (int)size.X * 32); itemCount.SetText(inventory[i].count.ToString()); itemCount.SetTextPosition("right", "bottom"); itemCount.SetRelativePosition(position + new Vector2i((i * 32) % (int)size.X - 16, (i * 32) / (int)size.X * 32)); gui.Draw(itemSprite); itemCount.Draw(gui, origin, guiState); } } if (hoveredIndex != -1 && inventory[hoveredIndex] != null) { itemName.SetText(inventory[hoveredIndex].item.name); itemName.SetTextPosition("left", "center"); RectangleShape backdrop = new RectangleShape(new Vector2f(itemName.size.X, itemName.size.Y)); backdrop.FillColor = new Color(64, 64, 64, 208); backdrop.Position = hoveredPosition; gui.Draw(backdrop); itemName.SetRelativePosition(new Vector2i((int)hoveredPosition.X, (int)hoveredPosition.Y)); itemName.Draw(gui, new Vector2i(0, 0), guiState); } base.Draw(gui, origin, guiState); }
/// <summary> /// A drop down menu implementation. Very quick if you are selecting from a range of enums. /// </summary> /// <param name="relativePosition"></param> /// <param name="componentSize"></param> /// <param name="listHeaders"></param> /// <param name="listValues"></param> public MenuListBox(Vector2i componentSize, string[] listHeaders, int[] listValues, SelectionMethod applySelection, Font font, uint charSize, int lineSpacing, int initialValue) { Initialize(componentSize); this.listHeaders = listHeaders; this.listValues = listValues; this.applySelection = applySelection; this.lineSpacing = lineSpacing; texts = new MenuText[listHeaders.Length]; selectedText = new MenuText(this.size, font, "", charSize, 0.6f); selectedText.SetRelativePosition(new Vector2i(0, -2)); selectedValue = initialValue; selectedText.SetText(listHeaders[initialValue]); selectedText.SetTextPosition("left", "center"); for (int i = 0; i < listHeaders.Length; i++) { texts[i] = new MenuText(this.size, font, listHeaders[i], charSize, 0.6f); AttachComponent(texts[i]); texts[i].SetText(listHeaders[i]); texts[i].SetTextPosition("left", "center"); texts[i].SetRelativePosition(new Vector2i(0, (i + 1) * (lineSpacing + 1) - 2)); attachedComponents.Clear(); } dropdownBox = new BoundingBox(new Vector2f(size.X, lineSpacing)); collisionBox = new BoundingBox(size + new Vector2i(size.Y, 0)); listboxState = ListBoxState.Normal; dropdownMainBox = CreateMenuGraphicArrayWithBorder(new FloatRect(96, 0, 96, 96), 10); dropdownArrow = CreateMenuGraphic(new FloatRect(416, 0, 96, 96), new Vector2i(size.Y, size.Y)); }
public override void HandleInput(InputManager input) { base.HandleInput(input); //Computing absolute position to check collision Vector2f mousePos; bool mouse = input.GetMousePosition(out mousePos); Vector2i origin = new Vector2i(0, 0); MenuComponent bubble = parent; while (bubble != null) { origin += bubble.position; bubble = bubble.parent; } Vector2f pos = new Vector2f((position + origin).X, (origin + position).Y); bool collided = BoundingBox.CheckPointMenuCollision(mousePos.X, mousePos.Y, collisionBox, pos); if (listboxState == ListBoxState.Normal && collided && input.GetMouseClicked(InputBindings.primary, true)) { listboxState = ListBoxState.Focused; parent.PushComponentToFront(this); hoveredValue = selectedValue; } else if (listboxState == ListBoxState.Focused) { for (int i = 0; i < listHeaders.Length; i++) { //check collision for each list header if (BoundingBox.CheckPointMenuCollision(mousePos.X, mousePos.Y, dropdownBox, pos + new Vector2f(0, lineSpacing * (i + 1)))) { hoveredValue = i; collided = true; } } if (input.GetMouseClickedIgnoreConsume(InputBindings.primary)) { //don't process a click if it was on the listbox if (collided) { input.GetMouseClicked(InputBindings.primary, true); } selectedValue = hoveredValue; applySelection?.Invoke(tag, listValues[selectedValue]); selectedText.SetText(listHeaders[selectedValue]); listboxState = ListBoxState.Normal; } } }
public override void Draw(RenderTexture gui, Vector2i origin, RenderStates guiState) { RectangleShape frame = new RectangleShape(new Vector2f(32, 32)); frame.FillColor = Color.Red; Vector2f pos = new Vector2f((position + origin).X, (origin + position).Y); for (int i = 0; i < allowedRecipes.Length; i++) { frame.Position = pos + new Vector2f((i * 32) % (int)size.X, ((i * 32) / (int)size.X) * 32); gui.Draw(frame); Sprite recipeSprite = allowedRecipes[i].recipeSprite.GetSprite(); recipeSprite.Position = pos + new Vector2f((i * 32) % (int)size.X, (i * 32) / (int)size.X * 32); gui.Draw(recipeSprite); } if (hoveredIndex != -1) { recipeName.SetText(allowedRecipes[hoveredIndex].name); recipeName.SetTextPosition("left", "center"); recipeName.SetRelativePosition(new Vector2i((int)hoveredPosition.X, (int)hoveredPosition.Y)); recipeName.Draw(gui, new Vector2i(0, 0), guiState); } base.Draw(gui, origin, guiState); }