diff --git a/src/main/java/cn/octopusyan/alistgui/base/BaseController.java b/src/main/java/cn/octopusyan/alistgui/base/BaseController.java
index 1b414f2..f7618cf 100644
--- a/src/main/java/cn/octopusyan/alistgui/base/BaseController.java
+++ b/src/main/java/cn/octopusyan/alistgui/base/BaseController.java
@@ -2,6 +2,7 @@ package cn.octopusyan.alistgui.base;
import cn.octopusyan.alistgui.Application;
import cn.octopusyan.alistgui.config.Context;
+import cn.octopusyan.alistgui.manager.WindowsUtil;
import cn.octopusyan.alistgui.util.FxmlUtil;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
@@ -20,7 +21,6 @@ import java.util.ResourceBundle;
*/
public abstract class BaseController
implements Initializable {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
- private double xOffSet = 0, yOffSet = 0;
public BaseController() {
//初始化时保存当前Controller实例
@@ -33,14 +33,7 @@ public abstract class BaseController
implements Initializable {
// 全局窗口拖拽
if (dragWindow()) {
// 窗口拖拽
- getRootPanel().setOnMousePressed(event -> {
- xOffSet = event.getSceneX();
- yOffSet = event.getSceneY();
- });
- getRootPanel().setOnMouseDragged(event -> {
- getWindow().setX(event.getScreenX() - xOffSet);
- getWindow().setY(event.getScreenY() - yOffSet);
- });
+ WindowsUtil.bindDragged(getRootPanel());
}
// 初始化数据
diff --git a/src/main/java/cn/octopusyan/alistgui/config/Context.java b/src/main/java/cn/octopusyan/alistgui/config/Context.java
index dca5cee..471a71e 100644
--- a/src/main/java/cn/octopusyan/alistgui/config/Context.java
+++ b/src/main/java/cn/octopusyan/alistgui/config/Context.java
@@ -1,6 +1,7 @@
package cn.octopusyan.alistgui.config;
import cn.octopusyan.alistgui.base.BaseController;
+import cn.octopusyan.alistgui.controller.AboutController;
import cn.octopusyan.alistgui.controller.MainController;
import cn.octopusyan.alistgui.controller.RootController;
import cn.octopusyan.alistgui.controller.SetupController;
@@ -34,7 +35,7 @@ public class Context {
private static final Logger log = LoggerFactory.getLogger(Context.class);
private static Scene scene;
private static final IntegerProperty currentViewIndexProperty = new SimpleIntegerProperty(0);
- // 获取控制器集合
+
/**
* 控制器集合
*/
@@ -51,7 +52,7 @@ public class Context {
/**
* 支持的语言集合,应与语言资源文件同步手动更新
*/
- public static final List SUPPORT_LANGUAGE_LIST = Arrays.asList(Locale.CHINESE, Locale.ENGLISH);
+ public static final List SUPPORT_LANGUAGE_LIST = Arrays.asList(Locale.SIMPLIFIED_CHINESE, Locale.ENGLISH);
/**
* 记录当前所选时区
*/
@@ -70,6 +71,7 @@ public class Context {
case RootController root -> root;
case MainController main -> main;
case SetupController setup -> setup;
+ case AboutController about -> about;
default -> throw new IllegalStateException(STR."Unexpected value: \{type}");
};
} catch (Exception e) {
@@ -107,6 +109,7 @@ public class Context {
// 更新界面语言
public static void setLanguage(Locale locale) {
setCurrentLocale(locale);
+ Locale.setDefault(locale);
ConfigManager.language(locale);
LANGUAGE_RESOURCE_FACTORY.setResourceBundle(ResourceBundle.getBundle(LANGUAGE_RESOURCE_NAME, locale));
}
@@ -133,7 +136,7 @@ public class Context {
* 初始化 语言
*/
private static void initI18n() {
- currentLocaleProperty().addListener((_, _, _) -> Platform.runLater(() -> {
+ currentLocaleProperty().addListener((_, _, locale) -> Platform.runLater(() -> {
try {
loadScene();
} catch (IOException e) {
diff --git a/src/main/java/cn/octopusyan/alistgui/controller/AboutController.java b/src/main/java/cn/octopusyan/alistgui/controller/AboutController.java
new file mode 100644
index 0000000..da7a22f
--- /dev/null
+++ b/src/main/java/cn/octopusyan/alistgui/controller/AboutController.java
@@ -0,0 +1,54 @@
+package cn.octopusyan.alistgui.controller;
+
+import cn.octopusyan.alistgui.base.BaseController;
+import cn.octopusyan.alistgui.viewModel.AboutViewModule;
+import javafx.fxml.FXML;
+import javafx.scene.control.Button;
+import javafx.scene.control.Label;
+import javafx.scene.layout.VBox;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 关于
+ *
+ * @author octopus_yan
+ */
+public class AboutController extends BaseController {
+ protected final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+ @FXML
+ public VBox aboutView;
+
+ @FXML
+ public Label aListVersion;
+ @FXML
+ public Button checkAppVersion;
+
+ private final AboutViewModule viewModule = new AboutViewModule();
+
+ @Override
+ public VBox getRootPanel() {
+ return aboutView;
+ }
+
+ @Override
+ public void initData() {
+
+ }
+
+ @Override
+ public void initViewStyle() {
+
+ }
+
+ @Override
+ public void initViewAction() {
+ aListVersion.textProperty().bindBidirectional(viewModule.aListVersionProperty());
+ }
+
+ @FXML
+ public void checkAListUpdate() {
+ viewModule.checkAListUpdate();
+ }
+}
diff --git a/src/main/java/cn/octopusyan/alistgui/controller/SetupController.java b/src/main/java/cn/octopusyan/alistgui/controller/SetupController.java
index 4fded3a..962bc81 100644
--- a/src/main/java/cn/octopusyan/alistgui/controller/SetupController.java
+++ b/src/main/java/cn/octopusyan/alistgui/controller/SetupController.java
@@ -8,25 +8,29 @@ import cn.octopusyan.alistgui.viewModel.SetupViewModel;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
-import javafx.scene.control.*;
-import javafx.scene.layout.AnchorPane;
+import javafx.scene.control.Button;
+import javafx.scene.control.CheckBox;
+import javafx.scene.control.ComboBox;
+import javafx.scene.control.TextField;
import javafx.scene.layout.Pane;
+import javafx.scene.layout.VBox;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Locale;
+import java.util.function.Consumer;
/**
* 设置页面控制器
*
* @author octopus_yan
*/
-public class SetupController extends BaseController implements Initializable {
+public class SetupController extends BaseController implements Initializable {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
@FXML
- public AnchorPane setupView;
+ public VBox setupView;
@FXML
public CheckBox autoStartCheckBox;
@FXML
@@ -43,15 +47,11 @@ public class SetupController extends BaseController implements Initi
public TextField proxyHost;
@FXML
public TextField proxyPort;
- @FXML
- public Label aListVersion;
- @FXML
- public Button checkAppVersion;
- private final SetupViewModel setupViewModel = new SetupViewModel();
+ private final SetupViewModel viewModule = new SetupViewModel();
@Override
- public AnchorPane getRootPanel() {
+ public VBox getRootPanel() {
return setupView;
}
@@ -75,21 +75,19 @@ public class SetupController extends BaseController implements Initi
@Override
public void initViewAction() {
- autoStartCheckBox.selectedProperty().bindBidirectional(setupViewModel.autoStartProperty());
- silentStartupCheckBox.selectedProperty().bindBidirectional(setupViewModel.silentStartupProperty());
- proxySetupComboBox.getSelectionModel().selectedItemProperty()
- .addListener((_, _, newValue) -> setupViewModel.proxySetupProperty().set(newValue));
- proxyHost.textProperty().bindBidirectional(setupViewModel.proxyHostProperty());
- proxyPort.textProperty().bindBidirectional(setupViewModel.proxyPortProperty());
- languageComboBox.getSelectionModel().selectedItemProperty().addListener((_, _, newValue) -> {
- setupViewModel.languageProperty().set(newValue);
- logger.info("language changed to {}", newValue);
+ autoStartCheckBox.selectedProperty().bindBidirectional(viewModule.autoStartProperty());
+ silentStartupCheckBox.selectedProperty().bindBidirectional(viewModule.silentStartupProperty());
+ proxySetupComboBox.getSelectionModel().selectedItemProperty().addListener((_, _, newValue) -> viewModule.proxySetupProperty().set(newValue));
+ proxyHost.textProperty().bindBidirectional(viewModule.proxyHostProperty());
+ proxyPort.textProperty().bindBidirectional(viewModule.proxyPortProperty());
+ languageComboBox.getSelectionModel().selectedItemProperty().subscribe(locale -> {
+ viewModule.languageProperty().set(locale);
+ logger.info("language changed to {}", locale);
});
- aListVersion.textProperty().bindBidirectional(setupViewModel.aListVersionProperty());
}
@FXML
- public void checkAListUpdate() {
- setupViewModel.checkAListUpdate();
+ public void proxyTest() {
+ viewModule.proxyTest();
}
}
diff --git a/src/main/java/cn/octopusyan/alistgui/manager/ConfigManager.java b/src/main/java/cn/octopusyan/alistgui/manager/ConfigManager.java
index 94cf291..55d154a 100644
--- a/src/main/java/cn/octopusyan/alistgui/manager/ConfigManager.java
+++ b/src/main/java/cn/octopusyan/alistgui/manager/ConfigManager.java
@@ -32,7 +32,7 @@ import java.util.regex.Matcher;
public class ConfigManager {
private static final Logger logger = LoggerFactory.getLogger(ConfigManager.class);
public static ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
- public static final Locale DEFAULT_LANGUAGE = Locale.CHINESE;
+ public static final Locale DEFAULT_LANGUAGE = Locale.SIMPLIFIED_CHINESE;
private static GuiConfig guiConfig;
private static UpgradeConfig upgradeConfig;
@@ -69,7 +69,7 @@ public class ConfigManager {
&& Integer.parseInt(proxyInfo.getPort()) > 0;
}
- private static ProxyInfo getProxyInfo() {
+ public static ProxyInfo getProxyInfo() {
return guiConfig.getProxyInfo();
}
@@ -129,6 +129,14 @@ public class ConfigManager {
return ProxySetup.valueOf(StringUtils.upperCase(guiConfig.getProxySetup()));
}
+ public static void proxyTestUrl(String url) {
+ guiConfig.setProxyTestUrl(url);
+ }
+
+ public static String proxyTestUrl() {
+ return guiConfig.getProxyTestUrl();
+ }
+
public static void proxySetup(ProxySetup setup) {
guiConfig.setProxySetup(setup.getName());
diff --git a/src/main/java/cn/octopusyan/alistgui/manager/WindowsUtil.java b/src/main/java/cn/octopusyan/alistgui/manager/WindowsUtil.java
new file mode 100644
index 0000000..7e02fdd
--- /dev/null
+++ b/src/main/java/cn/octopusyan/alistgui/manager/WindowsUtil.java
@@ -0,0 +1,31 @@
+package cn.octopusyan.alistgui.manager;
+
+import javafx.scene.layout.Pane;
+import javafx.stage.Window;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author octopus_yan
+ */
+public class WindowsUtil {
+ public static final Map paneXOffset = new HashMap<>();
+ public static final Map paneYOffset = new HashMap<>();
+
+ public static void bindDragged(Pane pane) {
+ Window stage = getStage(pane);
+ pane.setOnMousePressed(event -> {
+ paneXOffset.put(pane, stage.getX() - event.getScreenX());
+ paneYOffset.put(pane, stage.getY() - event.getScreenY());
+ });
+ pane.setOnMouseDragged(event -> {
+ stage.setX(event.getScreenX() + paneXOffset.get(pane));
+ stage.setY(event.getScreenY() + paneYOffset.get(pane));
+ });
+ }
+
+ public static Window getStage(Pane pane) {
+ return pane.getScene().getWindow();
+ }
+}
diff --git a/src/main/java/cn/octopusyan/alistgui/model/GuiConfig.java b/src/main/java/cn/octopusyan/alistgui/model/GuiConfig.java
index 2fc31c3..fca8b72 100644
--- a/src/main/java/cn/octopusyan/alistgui/model/GuiConfig.java
+++ b/src/main/java/cn/octopusyan/alistgui/model/GuiConfig.java
@@ -20,4 +20,5 @@ public class GuiConfig {
private ProxyInfo proxyInfo;
private String proxySetup = ProxySetup.NO_PROXY.getName();
private String language = ConfigManager.DEFAULT_LANGUAGE.toString();
+ private String proxyTestUrl = "http://";
}
diff --git a/src/main/java/cn/octopusyan/alistgui/task/ProxyCheckTask.java b/src/main/java/cn/octopusyan/alistgui/task/ProxyCheckTask.java
new file mode 100644
index 0000000..b9e2b9f
--- /dev/null
+++ b/src/main/java/cn/octopusyan/alistgui/task/ProxyCheckTask.java
@@ -0,0 +1,26 @@
+package cn.octopusyan.alistgui.task;
+
+import cn.octopusyan.alistgui.base.BaseTask;
+import cn.octopusyan.alistgui.manager.http.HttpUtil;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 代理检测任务
+ *
+ * @author octopus_yan
+ */
+@Slf4j
+public class ProxyCheckTask extends BaseTask {
+ private final String checkUrl;
+
+ public ProxyCheckTask(String checkUrl) {
+ this.checkUrl = checkUrl;
+ this.updateProgress(0d, 1d);
+ }
+
+ @Override
+ protected void task() throws Exception {
+ String response = HttpUtil.getInstance().get(checkUrl, null, null);
+ log.debug(STR."Proxy check response result => \n\{response}");
+ }
+}
diff --git a/src/main/java/cn/octopusyan/alistgui/task/UpgradeTask.java b/src/main/java/cn/octopusyan/alistgui/task/UpgradeTask.java
index bc97ef2..e5d3c7b 100644
--- a/src/main/java/cn/octopusyan/alistgui/task/UpgradeTask.java
+++ b/src/main/java/cn/octopusyan/alistgui/task/UpgradeTask.java
@@ -6,7 +6,7 @@ import cn.octopusyan.alistgui.manager.http.HttpUtil;
import cn.octopusyan.alistgui.model.UpgradeConfig;
import cn.octopusyan.alistgui.model.upgrade.UpgradeApp;
import cn.octopusyan.alistgui.util.JsonUtil;
-import cn.octopusyan.alistgui.viewModel.SetupViewModel;
+import cn.octopusyan.alistgui.viewModel.AboutViewModule;
import com.fasterxml.jackson.databind.JsonNode;
import org.apache.commons.lang3.StringUtils;
@@ -16,10 +16,10 @@ import org.apache.commons.lang3.StringUtils;
* @author octopus_yan
*/
public class UpgradeTask extends BaseTask {
- private final SetupViewModel vm;
+ private final AboutViewModule vm;
private final UpgradeApp app;
- public UpgradeTask(SetupViewModel viewModel, UpgradeApp app) {
+ public UpgradeTask(AboutViewModule viewModel, UpgradeApp app) {
this.vm = viewModel;
this.app = app;
}
diff --git a/src/main/java/cn/octopusyan/alistgui/viewModel/AboutViewModule.java b/src/main/java/cn/octopusyan/alistgui/viewModel/AboutViewModule.java
new file mode 100644
index 0000000..864124f
--- /dev/null
+++ b/src/main/java/cn/octopusyan/alistgui/viewModel/AboutViewModule.java
@@ -0,0 +1,73 @@
+package cn.octopusyan.alistgui.viewModel;
+
+import cn.octopusyan.alistgui.base.BaseTask;
+import cn.octopusyan.alistgui.config.Context;
+import cn.octopusyan.alistgui.manager.ConfigManager;
+import cn.octopusyan.alistgui.task.UpgradeTask;
+import cn.octopusyan.alistgui.util.alert.AlertUtil;
+import javafx.beans.property.*;
+import javafx.scene.control.ButtonType;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 关于
+ *
+ * @author octopus_yan
+ */
+@Slf4j
+public class AboutViewModule {
+ private final StringProperty aListVersion = new SimpleStringProperty(ConfigManager.aListVersion());
+ private final StringProperty aListNewVersion = new SimpleStringProperty("");
+ private final BooleanProperty aListUpgrade = new SimpleBooleanProperty(false);
+
+ public AboutViewModule() {
+ aListVersion.addListener((_, _, newValue) -> ConfigManager.aListVersion(newValue));
+ }
+
+ public Property aListVersionProperty() {
+ return aListVersion;
+ }
+
+ public BooleanProperty aListUpgradeProperty() {
+ return aListUpgrade;
+ }
+
+ public StringProperty aListNewVersionProperty() {
+ return aListNewVersion;
+ }
+
+ /**
+ * 检查alist更新
+ */
+ public void checkAListUpdate() {
+ var task = new UpgradeTask(this, ConfigManager.aList());
+ task.onListen(new BaseTask.Listener() {
+ @Override
+ public void onSucceeded() {
+ AlertUtil.confirm()
+ .content(STR."""
+ 当前版本 : \{aListVersion.get()}
+ 最新版本 : \{aListNewVersion.get()}
+ """)
+ .title(Context.getLanguageBinding("about.alist.update").getValue())
+ .show(new AlertUtil.OnChoseListener() {
+ @Override
+ public void confirm() {
+ log.info("========confirm==========");
+ }
+
+ @Override
+ public void cancelOrClose(ButtonType buttonType) {
+ log.info("========cancelOrClose==========");
+ }
+ });
+ }
+
+ @Override
+ public void onFailed(Throwable throwable) {
+ AlertUtil.exception(new Exception(throwable)).show();
+ }
+ });
+ task.execute();
+ }
+}
diff --git a/src/main/java/cn/octopusyan/alistgui/viewModel/SetupViewModel.java b/src/main/java/cn/octopusyan/alistgui/viewModel/SetupViewModel.java
index 6435772..df0bf8e 100644
--- a/src/main/java/cn/octopusyan/alistgui/viewModel/SetupViewModel.java
+++ b/src/main/java/cn/octopusyan/alistgui/viewModel/SetupViewModel.java
@@ -1,13 +1,19 @@
package cn.octopusyan.alistgui.viewModel;
+import cn.hutool.core.net.NetUtil;
import cn.octopusyan.alistgui.base.BaseTask;
import cn.octopusyan.alistgui.config.Context;
import cn.octopusyan.alistgui.enums.ProxySetup;
import cn.octopusyan.alistgui.manager.ConfigManager;
-import cn.octopusyan.alistgui.task.UpgradeTask;
+import cn.octopusyan.alistgui.manager.http.HttpUtil;
+import cn.octopusyan.alistgui.task.ProxyCheckTask;
import cn.octopusyan.alistgui.util.alert.AlertUtil;
+import javafx.application.Platform;
import javafx.beans.property.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import java.net.InetSocketAddress;
import java.util.Locale;
/**
@@ -15,6 +21,7 @@ import java.util.Locale;
*
* @author octopus_yan
*/
+@Slf4j
public class SetupViewModel {
private final BooleanProperty autoStart = new SimpleBooleanProperty(ConfigManager.autoStart());
private final BooleanProperty silentStartup = new SimpleBooleanProperty(ConfigManager.silentStartup());
@@ -22,18 +29,22 @@ public class SetupViewModel {
private final StringProperty proxyPort = new SimpleStringProperty(ConfigManager.proxyPort());
private final ObjectProperty language = new SimpleObjectProperty<>(ConfigManager.language());
private final ObjectProperty proxySetup = new SimpleObjectProperty<>(ConfigManager.proxySetup());
- private final StringProperty aListVersion = new SimpleStringProperty(ConfigManager.aListVersion());
- private final StringProperty aListNewVersion = new SimpleStringProperty("");
- private final BooleanProperty aListUpgrade = new SimpleBooleanProperty(false);
+ private final StringProperty proxyTestUrl = new SimpleStringProperty(ConfigManager.proxyTestUrl());
public SetupViewModel() {
- aListVersion.addListener((_, _, newValue) -> ConfigManager.aListVersion(newValue));
autoStart.addListener((_, _, newValue) -> ConfigManager.autoStart(newValue));
silentStartup.addListener((_, _, newValue) -> ConfigManager.silentStartup(newValue));
proxySetup.addListener((_, _, newValue) -> ConfigManager.proxySetup(newValue));
- proxyHost.addListener((_, _, newValue) -> ConfigManager.proxyHost(newValue));
- proxyPort.addListener((_, _, newValue) -> ConfigManager.proxyPort(newValue));
+ proxyTestUrl.addListener((_, _, newValue) -> ConfigManager.proxyTestUrl(newValue));
+ proxyHost.addListener((_, _, newValue) -> {
+ ConfigManager.proxyHost(newValue);
+ checkProxy();
+ });
+ proxyPort.addListener((_, _, newValue) -> {
+ ConfigManager.proxyPort(newValue);
+ checkProxy();
+ });
language.addListener((_, _, newValue) -> Context.setLanguage(newValue));
}
@@ -61,39 +72,54 @@ public class SetupViewModel {
return proxyPort;
}
- public Property aListVersionProperty() {
- return aListVersion;
+ public void proxyTest() {
+ var checkUrl = AlertUtil.input("URL :", proxyTestUrl.getValue())
+ .title(Context.getLanguageBinding("proxy.test.title").getValue())
+ .header(Context.getLanguageBinding("proxy.test.header").getValue())
+ .getInput();
+
+ if (StringUtils.isEmpty(checkUrl)) return;
+
+ proxyTestUrl.setValue(checkUrl);
+
+ getProxyCheckTask(checkUrl).execute();
}
- public BooleanProperty aListUpgradeProperty() {
- return aListUpgrade;
+ private void checkProxy() {
+ try {
+ InetSocketAddress address = NetUtil.createAddress(proxyHost.get(), Integer.parseInt(proxyPort.getValue()));
+ if (NetUtil.isOpen(address, 2000)) {
+ HttpUtil.getInstance().proxy(proxySetup.get(), ConfigManager.getProxyInfo());
+ }
+ } catch (Exception e) {
+ log.debug(STR."host=\{proxyHost.get()},port=\{proxyPort.get()}");
+ }
}
- public StringProperty aListNewVersionProperty() {
- return aListNewVersion;
- }
-
- /**
- * 检查alist更新
- */
- public void checkAListUpdate() {
- var task = new UpgradeTask(this, ConfigManager.aList());
+ private static ProxyCheckTask getProxyCheckTask(String checkUrl) {
+ var task = new ProxyCheckTask(checkUrl);
+ final var progress = AlertUtil.progress();
+ progress.title(Context.getLanguageBinding("proxy.test.title").get());
task.onListen(new BaseTask.Listener() {
+
+ @Override
+ public void onRunning() {
+ progress.onCancel(task::cancel).show();
+ }
+
@Override
public void onSucceeded() {
- AlertUtil.info(STR."""
- 当前版本 : \{aListVersion.get()}
- 最新版本 : \{aListNewVersion.get()}
- """)
- .title("AList 更新提示")
- .show();
+ Platform.runLater(progress::close);
+ AlertUtil.info(Context.getLanguageBinding("proxy.test.result.success").getValue()).show();
}
@Override
public void onFailed(Throwable throwable) {
- AlertUtil.exception(new Exception(throwable)).show();
+ Platform.runLater(progress::close);
+ final var tmp = Context.getLanguageBinding("proxy.test.result.failed").getValue();
+ AlertUtil.error(tmp + throwable.getMessage()).show();
}
});
- task.execute();
+ return task;
}
}
diff --git a/src/main/resources/assets/logo-about.png b/src/main/resources/assets/logo-about.png
new file mode 100644
index 0000000..ddafae3
Binary files /dev/null and b/src/main/resources/assets/logo-about.png differ
diff --git a/src/main/resources/assets/logo.png b/src/main/resources/assets/logo.png
new file mode 100644
index 0000000..279bffa
Binary files /dev/null and b/src/main/resources/assets/logo.png differ
diff --git a/src/main/resources/assets/logo.svg b/src/main/resources/assets/logo.svg
new file mode 100644
index 0000000..0b4a09b
--- /dev/null
+++ b/src/main/resources/assets/logo.svg
@@ -0,0 +1,14 @@
+
\ No newline at end of file
diff --git a/src/main/resources/assets/logo_disabled.png b/src/main/resources/assets/logo_disabled.png
new file mode 100644
index 0000000..4b8db32
Binary files /dev/null and b/src/main/resources/assets/logo_disabled.png differ
diff --git a/src/main/resources/css/about-view.scss b/src/main/resources/css/about-view.scss
new file mode 100644
index 0000000..64eb471
--- /dev/null
+++ b/src/main/resources/css/about-view.scss
@@ -0,0 +1,22 @@
+/**************************************************
+ * About View
+**************************************************/
+
+
+.shield {
+
+ .label {
+ -fx-text-fill: white;
+ -fx-label-padding: 3 5 3 5;
+ }
+
+ .shield-name {
+ -fx-background-color: #555555;
+ -fx-background-radius: 5 0 0 5;
+ }
+
+ .shield-version {
+ -fx-background-color: #6969AA;
+ -fx-background-radius: 0 5 5 0;
+ }
+}
\ No newline at end of file
diff --git a/src/main/resources/css/setup-view.scss b/src/main/resources/css/setup-view.scss
index fe2a1ea..2e7f9d8 100644
--- a/src/main/resources/css/setup-view.scss
+++ b/src/main/resources/css/setup-view.scss
@@ -23,23 +23,5 @@
-fx-text-fill: #2c69e0;
-fx-text-alignment: CENTER;
}
-
- .shield {
-
- .label {
- -fx-text-fill: white;
- -fx-label-padding: 3 5 3 5;
- }
-
- .shield-name {
- -fx-background-color: #555555;
- -fx-background-radius: 5 0 0 5;
- }
-
- .shield-version {
- -fx-background-color: #6969AA;
- -fx-background-radius: 0 5 5 0;
- }
- }
}
diff --git a/src/main/resources/fxml/about-view.fxml b/src/main/resources/fxml/about-view.fxml
new file mode 100644
index 0000000..25fefde
--- /dev/null
+++ b/src/main/resources/fxml/about-view.fxml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/fxml/root-view.fxml b/src/main/resources/fxml/root-view.fxml
index da0ef1f..da8d366 100644
--- a/src/main/resources/fxml/root-view.fxml
+++ b/src/main/resources/fxml/root-view.fxml
@@ -37,6 +37,13 @@
+
+
+
+
+
+
+
diff --git a/src/main/resources/fxml/setup-view.fxml b/src/main/resources/fxml/setup-view.fxml
index 1d02484..8b6c11b 100644
--- a/src/main/resources/fxml/setup-view.fxml
+++ b/src/main/resources/fxml/setup-view.fxml
@@ -3,48 +3,39 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/resources/language/language.properties b/src/main/resources/language/language.properties
index 95c9f55..4efb726 100644
--- a/src/main/resources/language/language.properties
+++ b/src/main/resources/language/language.properties
@@ -1,8 +1,10 @@
+label.cancel=\u53D6\u6D88
root.tab.main=\u4E3B\u9875
root.tab.setup=\u8BBE\u7F6E
+root.tab.about=\u5173\u4E8E
root.foot.doc=\u6587\u6863
root.foot.github=GitHub
-root.foot.sponsor=\u8D5E\u52A9
+root.foot.sponsor=\u8D5E\u52A9 AList
main.control.start=\u5F00\u59CB
main.control.password=\u5BC6\u7801
main.control.restart=\u91CD\u542F
@@ -15,14 +17,19 @@ setup.proxy=HTTP\u4EE3\u7406
setup.auto-start.label=\u5F00\u673A\u81EA\u542F
setup.silent-startup.label=\u9759\u9ED8\u542F\u52A8
setup.language=\u8BED\u8A00
-alist.version=AList \u7248\u672C
-app.version=GUI \u7248\u672C
-alist.update=\u68C0\u67E5 AList \u7248\u672C
-app.update=\u68C0\u67E5 GUI \u7248\u672C
-setup.proxy.host=\u4E3B\u673A
-setup.proxy.port=\u7AEF\u53E3
proxy.setup.label.no_proxy=\u4E0D\u4EE3\u7406
proxy.setup.label.system=\u7CFB\u7EDF\u4EE3\u7406
proxy.setup.label.manual=\u624B\u52A8\u8BBE\u7F6E
+setup.proxy.host=\u4E3B\u673A
+setup.proxy.port=\u7AEF\u53E3
setup.proxy.test=\u6D4B\u8BD5
+proxy.test.header=\u8BF7\u8F93\u5165\u60A8\u8981\u68C0\u67E5\u7684\u4EFB\u4F55URL\uFF1A
+proxy.test.title=\u68C0\u67E5\u4EE3\u7406\u8BBE\u7F6E
+proxy.test.result.success=\u8FDE\u63A5\u6210\u529F
+proxy.test.result.failed=\u8FDE\u63A5\u95EE\u9898:
+about.alist.version=AList \u7248\u672C
+about.app.version=GUI \u7248\u672C
+about.alist.update=\u68C0\u67E5 AList \u7248\u672C
+about.app.update=\u68C0\u67E5 GUI \u7248\u672C
+
diff --git a/src/main/resources/language/language_en.properties b/src/main/resources/language/language_en.properties
index 7630da2..b0540d9 100644
--- a/src/main/resources/language/language_en.properties
+++ b/src/main/resources/language/language_en.properties
@@ -1,8 +1,10 @@
+label.cancel=Cancel
root.tab.main=Home
root.tab.setup=Setup
+root.tab.about=About
root.foot.doc=Document
root.foot.github=GitHub
-root.foot.sponsor=Sponsor
+root.foot.sponsor=Sponsor AList
main.control.start=Start
main.control.password=Password
main.control.restart=Restart
@@ -15,14 +17,19 @@ setup.proxy=HTTP PROXY
setup.auto-start.label=Auto start with PC
setup.silent-startup.label=Silent startup
setup.language=language
-alist.version=AList Version
-app.version=GUI Version
-alist.update=Check AList Version
-app.update=Check GUI Version
-setup.proxy.host=Host
-setup.proxy.port=Port
proxy.setup.label.no_proxy=No Proxy
proxy.setup.label.system=System Proxy
proxy.setup.label.manual=Manual Config
+setup.proxy.host=Host
+setup.proxy.port=Port
setup.proxy.test=Check connection
+proxy.test.header=Enter any URL to check connection to:
+proxy.test.title=Check Proxy Settings
+proxy.test.result.success=Connection successful
+proxy.test.result.failed=Problem with connection:
+about.alist.version=AList Version
+about.app.version=GUI Version
+about.alist.update=Check AList Version
+about.app.update=Check GUI Version
+
diff --git a/src/main/resources/language/language_zh.properties b/src/main/resources/language/language_zh_CN.properties
similarity index 62%
rename from src/main/resources/language/language_zh.properties
rename to src/main/resources/language/language_zh_CN.properties
index 95c9f55..4efb726 100644
--- a/src/main/resources/language/language_zh.properties
+++ b/src/main/resources/language/language_zh_CN.properties
@@ -1,8 +1,10 @@
+label.cancel=\u53D6\u6D88
root.tab.main=\u4E3B\u9875
root.tab.setup=\u8BBE\u7F6E
+root.tab.about=\u5173\u4E8E
root.foot.doc=\u6587\u6863
root.foot.github=GitHub
-root.foot.sponsor=\u8D5E\u52A9
+root.foot.sponsor=\u8D5E\u52A9 AList
main.control.start=\u5F00\u59CB
main.control.password=\u5BC6\u7801
main.control.restart=\u91CD\u542F
@@ -15,14 +17,19 @@ setup.proxy=HTTP\u4EE3\u7406
setup.auto-start.label=\u5F00\u673A\u81EA\u542F
setup.silent-startup.label=\u9759\u9ED8\u542F\u52A8
setup.language=\u8BED\u8A00
-alist.version=AList \u7248\u672C
-app.version=GUI \u7248\u672C
-alist.update=\u68C0\u67E5 AList \u7248\u672C
-app.update=\u68C0\u67E5 GUI \u7248\u672C
-setup.proxy.host=\u4E3B\u673A
-setup.proxy.port=\u7AEF\u53E3
proxy.setup.label.no_proxy=\u4E0D\u4EE3\u7406
proxy.setup.label.system=\u7CFB\u7EDF\u4EE3\u7406
proxy.setup.label.manual=\u624B\u52A8\u8BBE\u7F6E
+setup.proxy.host=\u4E3B\u673A
+setup.proxy.port=\u7AEF\u53E3
setup.proxy.test=\u6D4B\u8BD5
+proxy.test.header=\u8BF7\u8F93\u5165\u60A8\u8981\u68C0\u67E5\u7684\u4EFB\u4F55URL\uFF1A
+proxy.test.title=\u68C0\u67E5\u4EE3\u7406\u8BBE\u7F6E
+proxy.test.result.success=\u8FDE\u63A5\u6210\u529F
+proxy.test.result.failed=\u8FDE\u63A5\u95EE\u9898:
+about.alist.version=AList \u7248\u672C
+about.app.version=GUI \u7248\u672C
+about.alist.update=\u68C0\u67E5 AList \u7248\u672C
+about.app.update=\u68C0\u67E5 GUI \u7248\u672C
+