From a9dd63b251b7c342b2e2363d31b8387387374154 Mon Sep 17 00:00:00 2001 From: octopus_yan Date: Mon, 9 Sep 2024 20:15:49 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BB=A3=E7=90=86=E6=B5=8B=E8=AF=95=20?= =?UTF-8?q?todo:=20=E5=85=B3=E4=BA=8E=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../alistgui/base/BaseController.java | 11 +-- .../octopusyan/alistgui/config/Context.java | 9 +- .../alistgui/controller/AboutController.java | 54 ++++++++++++ .../alistgui/controller/SetupController.java | 42 +++++---- .../alistgui/manager/ConfigManager.java | 12 ++- .../alistgui/manager/WindowsUtil.java | 31 +++++++ .../octopusyan/alistgui/model/GuiConfig.java | 1 + .../alistgui/task/ProxyCheckTask.java | 26 ++++++ .../octopusyan/alistgui/task/UpgradeTask.java | 6 +- .../alistgui/viewModel/AboutViewModule.java | 73 ++++++++++++++++ .../alistgui/viewModel/SetupViewModel.java | 82 ++++++++++++------ src/main/resources/assets/logo-about.png | Bin 0 -> 5961 bytes src/main/resources/assets/logo.png | Bin 0 -> 1282 bytes src/main/resources/assets/logo.svg | 14 +++ src/main/resources/assets/logo_disabled.png | Bin 0 -> 960 bytes src/main/resources/css/about-view.scss | 22 +++++ src/main/resources/css/setup-view.scss | 18 ---- src/main/resources/fxml/about-view.fxml | 34 ++++++++ src/main/resources/fxml/root-view.fxml | 7 ++ src/main/resources/fxml/setup-view.fxml | 75 +++++++--------- .../resources/language/language.properties | 21 +++-- .../resources/language/language_en.properties | 21 +++-- ...h.properties => language_zh_CN.properties} | 21 +++-- 23 files changed, 432 insertions(+), 148 deletions(-) create mode 100644 src/main/java/cn/octopusyan/alistgui/controller/AboutController.java create mode 100644 src/main/java/cn/octopusyan/alistgui/manager/WindowsUtil.java create mode 100644 src/main/java/cn/octopusyan/alistgui/task/ProxyCheckTask.java create mode 100644 src/main/java/cn/octopusyan/alistgui/viewModel/AboutViewModule.java create mode 100644 src/main/resources/assets/logo-about.png create mode 100644 src/main/resources/assets/logo.png create mode 100644 src/main/resources/assets/logo.svg create mode 100644 src/main/resources/assets/logo_disabled.png create mode 100644 src/main/resources/css/about-view.scss create mode 100644 src/main/resources/fxml/about-view.fxml rename src/main/resources/language/{language_zh.properties => language_zh_CN.properties} (62%) 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 0000000000000000000000000000000000000000..ddafae3c6a431b5cf6f4d42fcefcc4e17eda6e96 GIT binary patch literal 5961 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..4b8db32e5d38fb8194d4c2749778f1e7bba842bb GIT binary patch literal 960 zcmV;x13&zUP)ifB<%L9`RfTD8bUwX8*i z2o**2fP#WbS|nm%RvM{TmNtFg%sJ!X4yD74i@*bi```PW_c{0ff1huH{$~n@!z;i? z%gf6bxY)Rp=XvYE0|+2qSy_3nw6t`tD>H6{jAw>Ip=JaSH@p{6o+~>Zlm}-)@Q^x3 zFkCwVfxtpnIOl}y=fK%JajMSaRaI47FT3(NC-nPdb#=9t{Wk(=)JpIiGqK*)$r-_U zp=L~H*q`S)_Dvi{!CuwZ*H3YEb3!owm`>;n&#(3R1%ts2IPa873?Z=Nu5Q)@2M1w% zP)iRES{(Ze;9lh)zwYK**Vj)9^m;SR>w#% zG7sFYnc(>jjT3{jX)t;VOy}eWIGeA!Qib;tz%X!Tr82O4)`W3^z3^<33 z&VOOQ->9n02{1A0cSC=ZEAv-E#%p2tgDCUPUsViMn1%gwViLd$tEcF&GVl2c++m3Hjs?2rb%({U-@v5cm<*lUX>d zc43nPoj#CW^6K=dbF2-V2VyXo4}NN#w?w1S#6KX*jeV1unUD5LlHhPL947`>_$Fi~ zrv$ix;cH%U;u&Q-_JzdcTX2Bq62N!x4%LP1c9R|PCs;RQ-DObS|jsQ?0pmN_ar%$K~)0QNJw9~%-()RIYhid#1KfI zonj85Vi|H5xJd0VfTb{gA8VVIUWq+sd%&Ii^RXBSIt^Yj%P*rbY;=R)AjzGsoveui i%WuWMSciIoEd2q(ew@+hHzSq+0000 + + + + + + + + + + + + + + + + + + + + + + + +