From 367ef836e4913b8ac407fa6a5dc9d15ae8824757 Mon Sep 17 00:00:00 2001 From: gewuyou <1063891901@qq.com> Date: Sat, 23 Sep 2023 21:26:37 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=8F=92=E4=BB=B6=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E7=BC=96=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/manager/ApplicationManager.java | 2 +- .../model/entity/PluginDescriptor.java | 111 ++++++++++++++++++ .../jcnc/jnotepad/plugin/PluginLoader.java | 2 +- .../jcnc/jnotepad/plugin/PluginManager.java | 24 ++-- .../ui/pluginstage/PluginManagementPane.java | 70 +++++------ 5 files changed, 153 insertions(+), 56 deletions(-) diff --git a/src/main/java/org/jcnc/jnotepad/app/manager/ApplicationManager.java b/src/main/java/org/jcnc/jnotepad/app/manager/ApplicationManager.java index 6c9a19a..6e34722 100644 --- a/src/main/java/org/jcnc/jnotepad/app/manager/ApplicationManager.java +++ b/src/main/java/org/jcnc/jnotepad/app/manager/ApplicationManager.java @@ -114,7 +114,7 @@ public class ApplicationManager { public void stopApp() { PluginConfigController instance = PluginConfigController.getInstance(); // 刷新插件配置文件 - instance.getConfig().setPlugins(PluginManager.getInstance().getPluginInfos()); + instance.getConfig().setPlugins(PluginManager.getInstance().getPluginDescriptors()); instance.writeConfig(); // 销毁插件可能申请的资源 PluginManager.getInstance().destroyPlugins(); diff --git a/src/main/java/org/jcnc/jnotepad/model/entity/PluginDescriptor.java b/src/main/java/org/jcnc/jnotepad/model/entity/PluginDescriptor.java index d66d106..fb5a529 100644 --- a/src/main/java/org/jcnc/jnotepad/model/entity/PluginDescriptor.java +++ b/src/main/java/org/jcnc/jnotepad/model/entity/PluginDescriptor.java @@ -29,11 +29,50 @@ public class PluginDescriptor { * 类别 */ private String category; + /** + * 图标 + */ + private String icon; + /** + * 插件大小 + */ + private Integer size; + /** + * 描述 + */ + private String description; + /** + * 详细介绍 + */ + private String detailedIntroduction; + /** + * 插件日志 + */ + private String log; + /** + * 插件网址 + */ + private String pluginUrl; /** * 主类名称 */ private String mainClass; + /** + * 资源文件夹 + */ + private String assetFolder; + /** + * ReadMe + */ + private String readMe; + + /** + * 插件评分 + */ + @JsonIgnore + private Float score; + /** * 插件类 */ @@ -95,4 +134,76 @@ public class PluginDescriptor { public void setPlugin(Plugin plugin) { this.plugin = plugin; } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public Integer getSize() { + return size; + } + + public void setSize(Integer size) { + this.size = size; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getDetailedIntroduction() { + return detailedIntroduction; + } + + public void setDetailedIntroduction(String detailedIntroduction) { + this.detailedIntroduction = detailedIntroduction; + } + + public String getLog() { + return log; + } + + public void setLog(String log) { + this.log = log; + } + + public String getPluginUrl() { + return pluginUrl; + } + + public void setPluginUrl(String pluginUrl) { + this.pluginUrl = pluginUrl; + } + + public String getAssetFolder() { + return assetFolder; + } + + public void setAssetFolder(String assetFolder) { + this.assetFolder = assetFolder; + } + + public String getReadMe() { + return readMe; + } + + public void setReadMe(String readMe) { + this.readMe = readMe; + } + + public Float getScore() { + return score; + } + + public void setScore(Float score) { + this.score = score; + } } diff --git a/src/main/java/org/jcnc/jnotepad/plugin/PluginLoader.java b/src/main/java/org/jcnc/jnotepad/plugin/PluginLoader.java index dbd9099..98e3093 100644 --- a/src/main/java/org/jcnc/jnotepad/plugin/PluginLoader.java +++ b/src/main/java/org/jcnc/jnotepad/plugin/PluginLoader.java @@ -180,7 +180,7 @@ public class PluginLoader { public void loadPluginByFile(File pluginJar, List configPluginDescriptors) { PluginManager pluginManager = PluginManager.getInstance(); Map> categories = pluginManager.getLoadedPluginsByCategory(); - List pluginDescriptors = pluginManager.getPluginInfos(); + List pluginDescriptors = pluginManager.getPluginDescriptors(); if (pluginJar.exists() && pluginJar.isFile()) { try { PluginDescriptor pluginDescriptor = readPlugin(pluginJar); diff --git a/src/main/java/org/jcnc/jnotepad/plugin/PluginManager.java b/src/main/java/org/jcnc/jnotepad/plugin/PluginManager.java index fc50053..375a1fc 100644 --- a/src/main/java/org/jcnc/jnotepad/plugin/PluginManager.java +++ b/src/main/java/org/jcnc/jnotepad/plugin/PluginManager.java @@ -89,17 +89,17 @@ public class PluginManager { */ public void disablePlugIn(PluginDescriptor pluginDescriptor) { pluginDescriptor.setEnabled(false); - pluginDescriptor.setPlugin(null); - ThreadPoolManager.getThreadPool().submit(() -> { - PluginConfigController instance = PluginConfigController.getInstance(); - instance.getConfig().getPlugins().forEach(plugin -> { - if ((pluginDescriptor.getName() + pluginDescriptor.getAuthor()).equals(plugin.getName() + plugin.getAuthor())) { - plugin.setEnabled(false); - } - }); - instance.writeConfig(); - ThreadPoolManager.threadContSelfSubtracting(); - }); +// pluginDescriptor.setPlugin(null); +// ThreadPoolManager.getThreadPool().submit(() -> { +// PluginConfigController instance = PluginConfigController.getInstance(); +// instance.getConfig().getPlugins().forEach(plugin -> { +// if ((pluginDescriptor.getName() + pluginDescriptor.getAuthor()).equals(plugin.getName() + plugin.getAuthor())) { +// plugin.setEnabled(false); +// } +// }); +// instance.writeConfig(); +// ThreadPoolManager.threadContSelfSubtracting(); +// }); } /** @@ -156,7 +156,7 @@ public class PluginManager { return categories; } - public List getPluginInfos() { + public List getPluginDescriptors() { return pluginDescriptors; } } diff --git a/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java b/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java index 3a0566e..368650f 100644 --- a/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java +++ b/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java @@ -6,10 +6,6 @@ import atlantafx.base.theme.Styles; import javafx.geometry.Insets; import javafx.scene.Node; import javafx.scene.control.Button; -import javafx.scene.web.WebEngine; -import javafx.scene.web.WebView; -import org.commonmark.parser.Parser; -import org.commonmark.renderer.html.HtmlRenderer; import javafx.scene.control.ScrollPane; import javafx.scene.control.*; import javafx.scene.image.Image; @@ -18,6 +14,12 @@ import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.text.Text; +import javafx.scene.web.WebEngine; +import javafx.scene.web.WebView; +import org.commonmark.parser.Parser; +import org.commonmark.renderer.html.HtmlRenderer; +import org.jcnc.jnotepad.model.entity.PluginDescriptor; +import org.jcnc.jnotepad.plugin.PluginManager; import org.jcnc.jnotepad.util.LogUtil; import org.slf4j.Logger; @@ -26,7 +28,9 @@ import java.io.IOException; import java.net.URI; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -37,6 +41,7 @@ import java.util.Map; * @author luke */ public class PluginManagementPane extends BorderPane { + PluginManager pluginManager = PluginManager.getInstance(); /** * 图标大小常量 @@ -62,13 +67,13 @@ public class PluginManagementPane extends BorderPane { * 创建一个插件管理面板的实例。 */ public PluginManagementPane() { - init(); + initialize(); } /** * 初始化插件管理面板。 */ - private void init() { + private void initialize() { // 创建选项卡面板 TabPane rootTabPane = new TabPane(); @@ -116,30 +121,13 @@ public class PluginManagementPane extends BorderPane { * @return 包含插件列表的滚动面板 */ private ScrollPane getScrollPane() { - // 创建示例插件列表项 - var image1 = new Image("plug.png"); - var tile1 = createTile("运行插件", "这是一个运行插件\t\t\t\t\t\t", image1); - - var image2 = new Image("plug.png"); - var tile2 = createTile("终端插件", "这是一个终端插件", image2); - - var image3 = new Image("plug.png"); - var tile3 = createTile("构建插件", "这是一个构建插件", image3); - - var image4 = new Image("plug.png"); - var tile4 = createTile("1", "这是一个构建插件", image4); + List tiles = new ArrayList<>(); - var image5 = new Image("plug.png"); - var tile5 = createTile("2", "这是一个构建插件", image5); - - var image6 = new Image("plug.png"); - var tile6 = createTile("4", "这是一个构建插件", image6); - - var image7 = new Image("plug.png"); - var tile7 = createTile("5", "这是一个构建插件", image7); + pluginManager.getPluginDescriptors().forEach(pluginDescriptor -> tiles.add(createPlugInListItem(pluginDescriptor))); // 创建VBox并将插件列表项添加到其中 - var box = new VBox(tile1, tile2, tile3, tile4, tile5, tile6, tile7); + var box = new VBox(); + box.getChildren().addAll(tiles); // 创建滚动面板并将VBox设置为其内容 var scrollPane = new ScrollPane(box); @@ -156,19 +144,17 @@ public class PluginManagementPane extends BorderPane { /** * 创建插件列表项Tile。 * - * @param title 插件标题 - * @param description 插件描述 - * @param image 插件图标 + * @return 创建的插件列表项Tile */ - private Tile createTile(String title, String description, Image image) { + private Tile createPlugInListItem(PluginDescriptor pluginDescriptor) { // 创建一个title - var tile = new Tile(title, description); + var tile = new Tile(pluginDescriptor.getName(), pluginDescriptor.getDescription()); // 创建一个按钮 - var tgl = new ToggleSwitch(); + var toggleSwitch = new ToggleSwitch(); // 创建一个图标 - ImageView icon = new ImageView(image); + ImageView icon = new ImageView(new Image(pluginDescriptor.getIcon() == null ? "plug.png" : pluginDescriptor.getIcon())); // 指定要缩放的固定像素大小 double iconSize = ICON_SIZE; @@ -180,14 +166,14 @@ public class PluginManagementPane extends BorderPane { tile.setGraphic(icon); // 设置Tile的操作和操作处理程序 - tile.setAction(tgl); + tile.setAction(toggleSwitch); tile.setActionHandler(() -> { customSplitPane.setRightContent(tileContentMap.get(tile)); logger.info("点击了" + tile); }); // 创建专属的customSplitPane内容 - var content = createCustomSplitPaneContent(title); + var content = createCustomSplitPaneContent(pluginDescriptor, toggleSwitch); // 将内容与Tile关联起来 tileContentMap.put(tile, content); @@ -198,21 +184,21 @@ public class PluginManagementPane extends BorderPane { /** * 创建专属于每个插件的CustomSplitPane内容。 * - * @param titleName 插件标题 * @return 创建的CustomSplitPane内容 */ - private Node createCustomSplitPaneContent(String titleName) { + private Node createCustomSplitPaneContent(PluginDescriptor pluginDescriptor, ToggleSwitch toggleSwitch) { VBox content = new VBox(8); content.setPadding(new Insets(10)); - var titleLabel = new Text(titleName); + var titleLabel = new Text(pluginDescriptor.getName()); titleLabel.getStyleClass().addAll(Styles.TITLE_1); var authorBox = new HBox(10); - var author = new Text("JCNC团队"); + var author = new Text(pluginDescriptor.getAuthor()); var authorLink = getAuthorLink(); authorBox.getChildren().addAll(author, authorLink); - var state = new Text("未启用"); + toggleSwitch.setSelected(pluginDescriptor.isEnabled()); + var state = new Button(pluginDescriptor.isEnabled() ? "禁用" : "启用"); var main = new VBox(10); @@ -331,7 +317,7 @@ public class PluginManagementPane extends BorderPane { logger.info("系统不支持Desktop类!"); } } catch (Exception e) { - logger.info("启动" + authorLink + "失败!"); + logger.error("启动{}失败!\n错误是{}", authorLink, e.getMessage()); } }); return authorLink; -- Gitee From 59630846498fc759e1fd0f3babde21a3cea6614c Mon Sep 17 00:00:00 2001 From: gewuyou <1063891901@qq.com> Date: Sat, 23 Sep 2023 22:38:17 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java b/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java index 3c742bc..6ffbba4 100644 --- a/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java +++ b/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java @@ -109,7 +109,7 @@ public class PluginManagementPane extends BorderPane { myTab.setContent(myTabContent); // 将选项卡添加到选项卡面板中 - rootTabPane.getTabs().addAll(installedTab, marketTab, myTab); + rootTabPane.getTabs().addAll(marketTab, installedTab, myTab); // 将选项卡面板设置为插件管理面板的中心内容 this.setCenter(rootTabPane); -- Gitee From 97fbdd0d146d01c9af9c0f1a7dd558481951ca79 Mon Sep 17 00:00:00 2001 From: gewuyou <1063891901@qq.com> Date: Sat, 23 Sep 2023 23:28:02 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/pluginstage/PluginManagementPane.java | 31 ++++++++++++++----- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java b/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java index f273993..a8d2205 100644 --- a/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java +++ b/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java @@ -3,13 +3,13 @@ package org.jcnc.jnotepad.ui.pluginstage; import atlantafx.base.controls.Tile; import atlantafx.base.controls.ToggleSwitch; import atlantafx.base.theme.Styles; +import javafx.beans.binding.Bindings; +import javafx.beans.property.BooleanProperty; import javafx.geometry.Insets; +import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.control.Button; -import javafx.scene.web.WebEngine; -import javafx.scene.web.WebView; -import org.commonmark.parser.Parser; -import org.commonmark.renderer.html.HtmlRenderer; +import javafx.scene.control.MenuItem; import javafx.scene.control.ScrollPane; import javafx.scene.control.*; import javafx.scene.image.Image; @@ -17,7 +17,16 @@ import javafx.scene.image.ImageView; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; +import javafx.scene.paint.Color; import javafx.scene.text.Text; +import javafx.scene.web.WebEngine; +import javafx.scene.web.WebView; +import javafx.stage.Stage; +import org.commonmark.parser.Parser; +import org.commonmark.renderer.html.HtmlRenderer; +import org.jcnc.jnotepad.model.entity.PluginDescriptor; +import org.jcnc.jnotepad.plugin.PluginManager; +import org.jcnc.jnotepad.ui.module.CustomSetButton; import org.jcnc.jnotepad.util.LogUtil; import org.slf4j.Logger; @@ -26,7 +35,9 @@ import java.io.IOException; import java.net.URI; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; /** @@ -37,6 +48,7 @@ import java.util.Map; * @author luke */ public class PluginManagementPane extends BorderPane { + PluginManager pluginManager = PluginManager.getInstance(); /** * 图标大小常量 @@ -214,14 +226,17 @@ public class PluginManagementPane extends BorderPane { var authorLink = getAuthorLink(); authorBox.getChildren().addAll(author, authorLink); - toggleSwitch.setSelected(pluginDescriptor.isEnabled()); - var state = new Button(pluginDescriptor.isEnabled() ? "禁用" : "启用"); - + BooleanProperty booleanProperty = toggleSwitch.selectedProperty(); + booleanProperty.setValue(pluginDescriptor.isEnabled()); var uninstall = new MenuItem("卸载"); var state = new SplitMenuButton(uninstall); - state.setText("禁用"); state.getStyleClass().addAll(Styles.ACCENT); state.setPrefWidth(80); + state.textProperty().bind(Bindings.when(booleanProperty).then("禁用").otherwise("启用")); + state.setOnAction(event -> { + toggleSwitch.setSelected(!toggleSwitch.isSelected()); + }); + var main = new VBox(10); // 创建TabPane并添加标签页 -- Gitee From 3d88d7d2b431b0d08c237275ca4a9e6097eb62cd Mon Sep 17 00:00:00 2001 From: gewuyou <1063891901@qq.com> Date: Sun, 24 Sep 2023 00:56:21 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jcnc/jnotepad/plugin/PluginManager.java | 22 +++-- .../ui/pluginstage/PluginManagementPane.java | 83 +++++++------------ 2 files changed, 38 insertions(+), 67 deletions(-) diff --git a/src/main/java/org/jcnc/jnotepad/plugin/PluginManager.java b/src/main/java/org/jcnc/jnotepad/plugin/PluginManager.java index 375a1fc..6848df7 100644 --- a/src/main/java/org/jcnc/jnotepad/plugin/PluginManager.java +++ b/src/main/java/org/jcnc/jnotepad/plugin/PluginManager.java @@ -89,17 +89,6 @@ public class PluginManager { */ public void disablePlugIn(PluginDescriptor pluginDescriptor) { pluginDescriptor.setEnabled(false); -// pluginDescriptor.setPlugin(null); -// ThreadPoolManager.getThreadPool().submit(() -> { -// PluginConfigController instance = PluginConfigController.getInstance(); -// instance.getConfig().getPlugins().forEach(plugin -> { -// if ((pluginDescriptor.getName() + pluginDescriptor.getAuthor()).equals(plugin.getName() + plugin.getAuthor())) { -// plugin.setEnabled(false); -// } -// }); -// instance.writeConfig(); -// ThreadPoolManager.threadContSelfSubtracting(); -// }); } /** @@ -141,7 +130,7 @@ public class PluginManager { */ public void destroyPlugins() { for (PluginDescriptor pluginDescriptor : pluginDescriptors) { - if (pluginDescriptor.isEnabled()) { + if (pluginDescriptor.isEnabled() && pluginDescriptor.getPlugin() != null) { pluginDescriptor.getPlugin().destroyed(); } } @@ -159,4 +148,13 @@ public class PluginManager { public List getPluginDescriptors() { return pluginDescriptors; } + + /** + * 启用插件 + * + * @param pluginDescriptor 插件信息类 + */ + public void enablePlugIn(PluginDescriptor pluginDescriptor) { + pluginDescriptor.setEnabled(true); + } } diff --git a/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java b/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java index bfb8a94..8f33b61 100644 --- a/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java +++ b/src/main/java/org/jcnc/jnotepad/ui/pluginstage/PluginManagementPane.java @@ -9,15 +9,7 @@ import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Node; import javafx.scene.control.Button; -import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; -import javafx.scene.input.MouseEvent; -import javafx.scene.paint.Color; -import javafx.scene.web.WebEngine; -import javafx.scene.web.WebView; -import javafx.stage.Stage; -import org.commonmark.parser.Parser; -import org.commonmark.renderer.html.HtmlRenderer; import javafx.scene.control.ScrollPane; import javafx.scene.control.*; import javafx.scene.image.Image; @@ -39,7 +31,6 @@ import org.jcnc.jnotepad.util.LogUtil; import org.slf4j.Logger; import java.awt.*; -import java.awt.MenuBar; import java.io.File; import java.io.IOException; import java.net.URI; @@ -60,9 +51,6 @@ import java.util.Map; public class PluginManagementPane extends BorderPane { PluginManager pluginManager = PluginManager.getInstance(); - boolean isInstall = false; - - /** * 图标大小常量 */ @@ -215,12 +203,6 @@ public class PluginManagementPane extends BorderPane { var tile = new Tile(pluginDescriptor.getName(), pluginDescriptor.getDescription()); // 创建一个按钮 var toggleSwitch = new ToggleSwitch(); - - tgl.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> { - // 单击 ToggleSwitch 后执行的代码 - isInstall = !isInstall; - - }); // 创建一个图标 ImageView icon = new ImageView(new Image(pluginDescriptor.getIcon() == null ? "plug.png" : pluginDescriptor.getIcon())); // 指定要缩放的固定像素大小 @@ -266,52 +248,44 @@ public class PluginManagementPane extends BorderPane { authorBox.getChildren().addAll(author, authorLink); - var isInstallItem = new MenuItem(); - var state = new SplitMenuButton(isInstallItem); - - state.addEventHandler(MouseEvent.MOUSE_CLICKED, event -> { - // 切换isInstall的值 - isInstall = !isInstall; - if (!isInstall) { - isInstallItem.setText("安装"); - isInstallItem.setOnAction(event1 -> { - // TODO: 2023/9/23 插件安装的操作 - - }); - state.setText("启用"); - state.setOnAction(event1 -> { - // TODO: 2023/9/23 插件启动的操作 - - }); - + var uninstallItem = new MenuItem("卸载"); + var state = new SplitMenuButton(uninstallItem); + toggleSwitch.setSelected(pluginDescriptor.isEnabled()); + BooleanProperty booleanProperty = toggleSwitch.selectedProperty(); + state.textProperty().bind(Bindings.when(booleanProperty).then("禁用").otherwise("启用")); + state.getStyleClass().addAll(Styles.ACCENT); + state.setPrefWidth(80); + toggleSwitch.selectedProperty().addListener((observable, oldValue, newValue) -> { + if (Boolean.TRUE.equals(newValue)) { + pluginManager.enablePlugIn(pluginDescriptor); } else { - isInstallItem.setText("卸载"); - isInstallItem.setOnAction(event1 -> { - // TODO: 2023/9/23 插件卸载的操作 - - }); - state.setText("停用"); - state.setOnAction(event1 -> { - // TODO: 2023/9/23 插件停用的操作 - - }); + pluginManager.disablePlugIn(pluginDescriptor); } }); + state.setOnAction(event -> { + toggleSwitch.setSelected(!toggleSwitch.isSelected()); + if (toggleSwitch.isSelected()) { + pluginManager.enablePlugIn(pluginDescriptor); + } else { + pluginManager.disablePlugIn(pluginDescriptor); + } - state.getStyleClass().addAll(Styles.ACCENT); - state.setPrefWidth(80); + }); var main = new VBox(10); // 创建TabPane并添加标签页 TabPane tabPane = new TabPane(); - Tab detailsTab = new Tab("细节"); + Tab detailsTab = new Tab("简介"); detailsTab.setClosable(false); - Tab featuresTab = new Tab("实现功能"); + Tab featuresTab = new Tab("详细信息"); featuresTab.setClosable(false); Tab changelogTab = new Tab("更新日志"); changelogTab.setClosable(false); - + Tab readMeTab = new Tab("README"); + readMeTab.setClosable(false); + Tab othersTab = new Tab("其它信息"); + othersTab.setClosable(false); // 在标签页中添加内容 VBox detailsContent = new VBox(10); @@ -327,15 +301,14 @@ public class PluginManagementPane extends BorderPane { engine.loadContent(htmlContent); // 将WebView添加到detailsContent detailsContent.getChildren().addAll(webView); - VBox featuresContent = new VBox(10); VBox changelogContent = new VBox(10); - + VBox readMeContent = new VBox(10); detailsTab.setContent(detailsContent); featuresTab.setContent(featuresContent); changelogTab.setContent(changelogContent); - - tabPane.getTabs().addAll(detailsTab, featuresTab, changelogTab); + readMeTab.setContent(readMeContent); + tabPane.getTabs().addAll(detailsTab, featuresTab, changelogTab, readMeTab, othersTab); main.getChildren().addAll(tabPane); -- Gitee