Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,19 @@
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.stage.Stage;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;

import java.io.IOException;
import java.util.Locale;
import java.util.Properties;
import java.util.ResourceBundle;
import java.util.concurrent.TimeUnit;

Expand Down Expand Up @@ -50,7 +52,6 @@ public final class SettingsWindowController {
private MainWindowController mainWindowController;
private SettingsController settingsController;
private ResourceBundle translationBundle;
private Properties properties;

private final Logger logger;

Expand Down Expand Up @@ -80,15 +81,29 @@ public void setSettingsController(final SettingsController settingsController) {
throw new NullPointerException("SettingsController cannot be null!");

this.settingsController = settingsController;

properties = settingsController.getProperties();
final String languageTag = properties.getProperty("locale", DEFAULT_LOCALE);
final String languageTag = settingsController.getProperties().getProperty("locale", DEFAULT_LOCALE);

logger.info("Attempting to load the ResourceBundle for locale {}", languageTag);

final Locale locale = Locale.forLanguageTag(languageTag);
translationBundle = ResourceBundle.getBundle("translations.OpalApplication", locale);

final ObservableList<String> options = FXCollections.observableArrayList(
translationBundle.getString("Seconds"),
translationBundle.getString("Minutes"),
translationBundle.getString("Hours")
);

final ObservableList<String> themes = FXCollections.observableArrayList(
translationBundle.getString("Light"),
translationBundle.getString("Dark"),
translationBundle.getString("NordLight"),
translationBundle.getString("NordDark")
);

cboTheme.setItems(themes);
cboDelayType.setItems(options);

loadSettings();
}

Expand All @@ -106,25 +121,14 @@ public void setMainWindowController(final MainWindowController mainWindowControl
*/
private void loadSettings() {
logger.info("Attempting to load all settings");
final boolean autoUpdate = Boolean.parseBoolean(properties.getProperty("autoUpdate", "true"));
final boolean mediaButtons = Boolean.parseBoolean(properties.getProperty("mediaButtons", "true"));
final boolean dragDrop = Boolean.parseBoolean(properties.getProperty("dragDrop", "true"));
final String locale = properties.getProperty("locale", DEFAULT_LOCALE);
final String logLevel = properties.getProperty("loglevel", "INFO");
long timerDelay = Long.parseLong(properties.getProperty("timerDelay", "3600000"));
final int delayType = Integer.parseInt(properties.getProperty("timerDelayType", "0"));
final String theme = properties.getProperty("theme", "light");
long timerDelay = Long.parseLong(settingsController.getProperties().getProperty("timerDelay", "3600000"));
final int delayType = Integer.parseInt(settingsController.getProperties().getProperty("timerDelayType", "0"));

if (timerDelay < 1) {
timerDelay = 1;
}

chbAutoUpdate.setSelected(autoUpdate);
chbMediaButtons.setSelected(mediaButtons);
chbDragDrop.setSelected(dragDrop);
chbTimerApplicationShutdown.setSelected(Boolean.parseBoolean(properties.getProperty("timerApplicationShutdown", "false")));

switch (locale.toLowerCase()) {
switch (settingsController.getProperties().getProperty("locale", DEFAULT_LOCALE).toLowerCase()) {
case "de-de" -> cboLanguage.getSelectionModel().select(1);
case "es-es" -> cboLanguage.getSelectionModel().select(2);
case "fr-fr" -> cboLanguage.getSelectionModel().select(3);
Expand All @@ -133,7 +137,7 @@ private void loadSettings() {
default -> cboLanguage.getSelectionModel().select(0);
}

switch (logLevel) {
switch (settingsController.getProperties().getProperty("loglevel", "INFO").toUpperCase()) {
case "OFF" -> cboLogLevel.getSelectionModel().select(0);
case "FATAL" -> cboLogLevel.getSelectionModel().select(1);
case "ERROR" -> cboLogLevel.getSelectionModel().select(2);
Expand All @@ -144,30 +148,12 @@ private void loadSettings() {
default -> cboLogLevel.getSelectionModel().select(4);
}

final ObservableList<String> options = FXCollections.observableArrayList(
translationBundle.getString("Seconds"),
translationBundle.getString("Minutes"),
translationBundle.getString("Hours")
);

final ObservableList<String> themes = FXCollections.observableArrayList(
translationBundle.getString("Light"),
translationBundle.getString("Dark"),
translationBundle.getString("NordLight"),
translationBundle.getString("NordDark")
);

cboDelayType.setItems(options);
cboDelayType.getSelectionModel().select(delayType);

final int themeIndex = switch (theme) {
final int themeIndex = switch (settingsController.getProperties().getProperty("theme", "light").toLowerCase()) {
case "dark" -> 1;
case "nordlight" -> 2;
case "norddark" -> 3;
default -> 0;
};
cboTheme.setItems(themes);
cboTheme.getSelectionModel().select(themeIndex);

final long correctDelay = switch (delayType) {
case 0 -> TimeUnit.MILLISECONDS.toSeconds(timerDelay);
Expand All @@ -176,6 +162,12 @@ private void loadSettings() {
default -> throw new IllegalStateException("Unexpected value: " + delayType);
};

chbAutoUpdate.setSelected(Boolean.parseBoolean(settingsController.getProperties().getProperty("autoUpdate", "true")));
chbMediaButtons.setSelected(Boolean.parseBoolean(settingsController.getProperties().getProperty("mediaButtons", "true")));
chbDragDrop.setSelected(Boolean.parseBoolean(settingsController.getProperties().getProperty("dragDrop", "true")));
chbTimerApplicationShutdown.setSelected(Boolean.parseBoolean(settingsController.getProperties().getProperty("timerApplicationShutdown", "false")));
cboDelayType.getSelectionModel().select(delayType);
cboTheme.getSelectionModel().select(themeIndex);
numDelay.setText(String.valueOf(correctDelay));
}

Expand All @@ -194,7 +186,7 @@ private void resetSettingsAction() {
settingsController.setProperties(settingsController.readPropertiesFile());
mainWindowController.loadMediaButtonVisibility(Boolean.parseBoolean(settingsController.getProperties().getProperty("mediaButtons", "true")));

setSettingsController(settingsController);
loadSettings();
} catch (final IOException ex) {
logger.error("Unable to reset all settings", ex);
FxUtils.showErrorAlert(translationBundle.getString("ResetSettingsError"), ex.getMessage(), getClass().getResourceAsStream(SharedVariables.ICON_URL));
Expand All @@ -209,42 +201,42 @@ private void resetSettingsAction() {
private void saveSettingsAction() {
logger.info("Attempting to save all settings");

properties.setProperty("autoUpdate", Boolean.toString(chbAutoUpdate.isSelected()));
properties.setProperty("mediaButtons", Boolean.toString(chbMediaButtons.isSelected()));
properties.setProperty("dragDrop", Boolean.toString(chbDragDrop.isSelected()));
settingsController.getProperties().setProperty("autoUpdate", Boolean.toString(chbAutoUpdate.isSelected()));
settingsController.getProperties().setProperty("mediaButtons", Boolean.toString(chbMediaButtons.isSelected()));
settingsController.getProperties().setProperty("dragDrop", Boolean.toString(chbDragDrop.isSelected()));
mainWindowController.loadMediaButtonVisibility(chbMediaButtons.isSelected());

showAlertIfLanguageMismatch(properties.getProperty("locale", DEFAULT_LOCALE));
showAlertIfLanguageMismatch(settingsController.getProperties().getProperty("locale", DEFAULT_LOCALE));

switch (cboLanguage.getSelectionModel().getSelectedIndex()) {
case 1 -> properties.setProperty("locale", "de-DE");
case 2 -> properties.setProperty("locale", "es-es");
case 3 -> properties.setProperty("locale", "fr-FR");
case 4 -> properties.setProperty("locale", "nl-NL");
case 5 -> properties.setProperty("locale", "ru-RU");
default -> properties.setProperty("locale", DEFAULT_LOCALE);
case 1 -> settingsController.getProperties().setProperty("locale", "de-DE");
case 2 -> settingsController.getProperties().setProperty("locale", "es-es");
case 3 -> settingsController.getProperties().setProperty("locale", "fr-FR");
case 4 -> settingsController.getProperties().setProperty("locale", "nl-NL");
case 5 -> settingsController.getProperties().setProperty("locale", "ru-RU");
default -> settingsController.getProperties().setProperty("locale", DEFAULT_LOCALE);
}

switch (cboTheme.getSelectionModel().getSelectedIndex()) {
case 1:
properties.setProperty("theme", "dark");
case 1 -> {
settingsController.getProperties().setProperty("theme", "dark");
Application.setUserAgentStylesheet(new PrimerDark().getUserAgentStylesheet());
break;
case 2:
properties.setProperty("theme", "nordlight");
}
case 2 -> {
settingsController.getProperties().setProperty("theme", "nordlight");
Application.setUserAgentStylesheet(new NordLight().getUserAgentStylesheet());
break;
case 3:
properties.setProperty("theme", "norddark");
}
case 3 -> {
settingsController.getProperties().setProperty("theme", "norddark");
Application.setUserAgentStylesheet(new NordDark().getUserAgentStylesheet());
break;
default:
properties.setProperty("theme", "light");
}
default -> {
settingsController.getProperties().setProperty("theme", "light");
Application.setUserAgentStylesheet(new PrimerLight().getUserAgentStylesheet());
break;
}
}

properties.setProperty("loglevel", cboLogLevel.getValue());
settingsController.getProperties().setProperty("loglevel", cboLogLevel.getValue());

final Level level = switch (cboLogLevel.getValue()) {
case "OFF" -> Level.OFF;
Expand Down Expand Up @@ -272,20 +264,17 @@ private void saveSettingsAction() {
default -> throw new IllegalStateException("Unexpected value: " + delayType);
};

properties.setProperty("timerDelay", String.valueOf(correctDelay));
properties.setProperty("timerDelayType", String.valueOf(delayType));
properties.setProperty("timerApplicationShutdown", String.valueOf(chbTimerApplicationShutdown.isSelected()));
settingsController.getProperties().setProperty("timerDelay", String.valueOf(correctDelay));
settingsController.getProperties().setProperty("timerDelayType", String.valueOf(delayType));
settingsController.getProperties().setProperty("timerApplicationShutdown", String.valueOf(chbTimerApplicationShutdown.isSelected()));

Configurator.setAllLevels(LogManager.getRootLogger().getName(), level);
settingsController.setProperties(properties);
try {
settingsController.saveProperties();
} catch (final IOException ex) {
logger.error("Unable to save all settings", ex);
FxUtils.showErrorAlert(translationBundle.getString("SaveSettingsError"), ex.getMessage(), getClass().getResourceAsStream(SharedVariables.ICON_URL));
}

setSettingsController(settingsController);
}

/**
Expand All @@ -307,4 +296,15 @@ private void showAlertIfLanguageMismatch(final String languageToMatch) {
FxUtils.showInformationAlert(translationBundle.getString("RestartRequired"), getClass().getResourceAsStream(SharedVariables.ICON_URL));
}
}

/**
* Method that is invoked when the window should be closed
*
* @param event The {@link ActionEvent} object
*/
@FXML
private void cancelAction(final ActionEvent event) {
logger.info("Closing SettingsWindow");
((Stage) (((Button) event.getSource()).getScene().getWindow())).close();
}
}
28 changes: 14 additions & 14 deletions src/main/java/com/codedead/opal/domain/SoundPane.java
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,20 @@ public SoundPane() throws IOException {
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
fxmlLoader.load();
}

/**
* Method that is invoked to initialize the FXML object
*/
@FXML
private void initialize() {
sldVolume.valueProperty().addListener((observable, oldValue, newValue) -> {
if (newValue != null && newValue.doubleValue() == 0 && (oldValue != null && oldValue.doubleValue() != 0)) {
pause();
} else if (newValue != null && newValue.doubleValue() > 0 && (oldValue != null && oldValue.doubleValue() == 0)) {
play();
}
});

mediaPath.addListener(new ChangeListener<>() {
@Override
Expand Down Expand Up @@ -79,20 +93,6 @@ public void changed(ObservableValue<? extends MediaPlayer.Status> observable, Me
});
}

/**
* Method that is invoked to initialize the FXML object
*/
@FXML
private void initialize() {
sldVolume.valueProperty().addListener((observable, oldValue, newValue) -> {
if (newValue != null && newValue.doubleValue() == 0 && (oldValue != null && oldValue.doubleValue() != 0)) {
pause();
} else if (newValue != null && newValue.doubleValue() > 0 && (oldValue != null && oldValue.doubleValue() == 0)) {
play();
}
});
}

/**
* Get the image
*
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/translations/OpalApplication.properties
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,4 @@ NordLight=Nord light
NordDark=Nord dark
Space=Space
Restaurant=Restaurant
Cancel=Cancel
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,4 @@ NordLight=Nordlicht
NordDark=Norden dunkel
Space=Weltraum
Restaurant=Restaurant
Cancel=Abbrechen
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,4 @@ NordLight=Nord light
NordDark=Nord dark
Space=Space
Restaurant=Restaurant
Cancel=Cancel
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,4 @@ NordLight=Nord ligero
NordDark=Nord oscuro
Space=Espacio
Restaurant=Restaurante
Cancel=Cancelar
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,4 @@ NordLight=Nord clair
NordDark=Nord foncé
Space=L'espace
Restaurant=Restaurant
Cancel=Annuler
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Phone=Telefoon
Rain=Regen
Reset=Reset
ResetSettingsError=Kan de instellingen niet resetten!
RestartRequired=Een herstart is vereist om de taal te wijzigen!
RestartRequired=Gelieve de applicatie te herstarten om te taal te wijzigen.
Save=Opslaan
SaveSettingsError=Kan instellingen niet opslaan!
SaveSoundPreset=Sla geluidsinstellingen op
Expand Down Expand Up @@ -83,3 +83,4 @@ NordLight=Nord licht
NordDark=Nord donker
Space=De ruimte
Restaurant=Restaurant
Cancel=Annuleren
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,4 @@ NordLight=Норд лайт
NordDark=Норд темный
Space=Космос
Restaurant=Ресторан
Cancel=Отмена
21 changes: 15 additions & 6 deletions src/main/resources/windows/SettingsWindow.fxml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@
<?import com.codedead.opal.domain.NumberTextField?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.image.Image?>

<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="com.codedead.opal.controller.SettingsWindowController"
prefHeight="320.0" prefWidth="400.0">
prefHeight="320.0" prefWidth="450.0">

<rowConstraints>
<RowConstraints vgrow="ALWAYS"/>
Expand All @@ -27,7 +28,7 @@
<ColumnConstraints hgrow="ALWAYS"/>
</columnConstraints>

<TabPane GridPane.rowIndex="0" tabClosingPolicy="UNAVAILABLE">
<TabPane GridPane.rowIndex="0" tabClosingPolicy="UNAVAILABLE" side="LEFT">
<Tab text="%General">
<graphic>
<ImageView>
Expand Down Expand Up @@ -172,17 +173,25 @@
<columnConstraints>
<ColumnConstraints hgrow="ALWAYS"/>
<ColumnConstraints hgrow="ALWAYS"/>
<ColumnConstraints/>
</columnConstraints>

<Button GridPane.columnIndex="0" minWidth="100" text="%Reset" onAction="#resetSettingsAction">
<Button GridPane.columnIndex="0" minWidth="100" text="%Reset"
onAction="#resetSettingsAction" styleClass="danger">
<GridPane.margin>
<Insets bottom="5" left="5" right="5" top="5"/>
</GridPane.margin>
</Button>
<Button GridPane.columnIndex="1" GridPane.halignment="RIGHT" minWidth="100" text="%Save"
onAction="#saveSettingsAction">
<Button GridPane.columnIndex="1" GridPane.halignment="RIGHT" minWidth="100" text="%Cancel"
onAction="#cancelAction">
<GridPane.margin>
<Insets bottom="5" left="5" right="5" top="5"/>
<Insets bottom="5" right="5" top="5"/>
</GridPane.margin>
</Button>
<Button GridPane.columnIndex="2" GridPane.halignment="RIGHT" minWidth="100" text="%Save"
onAction="#saveSettingsAction" styleClass="success">
<GridPane.margin>
<Insets bottom="5" top="5" right="5"/>
</GridPane.margin>
</Button>
</GridPane>
Expand Down