From 90300473bcb8a5032816a4418bf342671479de75 Mon Sep 17 00:00:00 2001 From: 0xboobface <0xboobface@gmail.com> Date: Sun, 28 Jun 2020 12:58:39 +0200 Subject: [PATCH] Add more settings --- .../java/ctbrec/ui/CamrecApplication.java | 2 +- .../ctbrec/ui/settings/ColorSettingsPane.java | 37 ++++++++----- .../ui/settings/CtbrecPreferencesStorage.java | 28 +++++++++- .../java/ctbrec/ui/settings/SettingsTab.java | 2 +- .../java/ctbrec/ui/settings/SettingsTab2.java | 53 +++++++++++++++---- .../ctbrec/ui/settings/api/Preferences.java | 11 ++-- .../ui/settings/api/PreferencesStorage.java | 2 +- .../ui/settings/api/SelectionSetting.java | 15 ++++++ .../java/ctbrec/ui/settings/api/Setting.java | 30 +++++++++-- 9 files changed, 142 insertions(+), 38 deletions(-) create mode 100644 client/src/main/java/ctbrec/ui/settings/api/SelectionSetting.java diff --git a/client/src/main/java/ctbrec/ui/CamrecApplication.java b/client/src/main/java/ctbrec/ui/CamrecApplication.java index b5ed64d7..c0881658 100644 --- a/client/src/main/java/ctbrec/ui/CamrecApplication.java +++ b/client/src/main/java/ctbrec/ui/CamrecApplication.java @@ -190,8 +190,8 @@ public class CamrecApplication extends Application { recordingsTab = new RecordingsTab("Recordings", recorder, config, sites); tabPane.getTabs().add(recordingsTab); settingsTab = new SettingsTab(sites, recorder); - tabPane.getTabs().add(settingsTab); tabPane.getTabs().add(new SettingsTab2(sites, recorder)); + tabPane.getTabs().add(settingsTab); tabPane.getTabs().add(new NewsTab()); tabPane.getTabs().add(new DonateTabFx()); tabPane.getTabs().add(new HelpTab()); diff --git a/client/src/main/java/ctbrec/ui/settings/ColorSettingsPane.java b/client/src/main/java/ctbrec/ui/settings/ColorSettingsPane.java index b91765d1..0725b779 100644 --- a/client/src/main/java/ctbrec/ui/settings/ColorSettingsPane.java +++ b/client/src/main/java/ctbrec/ui/settings/ColorSettingsPane.java @@ -1,6 +1,9 @@ package ctbrec.ui.settings; +import java.io.IOException; + import ctbrec.Config; +import ctbrec.ui.controls.Dialogs; import javafx.scene.control.Button; import javafx.scene.control.ColorPicker; import javafx.scene.control.Tooltip; @@ -14,41 +17,49 @@ public class ColorSettingsPane extends HBox { ColorPicker accentColor = new ColorPicker(); Button reset = new Button("Reset"); Pane foobar = new Pane(); + private Config config; - public ColorSettingsPane(SettingsTab settingsTab) { + public ColorSettingsPane(Config config) { super(5); + this.config = config; getChildren().add(baseColor); getChildren().add(accentColor); getChildren().add(reset); - baseColor.setValue(Color.web(Config.getInstance().getSettings().colorBase)); + baseColor.setValue(Color.web(config.getSettings().colorBase)); baseColor.setTooltip(new Tooltip("Base Color")); baseColor.setMaxSize(44, 25); - accentColor.setValue(Color.web(Config.getInstance().getSettings().colorAccent)); + accentColor.setValue(Color.web(config.getSettings().colorAccent)); accentColor.setTooltip(new Tooltip("Accent Color")); accentColor.setMaxSize(44, 25); + reset.setMinSize(60, 25); reset.setMaxSize(60, 25); baseColor.setOnAction(evt -> { - Config.getInstance().getSettings().colorBase = toWeb(baseColor.getValue()); - settingsTab.showRestartRequired(); - settingsTab.saveConfig(); + config.getSettings().colorBase = toWeb(baseColor.getValue()); + save(); }); accentColor.setOnAction(evt -> { - Config.getInstance().getSettings().colorAccent = toWeb(accentColor.getValue()); - settingsTab.showRestartRequired(); - settingsTab.saveConfig(); + config.getSettings().colorAccent = toWeb(accentColor.getValue()); + save(); }); reset.setOnAction(evt -> { baseColor.setValue(Color.WHITE); - Config.getInstance().getSettings().colorBase = toWeb(Color.WHITE); + config.getSettings().colorBase = toWeb(Color.WHITE); accentColor.setValue(Color.WHITE); - Config.getInstance().getSettings().colorAccent = toWeb(Color.WHITE); - settingsTab.showRestartRequired(); - settingsTab.saveConfig(); + config.getSettings().colorAccent = toWeb(Color.WHITE); + save(); }); } + private void save() { + try { + config.save(); + } catch (IOException e) { + Dialogs.showError(getScene(), "Save Settings", "Couldn't save color settings", e); + } + } + private String toWeb(Color value) { StringBuilder sb = new StringBuilder("#"); sb.append(toHex((int) (value.getRed() * 255))); diff --git a/client/src/main/java/ctbrec/ui/settings/CtbrecPreferencesStorage.java b/client/src/main/java/ctbrec/ui/settings/CtbrecPreferencesStorage.java index d0f2c3e9..27a8034d 100644 --- a/client/src/main/java/ctbrec/ui/settings/CtbrecPreferencesStorage.java +++ b/client/src/main/java/ctbrec/ui/settings/CtbrecPreferencesStorage.java @@ -2,16 +2,22 @@ package ctbrec.ui.settings; import java.io.IOException; import java.lang.reflect.Field; +import java.util.Arrays; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ctbrec.Config; import ctbrec.Settings; +import ctbrec.StringUtil; import ctbrec.ui.settings.api.Preferences; import ctbrec.ui.settings.api.PreferencesStorage; +import ctbrec.ui.settings.api.SelectionSetting; +import ctbrec.ui.settings.api.Setting; +import javafx.collections.FXCollections; import javafx.scene.Node; import javafx.scene.control.CheckBox; +import javafx.scene.control.ComboBox; import javafx.scene.control.Label; import javafx.scene.control.TextField; @@ -40,11 +46,14 @@ public class CtbrecPreferencesStorage implements PreferencesStorage { } @Override - public Node createGui(String key) throws Exception { + public Node createGui(Setting setting) throws Exception { + String key = setting.getKey(); Field field = Settings.class.getField(key); Class t = field.getType(); Object value = field.get(settings); - if (t == String.class) { + if(setting instanceof SelectionSetting) { + return createComboBox(key, ((SelectionSetting) setting).getOptions()); + } else if (t == String.class) { return createStringProperty(key, (String) value); } else if (t == int.class || t == Integer.class) { return createIntegerProperty(key, (Integer) value); @@ -91,6 +100,21 @@ public class CtbrecPreferencesStorage implements PreferencesStorage { return ctrl; } + private Node createComboBox(String key, Object[] options) throws NoSuchFieldException, IllegalAccessException { + @SuppressWarnings({ "rawtypes", "unchecked" }) + ComboBox comboBox = new ComboBox(FXCollections.observableList(Arrays.asList(options))); + Field field = Settings.class.getField(key); + Object value = field.get(settings); + if(StringUtil.isNotBlank(value.toString())) { + comboBox.getSelectionModel().select(value); + } + comboBox.valueProperty().addListener((obs, oldV, newV) -> saveValue(() -> { + field.set(settings, newV); + config.save(); + })); + return comboBox; + } + private void saveValue(Exec exe) { try { exe.run(); diff --git a/client/src/main/java/ctbrec/ui/settings/SettingsTab.java b/client/src/main/java/ctbrec/ui/settings/SettingsTab.java index 99e13575..fcbfe242 100644 --- a/client/src/main/java/ctbrec/ui/settings/SettingsTab.java +++ b/client/src/main/java/ctbrec/ui/settings/SettingsTab.java @@ -745,7 +745,7 @@ public class SettingsTab extends Tab implements TabSelectionListener { l = new Label("Colors (Base / Accent)"); layout.add(l, 0, row); - ColorSettingsPane colorSettingsPane = new ColorSettingsPane(this); + ColorSettingsPane colorSettingsPane = new ColorSettingsPane(Config.getInstance()); layout.add(colorSettingsPane, 1, row++); GridPane.setMargin(l, new Insets(0, 0, 0, 0)); GridPane.setMargin(colorSettingsPane, new Insets(0, 0, 0, CHECKBOX_MARGIN)); diff --git a/client/src/main/java/ctbrec/ui/settings/SettingsTab2.java b/client/src/main/java/ctbrec/ui/settings/SettingsTab2.java index 67bf5245..32304faa 100644 --- a/client/src/main/java/ctbrec/ui/settings/SettingsTab2.java +++ b/client/src/main/java/ctbrec/ui/settings/SettingsTab2.java @@ -1,5 +1,7 @@ package ctbrec.ui.settings; +import static ctbrec.Settings.ProxyType.*; + import java.util.ArrayList; import java.util.List; @@ -18,13 +20,15 @@ public class SettingsTab2 extends Tab implements TabSelectionListener { private List sites; private Recorder recorder; + private Preferences prefs; + private boolean initialized = false; public SettingsTab2(List sites, Recorder recorder) { this.sites = sites; this.recorder = recorder; setText("Settings"); - createGui(); setClosable(false); + } private void createGui() { @@ -33,33 +37,60 @@ public class SettingsTab2 extends Tab implements TabSelectionListener { siteCategories.add(Category.of(site.getName(), SiteUiFactory.getUi(site).getConfigUI().createConfigPanel())); } - Preferences prefs = Preferences.of(new CtbrecPreferencesStorage(Config.getInstance()), + prefs = Preferences.of(new CtbrecPreferencesStorage(Config.getInstance()), Category.of("General", Group.of("General", - Setting.of("Player", "mediaPlayer"), - Setting.of("Start parameters", "mediaPlayerParams"), - Setting.of("Maximum resolution (0 = unlimited)", "maximumResolutionPlayer", "video height, e.g. 720 or 1080")), + Setting.of("User-Agent", "httpUserAgent"), + Setting.of("User-Agent mobile", "httpUserAgentMobile"), + Setting.of("Update overview interval (seconds)", "overviewUpdateIntervalInSecs", "Update the thumbnail overviews every x seconds"), + Setting.of("Update thumbnails", "updateThumbnails", "The overviews will still be updated, but the thumbnails won't be changed. This is useful for less powerful systems."), + Setting.of("Display stream resolution in overview", "determineResolution"), + Setting.of("Manually select stream quality", "chooseStreamQuality", "Opens a dialog to select the video resolution before recording"), + Setting.of("Enable live previews (experimental)", "livePreviews"), + Setting.of("Start Tab", "startTab", getTabNames()), + Setting.of("Colors (Base / Accent)", null, new ColorSettingsPane(Config.getInstance())) + ), Group.of("Player", Setting.of("Player", "mediaPlayer"), Setting.of("Start parameters", "mediaPlayerParams"), Setting.of("Maximum resolution (0 = unlimited)", "maximumResolutionPlayer", "video height, e.g. 720 or 1080"), - Setting.of("Show \"Player Starting\" Message", "showPlayerStarting")) + Setting.of("Show \"Player Starting\" Message", "showPlayerStarting"), + Setting.of("Start only one player at a time", "singlePlayer") + ) ), - Category.of("Sites", siteCategories.toArray(new Category[0])) + Category.of("Sites", siteCategories.toArray(new Category[0])), + Category.of("Proxy", + Group.of("Proxy", + Setting.of("Type", "proxyType", DIRECT, HTTP, SOCKS4, SOCKS5), + Setting.of("Host", "proxyHost"), + Setting.of("Port", "proxyPort"), + Setting.of("Username", "proxyUser"), + Setting.of("Password", "proxyPassword") + ) + ) ); setContent(prefs.getView()); } + private Object[] getTabNames() { + List tabNames = new ArrayList<>(); + for (Tab tab : getTabPane().getTabs()) { + tabNames.add(tab.getText()); + } + return tabNames.toArray(new String[0]); + } + @Override public void selected() { - // TODO Auto-generated method stub - + if (!initialized) { + createGui(); + initialized = true; + } } @Override public void deselected() { - // TODO Auto-generated method stub - + // TODO maybe save the config ?!? } diff --git a/client/src/main/java/ctbrec/ui/settings/api/Preferences.java b/client/src/main/java/ctbrec/ui/settings/api/Preferences.java index fe322d0e..b1520564 100644 --- a/client/src/main/java/ctbrec/ui/settings/api/Preferences.java +++ b/client/src/main/java/ctbrec/ui/settings/api/Preferences.java @@ -8,6 +8,7 @@ import org.slf4j.LoggerFactory; import ctbrec.ui.controls.SearchBox; import javafx.beans.value.ObservableValue; import javafx.geometry.Insets; +import javafx.geometry.VPos; import javafx.scene.Node; import javafx.scene.control.Label; import javafx.scene.control.Tooltip; @@ -83,7 +84,7 @@ public class Preferences { main.setCenter(gui); } }); - + categoryTree.getSelectionModel().select(0); return main; } @@ -150,12 +151,14 @@ public class Preferences { for (Setting setting : settings) { Node node = setting.getGui(); Label label = new Label(setting.getName()); + label.setMinHeight(34); label.labelForProperty().set(node); - if (setting.getTooltip() != null) { - label.setTooltip(new Tooltip(setting.getTooltip())); - } + label.setTooltip(new Tooltip(setting.getName())); pane.addRow(row++, label, node); + GridPane.setVgrow(label, Priority.ALWAYS); + GridPane.setValignment(label, VPos.CENTER); GridPane.setMargin(node, new Insets(5, 0, 5, 10)); + GridPane.setValignment(node, VPos.CENTER); GridPane.setHgrow(node, Priority.ALWAYS); } return pane; diff --git a/client/src/main/java/ctbrec/ui/settings/api/PreferencesStorage.java b/client/src/main/java/ctbrec/ui/settings/api/PreferencesStorage.java index b57d2ae2..c380eaa1 100644 --- a/client/src/main/java/ctbrec/ui/settings/api/PreferencesStorage.java +++ b/client/src/main/java/ctbrec/ui/settings/api/PreferencesStorage.java @@ -9,5 +9,5 @@ public interface PreferencesStorage { void save(Preferences preferences) throws IOException; void load(Preferences preferences); - Node createGui(String key) throws Exception; + Node createGui(Setting setting) throws Exception; } diff --git a/client/src/main/java/ctbrec/ui/settings/api/SelectionSetting.java b/client/src/main/java/ctbrec/ui/settings/api/SelectionSetting.java new file mode 100644 index 00000000..4dec3327 --- /dev/null +++ b/client/src/main/java/ctbrec/ui/settings/api/SelectionSetting.java @@ -0,0 +1,15 @@ +package ctbrec.ui.settings.api; + +public class SelectionSetting extends Setting { + + private Object[] options; + + public SelectionSetting(String name, String key, Object[] options) { + super(name, key); + this.options = options; + } + + public Object[] getOptions() { + return options; + } +} diff --git a/client/src/main/java/ctbrec/ui/settings/api/Setting.java b/client/src/main/java/ctbrec/ui/settings/api/Setting.java index f04891e0..63f842b9 100644 --- a/client/src/main/java/ctbrec/ui/settings/api/Setting.java +++ b/client/src/main/java/ctbrec/ui/settings/api/Setting.java @@ -16,8 +16,9 @@ public class Setting { private Property property; private Node gui; private PreferencesStorage preferencesStorage; + private boolean needsRestart = false; - private Setting(String name, String key) { + protected Setting(String name, String key) { this.name = name; this.key = key; } @@ -32,18 +33,37 @@ public class Setting { return setting; } - String getName() { + public static Setting of(String name, String key, Object...options) { + return new SelectionSetting(name, key, options); + } + + public static Setting of(String name, String key, Node gui) { + Setting setting = new Setting(name, key); + setting.gui = gui; + return setting; + } + + public String getName() { return name; } - String getKey() { + public String getKey() { return key; } - String getTooltip() { + public String getTooltip() { return tooltip; } + public Setting needsRestart() { + needsRestart = true; + return this; + } + + public boolean doesNeedRestart() { + return needsRestart; + } + @SuppressWarnings("rawtypes") Property getProperty() { return property; @@ -51,7 +71,7 @@ public class Setting { Node getGui() throws Exception { if (gui == null) { - gui = preferencesStorage.createGui(key); + gui = preferencesStorage.createGui(this); if (gui instanceof Control && StringUtil.isNotBlank(tooltip)) { Control control = (Control) gui; control.setTooltip(new Tooltip(tooltip));