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 @@ + + + + + + + + + + + + + + + + + + + + + + + + +