mirror of
https://github.com/Ellpeck/MLEM.git
synced 2024-11-26 06:28:35 +01:00
tidied up paragraph link code
This commit is contained in:
parent
3eded637da
commit
9d5e9d4ccf
1 changed files with 33 additions and 35 deletions
|
@ -126,27 +126,16 @@ namespace MLEM.Ui.Elements {
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="size">The paragraph's default size</param>
|
/// <param name="size">The paragraph's default size</param>
|
||||||
protected virtual void ParseText(Vector2 size) {
|
protected virtual void ParseText(Vector2 size) {
|
||||||
if (this.TokenizedText == null)
|
if (this.TokenizedText == null) {
|
||||||
|
// tokenize the text
|
||||||
this.TokenizedText = this.System.TextFormatter.Tokenize(this.RegularFont, this.Text);
|
this.TokenizedText = this.System.TextFormatter.Tokenize(this.RegularFont, this.Text);
|
||||||
|
|
||||||
this.TokenizedText.Split(this.RegularFont, size.X - this.ScaledPadding.Width, this.TextScale * this.Scale);
|
// add links to the paragraph
|
||||||
var linkTokens = this.TokenizedText.Tokens.Where(t => t.AppliedCodes.Any(c => c is LinkCode)).ToArray();
|
|
||||||
// this basically checks if there are any tokens that have an area that doesn't have a link element associated with it
|
|
||||||
if (linkTokens.Any(t => !t.GetArea(Vector2.Zero, this.TextScale).All(a => this.GetChildren<Link>(c => c.PositionOffset == a.Location && c.Size == a.Size).Any()))) {
|
|
||||||
this.RemoveChildren(c => c is Link);
|
this.RemoveChildren(c => c is Link);
|
||||||
foreach (var link in linkTokens) {
|
foreach (var link in this.TokenizedText.Tokens.Where(t => t.AppliedCodes.Any(c => c is LinkCode)))
|
||||||
var areas = link.GetArea(Vector2.Zero, this.TextScale).ToArray();
|
this.AddChild(new Link(Anchor.TopLeft, link, this.TextScale));
|
||||||
var cluster = new Link[areas.Length];
|
|
||||||
for (var i = 0; i < areas.Length; i++) {
|
|
||||||
var area = areas[i];
|
|
||||||
cluster[i] = this.AddChild(new Link(Anchor.TopLeft, link, area.Size, cluster) {
|
|
||||||
PositionOffset = area.Location,
|
|
||||||
// only allow selecting the first part of a link
|
|
||||||
CanBeSelected = i == 0
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
this.TokenizedText.Split(this.RegularFont, size.X - this.ScaledPadding.Width, this.TextScale * this.Scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void QueryTextCallback() {
|
private void QueryTextCallback() {
|
||||||
|
@ -169,36 +158,45 @@ namespace MLEM.Ui.Elements {
|
||||||
/// The token that this link represents
|
/// The token that this link represents
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public readonly Token Token;
|
public readonly Token Token;
|
||||||
/// <summary>
|
private readonly float textScale;
|
||||||
/// The links that form a cluster for the given token.
|
|
||||||
/// This only contains more than one element if the tokenized string has previously been <see cref="TokenizedString.Split"/>.
|
|
||||||
/// </summary>
|
|
||||||
public readonly Link[] LinkCluster;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a new link element with the given settings
|
/// Creates a new link element with the given settings
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="anchor">The link's anchor</param>
|
/// <param name="anchor">The link's anchor</param>
|
||||||
/// <param name="token">The token that this link represents</param>
|
/// <param name="token">The token that this link represents</param>
|
||||||
/// <param name="size">The size of the token</param>
|
/// <param name="textScale">The scale that text is rendered with</param>
|
||||||
/// <param name="linkCluster">The links that form a cluster for the given token. This only contains more than one element if the tokenized string has previously been split.</param>
|
public Link(Anchor anchor, Token token, float textScale) : base(anchor, Vector2.Zero) {
|
||||||
public Link(Anchor anchor, Token token, Vector2 size, Link[] linkCluster) : base(anchor, size) {
|
|
||||||
this.Token = token;
|
this.Token = token;
|
||||||
this.LinkCluster = linkCluster;
|
this.textScale = textScale;
|
||||||
this.OnSelected += e => {
|
|
||||||
foreach (var link in this.LinkCluster)
|
|
||||||
link.IsSelected = true;
|
|
||||||
};
|
|
||||||
this.OnDeselected += e => {
|
|
||||||
foreach (var link in this.LinkCluster)
|
|
||||||
link.IsSelected = false;
|
|
||||||
};
|
|
||||||
this.OnPressed += e => {
|
this.OnPressed += e => {
|
||||||
foreach (var code in token.AppliedCodes.OfType<LinkCode>())
|
foreach (var code in token.AppliedCodes.OfType<LinkCode>())
|
||||||
this.System?.LinkBehavior?.Invoke(code);
|
this.System?.LinkBehavior?.Invoke(code);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override void ForceUpdateArea() {
|
||||||
|
// set the position offset and size to the token's first area
|
||||||
|
var area = this.Token.GetArea(Vector2.Zero, this.textScale).First();
|
||||||
|
this.PositionOffset = area.Location;
|
||||||
|
this.Size = area.Size;
|
||||||
|
base.ForceUpdateArea();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public override Element GetElementUnderPos(Vector2 position) {
|
||||||
|
var ret = base.GetElementUnderPos(position);
|
||||||
|
if (ret != null)
|
||||||
|
return ret;
|
||||||
|
// check if any of our token's parts are hovered
|
||||||
|
foreach (var rect in this.Token.GetArea(this.Parent.DisplayArea.Location, this.Scale * this.textScale)) {
|
||||||
|
if (rect.Contains(position))
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue