100 lines
3.7 KiB
Java
100 lines
3.7 KiB
Java
package ctbrec.ui.settings;
|
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.nio.file.Files;
|
|
import java.util.List;
|
|
import ctbrec.Config;
|
|
import ctbrec.ui.controls.Dialogs;
|
|
import javafx.collections.FXCollections;
|
|
import javafx.collections.ObservableList;
|
|
import javafx.scene.control.Button;
|
|
import javafx.scene.control.ComboBox;
|
|
import javafx.scene.control.ListCell;
|
|
import javafx.scene.layout.HBox;
|
|
import javafx.scene.text.Font;
|
|
|
|
@Slf4j
|
|
public class FontSettingsPane extends HBox {
|
|
private ComboBox<String> fontFaceCombo;
|
|
private ComboBox<Integer> fontSizeCombo;
|
|
|
|
private SettingsTab settingsTab;
|
|
private Config config;
|
|
|
|
public FontSettingsPane(SettingsTab settingsTab, Config config) {
|
|
this.settingsTab = settingsTab;
|
|
this.config = config;
|
|
setSpacing(5);
|
|
getChildren().addAll(buildFontFaceCombo(), buildFontSizeCombo(), buildFontResetButton());
|
|
}
|
|
|
|
private ComboBox<String> buildFontFaceCombo() {
|
|
ObservableList<String> lst = FXCollections.observableList(javafx.scene.text.Font.getFamilies());
|
|
fontFaceCombo = new ComboBox<>(lst);
|
|
fontFaceCombo.getSelectionModel().select(0);
|
|
fontFaceCombo.setCellFactory((listview -> new ListCell<String>() {
|
|
@Override
|
|
protected void updateItem(String family, boolean empty) {
|
|
super.updateItem(family, empty);
|
|
if (empty) {
|
|
setText(null);
|
|
} else {
|
|
setFont(Font.font(family));
|
|
setText(family);
|
|
}
|
|
}
|
|
}));
|
|
fontFaceCombo.getSelectionModel().select(config.getSettings().fontFamily);
|
|
fontFaceCombo.setOnAction(evt -> saveFontConfig());
|
|
return fontFaceCombo;
|
|
}
|
|
|
|
private ComboBox<Integer> buildFontSizeCombo() {
|
|
ObservableList<Integer> lst = FXCollections
|
|
.observableList(List.of(4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 22, 24, 26, 28, 32, 48, 64, 72, 80, 96, 128));
|
|
fontSizeCombo = new ComboBox<>(lst);
|
|
fontSizeCombo.setOnAction(evt -> saveFontConfig());
|
|
int size = config.getSettings().fontSize;
|
|
int selectedIndex = Math.max(0, lst.indexOf(size));
|
|
fontSizeCombo.getSelectionModel().select(selectedIndex);
|
|
return fontSizeCombo;
|
|
}
|
|
|
|
private void saveFontConfig() {
|
|
Font font = Font.font(fontFaceCombo.getSelectionModel().getSelectedItem());
|
|
int size = fontSizeCombo.getSelectionModel().getSelectedItem();
|
|
String css = ".root {\n -fx-font: " + size + " '" + font.getFamily() + "';\n}";
|
|
config.getSettings().fontFamily = font.getFamily();
|
|
config.getSettings().fontSize = size;
|
|
try {
|
|
config.save();
|
|
Files.writeString(getFontCssFile().toPath(), css);
|
|
settingsTab.showRestartRequired();
|
|
} catch (IOException e) {
|
|
log.error("Couldn't write font file", e);
|
|
Dialogs.showError(getScene(), "Error saving configuration", "The font stylesheet file couldn't be written", e);
|
|
}
|
|
}
|
|
|
|
private File getFontCssFile() {
|
|
return new File(Config.getInstance().getConfigDir(), "font.css");
|
|
}
|
|
|
|
private Button buildFontResetButton() {
|
|
var button = new Button("Reset");
|
|
button.setOnAction(evt -> {
|
|
try {
|
|
Files.delete(getFontCssFile().toPath());
|
|
settingsTab.showRestartRequired();
|
|
} catch (IOException e) {
|
|
log.error("Couldn't delete font file", e);
|
|
Dialogs.showError(getScene(), "Error resetting font configuration", "The font stylesheet file couldn't be deleted", e);
|
|
}
|
|
});
|
|
return button;
|
|
}
|
|
}
|