1+ package org .mcdcl .ui ;
2+
3+ import java .util .List ;
4+
5+ import org .mcdcl .util .VersionManager ;
6+
7+ import javafx .animation .FadeTransition ;
8+ import javafx .application .Platform ;
9+ import javafx .geometry .Insets ;
10+ import javafx .geometry .Pos ;
11+ import javafx .scene .control .Alert ;
12+ import javafx .scene .control .Alert .AlertType ;
13+ import javafx .scene .control .Button ;
14+ import javafx .scene .control .ComboBox ;
15+ import javafx .scene .control .Label ;
16+ import javafx .scene .control .ProgressBar ;
17+ import javafx .scene .control .RadioButton ;
18+ import javafx .scene .control .Tab ;
19+ import javafx .scene .control .TabPane ;
20+ import javafx .scene .control .ToggleGroup ;
21+ import javafx .scene .layout .HBox ;
22+ import javafx .scene .layout .VBox ;
23+ import javafx .util .Duration ;
24+
25+ public class DownloadView extends VBox {
26+ private TabPane tabPane ;
27+
28+ public DownloadView () {
29+ // 初始化布局
30+ setPadding (new Insets (40 , 10 , 10 , 10 )); // 增加顶部边距,为返回按钮留出空间
31+ setSpacing (10 );
32+
33+ // 创建选项卡面板
34+ tabPane = new TabPane ();
35+ tabPane .setTabClosingPolicy (TabPane .TabClosingPolicy .UNAVAILABLE );
36+ tabPane .getStyleClass ().add ("download-tabs" ); // 添加自定义样式类
37+
38+ // 创建各个选项卡
39+ Tab gameTab = new Tab ("游戏" );
40+ gameTab .setContent (new GameDownloadTab ());
41+
42+ Tab modpackTab = new Tab ("整合包" );
43+ modpackTab .setContent (new ModpackDownloadTab ());
44+
45+ Tab modTab = new Tab ("模组" );
46+ modTab .setContent (new ModDownloadTab ());
47+
48+ Tab resourceTab = new Tab ("资源包" );
49+ resourceTab .setContent (new ResourcePackDownloadTab ());
50+
51+ // 添加选项卡到面板
52+ tabPane .getTabs ().addAll (gameTab , modpackTab , modTab , resourceTab );
53+
54+ // 将选项卡面板添加到布局中
55+ getChildren ().add (tabPane );
56+ }
57+ }
58+
59+ // 游戏下载选项卡
60+ class GameDownloadTab extends VBox {
61+ private ProgressBar progressBar ;
62+ private Label progressLabel ;
63+ private Button downloadButton ;
64+
65+ public GameDownloadTab () {
66+ setPadding (new Insets (10 ));
67+ setSpacing (10 );
68+
69+ Label titleLabel = new Label ("下载新版本" );
70+ titleLabel .getStyleClass ().add ("section-title" );
71+
72+ // 添加版本类型选择
73+ ToggleGroup versionTypeGroup = new ToggleGroup ();
74+ HBox versionTypeBox = new HBox (10 );
75+ versionTypeBox .setAlignment (Pos .CENTER_LEFT );
76+
77+ RadioButton releaseButton = new RadioButton ("正式版" );
78+ releaseButton .setToggleGroup (versionTypeGroup );
79+ releaseButton .setSelected (true );
80+
81+ RadioButton snapshotButton = new RadioButton ("快照版" );
82+ snapshotButton .setToggleGroup (versionTypeGroup );
83+
84+ RadioButton allButton = new RadioButton ("全部版本" );
85+ allButton .setToggleGroup (versionTypeGroup );
86+
87+ versionTypeBox .getChildren ().addAll (releaseButton , snapshotButton , allButton );
88+
89+ ComboBox <String > versionComboBox = new ComboBox <>();
90+ versionComboBox .setPromptText ("选择要下载的版本" );
91+ versionComboBox .setPrefWidth (200 );
92+
93+ // 版本类型切换监听器
94+ versionTypeGroup .selectedToggleProperty ().addListener ((obs , oldVal , newVal ) -> {
95+ try {
96+ VersionManager .VersionType type ;
97+ RadioButton selected = (RadioButton ) newVal ;
98+ if (selected == snapshotButton ) {
99+ type = VersionManager .VersionType .SNAPSHOT ;
100+ } else if (selected == allButton ) {
101+ type = VersionManager .VersionType .ALL ;
102+ } else {
103+ type = VersionManager .VersionType .RELEASE ;
104+ }
105+ List <String > versions = VersionManager .getAvailableVersions (type );
106+ versionComboBox .getItems ().clear ();
107+ versionComboBox .getItems ().addAll (versions );
108+ } catch (Exception e ) {
109+ Alert alert = new Alert (AlertType .ERROR );
110+ alert .setTitle ("错误" );
111+ alert .setHeaderText ("获取版本列表失败" );
112+ alert .setContentText (e .getMessage ());
113+ alert .showAndWait ();
114+ }
115+ });
116+
117+ // 创建进度条和标签
118+ progressBar = new ProgressBar (0 );
119+ progressBar .setVisible (false );
120+ progressBar .setPrefWidth (200 );
121+
122+ progressLabel = new Label ("" );
123+ progressLabel .setVisible (false );
124+
125+ Button downloadButton = new Button ("下载" );
126+ downloadButton .getStyleClass ().add ("download-button" );
127+ downloadButton .setOnAction (e -> {
128+ String selectedVersion = versionComboBox .getValue ();
129+ if (selectedVersion != null && !selectedVersion .isEmpty ()) {
130+ // 禁用下载按钮
131+ downloadButton .setDisable (true );
132+ // 显示进度条
133+ progressBar .setVisible (true );
134+ progressLabel .setVisible (true );
135+
136+ // 在新线程中执行下载
137+ new Thread (() -> {
138+ try {
139+ VersionManager .downloadVersion (selectedVersion , progress -> {
140+ Platform .runLater (() -> {
141+ progressBar .setProgress (progress );
142+ progressLabel .setText (String .format ("下载进度: %.1f%%" , progress * 100 ));
143+
144+ if (progress >= 1.0 ) {
145+ // 显示下载完成
146+ progressLabel .setText ("下载完成!" );
147+
148+ // 创建淡出动画
149+ FadeTransition fadeOut = new FadeTransition (Duration .seconds (2 ));
150+ fadeOut .setNode (progressBar );
151+ fadeOut .setFromValue (1.0 );
152+ fadeOut .setToValue (0.0 );
153+
154+ FadeTransition labelFadeOut = new FadeTransition (Duration .seconds (2 ));
155+ labelFadeOut .setNode (progressLabel );
156+ labelFadeOut .setFromValue (1.0 );
157+ labelFadeOut .setToValue (0.0 );
158+
159+ // 动画完成后隐藏进度条和标签
160+ fadeOut .setOnFinished (event -> {
161+ progressBar .setVisible (false );
162+ progressLabel .setVisible (false );
163+ downloadButton .setDisable (false );
164+ });
165+
166+ // 启动动画
167+ fadeOut .play ();
168+ labelFadeOut .play ();
169+
170+ // 显示完成提示
171+ Alert alert = new Alert (AlertType .INFORMATION );
172+ alert .setTitle ("下载完成" );
173+ alert .setHeaderText ("版本 " + selectedVersion + " 下载完成" );
174+ alert .showAndWait ();
175+ }
176+ });
177+ });
178+ } catch (Exception ex ) {
179+ Platform .runLater (() -> {
180+ downloadButton .setDisable (false );
181+ Alert alert = new Alert (AlertType .ERROR );
182+ alert .setTitle ("下载失败" );
183+ alert .setHeaderText ("版本下载失败" );
184+ alert .setContentText (ex .getMessage ());
185+ alert .showAndWait ();
186+ });
187+ }
188+ }).start ();
189+ } else {
190+ Alert alert = new Alert (AlertType .WARNING );
191+ alert .setTitle ("警告" );
192+ alert .setHeaderText ("未选择版本" );
193+ alert .setContentText ("请先选择要下载的版本" );
194+ alert .showAndWait ();
195+ }
196+ });
197+
198+ // 加载可用版本列表
199+ try {
200+ List <String > versions = VersionManager .getAvailableVersions (VersionManager .VersionType .RELEASE );
201+ versionComboBox .getItems ().addAll (versions );
202+ } catch (Exception e ) {
203+ Alert alert = new Alert (AlertType .ERROR );
204+ alert .setTitle ("错误" );
205+ alert .setHeaderText ("获取版本列表失败" );
206+ alert .setContentText (e .getMessage ());
207+ alert .showAndWait ();
208+ }
209+
210+ getChildren ().addAll (titleLabel , versionTypeBox , versionComboBox , progressBar , progressLabel , downloadButton );
211+ }
212+ }
213+
214+ // 整合包下载选项卡
215+ class ModpackDownloadTab extends VBox {
216+ public ModpackDownloadTab () {
217+ setPadding (new Insets (10 ));
218+ setSpacing (10 );
219+ // TODO: 添加整合包列表和下载功能
220+ }
221+ }
222+
223+ // 模组下载选项卡
224+ class ModDownloadTab extends VBox {
225+ public ModDownloadTab () {
226+ setPadding (new Insets (10 ));
227+ setSpacing (10 );
228+ // TODO: 添加模组列表和下载功能
229+ }
230+ }
231+
232+ // 资源包下载选项卡
233+ class ResourcePackDownloadTab extends VBox {
234+ public ResourcePackDownloadTab () {
235+ setPadding (new Insets (10 ));
236+ setSpacing (10 );
237+ // TODO: 添加资源包列表和下载功能
238+ }
239+ }
0 commit comments