Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
ReleasesScreen.cs
浏览该文件的文档.
1using System.Text.Json;
2using System.Xml.Linq;
3using Engine;
4
5namespace Game {
6 public class ReleasesScreen : Screen {
7 #region 用户自定义区
8
9 public string m_releasesName = string.Empty; //此界面发布版系列的名称
10
11 public string m_releasesURL = string.Empty; //此界面发布版系列的Releases链接
12
13 public IComparer<ReleaseInfo> m_versionComparer;
14
15 #endregion
16
17 public List<ReleaseInfo> Releases { get; set; } = new(); //所有发布版的信息
23 public Dictionary<BevelledButtonWidget, Asset> m_assetButtons = new(); //点击就下载资源的按钮
25 public BusyDialog m_busyDialog; //进入时展示的"获取发布版..."的对话框
26 public const string fName = "ReleasesScreen";
27
28 public ReleasesScreen() {
29 XElement node = ContentManager.Get<XElement>("Screens/ReleasesScreen");
30 LoadContents(this, node);
31 m_titleLabel = Children.Find<LabelWidget>("ReleaseTitle");
32 m_textLabel = Children.Find<LabelWidget>("ReleaseText");
33 m_scrollPanel = Children.Find<ScrollPanelWidget>("ScrollPanel");
34 m_releasesListPanel = Children.Find<ListPanelWidget>("ReleasesList");
35 m_infoLabel = Children.Find<LabelWidget>("ReleaseInfo");
36 m_releaseInfoPanel = Children.Find<StackPanelWidget>("ReleaseInfoPanel");
37 m_releasesListPanel.ItemWidgetFactory = item => new LabelWidget {
38 Text = item is ReleaseInfo releaseInfo
39 ? releaseInfo.name + GetVersionSuffix(releaseInfo.tag_name, APIUpdateManager.CurrentVersion)
40 : string.Empty,
43 };
44 m_releasesListPanel.ItemClicked += DisplayReleaseInfo;
45 }
46
47 public override void Enter(object[] parameters) {
48 string previousName = m_releasesName;
49 m_releasesURL = (string)parameters[0];
50 m_releasesName = (string)parameters[1];
51 if (parameters.Length >= 3) {
52 m_versionComparer = parameters[2] as IComparer<ReleaseInfo> ?? new ReleaseInfoComparer();
53 }
54 else {
56 }
60 );
61 Children.Find<LabelWidget>("TopBar.Label").Text = string.Format(
64 );
65 if (Releases.Count == 0
66 || m_releasesName != previousName) {
67 Task.Run(() => Task.FromResult(GetReleasesAsync()));
68 }
69 m_scrollPanel.ScrollPosition = 0f;
70 }
71
72 public async Task GetReleasesAsync() //异步获取发布版
73 {
74 Exception e = null;
75 if (m_busyDialog.RootWidget != ScreensManager.RootWidget) {
77 }
78 try {
79 JsonDocument document = await OnlineJsonReader.GetJsonFromUrlAsync(m_releasesURL);
80 //Releases = JsonSerializer.Deserialize<List<ReleaseInfo>>(document.RootElement.GetRawText());
81 Releases = JsonSerializer.Deserialize(document.RootElement.GetRawText(), GiteeReleaseInfoJsonContext.Default.ListReleaseInfo);
84 }
85 catch (Exception exception) {
86 e = exception;
87 }
88 finally {
89 if (m_busyDialog.RootWidget == ScreensManager.RootWidget) {
91 }
92 if (e != null) {
94 null,
95 new MessageDialog(
97 string.Format(LanguageControl.GetContentWidgets(fName, 20), m_releasesName, e.Message),
99 null,
100 null
101 )
102 );
104 }
105 }
106 }
107
108 public void PopulateReleasesList() //向左侧版本列表中加入Release条目
109 {
110 m_releasesListPanel.ClearItems();
111 foreach (ReleaseInfo releaseInfo in Releases) {
112 m_releasesListPanel.AddItem(releaseInfo);
113 }
114 if (Releases.Count > 0) {
116 }
117 }
118
119 public string GetVersionSuffix(string currentVersion, string targetVersion) {
120 if (currentVersion == APIUpdateManager.LatestVersion) {
122 }
123 int firstNumberIndex = currentVersion.IndexOfAny(
124 [
125 '0',
126 '1',
127 '2',
128 '3',
129 '4',
130 '5',
131 '6',
132 '7',
133 '8',
134 '9'
135 ]
136 );
137 if (firstNumberIndex >= 0 && currentVersion.Substring(firstNumberIndex) == targetVersion) {
139 }
140 return string.Empty;
141 }
142
143 public void PopulateAssetsList(ReleaseInfo releaseInfo) {
144 foreach (BevelledButtonWidget assetButton in m_assetButtons.Keys) {
145 m_releaseInfoPanel.Children.Remove(assetButton);
146 }
147 m_assetButtons.Clear();
148 foreach (Asset asset in releaseInfo.assets) {
149 BevelledButtonWidget button = new() { Size = new Vector2(float.PositiveInfinity, 56), Text = asset.name, FontScale = 0.85f };
150 m_assetButtons.Add(button, asset);
151 m_releaseInfoPanel.Children.Add(button);
152 }
153 }
154
155 public void DisplayReleaseInfo(object item) //档左侧版本列表中某条目点击时
156 {
157 ReleaseInfo releaseInfo = (ReleaseInfo)item;
158 m_titleLabel.Text = releaseInfo.name;
159 m_infoLabel.Text = string.Format(
161 releaseInfo.author.name,
162 releaseInfo.created_at
163 );
164 m_textLabel.Text = releaseInfo.body;
165 PopulateAssetsList(releaseInfo);
166 }
167
168 public override void Update() {
169 foreach (KeyValuePair<BevelledButtonWidget, Asset> assetButton in m_assetButtons) {
170 if (assetButton.Key.IsClicked) {
171 WebBrowserManager.LaunchBrowser(assetButton.Value.browser_download_url);
172 }
173 }
174 if (Input.Back
175 || Input.Cancel
176 || Children.Find<ButtonWidget>("TopBar.Back").IsClicked) {
178 }
179 }
180
181 //用于给版本列表排序
182 public class ReleaseInfoComparer : IComparer<ReleaseInfo> {
183 public int Compare(ReleaseInfo x, ReleaseInfo y) {
184 if (ReferenceEquals(x, y)) {
185 return 0;
186 }
187 if (y is null) {
188 return 1;
189 }
190 if (x is null) {
191 return -1;
192 }
194 }
195 }
196 }
197}
static void Error(object message)
定义 Log.cs:80
static string CurrentVersion
当前API版本
static string LatestVersion
网络上最新的API的版本
static int CompareVersion(string current, string target)
比较两个版本的新旧关系。 current大于target,返回1 current小于target,返回-1 版本相等,返回0
readonly WidgetsList Children
static object Get(Type type, string name)
static void HideDialog(Dialog dialog)
static void ShowDialog(ContainerWidget parentWidget, Dialog dialog)
static string GetContentWidgets(string name, string prop)
static async Task< JsonDocument > GetJsonFromUrlAsync(string url)
从链接获取 Json 文档
int Compare(ReleaseInfo x, ReleaseInfo y)
List< ReleaseInfo > Releases
ListPanelWidget m_releasesListPanel
Dictionary< BevelledButtonWidget, Asset > m_assetButtons
void DisplayReleaseInfo(object item)
string GetVersionSuffix(string currentVersion, string targetVersion)
override void Enter(object[] parameters)
IComparer< ReleaseInfo > m_versionComparer
ScrollPanelWidget m_scrollPanel
void PopulateAssetsList(ReleaseInfo releaseInfo)
StackPanelWidget m_releaseInfoPanel
static Screen PreviousScreen
上一个Screen
static void SwitchScreen(string name, params object[] parameters)
static ContainerWidget RootWidget
static void LaunchBrowser(string url)
virtual WidgetAlignment VerticalAlignment
virtual WidgetAlignment HorizontalAlignment
virtual void LoadContents(object eventsTarget, XElement node)