CI / Go Backend (push) Canceled after 0s
初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器 HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块 Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚 AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
105 lines
3.4 KiB
C#
105 lines
3.4 KiB
C#
using System.Windows;
|
|
using PCL.Core.UI;
|
|
|
|
namespace PCL;
|
|
|
|
public static class HintService
|
|
{
|
|
private struct HintMessage
|
|
{
|
|
public string Text;
|
|
public HintType Type;
|
|
public bool Log;
|
|
}
|
|
|
|
private static ModBase.SafeList<HintMessage> HintWaiting
|
|
{
|
|
get => field ??= new ModBase.SafeList<HintMessage>();
|
|
set;
|
|
}
|
|
|
|
public static void Hint(string? text, HintType type = HintType.Info, bool log = true)
|
|
{
|
|
var normalized = (text ?? "").Replace("\r\n", " ").Replace("\r", " ").Replace("\n", " ");
|
|
if (HintWaiting.Any(h => h.Text == normalized && h.Type == type)) return;
|
|
HintWaiting.Add(new HintMessage { Text = normalized, Type = type, Log = log });
|
|
}
|
|
|
|
public static void HintWrapper_OnShow(string message, HintTheme messageTheme)
|
|
{
|
|
var hintType = messageTheme switch
|
|
{
|
|
HintTheme.Success => HintType.Success,
|
|
HintTheme.Error => HintType.Error,
|
|
HintTheme.Warning => HintType.Warning,
|
|
_ => HintType.Info
|
|
};
|
|
Hint(message, hintType);
|
|
}
|
|
|
|
internal static void Tick()
|
|
{
|
|
try
|
|
{
|
|
ModMain.frmMain!.PanHint.HorizontalAlignment = HorizontalAlignment.Right;
|
|
ModMain.frmMain.PanHint.VerticalAlignment = VerticalAlignment.Bottom;
|
|
|
|
var extraHeight = ModMain.frmMain.PanExtraButtons.ActualHeight;
|
|
ModMain.frmMain.PanHint.Margin = new Thickness(0, 0, 0, extraHeight > 0 ? extraHeight + 20 : 20);
|
|
|
|
if (!HintWaiting.Any())
|
|
return;
|
|
|
|
var currentHint = HintWaiting[0];
|
|
|
|
var duplicate = ModMain.frmMain.PanHint.Children.OfType<MyToast>()
|
|
.FirstOrDefault(t => !t.IsDismissing && t.Context == currentHint.Text && t.ToastType == currentHint.Type);
|
|
if (duplicate != null)
|
|
{
|
|
duplicate.Emphasize();
|
|
HintWaiting.RemoveAt(0);
|
|
return;
|
|
}
|
|
|
|
var activeCount = ModMain.frmMain.PanHint.Children.OfType<MyToast>().Count(t => !t.IsDismissing);
|
|
if (activeCount >= 5)
|
|
{
|
|
var oldest = ModMain.frmMain.PanHint.Children.OfType<MyToast>().FirstOrDefault(t => !t.IsDismissing);
|
|
oldest?.Dismiss();
|
|
return;
|
|
}
|
|
|
|
var toast = new MyToast
|
|
{
|
|
Context = currentHint.Text,
|
|
ToastType = currentHint.Type,
|
|
Icon = currentHint.Type switch
|
|
{
|
|
HintType.Success => "lucide/circle-check",
|
|
HintType.Error => "lucide/circle-minus",
|
|
HintType.Warning => "lucide/triangle-alert",
|
|
_ => "lucide/info"
|
|
},
|
|
DisplayDuration = (800d + ModBase.MathClamp(currentHint.Text.Length, 5d, 23d) * 180d) * ModAnimation.aniSpeed
|
|
};
|
|
|
|
ModMain.frmMain.PanHint.Children.Add(toast);
|
|
toast.Show();
|
|
|
|
if (currentHint.Log)
|
|
ModBase.Log("[UI] 弹出提示:" + currentHint.Text);
|
|
HintWaiting.RemoveAt(0);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ModBase.Log(ex, "显示弹出提示失败", ModBase.LogLevel.Normal);
|
|
}
|
|
}
|
|
|
|
public static void HideAll()
|
|
{
|
|
foreach (MyToast toast in ModMain.frmMain!.PanHint.Children.OfType<MyToast>().ToList())
|
|
toast.Dismiss();
|
|
}
|
|
}
|