@@ -1,7 +1,11 @@
|
|||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using Content.Client.Guidebook.RichText;
|
||||||
using Content.Client.UserInterface.Controls;
|
using Content.Client.UserInterface.Controls;
|
||||||
using Content.Client.UserInterface.Controls.FancyTree;
|
using Content.Client.UserInterface.Controls.FancyTree;
|
||||||
|
using JetBrains.Annotations;
|
||||||
using Robust.Client.AutoGenerated;
|
using Robust.Client.AutoGenerated;
|
||||||
|
using Robust.Client.UserInterface;
|
||||||
using Robust.Client.UserInterface.Controls;
|
using Robust.Client.UserInterface.Controls;
|
||||||
using Robust.Client.UserInterface.XAML;
|
using Robust.Client.UserInterface.XAML;
|
||||||
using Robust.Shared.ContentPack;
|
using Robust.Shared.ContentPack;
|
||||||
@@ -9,7 +13,7 @@ using Robust.Shared.ContentPack;
|
|||||||
namespace Content.Client.Guidebook.Controls;
|
namespace Content.Client.Guidebook.Controls;
|
||||||
|
|
||||||
[GenerateTypedNameReferences]
|
[GenerateTypedNameReferences]
|
||||||
public sealed partial class GuidebookWindow : FancyWindow
|
public sealed partial class GuidebookWindow : FancyWindow, ILinkClickHandler
|
||||||
{
|
{
|
||||||
[Dependency] private readonly IResourceManager _resourceManager = default!;
|
[Dependency] private readonly IResourceManager _resourceManager = default!;
|
||||||
[Dependency] private readonly DocumentParsingManager _parsingMan = default!;
|
[Dependency] private readonly DocumentParsingManager _parsingMan = default!;
|
||||||
@@ -139,4 +143,20 @@ public sealed partial class GuidebookWindow : FancyWindow
|
|||||||
|
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void HandleClick(string link)
|
||||||
|
{
|
||||||
|
if (!_entries.TryGetValue(link, out var entry))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (Tree.TryGetIndexFromMetadata(entry, out var index))
|
||||||
|
{
|
||||||
|
Tree.ExpandParentEntries(index.Value);
|
||||||
|
Tree.SetSelectedIndex(index);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ShowGuide(entry);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
70
Content.Client/Guidebook/Richtext/TextLinkTag.cs
Normal file
70
Content.Client/Guidebook/Richtext/TextLinkTag.cs
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
using JetBrains.Annotations;
|
||||||
|
using Robust.Client.UserInterface;
|
||||||
|
using Robust.Client.UserInterface.Controls;
|
||||||
|
using Robust.Client.UserInterface.RichText;
|
||||||
|
using Robust.Shared.Input;
|
||||||
|
using Robust.Shared.Utility;
|
||||||
|
|
||||||
|
namespace Content.Client.Guidebook.RichText;
|
||||||
|
|
||||||
|
[UsedImplicitly]
|
||||||
|
public sealed class TextLinkTag : IMarkupTag
|
||||||
|
{
|
||||||
|
public string Name => "textlink";
|
||||||
|
|
||||||
|
public Control? Control;
|
||||||
|
|
||||||
|
/// <inheritdoc/>
|
||||||
|
public bool TryGetControl(MarkupNode node, [NotNullWhen(true)] out Control? control)
|
||||||
|
{
|
||||||
|
if (!node.Value.TryGetString(out var text)
|
||||||
|
|| !node.Attributes.TryGetValue("link", out var linkParameter)
|
||||||
|
|| !linkParameter.TryGetString(out var link))
|
||||||
|
{
|
||||||
|
control = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var label = new Label();
|
||||||
|
label.Text = text;
|
||||||
|
|
||||||
|
label.MouseFilter = Control.MouseFilterMode.Stop;
|
||||||
|
label.FontColorOverride = Color.CornflowerBlue;
|
||||||
|
label.DefaultCursorShape = Control.CursorShape.Hand;
|
||||||
|
|
||||||
|
label.OnMouseEntered += _ => label.FontColorOverride = Color.LightSkyBlue;
|
||||||
|
label.OnMouseExited += _ => label.FontColorOverride = Color.CornflowerBlue;
|
||||||
|
label.OnKeyBindDown += args => OnKeybindDown(args, link);
|
||||||
|
|
||||||
|
control = label;
|
||||||
|
Control = label;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnKeybindDown(GUIBoundKeyEventArgs args, string link)
|
||||||
|
{
|
||||||
|
if (args.Function != EngineKeyFunctions.UIClick)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (Control == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var current = Control;
|
||||||
|
while (current != null)
|
||||||
|
{
|
||||||
|
current = current.Parent;
|
||||||
|
|
||||||
|
if (current is not ILinkClickHandler handler)
|
||||||
|
continue;
|
||||||
|
handler.HandleClick(link);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Logger.Warning($"Warning! No valid ILinkClickHandler found.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface ILinkClickHandler
|
||||||
|
{
|
||||||
|
public void HandleClick(string link);
|
||||||
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using Content.Client.Resources;
|
using Content.Client.Resources;
|
||||||
using Robust.Client.AutoGenerated;
|
using Robust.Client.AutoGenerated;
|
||||||
using Robust.Client.Graphics;
|
using Robust.Client.Graphics;
|
||||||
@@ -203,6 +204,31 @@ public sealed partial class FancyTree : Control
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool TryGetIndexFromMetadata(object metadata, [NotNullWhen(true)] out int? index)
|
||||||
|
{
|
||||||
|
index = null;
|
||||||
|
foreach (var item in Items)
|
||||||
|
{
|
||||||
|
if (item.Metadata?.Equals(metadata) ?? false)
|
||||||
|
{
|
||||||
|
index = item.Index;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return index != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ExpandParentEntries(int index)
|
||||||
|
{
|
||||||
|
Control? current = Items[index];
|
||||||
|
while (current != null)
|
||||||
|
{
|
||||||
|
if (current is TreeItem item)
|
||||||
|
item.SetExpanded(true);
|
||||||
|
current = current.Parent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void Clear()
|
public void Clear()
|
||||||
{
|
{
|
||||||
foreach (var item in Items)
|
foreach (var item in Items)
|
||||||
|
|||||||
Reference in New Issue
Block a user