From dcbea85f761d9b4efa350a11af1e61bfe4036cbf Mon Sep 17 00:00:00 2001
From: 0xboobface <0xboobface@gmail.com>
Date: Thu, 26 Jul 2018 16:08:39 +0200
Subject: [PATCH] Grouped settings in TitledPanes

---
 src/main/java/ctbrec/ui/SettingsTab.java | 118 +++++++++++++++--------
 1 file changed, 77 insertions(+), 41 deletions(-)

diff --git a/src/main/java/ctbrec/ui/SettingsTab.java b/src/main/java/ctbrec/ui/SettingsTab.java
index 1804b69d..e912d1dd 100644
--- a/src/main/java/ctbrec/ui/SettingsTab.java
+++ b/src/main/java/ctbrec/ui/SettingsTab.java
@@ -23,6 +23,7 @@ import javafx.scene.control.RadioButton;
 import javafx.scene.control.Tab;
 import javafx.scene.control.TextField;
 import javafx.scene.control.TextInputDialog;
+import javafx.scene.control.TitledPane;
 import javafx.scene.control.ToggleGroup;
 import javafx.scene.control.Tooltip;
 import javafx.scene.layout.Border;
@@ -55,6 +56,7 @@ public class SettingsTab extends Tab {
     private RadioButton recordLocal;
     private RadioButton recordRemote;
     private ToggleGroup recordLocation;
+    private TitledPane mergePane;
 
     public SettingsTab() {
         setText("Settings");
@@ -63,42 +65,45 @@ public class SettingsTab extends Tab {
     }
 
     private void createGui() {
-        GridPane layout = new GridPane();
-        layout.setOpacity(1);
-        layout.setPadding(new Insets(5));
-        layout.setHgap(5);
-        layout.setVgap(5);
-        setContent(layout);
+        GridPane mainLayout = createGridLayout();
+        mainLayout.setHgap(15);
+        mainLayout.setVgap(15);
+        mainLayout.setPadding(new Insets(15));
+        setContent(mainLayout);
 
-        int row = 0;
-        layout.add(new Label("Recordings Directory"), 0, row);
+        GridPane layout = createGridLayout();
+        layout.add(new Label("Recordings Directory"), 0, 0);
         recordingsDirectory = new TextField(Config.getInstance().getSettings().recordingsDir);
         recordingsDirectory.focusedProperty().addListener(createRecordingsDirectoryFocusListener());
         recordingsDirectory.setPrefWidth(400);
         GridPane.setFillWidth(recordingsDirectory, true);
         GridPane.setHgrow(recordingsDirectory, Priority.ALWAYS);
         GridPane.setColumnSpan(recordingsDirectory, 2);
-        layout.add(recordingsDirectory, 1, row);
-        layout.add(createRecordingsBrowseButton(), 3, row);
+        layout.add(recordingsDirectory, 1, 0);
+        layout.add(createRecordingsBrowseButton(), 3, 0);
 
-        layout.add(new Label("Player"), 0, ++row);
+        layout.add(new Label("Player"), 0, 1);
         mediaPlayer = new TextField(Config.getInstance().getSettings().mediaPlayer);
         mediaPlayer.focusedProperty().addListener(createMpvFocusListener());
         GridPane.setFillWidth(mediaPlayer, true);
         GridPane.setHgrow(mediaPlayer, Priority.ALWAYS);
         GridPane.setColumnSpan(mediaPlayer, 2);
-        layout.add(mediaPlayer, 1, row);
-        layout.add(createMpvBrowseButton(), 3, row);
+        layout.add(mediaPlayer, 1, 1);
+        layout.add(createMpvBrowseButton(), 3, 1);
+        TitledPane locations = new TitledPane("Locations", layout);
+        locations.setCollapsible(false);
+        mainLayout.add(locations, 0, 0);
 
-        layout.add(new Label("Chaturbate User"), 0, ++row);
+        layout = createGridLayout();
+        layout.add(new Label("Chaturbate User"), 0, 0);
         username = new TextField(Config.getInstance().getSettings().username);
         username.focusedProperty().addListener((e) -> Config.getInstance().getSettings().username = username.getText());
         GridPane.setFillWidth(username, true);
         GridPane.setHgrow(username, Priority.ALWAYS);
         GridPane.setColumnSpan(username, 2);
-        layout.add(username, 1, row);
+        layout.add(username, 1, 0);
 
-        layout.add(new Label("Chaturbate Password"), 0, ++row);
+        layout.add(new Label("Chaturbate Password"), 0, 1);
         password = new PasswordField();
         password.setText(Config.getInstance().getSettings().password);
         password.focusedProperty().addListener((e) -> {
@@ -109,10 +114,14 @@ public class SettingsTab extends Tab {
         GridPane.setFillWidth(password, true);
         GridPane.setHgrow(password, Priority.ALWAYS);
         GridPane.setColumnSpan(password, 2);
-        layout.add(password, 1, row);
+        layout.add(password, 1, 1);
+        TitledPane ctb = new TitledPane("Chaturbate", layout);
+        ctb.setCollapsible(false);
+        mainLayout.add(ctb, 0, 1);
 
+        layout = createGridLayout();
         Label l = new Label("Display stream resolution in overview");
-        layout.add(l, 0, ++row);
+        layout.add(l, 0, 0);
         loadResolution = new CheckBox();
         loadResolution.setSelected(Config.getInstance().getSettings().determineResolution);
         loadResolution.setOnAction((e) -> {
@@ -121,32 +130,43 @@ public class SettingsTab extends Tab {
                 ThumbOverviewTab.queue.clear();
             }
         });
-        GridPane.setMargin(l, new Insets(CHECKBOX_MARGIN, 0, 0, 0));
-        GridPane.setMargin(loadResolution, new Insets(CHECKBOX_MARGIN, 0, 0, 0));
-        layout.add(loadResolution, 1, row);
+        //GridPane.setMargin(l, new Insets(CHECKBOX_MARGIN, 0, 0, 0));
+        GridPane.setMargin(loadResolution, new Insets(0, 0, 0, CHECKBOX_MARGIN));
+        layout.add(loadResolution, 1, 0);
 
         l = new Label("Manually select stream quality");
-        layout.add(l, 0, ++row);
+        layout.add(l, 0, 1);
         chooseStreamQuality.setSelected(Config.getInstance().getSettings().chooseStreamQuality);
         chooseStreamQuality.setOnAction((e) -> Config.getInstance().getSettings().chooseStreamQuality = chooseStreamQuality.isSelected());
         GridPane.setMargin(l, new Insets(CHECKBOX_MARGIN, 0, 0, 0));
-        GridPane.setMargin(chooseStreamQuality, new Insets(CHECKBOX_MARGIN, 0, 0, 0));
-        layout.add(chooseStreamQuality, 1, row);
+        GridPane.setMargin(chooseStreamQuality, new Insets(CHECKBOX_MARGIN, 0, 0, CHECKBOX_MARGIN));
+        layout.add(chooseStreamQuality, 1, 1);
+        TitledPane quality = new TitledPane("Stream Quality", layout);
+        quality.setCollapsible(false);
+        mainLayout.add(quality, 0, 2);
 
+        GridPane mergeLayout = createGridLayout();
         l = new Label("Auto-merge recordings");
-        layout.add(l, 0, ++row);
+        mergeLayout.add(l, 0, 0);
         automerge.setSelected(Config.getInstance().getSettings().automerge);
         automerge.setOnAction((e) -> Config.getInstance().getSettings().automerge = automerge.isSelected());
-        GridPane.setMargin(l, new Insets(CHECKBOX_MARGIN, 0, 0, 0));
-        GridPane.setMargin(automerge, new Insets(CHECKBOX_MARGIN, 0, 0, 0));
-        layout.add(automerge, 1, row);
+        GridPane.setMargin(automerge, new Insets(0, 0, 0, CHECKBOX_MARGIN));
+        mergeLayout.add(automerge, 1, 0);
 
-        automergeKeepSegments.setText("Keep segments");
+        l = new Label("Keep segments");
+        mergeLayout.add(l, 0, 1);
         automergeKeepSegments.setOnAction((e) -> Config.getInstance().getSettings().automergeKeepSegments = automergeKeepSegments.isSelected());
-        GridPane.setMargin(automergeKeepSegments, new Insets(CHECKBOX_MARGIN, 0, 30, 0));
-        layout.add(automergeKeepSegments, 1, ++row);
+        GridPane.setMargin(l, new Insets(CHECKBOX_MARGIN, 0, 0, 0));
+        GridPane.setMargin(automergeKeepSegments, new Insets(CHECKBOX_MARGIN, 0, 0, CHECKBOX_MARGIN));
+        mergeLayout.add(automergeKeepSegments, 1, 1);
 
-        layout.add(new Label("Record Location"), 0, ++row);
+        mergePane = new TitledPane("Auto-merge", mergeLayout);
+        mergePane.setCollapsible(false);
+        mainLayout.add(mergePane, 0, 3);
+
+        layout = createGridLayout();
+        l = new Label("Record Location");
+        layout.add(l, 0, 0);
         recordLocation = new ToggleGroup();
         recordLocal = new RadioButton("Local");
         recordRemote = new RadioButton("Remote");
@@ -154,8 +174,8 @@ public class SettingsTab extends Tab {
         recordRemote.setToggleGroup(recordLocation);
         recordLocal.setSelected(Config.getInstance().getSettings().localRecording);
         recordRemote.setSelected(!recordLocal.isSelected());
-        layout.add(recordLocal, 1, row);
-        layout.add(recordRemote, 2, row);
+        layout.add(recordLocal, 1, 0);
+        layout.add(recordRemote, 2, 0);
         recordLocation.selectedToggleProperty().addListener((e) -> {
             Config.getInstance().getSettings().localRecording = recordLocal.isSelected();
             setRecordingMode(recordLocal.isSelected());
@@ -165,8 +185,11 @@ public class SettingsTab extends Tab {
             restart.setContentText("Changes get applied after a restart of the application");
             restart.show();
         });
+        GridPane.setMargin(l, new Insets(0, 0, CHECKBOX_MARGIN, 0));
+        GridPane.setMargin(recordLocal, new Insets(0, 0, CHECKBOX_MARGIN, 0));
+        GridPane.setMargin(recordRemote, new Insets(0, 0, CHECKBOX_MARGIN, 0));
 
-        layout.add(new Label("Server"), 0, ++row);
+        layout.add(new Label("Server"), 0, 1);
         server = new TextField(Config.getInstance().getSettings().httpServer);
         server.focusedProperty().addListener((e) -> {
             if(!server.getText().isEmpty()) {
@@ -176,9 +199,9 @@ public class SettingsTab extends Tab {
         GridPane.setFillWidth(server, true);
         GridPane.setHgrow(server, Priority.ALWAYS);
         GridPane.setColumnSpan(server, 2);
-        layout.add(server, 1, row);
+        layout.add(server, 1, 1);
 
-        layout.add(new Label("Port"), 0, ++row);
+        layout.add(new Label("Port"), 0, 2);
         port = new TextField(Integer.toString(Config.getInstance().getSettings().httpPort));
         port.focusedProperty().addListener((e) -> {
             if(!port.getText().isEmpty()) {
@@ -195,10 +218,10 @@ public class SettingsTab extends Tab {
         GridPane.setFillWidth(port, true);
         GridPane.setHgrow(port, Priority.ALWAYS);
         GridPane.setColumnSpan(port, 2);
-        layout.add(port, 1, row);
+        layout.add(port, 1, 2);
 
         l = new Label("Require authentication");
-        layout.add(l, 0, ++row);
+        layout.add(l, 0, 3);
         secureCommunication.setSelected(Config.getInstance().getSettings().requireAuthentication);
         secureCommunication.setOnAction((e) -> {
             Config.getInstance().getSettings().requireAuthentication = secureCommunication.isSelected();
@@ -220,19 +243,32 @@ public class SettingsTab extends Tab {
                 keyDialog.show();
             }
         });
-        GridPane.setMargin(l, new Insets(CHECKBOX_MARGIN, 0, 0, 0));
+        GridPane.setMargin(l, new Insets(CHECKBOX_MARGIN, CHECKBOX_MARGIN, 0, 0));
         GridPane.setMargin(secureCommunication, new Insets(CHECKBOX_MARGIN, 0, 0, 0));
-        layout.add(secureCommunication, 1, row);
+        layout.add(secureCommunication, 1, 3);
+
+        TitledPane recordLocation = new TitledPane("Record Location", layout);
+        recordLocation.setCollapsible(false);
+        mainLayout.add(recordLocation, 0, 4);
 
         setRecordingMode(recordLocal.isSelected());
     }
 
+    private GridPane createGridLayout() {
+        GridPane layout = new GridPane();
+        layout.setPadding(new Insets(10));
+        layout.setHgap(5);
+        layout.setVgap(5);
+        return layout;
+    }
+
     private void setRecordingMode(boolean local) {
         server.setDisable(local);
         port.setDisable(local);
         secureCommunication.setDisable(local);
         automerge.setDisable(!local);
         automergeKeepSegments.setDisable(!local);
+        mergePane.setDisable(!local);
     }
 
     private ChangeListener<? super Boolean> createRecordingsDirectoryFocusListener() {