Polished settings mechanism

* Set initial value of onCloseMode setting to true
* Added setting change handlers
* Applying settings changes immediately
* Made PrimaryToggleSwitch round
This commit is contained in:
Kai S. K. Engelbart 2019-12-23 16:33:13 +01:00
parent 4ef0b3352c
commit 07b2c73b50
8 changed files with 39 additions and 78 deletions

View File

@ -102,7 +102,7 @@ public class Settings {
private void supplementDefaults() { private void supplementDefaults() {
items.putIfAbsent("enterToSend", new SettingsItem<>(true, "Enter to send", "Sends a message by pressing the enter key.")); items.putIfAbsent("enterToSend", new SettingsItem<>(true, "Enter to send", "Sends a message by pressing the enter key."));
items.putIfAbsent("onCloseMode", new SettingsItem<>(false, "Hide on close", "Hides the chat window when it is closed.")); items.putIfAbsent("onCloseMode", new SettingsItem<>(true, "Hide on close", "Hides the chat window when it is closed."));
items.putIfAbsent("currentTheme", new SettingsItem<>("dark", null)); items.putIfAbsent("currentTheme", new SettingsItem<>("dark", null));
} }

View File

@ -3,6 +3,7 @@ package envoy.client;
import java.io.Serializable; import java.io.Serializable;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.function.Consumer;
import javax.swing.JComponent; import javax.swing.JComponent;
@ -21,12 +22,14 @@ public class SettingsItem<T> implements Serializable {
private Class<? extends JComponent> componentClass; private Class<? extends JComponent> componentClass;
private String userFriendlyName, description; private String userFriendlyName, description;
transient private Consumer<T> changeHandler;
private static final Map<Class<?>, Class<? extends JComponent>> componentClasses = new HashMap<>(); private static final Map<Class<?>, Class<? extends JComponent>> componentClasses = new HashMap<>();
private static final long serialVersionUID = 2146837835556852218L; private static final long serialVersionUID = 2146837835556852218L;
static { static {
componentClasses.put(boolean.class, PrimaryToggleSwitch.class); componentClasses.put(Boolean.class, PrimaryToggleSwitch.class);
} }
public SettingsItem(T value, String userFriendlyName, String description) { public SettingsItem(T value, String userFriendlyName, String description) {
@ -53,7 +56,11 @@ public class SettingsItem<T> implements Serializable {
/** /**
* @param value the value to set * @param value the value to set
*/ */
public void set(T value) { this.value = value; } public void set(T value) {
if(changeHandler != null && value != this.value)
changeHandler.accept(value);
this.value = value;
}
/** /**
* @return the componentClass * @return the componentClass
@ -84,4 +91,9 @@ public class SettingsItem<T> implements Serializable {
* @param description the description to set * @param description the description to set
*/ */
public void setDescription(String description) { this.description = description; } public void setDescription(String description) { this.description = description; }
/**
* @param changeHandler the changeHandler to set
*/
public void setChangeHandler(Consumer<T> changeHandler) { this.changeHandler = changeHandler; changeHandler.accept(value); }
} }

View File

@ -1,27 +0,0 @@
package envoy.client.event;
/**
* Encapsulates a change to the {@code enterToSend} setting.<br>
* <br>
* Project: <strong>envoy-client</strong><br>
* File: <strong>EnterToSendEvent.java</strong><br>
* Created: <strong>22 Dec 2019</strong><br>
*
* @author Maximilian K&auml;fer
* @since Envoy v0.3-alpha
*/
public class EnterToSendEvent implements Event<Boolean> {
private boolean mode;
/**
* Initializes an {@link EnterToSendEvent}.
*
* @param mode the state of the {@code enterToSend} setting
* @since Envoy 0.3-alpha
*/
public EnterToSendEvent(boolean mode) { this.mode = mode; }
@Override
public Boolean get() { return mode; }
}

View File

@ -1,27 +0,0 @@
package envoy.client.event;
/**
* Encapsulates a change to the {@code currentOnCloseMode} setting.<br>
* <br>
* Project: <strong>envoy-client</strong><br>
* File: <strong>OnCloseChangeEvent.java</strong><br>
* Created: <strong>22 Dec 2019</strong><br>
*
* @author Maximilian K&auml;fer
* @since Envoy v0.3-alpha
*/
public class OnCloseChangeEvent implements Event<Boolean> {
private boolean closeMode;
/**
* Initializes an {@link OnCloseChangeEvent}.
*
* @param closeMode the state of the {@code currentOnCloseMode} setting
* @since Envoy 0.3-alpha
*/
public OnCloseChangeEvent(boolean closeMode) { this.closeMode = closeMode; }
@Override
public Boolean get() { return closeMode; }
}

View File

@ -47,14 +47,13 @@ public class PrimaryToggleSwitch extends JButton {
@Override @Override
public void paintComponent(Graphics g) { public void paintComponent(Graphics g) {
g.setColor(state ? Color.GREEN : Color.LIGHT_GRAY); g.setColor(state ? Color.GREEN : Color.LIGHT_GRAY);
g.fillRect(0, 0, getWidth(), getHeight()); g.fillRoundRect(0, 0, getWidth(), getHeight(), 25, 25);
g.setColor(Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getInteractableBackgroundColor()); g.setColor(Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()).getInteractableBackgroundColor());
if (state) { if (state)
g.fillRect(25, 0, 25, 25); g.fillRoundRect(25, 0, 25, 25, 25, 25);
} else { else
g.fillRect(0, 0, 25, 25); g.fillRoundRect(0, 0, 25, 25, 25, 25);
}
} }
} }

View File

@ -143,8 +143,7 @@ public class Startup {
new StatusTrayIcon(chatWindow).show(); new StatusTrayIcon(chatWindow).show();
// If the tray icon is supported and corresponding settings is set, hide the chat window on close // If the tray icon is supported and corresponding settings is set, hide the chat window on close
if (Settings.getInstance().getCurrentOnCloseMode()) Settings.getInstance().getItems().get("onCloseMode").setChangeHandler((onCloseMode) -> chatWindow.setDefaultCloseOperation((boolean) onCloseMode ? JFrame.HIDE_ON_CLOSE : JFrame.EXIT_ON_CLOSE));
chatWindow.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
} catch (EnvoyException e) { } catch (EnvoyException e) {
logger.warning("The StatusTrayIcon is not supported on this platform!"); logger.warning("The StatusTrayIcon is not supported on this platform!");
} }

View File

@ -4,13 +4,14 @@ import java.awt.GridBagConstraints;
import java.awt.GridBagLayout; import java.awt.GridBagLayout;
import java.awt.Insets; import java.awt.Insets;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.swing.JComponent;
import javax.swing.JTextPane; import javax.swing.JTextPane;
import envoy.client.Settings; import envoy.client.Settings;
import envoy.client.SettingsItem; import envoy.client.SettingsItem;
import envoy.client.ui.PrimaryToggleSwitch;
import envoy.client.ui.Theme; import envoy.client.ui.Theme;
import envoy.client.util.EnvoyLog; import envoy.client.util.EnvoyLog;
@ -24,11 +25,12 @@ import envoy.client.util.EnvoyLog;
* @author Maximilian K&auml;fer * @author Maximilian K&auml;fer
* @since Envoy v0.3-alpha * @since Envoy v0.3-alpha
*/ */
public class General extends SettingsPanel { public class GeneralSettingsPanel extends SettingsPanel {
private Theme theme; private Theme theme;
private static final Logger logger = EnvoyLog.getLogger(General.class.getSimpleName()); private static final String[] items = { "onCloseMode", "enterToSend" };
private static final Logger logger = EnvoyLog.getLogger(GeneralSettingsPanel.class.getSimpleName());
private static final long serialVersionUID = -7470848775130754239L; private static final long serialVersionUID = -7470848775130754239L;
/** /**
@ -37,7 +39,7 @@ public class General extends SettingsPanel {
* *
* @since Envoy 0.3-alpha * @since Envoy 0.3-alpha
*/ */
public General() { public GeneralSettingsPanel() {
theme = Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme()); theme = Settings.getInstance().getThemes().get(Settings.getInstance().getCurrentTheme());
setBackground(theme.getCellColor()); setBackground(theme.getCellColor());
@ -50,21 +52,24 @@ public class General extends SettingsPanel {
setLayout(gbl_general); setLayout(gbl_general);
createSettingElement(0, (SettingsItem<Boolean>) Settings.getInstance().getItems().get("onCloseMode")); for (int i = 0; i < items.length; i++)
try {
createSettingElement(1, (SettingsItem<Boolean>) Settings.getInstance().getItems().get("enterToSend")); createSettingElement(i, Settings.getInstance().getItems().get(items[i]));
} catch (SecurityException | ReflectiveOperationException e) {
logger.log(Level.WARNING, "Could not create settings item", e);
}
} }
private void createSettingElement(int gridy, SettingsItem<Boolean> settingsItem) { private void createSettingElement(int gridy, SettingsItem<?> settingsItem) throws SecurityException, ReflectiveOperationException {
JTextPane descriptionText = new JTextPane(); JTextPane descriptionText = new JTextPane();
PrimaryToggleSwitch toggleSwitch = new PrimaryToggleSwitch(settingsItem); JComponent settingComponent = settingsItem.getComponent();
GridBagConstraints gbc_toggleSwitch = new GridBagConstraints(); GridBagConstraints gbc_toggleSwitch = new GridBagConstraints();
gbc_toggleSwitch.gridx = 1; gbc_toggleSwitch.gridx = 1;
gbc_toggleSwitch.gridy = gridy; gbc_toggleSwitch.gridy = gridy;
add(toggleSwitch, gbc_toggleSwitch); add(settingComponent, gbc_toggleSwitch);
descriptionText.setText(settingsItem.getDescription()); descriptionText.setText(settingsItem.getDescription());
descriptionText.setBackground(theme.getBackgroundColor()); descriptionText.setBackground(theme.getBackgroundColor());

View File

@ -57,7 +57,7 @@ public class SettingsScreen extends JDialog {
public SettingsScreen() { public SettingsScreen() {
// Initialize settings pages // Initialize settings pages
Map<String, Class<? extends SettingsPanel>> panels = new HashMap<>(); Map<String, Class<? extends SettingsPanel>> panels = new HashMap<>();
panels.put("General", General.class); panels.put("General", GeneralSettingsPanel.class);
panels.put("Color Themes", ThemeCustomizationPanel.class); panels.put("Color Themes", ThemeCustomizationPanel.class);
setBounds(10, 10, 450, 650); setBounds(10, 10, 450, 650);