diff --git a/client/src/main/java/ctbrec/ui/settings/IgnoreListDialog.java b/client/src/main/java/ctbrec/ui/settings/IgnoreListDialog.java index 6659ca6c..762743cc 100644 --- a/client/src/main/java/ctbrec/ui/settings/IgnoreListDialog.java +++ b/client/src/main/java/ctbrec/ui/settings/IgnoreListDialog.java @@ -27,7 +27,7 @@ import javafx.stage.Stage; public class IgnoreListDialog extends Dialog { - private static final transient Logger LOG = LoggerFactory.getLogger(IgnoreListDialog.class); + private static final Logger LOG = LoggerFactory.getLogger(IgnoreListDialog.class); private Scene parent; private ListView ignoreList; @@ -46,7 +46,7 @@ public class IgnoreListDialog extends Dialog { InputStream icon = Dialogs.class.getResourceAsStream("/icon.png"); Stage stage = (Stage) getDialogPane().getScene().getWindow(); stage.getIcons().add(new Image(icon)); - if(parent != null) { + if (parent != null) { stage.getScene().getStylesheets().addAll(parent.getStylesheets()); } @@ -74,7 +74,7 @@ public class IgnoreListDialog extends Dialog { private void removeSelectedModels() { List selectedModels = ignoreList.getSelectionModel().getSelectedItems(); - if(selectedModels.isEmpty()) { + if (selectedModels.isEmpty()) { return; } else { Config.getInstance().getSettings().modelsIgnored.removeAll(selectedModels); diff --git a/client/src/main/java/ctbrec/ui/settings/SettingsTab.java b/client/src/main/java/ctbrec/ui/settings/SettingsTab.java index 42303518..a20c7023 100644 --- a/client/src/main/java/ctbrec/ui/settings/SettingsTab.java +++ b/client/src/main/java/ctbrec/ui/settings/SettingsTab.java @@ -1,8 +1,14 @@ package ctbrec.ui.settings; import static ctbrec.Settings.DirectoryStructure.*; +import static javafx.scene.control.ButtonType.*; +import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; +import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -11,15 +17,23 @@ import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.squareup.moshi.JsonAdapter; +import com.squareup.moshi.Moshi; +import com.squareup.moshi.Types; + import ctbrec.Config; import ctbrec.Hmac; +import ctbrec.Model; import ctbrec.Settings.DirectoryStructure; import ctbrec.StringUtil; +import ctbrec.io.ModelJsonAdapter; import ctbrec.recorder.Recorder; import ctbrec.sites.ConfigUI; import ctbrec.sites.Site; +import ctbrec.ui.AutosizeAlert; import ctbrec.ui.SiteUiFactory; import ctbrec.ui.TabSelectionListener; +import ctbrec.ui.controls.Dialogs; import ctbrec.ui.controls.DirectorySelectionBox; import ctbrec.ui.controls.ProgramSelectionBox; import javafx.collections.FXCollections; @@ -27,7 +41,9 @@ import javafx.geometry.HPos; import javafx.geometry.Insets; import javafx.scene.Node; import javafx.scene.control.Accordion; +import javafx.scene.control.Alert.AlertType; import javafx.scene.control.Button; +import javafx.scene.control.ButtonType; import javafx.scene.control.CheckBox; import javafx.scene.control.ComboBox; import javafx.scene.control.Label; @@ -45,6 +61,7 @@ import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.text.Font; +import javafx.stage.FileChooser; public class SettingsTab extends Tab implements TabSelectionListener { @@ -439,14 +456,68 @@ public class SettingsTab extends Tab implements TabSelectionListener { private Node createIgnoreListPanel() { GridPane layout = createGridLayout(); - Button edit = new Button("Edit"); - edit.setOnAction(e -> new IgnoreListDialog(edit.getScene()).showAndWait()); - layout.add(edit, 0, 0); + Button editIgnoreList = new Button("Edit"); + editIgnoreList.setOnAction(e -> new IgnoreListDialog(editIgnoreList.getScene()).showAndWait()); + layout.add(editIgnoreList, 0, 0); + Button exportIgnoreList = new Button("Export"); + exportIgnoreList.setOnAction(e -> exportIgnoreList()); + layout.add(exportIgnoreList, 1, 0); + Button importIgnoreList = new Button("Import"); + importIgnoreList.setOnAction(e -> importIgnoreList()); + layout.add(importIgnoreList, 2, 0); TitledPane ignoreList = new TitledPane("Ignore List", layout); ignoreList.setCollapsible(false); return ignoreList; } + private void exportIgnoreList() { + FileChooser chooser = new FileChooser(); + chooser.setTitle("Export ignore list"); + chooser.setInitialFileName("ctbrec-ignorelist.json"); + File file = chooser.showSaveDialog(null); + if (file != null) { + Moshi moshi = new Moshi.Builder().add(Model.class, new ModelJsonAdapter(sites)).build(); + Type modelListType = Types.newParameterizedType(List.class, Model.class); + JsonAdapter> adapter = moshi.adapter(modelListType); + adapter = adapter.indent(" "); + try (FileOutputStream out = new FileOutputStream(file)) { + String json = adapter.toJson(Config.getInstance().getSettings().modelsIgnored); + out.write(json.getBytes(StandardCharsets.UTF_8)); + } catch (IOException e) { + Dialogs.showError(getTabPane().getScene(), "Couldn't export ignore list", e.getLocalizedMessage(), e); + } + } + } + + private void importIgnoreList() { + FileChooser chooser = new FileChooser(); + chooser.setTitle("Import ignore list"); + File file = chooser.showOpenDialog(null); + if (file != null) { + Moshi moshi = new Moshi.Builder().add(Model.class, new ModelJsonAdapter(sites)).build(); + Type modelListType = Types.newParameterizedType(List.class, Model.class); + JsonAdapter> adapter = moshi.adapter(modelListType); + try { + byte[] fileContent = Files.readAllBytes(file.toPath()); + List ignoredModels = adapter.fromJson(new String(fileContent, StandardCharsets.UTF_8)); + boolean confirmed = true; + if (!Config.getInstance().getSettings().modelsIgnored.isEmpty()) { + String msg = "This will replace the existing ignore list! Continue?"; + AutosizeAlert confirm = new AutosizeAlert(AlertType.CONFIRMATION, msg, getTabPane().getScene(), YES, NO); + confirm.setTitle("Import ignore list"); + confirm.setHeaderText("Overwrite ignore list"); + confirm.showAndWait(); + confirmed = confirm.getResult() == ButtonType.YES; + } + if (confirmed) { + Config.getInstance().getSettings().modelsIgnored = ignoredModels; + } + } catch (IOException e) { + Dialogs.showError(getTabPane().getScene(), "Couldn't import ignore list", e.getLocalizedMessage(), e); + } + } + } + private Node createGeneralPanel() { GridPane layout = createGridLayout(); int row = 0;