diff --git a/src/Decentralized/CandleChart.cs b/src/Decentralized/CandleChart.cs index a76086e..e6fcb04 100644 --- a/src/Decentralized/CandleChart.cs +++ b/src/Decentralized/CandleChart.cs @@ -212,17 +212,20 @@ namespace Decentralized } } - /// 把一个币的图放进界面:说明一行、图、图例一行。 + /// 把一个币的图放进界面:说明一行、黑框包裹的图、图例一行。 public static void Add(CustomUIBuilder b, string key, string asset, double threshold = 0) { var all = Session.Data.Candles.Of(asset); - b.AddLabel(Caption(asset, all)); + b.AddLabel(Caption(asset, all), "chart_caption_dim"); + b.BeginPanel(W * Scale + 4f, H * Scale + 4f, TextAnchor.MiddleCenter, 2f, 0f, "chart_bezel"); + PledgerSkin.Slice(b.Last.image, "ui_hw_bezel", 5); b.AddImage(Render(key, all, threshold), W * Scale, H * Scale); - b.AddLabel(L.T(threshold > 0 ? "chart.legend.thr" : "chart.legend")); + b.End(); + b.AddLabel(L.T(threshold > 0 ? "chart.legend.thr" : "chart.legend"), "chart_legend_dim"); } - /// 带币种切换的图:上面一排币种按钮(选中的加方括号),切换后重画。 - public static void AddPicker(CustomUIBuilder b, string key, string fallback, Action refresh) + /// 带币种切换的图:上面一排币种按钮(选中项带准星角标),切换后重画。 + public static void AddPicker(CustomUIBuilder b, string key, string fallback, Action refresh, ICollection picked = null) { var list = ChartAssets.Where(a => a != Assets.Ponero || Unlock.BlackUnlocked).ToList(); if (!Picked.TryGetValue(key, out var cur) || !list.Contains(cur)) cur = fallback; @@ -230,7 +233,7 @@ namespace Decentralized foreach (var a in list) { string asset = a; - b.AddButton(asset == cur ? "[" + asset + "]" : asset, () => { Picked[key] = asset; refresh(); }); + PledgerSkin.Pick(b, asset, asset == cur, () => { Picked[key] = asset; refresh(); }, picked); } b.End(); Add(b, key, cur); diff --git a/src/Decentralized/TerminalWindow.cs b/src/Decentralized/TerminalWindow.cs index 5544089..f7dacb7 100644 --- a/src/Decentralized/TerminalWindow.cs +++ b/src/Decentralized/TerminalWindow.cs @@ -1,7 +1,9 @@ using System; +using System.Collections.Generic; using System.Globalization; using System.Linq; using UnityEngine; +using UnityEngine.UI; using Decentralized.Domain; namespace Decentralized @@ -13,6 +15,8 @@ namespace Decentralized public static class TerminalWindow { public const string Id = "pd_terminal"; + private const float WinW = 828f, WinH = 680f, ScreenW = 768f, ScreenH = 578f, Bezel = 6f; + private const float LeftW = 420f, RightW = 310f; private enum Page { Home, Bank, Poinbase, Web3, Wallets } private static Page _page = Page.Home; @@ -22,22 +26,34 @@ namespace Decentralized private static string _amount = ""; private static string _message; + private static readonly List _picked = new List(); + private static readonly List _clear = new List(); + private static readonly List _rows = new List(); + public static void Open() { if (Session.Data == null) return; var b = CustomUIManager.Window(Id, L.T("term.title")); if (b == null) return; - b.SetSize(780, 660).SetDraggable(true).SetCloseOnEscape(true).UseMachineryStyle(); - b.BeginRow(); + _picked.Clear(); _clear.Clear(); _rows.Clear(); + b.SetSize(WinW, WinH).SetDraggable(true).SetCloseOnEscape(true).UseMachineryStyle(); + // 黑色外边框包裹墨水屏 + b.BeginPanel(ScreenW + Bezel * 2, ScreenH + Bezel * 2, TextAnchor.MiddleCenter, Bezel + 3f, 0f); + var bezel = b.Last.image; + b.BeginPanel(ScreenW, ScreenH, TextAnchor.UpperLeft, 12f, 4f); + var screen = b.CurrentContainer; + var paper = b.Last.image; + b.BeginRow(4f, TextAnchor.MiddleLeft); foreach (Page p in Enum.GetValues(typeof(Page))) { var page = p; string name = L.T("tab." + p.ToString().ToLowerInvariant()); - b.AddButton(page == _page ? $"[{name}]" : name, () => { _page = page; _message = null; _edit = null; Open(); }); + PledgerSkin.Pick(b, name, page == _page, () => { _page = page; _message = null; _edit = null; Open(); }, _picked); } b.End(); b.AddSeparator(); - b.BeginScroll(540); + b.BeginScroll(ScreenH - 52f); + _clear.Add(b.Last.image); switch (_page) { case Page.Home: HomePage(b); break; @@ -48,8 +64,11 @@ namespace Decentralized default: break; } b.End(); - if (!string.IsNullOrEmpty(_message)) b.AddLabel(_message); - b.Show(); + if (!string.IsNullOrEmpty(_message)) b.AddLabel(_message, "term_note"); + b.End(); + b.End(); + var win = b.Show(); + Log.Guard("交易终端外观", () => PledgerSkin.Apply(win, screen, bezel, paper, _picked, _clear, _rows)); } private static void Go(Page p) { _page = p; _message = null; _edit = null; Open(); } @@ -63,11 +82,14 @@ namespace Decentralized private static void Entry(CustomUIBuilder b, string icon, string name, string line1, string line2, Page target) { - b.BeginPanel(220f, 250f, TextAnchor.UpperCenter, 10f, 6f); + b.BeginPanel(230f, 250f, TextAnchor.UpperCenter, 10f, 6f); + var cardImg = b.Last.image; + cardImg.sprite = MachineryStyle.White; + cardImg.color = PledgerSkin.RowNormal; b.AddImage(ModInfo.Id + ":" + icon, 96f, 96f); b.AddHeader(name); b.AddLabel(line1); - if (line2 != null) b.AddLabel(line2); + if (line2 != null) b.AddLabel(line2, "entry_l2_dim"); b.AddFlexibleSpace(); b.AddButton(L.T("home.enter"), () => Go(target)); b.End(); @@ -87,40 +109,61 @@ namespace Decentralized b.AddSpace(8f); b.AddSeparator(); var r = d.LastNight; - b.AddLabel(r == null ? L.T("report.none") : L.T("home.lastnight", r.Day, Fmt.Num(r.Mined), r.PoweredRigs, r.Rigs)); + b.AddLabel(r == null ? L.T("report.none") : L.T("home.lastnight", r.Day, Fmt.Num(r.Mined), r.PoweredRigs, r.Rigs), "report_dim"); } - private const float LeftW = 430f, RightW = 300f; - - private static void Cell(CustomUIBuilder b, float w, string text, bool header = false) + private static void Cell(CustomUIBuilder b, float w, string text, bool header = false, TextAnchor align = TextAnchor.MiddleLeft) { - b.BeginPanel(w, 30f, TextAnchor.MiddleLeft, 6f, 0f); + b.BeginPanel(w, 26f, align, 0f, 0f); + _clear.Add(b.Last.image); b.AddLabel(header ? "" + text + "" : text); b.End(); } - private static void TableRow(CustomUIBuilder b, float[] widths, params string[] cells) + private static void TableRow(CustomUIBuilder b, float totalW, float[] widths, TextAnchor[] aligns, string[] cells, bool selected = false, Action onClick = null) { - b.BeginRow(2f); - for (int i = 0; i < widths.Length; i++) Cell(b, widths[i], i < cells.Length ? cells[i] : ""); + b.BeginPanel(totalW, 28f, TextAnchor.MiddleLeft, 4f, 0f); + _rows.Add(new PledgerSkin.RowDef { Root = b.Last.root, Image = b.Last.image, Selected = selected, OnClick = onClick }); + b.BeginRow(0f, TextAnchor.MiddleLeft); + for (int i = 0; i < widths.Length; i++) + { + var align = (aligns != null && i < aligns.Length) ? aligns[i] : (i == 0 ? TextAnchor.MiddleLeft : TextAnchor.MiddleRight); + Cell(b, widths[i], i < cells.Length ? cells[i] : "", false, align); + } + b.End(); b.End(); } - private static void TableHeader(CustomUIBuilder b, float[] widths, params string[] cells) + private static void TableRow(CustomUIBuilder b, float[] widths, params string[] cells) => + TableRow(b, widths.Sum() + 8f, widths, null, cells, false, null); + + private static void TableHeader(CustomUIBuilder b, float totalW, float[] widths, TextAnchor[] aligns, params string[] cells) { - b.BeginRow(2f); - for (int i = 0; i < widths.Length; i++) Cell(b, widths[i], cells[i], true); + b.BeginPanel(totalW, 26f, TextAnchor.MiddleLeft, 4f, 0f); + _clear.Add(b.Last.image); + b.BeginRow(0f, TextAnchor.MiddleLeft); + for (int i = 0; i < widths.Length; i++) + { + var align = (aligns != null && i < aligns.Length) ? aligns[i] : (i == 0 ? TextAnchor.MiddleLeft : TextAnchor.MiddleRight); + Cell(b, widths[i], i < cells.Length ? cells[i] : "", true, align); + } + b.End(); b.End(); } + private static void TableHeader(CustomUIBuilder b, float[] widths, params string[] cells) => + TableHeader(b, widths.Sum() + 8f, widths, null, cells); + /// 左右分栏:左边是账户与持仓表格,右边是操作区。 private static void Columns(CustomUIBuilder b, Action left, Action right) { b.BeginRow(10f); - b.BeginPanel(LeftW, -1f, TextAnchor.UpperLeft, 8f, 4f); + b.BeginPanel(LeftW, -1f, TextAnchor.UpperLeft, 4f, 4f); + _clear.Add(b.Last.image); left(b); b.End(); - b.BeginPanel(RightW, -1f, TextAnchor.UpperLeft, 8f, 6f); + b.BeginPanel(RightW, -1f, TextAnchor.UpperLeft, 4f, 6f); + _clear.Add(b.Last.image); right(b); b.End(); b.End(); @@ -129,7 +172,8 @@ namespace Decentralized private static void AmountRow(CustomUIBuilder b) { b.AddLabel(L.T("trade.amount")); - b.BeginPanel(RightW - 30f, -1f, TextAnchor.MiddleCenter, 0f, 0f); // 给输入框一个固定宽度,容得下大额数字 + b.BeginPanel(RightW - 30f, -1f, TextAnchor.MiddleCenter, 0f, 0f); + _clear.Add(b.Last.image); b.AddInput("0", _amount, s => _amount = s, "amount", s => _amount = s); b.End(); }