From ac1464a9fb703dc7e399cdfb2602df85de8f9cac Mon Sep 17 00:00:00 2001 From: Josh Ashton Date: Thu, 21 Mar 2024 14:12:14 -0600 Subject: [PATCH] implemented fonts and documented settings class. --- src/App.java | 2 + src/Nav.java | 5 +- src/Settings.java | 56 ------------ src/gui/ComboBox.java | 8 +- src/gui/FileChooser.java | 26 +++++- src/gui/Settings.java | 192 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 228 insertions(+), 61 deletions(-) delete mode 100644 src/Settings.java create mode 100644 src/gui/Settings.java diff --git a/src/App.java b/src/App.java index 065bcc9..aa4a300 100644 --- a/src/App.java +++ b/src/App.java @@ -2,6 +2,8 @@ import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.UIManager; +import gui.Settings; + import java.awt.BorderLayout; import java.awt.Dimension; diff --git a/src/Nav.java b/src/Nav.java index da0a414..a40d17f 100644 --- a/src/Nav.java +++ b/src/Nav.java @@ -8,6 +8,7 @@ import javax.swing.JButton; import gui.ComboBox; import gui.FileChooser; +import gui.Settings; /** * The Nav class represents the Navigation bar at the top of the JFrame window. * @@ -87,7 +88,9 @@ public class Nav extends JPanel { */ private void createGUI() { JLabel elapsedTime = new JLabel("Elapsed Time: 00:00:00"); + elapsedTime.setFont(s.getFont()); // TODO: Make custom Label class. JButton solve = new JButton("Solve"); + solve.setFont(s.getFont()); // TODO: Make custom Button class. add(createFileOptions()); add(elapsedTime); @@ -100,7 +103,7 @@ public class Nav extends JPanel { * @return ComboBox */ private ComboBox createFileOptions() { - ComboBox fileOptions = new ComboBox<>(); + ComboBox fileOptions = new ComboBox<>(s); fileOptions.addItem("New"); fileOptions.addItem("Open"); fileOptions.addItem("Save"); diff --git a/src/Settings.java b/src/Settings.java deleted file mode 100644 index fcefba6..0000000 --- a/src/Settings.java +++ /dev/null @@ -1,56 +0,0 @@ - -import java.util.Scanner; -import java.io.File; - -/** - * A class solely to store user settings relating to default behaviors, - * difficulty, filepaths, and more. - * - * These user settings are stored in a {TBD} file located at {TBD}. - */ -public class Settings { - private int newFileProperties; - private String defaultDirectory; - - /** - * Create a new Settings object, initializing the default settings - * or reading in the settings from a file if it exists. - */ - public Settings() { - // TODO: Read in a file from the master default directory and populate - // settings, effectively toggles. If the file does not exist, - // populate it with the following values (possibly in .json). - newFileProperties = 0; - defaultDirectory = "C:\\Users\\jashton\\AppData\\Local\\Sudoku"; // TODO: This is a Windows default. Need OS detection. - } - - /** - * New File Properties is a configurable setting, where the following - * values are allowable: - * 0 - Load the last opened .sdku file, default behavior - * 1 - Create a new, blank .sdku file - * 2 - Create a new, random .sdku file - * - * @return int - */ - public int getNewFileProperties() { - return newFileProperties; - } - - /** - * The Default Directory is a configurable setting, where the user can - * specify a default directory to store .sdku files. This is useful for - * eliminating the need for user input for file operations. - * - * By default, the value will be "~/.config/sudoku/" on MacOS and Linux. - * On Windows, the value will be "~/AppData/Local/sudoku/". - * - * NOTE: This does not change the location that the settings file may - * be located in. This must be located at {TBD}. - * - * @return String - */ - public String getDefaultDirectory() { - return defaultDirectory; - } -} diff --git a/src/gui/ComboBox.java b/src/gui/ComboBox.java index 95e8c0d..6db084e 100644 --- a/src/gui/ComboBox.java +++ b/src/gui/ComboBox.java @@ -6,12 +6,18 @@ import javax.swing.JComboBox; * A custom JComboBox with the appropriate styling for the Sudoku app. */ public class ComboBox extends JComboBox { + private Settings s; /** * Create a new ComboBox with the default styling and without initial items. */ public ComboBox() { super(); + } + + public ComboBox(Settings s) { + super(); + this.s = s; style(); } @@ -20,6 +26,6 @@ public class ComboBox extends JComboBox { */ private void style() { // TODO: Style the ComboBox. - System.out.println("TODO: Style the ComboBox."); + setFont(s.getFont()); } } diff --git a/src/gui/FileChooser.java b/src/gui/FileChooser.java index 7066527..80bdcc9 100644 --- a/src/gui/FileChooser.java +++ b/src/gui/FileChooser.java @@ -9,10 +9,11 @@ import javax.swing.JFileChooser; * Additionally, this FileChooser only allows .sdku files to be selected. */ public class FileChooser extends JFileChooser { + private Settings s; /** * Create a new FileChooser with the default directory set to the user's - * Sudoku directory. + * Sudoku directory and no special styling. * * @param defaultDirectory */ @@ -21,6 +22,26 @@ public class FileChooser extends JFileChooser { for (File f: defaultDirectory.listFiles()) { ensureFileIsVisible(f); } + + style(); + setupSettings(); + } + + /** + * Create a new FileChooser with the default directory set to the user's + * Sudoku directory. + * + * @param defaultDirectory + * @param s + */ + public FileChooser(File defaultDirectory, Settings s) { + super(defaultDirectory); + this.s = s; + + for (File f: defaultDirectory.listFiles()) { + ensureFileIsVisible(f); + } + style(); setupSettings(); } @@ -30,7 +51,7 @@ public class FileChooser extends JFileChooser { */ private void style() { // TODO: Style the FileChooser. - System.out.println("TODO: Style the FileChooser."); + setFont(s.getFont()); } /** @@ -39,7 +60,6 @@ public class FileChooser extends JFileChooser { private void setupSettings() { setFileHidingEnabled(false); setFileSelectionMode(JFileChooser.FILES_ONLY); - rescanCurrentDirectory(); setFileFilter(new Filter()); } diff --git a/src/gui/Settings.java b/src/gui/Settings.java new file mode 100644 index 0000000..583f4ad --- /dev/null +++ b/src/gui/Settings.java @@ -0,0 +1,192 @@ +package gui; + +import java.util.Scanner; +import java.io.File; +import java.io.IOException; + +import java.awt.GraphicsEnvironment; +import java.awt.Font; +import java.awt.FontFormatException; + +/** + * A class solely to store user settings relating to default behaviors, + * difficulty, filepaths, and more. + * + * These user settings are stored in a {TBD} file located at {TBD}. + */ +public class Settings { + private final String os; + + private int newFileProperties; + private String defaultDirectory; + private Font font; + + /** + * Create a new Settings object, initializing the default settings + * or reading in the settings from settings file if it exists. + * + * While the defaultDirectory can be modified, it will not change where + * the settings file is located. The settings file is always located in + * either "~/.config/sudoku/" or "%APPDATA%/Local/Sudoku/", depending + * on the user's operating system. + */ + public Settings() { + os = System.getProperty("os.name").toLowerCase(); + if(os.startsWith("windows")) + defaultDirectory = System.getProperty("user.home") + "\\AppData\\Local\\Sudoku\\"; + else + defaultDirectory = System.getProperty("user.home") + "/.config/sudoku/"; + + File dir = new File(defaultDirectory); + if (!dir.exists() || !dir.isDirectory()) { + dir.mkdirs(); + + defaultSettings(); + } + readSettings(); + } + + /** + * New File Properties is a configurable setting, where the following + * values are allowable: + * 0 - Load the last opened .sdku file, default behavior + * 1 - Create a new, blank .sdku file + * 2 - Create a new, random .sdku file + * + * @return int + */ + public int getNewFileProperties() { + return newFileProperties; + } + + /** + * Set the new file properties and write them to the settings file. + * + * @param newFileProperties + */ + public void setNewFileProperties(int newFileProperties) { + this.newFileProperties = newFileProperties; + updateSettingsFile(); + } + + /** + * The Default Directory is a configurable setting, where the user can + * specify a default directory to store .sdku files. This is useful for + * eliminating the need for user input for file operations. + * + * NOTE: This does not change the location that the settings file may + * be located in. At this time, the settings file is always located in + * either "~/.config/sudoku/" or "%APPDATA%/Local/Sudoku/", depending + * on the user's operating system. + * + * @return String + */ + public String getDefaultDirectory() { + return defaultDirectory; + } + + /** + * Set the default directory and write it to the settings file. + * + * @param defaultDirectory + */ + public void setDefaultDirectory(String defaultDirectory) { + this.defaultDirectory = defaultDirectory; + updateSettingsFile(); + } + + /** + * The Font is a configurable setting, where the user can specify a + * font to be used throughout the application. + * + * Fonts are loaded from the system directory. In Windows, the font + * is loaded from C:\Windows\Fonts\. In MacOS, the font is loaded + * from /Library/Fonts/. In Linux, the font is loaded from + * /usr/share/fonts/. + * + * @return Font + */ + public Font getFont() { + return font; + } + + /** + * Set the font and write it to the settings file. + * + * @param font + */ + public void setFont(Font font) { + this.font = font; + updateSettingsFile(); + } + + /** + * Open and write the settings to the settings file. + * + * This method is called whenever a setting is updated. + */ + private void updateSettingsFile() { + // TODO: Write the settings to the settings file. + } + + /** + * Set the default settings for the application and write them to the + * settings file. + */ + private void defaultSettings() { + newFileProperties = 0; + + // Load the font from the system directory. + if(loadFont("HackNerdFont-Regular") == 0) + font = new Font("Hack Nerd Font", Font.PLAIN, 12); + + // If the font does not exist, use Arial as the default font. + else + font = new Font("Arial", Font.PLAIN, 12); + + updateSettingsFile(); + } + + /** + * Read the settings from the settings file. + * + * If the settings file does not exist, the default settings will be used + * to populate the Settings file. + */ + private void readSettings() { + File settingsFile = new File(defaultDirectory + "/settings"); + if (!settingsFile.exists()) { + defaultSettings(); + return; + } + + // TODO: Read the settings from the settings file. + } + + /** + * Load the font from the resources folder in the user's system directory. + * + * @return int 0 if successful, 1 if the file does not exist. + */ + private int loadFont(String fontName) { + // Load the font from the system directory. + String fontFilepath; + if(os.startsWith("windows")) + fontFilepath = System.getProperty("user.home") + "\\AppData\\Local\\Microsoft\\Windows\\Fonts\\" + fontName + ".ttf"; + else if(os.startsWith("mac")) + fontFilepath = "/Library/Fonts/" + fontName + ".ttf"; + else + fontFilepath = "/usr/share/fonts/" + fontName + ".ttf"; + + // Register the font with the GraphicsEnvironment. + try { + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + ge.registerFont(Font.createFont(Font.TRUETYPE_FONT, new File(fontFilepath))); + return 0; + + } catch(IOException | FontFormatException e) { + System.out.println("Filepath of font not found: " + fontFilepath + " does not exist."); + return 1; + } + } +}