diff --git a/pom.xml b/pom.xml index dfb25f2..17f5e42 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,16 @@ 6.1.5 test + + com.formdev + flatlaf + 3.5.4 + + + com.formdev + flatlaf-extras + 3.5.4 + diff --git a/src/main/java/de/tki/comfymodels/Main.java b/src/main/java/de/tki/comfymodels/Main.java index 118afeb..f45b129 100644 --- a/src/main/java/de/tki/comfymodels/Main.java +++ b/src/main/java/de/tki/comfymodels/Main.java @@ -9,6 +9,10 @@ import de.tki.comfymodels.service.IModelSearchService; import de.tki.comfymodels.service.impl.ConfigService; import de.tki.comfymodels.service.impl.GeminiAIService; import de.tki.comfymodels.service.impl.ModelListService; +import com.formdev.flatlaf.FlatDarkLaf; +import com.formdev.flatlaf.FlatLightLaf; +import com.formdev.flatlaf.FlatLaf; +import com.formdev.flatlaf.extras.FlatAnimatedLafChange; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; @@ -59,6 +63,7 @@ public class Main extends JFrame { private JPasswordField hfTokenField; private JCheckBox backgroundCheck; private JCheckBox shutdownCheck; + private JCheckBox darkCheck; private JLabel activeAiModelLabel; private JTextArea jsonInputArea; private DefaultTableModel tableModel; @@ -86,13 +91,22 @@ public class Main extends JFrame { } } - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (Exception e) {} - if (!promptForPassword()) { System.exit(0); } + + // Apply theme before UI initialization + if (configService.isDarkMode()) { + FlatDarkLaf.setup(); + } else { + FlatLightLaf.setup(); + } + + // Modern UI tweaks + UIManager.put("Button.arc", 8); + UIManager.put("Component.arc", 8); + UIManager.put("TextComponent.arc", 8); + UIManager.put("ProgressBar.arc", 8); SwingUtilities.invokeLater(() -> { initUI(); @@ -225,6 +239,9 @@ public class Main extends JFrame { if (shutdownCheck != null) { shutdownCheck.setSelected(configService.isShutdownAfterDownloadEnabled()); } + if (darkCheck != null) { + darkCheck.setSelected(configService.isDarkMode()); + } } private void updateAiModelDisplay() { @@ -238,9 +255,12 @@ public class Main extends JFrame { setTitle("ComfyUIModel-Downloader"); setSize(1450, 1000); setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); - setLayout(new BorderLayout()); + + JPanel mainContainer = new JPanel(new BorderLayout(10, 10)); + mainContainer.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + setContentPane(mainContainer); - JPanel settingsPanel = new JPanel(new GridLayout(4, 1)); + JPanel settingsPanel = new JPanel(new GridLayout(4, 1, 5, 5)); JPanel pathRow = new JPanel(new BorderLayout()); pathRow.setBorder(BorderFactory.createTitledBorder("Models Directory")); @@ -310,10 +330,26 @@ public class Main extends JFrame { shutdownCheck = new JCheckBox("Shutdown after Queue"); shutdownCheck.addActionListener(e -> configService.setShutdownAfterDownloadEnabled(shutdownCheck.isSelected())); + darkCheck = new JCheckBox("Dark Mode"); + darkCheck.addActionListener(e -> { + boolean isDark = darkCheck.isSelected(); + configService.setDarkMode(isDark); + + FlatAnimatedLafChange.showSnapshot(); + if (isDark) { + FlatDarkLaf.setup(); + } else { + FlatLightLaf.setup(); + } + FlatLaf.updateUI(); + FlatAnimatedLafChange.hideSnapshotWithAnimation(); + }); + infoRow.add(helpBtn); infoRow.add(verifyBtn); infoRow.add(backgroundCheck); infoRow.add(shutdownCheck); + infoRow.add(darkCheck); settingsPanel.add(pathRow); settingsPanel.add(apiRow); @@ -460,9 +496,9 @@ public class Main extends JFrame { bottomPanel.add(progressPanel, BorderLayout.CENTER); bottomPanel.add(actionButtons, BorderLayout.EAST); - add(settingsPanel, BorderLayout.NORTH); - add(splitPane, BorderLayout.CENTER); - add(bottomPanel, BorderLayout.SOUTH); + mainContainer.add(settingsPanel, BorderLayout.NORTH); + mainContainer.add(splitPane, BorderLayout.CENTER); + mainContainer.add(bottomPanel, BorderLayout.SOUTH); } private void performSystemShutdown() { diff --git a/src/main/java/de/tki/comfymodels/service/impl/ConfigService.java b/src/main/java/de/tki/comfymodels/service/impl/ConfigService.java index d08817e..fd83701 100644 --- a/src/main/java/de/tki/comfymodels/service/impl/ConfigService.java +++ b/src/main/java/de/tki/comfymodels/service/impl/ConfigService.java @@ -91,6 +91,9 @@ public class ConfigService { public boolean isShutdownAfterDownloadEnabled() { return settings.optBoolean("shutdown_after_download", false); } public void setShutdownAfterDownloadEnabled(boolean enabled) { settings.put("shutdown_after_download", enabled); save(); } + public boolean isDarkMode() { return settings.optBoolean("dark_mode", true); } + public void setDarkMode(boolean enabled) { settings.put("dark_mode", enabled); save(); } + public void savePendingDownloads(String json) { try { Files.writeString(getFileInAppData("pending_downloads.json").toPath(), json, StandardCharsets.UTF_8);