v1.4.4.1 (Blood in the Water Update)
This commit is contained in:
@@ -0,0 +1,184 @@
|
||||
#nullable enable
|
||||
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
|
||||
namespace Barotrauma
|
||||
{
|
||||
internal sealed partial class CircuitBoxLabelNode
|
||||
{
|
||||
private CircuitBoxLabel headerLabel;
|
||||
private readonly GUITextBlock bodyLabel;
|
||||
private const string PromptUserData = "LabelEditPrompt";
|
||||
|
||||
public override void DrawHeader(SpriteBatch spriteBatch, RectangleF rect, Color color)
|
||||
{
|
||||
GUI.DrawString(spriteBatch, new Vector2(rect.X + CircuitBoxSizes.NodeHeaderTextPadding, rect.Center.Y - headerLabel.Size.Y / 2f), headerLabel.Value, GUIStyle.TextColorNormal, font: GUIStyle.LargeFont);
|
||||
}
|
||||
|
||||
public override void DrawBody(SpriteBatch spriteBatch, RectangleF rect, Color color)
|
||||
{
|
||||
bodyLabel.TextOffset = rect.Location - bodyLabel.Rect.Location.ToVector2() + new Vector2(CircuitBoxSizes.NodeBodyTextPadding);
|
||||
bodyLabel.DrawManually(spriteBatch);
|
||||
}
|
||||
|
||||
public override void OnResized(RectangleF rect)
|
||||
=> UpdateTextSizes(rect);
|
||||
|
||||
private void UpdateTextSizes(RectangleF rect)
|
||||
{
|
||||
var size = new Point((int)rect.Width - CircuitBoxSizes.NodeBodyTextPadding * 2, (int)rect.Height - CircuitBoxSizes.NodeBodyTextPadding * 2);
|
||||
bodyLabel.RectTransform.NonScaledSize = size;
|
||||
bodyLabel.Text = GetLocalizedText(BodyText);
|
||||
if (bodyLabel.Font != null)
|
||||
{
|
||||
bodyLabel.Text = ToolBox.LimitStringHeight(bodyLabel.WrappedText.Value, bodyLabel.Font!, size.Y);
|
||||
}
|
||||
headerLabel = new CircuitBoxLabel(ToolBox.LimitString(GetLocalizedText(HeaderText), GUIStyle.LargeFont, size.X), GUIStyle.LargeFont);
|
||||
|
||||
static LocalizedString GetLocalizedText(NetLimitedString text) => TextManager.Get(text.Value).Fallback(text.Value);
|
||||
}
|
||||
|
||||
public void PromptEditText(GUIComponent parent)
|
||||
{
|
||||
Color newColor = Color;
|
||||
CircuitBox.UI?.SetMenuVisibility(false);
|
||||
GUIFrame backgroundBlocker = new(new RectTransform(Vector2.One, parent.RectTransform), style: "GUIBackgroundBlocker")
|
||||
{
|
||||
UserData = PromptUserData
|
||||
};
|
||||
|
||||
GUILayoutGroup mainLayout = new GUILayoutGroup(new RectTransform(new Vector2(0.3f, 0.8f), backgroundBlocker.RectTransform, Anchor.Center), isHorizontal: false, childAnchor: Anchor.TopCenter);
|
||||
|
||||
GUILayoutGroup colorLayout = new GUILayoutGroup(new RectTransform(new Vector2(1f, 0.1f), mainLayout.RectTransform));
|
||||
new GUIFrame(new RectTransform(new Vector2(1f, 0.9f), colorLayout.RectTransform)) { IgnoreLayoutGroups = true };
|
||||
GUILayoutGroup colorArea = new GUILayoutGroup(new RectTransform(new Vector2(1f, 0.9f), colorLayout.RectTransform), isHorizontal: true);
|
||||
|
||||
GUIFrame labelArea = new(new RectTransform(new Vector2(1f, 0.65f), mainLayout.RectTransform, Anchor.Center));
|
||||
|
||||
GUIFrame header = new GUIFrame(new RectTransform(new Vector2(1f, 0.15f), labelArea.RectTransform, Anchor.TopLeft), style: "CircuitBoxTop");
|
||||
GUIFrame frame = new GUIFrame(new RectTransform(new Vector2(1f, 0.86f), labelArea.RectTransform, Anchor.BottomLeft), style: "CircuitBoxFrame");
|
||||
header.Color = frame.Color = Color;
|
||||
|
||||
GUITextBox headerTextBox = new GUITextBox(new RectTransform(Vector2.One, header.RectTransform, Anchor.Center), text: HeaderText.Value, font: headerLabel.Font, style: "GUITextBoxNoStyle")
|
||||
{
|
||||
MaxTextLength = NetLimitedString.MaxLength,
|
||||
Text = HeaderText.Value
|
||||
};
|
||||
|
||||
GUITextBox bodyTextBox = new GUITextBox(new RectTransform(ToolBox.PaddingSizeParentRelative(frame.RectTransform, 0.95f), frame.RectTransform, Anchor.Center), text: BodyText.Value, font: GUIStyle.Font, style: "GUITextBoxNoStyle", textAlignment: Alignment.TopLeft, wrap: true)
|
||||
{
|
||||
MaxTextLength = NetLimitedString.MaxLength
|
||||
};
|
||||
|
||||
bodyTextBox.OnEnterPressed += (textBox, text) =>
|
||||
{
|
||||
int caretIndex = textBox.CaretIndex;
|
||||
textBox.Text = $"{text[..caretIndex]}\n{text[caretIndex..]}";
|
||||
textBox.CaretIndex = caretIndex + 1;
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
static void UpdateLabelColor(GUITextBox box)
|
||||
{
|
||||
bool found = TextManager.ContainsTag(box.Text);
|
||||
box.TextColor = found
|
||||
? GUIStyle.Orange
|
||||
: GUIStyle.TextColorNormal;
|
||||
|
||||
if (found)
|
||||
{
|
||||
box.ToolTip = TextManager.GetWithVariable("StringPropertyTranslate", "[translation]", TextManager.Get(box.Text));
|
||||
}
|
||||
else
|
||||
{
|
||||
box.ToolTip = string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
bodyTextBox.OnDeselected += (textBox, _) => UpdateLabelColor(textBox);
|
||||
headerTextBox.OnDeselected += (textBox, _) => UpdateLabelColor(textBox);
|
||||
UpdateLabelColor(bodyTextBox);
|
||||
UpdateLabelColor(headerTextBox);
|
||||
|
||||
mainLayout.Recalculate();
|
||||
headerTextBox.ForceUpdate();
|
||||
|
||||
new GUIButton(new RectTransform(new Vector2(0.5f, 0.1f), mainLayout.RectTransform), text: TextManager.Get("confirm"))
|
||||
{
|
||||
OnClicked = (_, _) =>
|
||||
{
|
||||
CircuitBox.RenameLabel(this, newColor, new NetLimitedString(headerTextBox.Text), new NetLimitedString(bodyTextBox.Text));
|
||||
RemoveEditPrompt(parent);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
new GUIButton(new RectTransform(new Vector2(0.5f, 0.1f), mainLayout.RectTransform), text: TextManager.Get("cancel"))
|
||||
{
|
||||
OnClicked = (_, _) =>
|
||||
{
|
||||
RemoveEditPrompt(parent);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
LocalizedString[] colorComponentLabels =
|
||||
{
|
||||
TextManager.Get("spriteeditor.colorcomponentr"),
|
||||
TextManager.Get("spriteeditor.colorcomponentg"),
|
||||
TextManager.Get("spriteeditor.colorcomponentb")
|
||||
};
|
||||
for (int i = 0; i <= 2; i++)
|
||||
{
|
||||
var element = new GUIFrame(new RectTransform(new Vector2(0.33f, 1), colorArea.RectTransform), style: null);
|
||||
|
||||
var colorLabel = new GUITextBlock(new RectTransform(new Vector2(0.3f, 1), element.RectTransform, Anchor.CenterLeft), colorComponentLabels[i],
|
||||
font: GUIStyle.SubHeadingFont, textAlignment: Alignment.CenterLeft);
|
||||
|
||||
var numberInput = new GUINumberInput(new RectTransform(new Vector2(0.7f, 1), element.RectTransform, Anchor.CenterRight), NumberType.Int)
|
||||
{
|
||||
Font = GUIStyle.SubHeadingFont,
|
||||
MinValueInt = 0,
|
||||
MaxValueInt = 255
|
||||
};
|
||||
switch (i)
|
||||
{
|
||||
case 0:
|
||||
colorLabel.TextColor = GUIStyle.Red;
|
||||
numberInput.IntValue = Color.R;
|
||||
numberInput.OnValueChanged += numInput =>
|
||||
{
|
||||
newColor.R = (byte)numInput.IntValue;
|
||||
header.Color = frame.Color = newColor;
|
||||
};
|
||||
break;
|
||||
case 1:
|
||||
colorLabel.TextColor = GUIStyle.Green;
|
||||
numberInput.IntValue = Color.G;
|
||||
numberInput.OnValueChanged += numInput =>
|
||||
{
|
||||
newColor.G = (byte)numInput.IntValue;
|
||||
header.Color = frame.Color = newColor;
|
||||
};
|
||||
break;
|
||||
case 2:
|
||||
colorLabel.TextColor = GUIStyle.Blue;
|
||||
numberInput.IntValue = Color.B;
|
||||
numberInput.OnValueChanged += numInput =>
|
||||
{
|
||||
newColor.B = (byte)numInput.IntValue;
|
||||
header.Color = frame.Color = newColor;
|
||||
};
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void RemoveEditPrompt(GUIComponent parent)
|
||||
{
|
||||
if (parent.FindChild(PromptUserData) is not { } promptParent) { return; }
|
||||
parent.RemoveChild(promptParent);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user