From 985ded70a876bf86cadbc5a20fb8caee88db27ae Mon Sep 17 00:00:00 2001
From: 0xb00bface <0xboobface@gmail.com>
Date: Sun, 15 Aug 2021 14:29:38 +0200
Subject: [PATCH] Add possibility to remove portrait image

---
 .../ctbrec/ui/action/SetPortraitAction.java   | 62 ++++++++++++++-----
 1 file changed, 48 insertions(+), 14 deletions(-)

diff --git a/client/src/main/java/ctbrec/ui/action/SetPortraitAction.java b/client/src/main/java/ctbrec/ui/action/SetPortraitAction.java
index c543da32..e2c0cdcc 100644
--- a/client/src/main/java/ctbrec/ui/action/SetPortraitAction.java
+++ b/client/src/main/java/ctbrec/ui/action/SetPortraitAction.java
@@ -17,10 +17,14 @@ import org.slf4j.LoggerFactory;
 
 import ctbrec.Config;
 import ctbrec.Model;
+import ctbrec.StringUtil;
 import ctbrec.ui.controls.Dialogs;
 import ctbrec.ui.controls.FileSelectionBox;
+import javafx.geometry.Insets;
 import javafx.scene.Cursor;
 import javafx.scene.Node;
+import javafx.scene.control.Label;
+import javafx.scene.layout.GridPane;
 
 public class SetPortraitAction {
     private static final Logger LOG = LoggerFactory.getLogger(SetPortraitAction.class);
@@ -40,27 +44,52 @@ public class SetPortraitAction {
         source.setCursor(Cursor.WAIT);
         String portraitId = Config.getInstance().getSettings().modelPortraits.getOrDefault(model.getUrl(), UUID.randomUUID().toString());
 
+        GridPane pane = new GridPane();
+        Label l = new Label("Select a portrait image. Leave empty to remove a portrait again.");
+        pane.add(l, 0, 0);
         FileSelectionBox portraitSelectionBox = new FileSelectionBox();
-        boolean accepted = Dialogs.showCustomInput(source.getScene(), "Select a portrait image", portraitSelectionBox);
+        pane.add(portraitSelectionBox, 0, 1);
+        GridPane.setMargin(l, new Insets(5));
+        GridPane.setMargin(portraitSelectionBox, new Insets(5));
+        boolean accepted = Dialogs.showCustomInput(source.getScene(), "Select a portrait image", pane);
         if (!accepted) {
+            source.setCursor(Cursor.DEFAULT);
             return;
         }
         String selectedFile = portraitSelectionBox.fileProperty().getValue();
 
-        LOG.debug("User selected {}", selectedFile);
-        boolean success = processImageFile(portraitId, selectedFile);
-        if (success) {
-            Config.getInstance().getSettings().modelPortraits.put(model.getUrl(), portraitId);
-            try {
-                Config.getInstance().save();
-                runCallback();
-            } catch (IOException e) {
-                Dialogs.showError("Set Portrait", "Couldn't change portrait image: ", e);
+        if (StringUtil.isBlank(selectedFile)) {
+            removePortrait(portraitId);
+        } else {
+            LOG.debug("User selected {}", selectedFile);
+            boolean success = processImageFile(portraitId, selectedFile);
+            if (success) {
+                Config.getInstance().getSettings().modelPortraits.put(model.getUrl(), portraitId);
+                try {
+                    Config.getInstance().save();
+                    runCallback();
+                } catch (IOException e) {
+                    Dialogs.showError("Set Portrait", "Couldn't change portrait image: ", e);
+                }
             }
         }
         source.setCursor(Cursor.DEFAULT);
     }
 
+    private void removePortrait(String portraitId) {
+        File portraitFile = getPortraitFile(portraitId);
+        try {
+            if (portraitFile.exists()) {
+                Files.delete(portraitFile.toPath());
+            }
+            Config.getInstance().getSettings().modelPortraits.remove(model.getUrl());
+            Config.getInstance().save();
+            runCallback();
+        } catch (IOException e) {
+            Dialogs.showError("Remove Portrait", "Couldn't remove portrait image: ", e);
+        }
+    }
+
     private void runCallback() {
         if (callback != null) {
             try {
@@ -98,11 +127,16 @@ public class SetPortraitAction {
     }
 
     private boolean copyToCacheAsJpg(String portraitId, BufferedImage portrait) throws IOException {
-        File configDir = Config.getInstance().getConfigDir();
-        File portraitDir = new File(configDir, "portraits");
-        Files.createDirectories(portraitDir.toPath());
-        File output = new File(portraitDir, portraitId + '.' + FORMAT);
+        File output = getPortraitFile(portraitId);
+        Files.createDirectories(output.getParentFile().toPath());
         LOG.debug("Writing scaled portrait to {}", output);
         return ImageIO.write(portrait, FORMAT, output);
     }
+
+    private File getPortraitFile(String portraitId) {
+        File configDir = Config.getInstance().getConfigDir();
+        File portraitDir = new File(configDir, "portraits");
+        File output = new File(portraitDir, portraitId + '.' + FORMAT);
+        return output;
+    }
 }