From 17bc5a3b4dc01c02c64b23c1e6ae00af3719a0d4 Mon Sep 17 00:00:00 2001 From: Alec Roelke Date: Fri, 30 Apr 2021 11:05:17 -0400 Subject: [PATCH] Change settings classes to records GSON doesn't like it, but there is a workaround at https://github.com/google/gson/issues/1794 --- src/main/java/editor/gui/MainFrame.java | 34 +-- .../editor/gui/display/CardImagePanel.java | 18 +- .../java/editor/gui/display/CardJList.java | 2 +- .../editor/gui/editor/CalculateHandPanel.java | 2 +- .../java/editor/gui/editor/CategoryPanel.java | 4 +- .../java/editor/gui/editor/EditorFrame.java | 12 +- .../java/editor/gui/editor/LegalityPanel.java | 12 +- .../filter/editor/DefaultsFilterPanel.java | 2 +- .../editor/gui/inventory/InventoryLoader.java | 8 +- .../java/editor/gui/settings/Settings.java | 250 ++---------------- .../editor/gui/settings/SettingsBuilder.java | 56 ++-- .../editor/gui/settings/SettingsDialog.java | 70 ++--- 12 files changed, 131 insertions(+), 339 deletions(-) diff --git a/src/main/java/editor/gui/MainFrame.java b/src/main/java/editor/gui/MainFrame.java index c342a2f8c..c10c9ea62 100644 --- a/src/main/java/editor/gui/MainFrame.java +++ b/src/main/java/editor/gui/MainFrame.java @@ -436,8 +436,8 @@ public MainFrame(List files) JOptionPane.showMessageDialog(this, "Bad file URL: " + SettingsDialog.settings().inventory.url() + ".zip", "Warning", JOptionPane.WARNING_MESSAGE); } inventoryFile = new File(SettingsDialog.settings().inventory.path()); - recentCount = SettingsDialog.settings().editor.recents.count; - newestVersion = SettingsDialog.settings().inventory.version; + recentCount = SettingsDialog.settings().editor.recents.count(); + newestVersion = SettingsDialog.settings().inventory.version(); setTitle("MTG Workstation"); setIconImages(IntStream.rangeClosed(4, 8).mapToObj((i) -> new ImageIcon(MainFrame.class.getResource("/icon/" + (1 << i) + ".png")).getImage()).collect(Collectors.toList())); @@ -501,7 +501,7 @@ public MainFrame(List files) // Recent files menu recentsMenu = new JMenu("Open Recent"); recentsMenu.setEnabled(false); - for (String fname : SettingsDialog.settings().editor.recents.files) + for (String fname : SettingsDialog.settings().editor.recents.files()) updateRecents(new File(fname)); fileMenu.add(recentsMenu); @@ -1331,7 +1331,7 @@ public void actionPerformed(ActionEvent e) // Panel showing the image of the currently-selected card cardPane.addTab("Image", imagePanel = new CardImagePanel()); - setImageBackground(SettingsDialog.settings().inventory.background); + setImageBackground(SettingsDialog.settings().inventory.background()); // Pane displaying the Oracle text oracleTextPane = new JTextPane(); @@ -1429,7 +1429,7 @@ public void actionPerformed(ActionEvent e) inventoryTable.setDefaultRenderer(Integer.class, new InventoryTableCellRenderer()); inventoryTable.setDefaultRenderer(Rarity.class, new InventoryTableCellRenderer()); inventoryTable.setDefaultRenderer(List.class, new InventoryTableCellRenderer()); - inventoryTable.setStripeColor(SettingsDialog.settings().inventory.stripe); + inventoryTable.setStripeColor(SettingsDialog.settings().inventory.stripe()); inventoryTable.addMouseListener(MouseListenerFactory.createClickListener((e) -> selectedFrame.ifPresent((f) -> { if (e.getClickCount() % 2 == 0) f.addCards(EditorFrame.MAIN_DECK, getSelectedCards(), 1); @@ -1559,7 +1559,7 @@ public void windowClosing(WindowEvent e) @Override public void windowOpened(WindowEvent e) { - if (checkForUpdate(SettingsDialog.settings().inventory.update) == UPDATE_NEEDED && updateInventory()) + if (checkForUpdate(SettingsDialog.settings().inventory.update()) == UPDATE_NEEDED && updateInventory()) SettingsDialog.setInventoryVersion(newestVersion); loadInventory(); TableSelectionListener listener = new TableSelectionListener(MainFrame.this, inventoryTable, inventory); @@ -1568,7 +1568,7 @@ public void windowOpened(WindowEvent e) if (!inventory.isEmpty()) { - for (CategorySpec spec : SettingsDialog.settings().editor.categories.presets) + for (CategorySpec spec : SettingsDialog.settings().editor.categories.presets()) { JMenuItem categoryItem = new JMenuItem(spec.getName()); categoryItem.addActionListener((v) -> selectedFrame.ifPresent((f) -> f.addCategory(spec))); @@ -1626,20 +1626,20 @@ public void applySettings() JOptionPane.showMessageDialog(this, "Bad file URL: " + SettingsDialog.settings().inventory.url() + ".zip", "Warning", JOptionPane.WARNING_MESSAGE); } inventoryFile = new File(SettingsDialog.settings().inventory.path()); - recentCount = SettingsDialog.settings().editor.recents.count; - inventoryModel.setColumns(SettingsDialog.settings().inventory.columns); - inventoryTable.setStripeColor(SettingsDialog.settings().inventory.stripe); + recentCount = SettingsDialog.settings().editor.recents.count(); + inventoryModel.setColumns(SettingsDialog.settings().inventory.columns()); + inventoryTable.setStripeColor(SettingsDialog.settings().inventory.stripe()); for (EditorFrame frame : editors) frame.applySettings(); presetMenu.removeAll(); - for (CategorySpec spec : SettingsDialog.settings().editor.categories.presets) + for (CategorySpec spec : SettingsDialog.settings().editor.categories.presets()) { JMenuItem categoryItem = new JMenuItem(spec.getName()); categoryItem.addActionListener((e) -> selectedFrame.ifPresent((f) -> f.addCategory(spec))); presetMenu.add(categoryItem); } - setImageBackground(SettingsDialog.settings().inventory.background); - setHandBackground(SettingsDialog.settings().editor.hand.background); + setImageBackground(SettingsDialog.settings().inventory.background()); + setHandBackground(SettingsDialog.settings().editor.hand.background()); revalidate(); repaint(); @@ -1668,19 +1668,19 @@ public int checkForUpdate(UpdateFrequency freq) } return UPDATE_NEEDED; } - else if (SettingsDialog.settings().inventory.update != UpdateFrequency.NEVER) + else if (SettingsDialog.settings().inventory.update() != UpdateFrequency.NEVER) { try (BufferedReader in = new BufferedReader(new InputStreamReader(versionSite.openStream()))) { JsonObject data = new JsonParser().parse(in.lines().collect(Collectors.joining())).getAsJsonObject(); newestVersion = new DatabaseVersion((data.has("data") ? data.get("data").getAsJsonObject() : data).get("version").getAsString()); } - if (newestVersion.needsUpdate(SettingsDialog.settings().inventory.version, freq)) + if (newestVersion.needsUpdate(SettingsDialog.settings().inventory.version(), freq)) { int wantUpdate = JOptionPane.showConfirmDialog( this, "Inventory is out of date:\n" + - UnicodeSymbols.BULLET + " Current version: " + SettingsDialog.settings().inventory.version + "\n" + + UnicodeSymbols.BULLET + " Current version: " + SettingsDialog.settings().inventory.version() + "\n" + UnicodeSymbols.BULLET + " Latest version: " + newestVersion + "\n" + "\n" + "Download update?", @@ -1823,7 +1823,7 @@ public void loadInventory() setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); inventory = InventoryLoader.loadInventory(this, inventoryFile); inventory.sort(CardAttribute.NAME.comparingCard()); - inventoryModel = new CardTableModel(inventory, SettingsDialog.settings().inventory.columns); + inventoryModel = new CardTableModel(inventory, SettingsDialog.settings().inventory.columns()); inventoryTable.setModel(inventoryModel); setCursor(Cursor.getDefaultCursor()); System.gc(); diff --git a/src/main/java/editor/gui/display/CardImagePanel.java b/src/main/java/editor/gui/display/CardImagePanel.java index cffa77fc0..708195018 100644 --- a/src/main/java/editor/gui/display/CardImagePanel.java +++ b/src/main/java/editor/gui/display/CardImagePanel.java @@ -208,16 +208,16 @@ protected Void doInBackground() throws Exception System.out.println(e); } } - if (SettingsDialog.settings().inventory.imageLimitEnable) + if (SettingsDialog.settings().inventory.imageLimitEnable()) { int count = 0; do { - var images = Paths.get(SettingsDialog.settings().inventory.scans).toFile().listFiles(); + var images = Paths.get(SettingsDialog.settings().inventory.scans()).toFile().listFiles(); count = images.length; - if (count > SettingsDialog.settings().inventory.imageLimit) + if (count > SettingsDialog.settings().inventory.imageLimit()) Arrays.stream(images).min(Comparator.comparingLong(File::lastModified)).ifPresent(File::delete); - } while (count > SettingsDialog.settings().inventory.imageLimit); + } while (count > SettingsDialog.settings().inventory.imageLimit()); } SwingUtilities.invokeLater(() -> { if (req.source.card == req.card) @@ -261,12 +261,12 @@ protected void process(List chunks) */ private static List getFiles(Card c) { - switch (SettingsDialog.settings().inventory.imageSource) + switch (SettingsDialog.settings().inventory.imageSource()) { case "Scryfall": - return IntStream.range(0, c.imageNames().size()).mapToObj((i) -> Paths.get(SettingsDialog.settings().inventory.scans, c.scryfallid().get(i) + ";" + i + ".jpg").toFile()).collect(Collectors.toList()); + return IntStream.range(0, c.imageNames().size()).mapToObj((i) -> Paths.get(SettingsDialog.settings().inventory.scans(), c.scryfallid().get(i) + ";" + i + ".jpg").toFile()).collect(Collectors.toList()); case "Gatherer": - return IntStream.range(0, c.multiverseid().size()).mapToObj((i) -> Paths.get(SettingsDialog.settings().inventory.scans, c.multiverseid().get(i) + ";" + i + ".jpg").toFile()).collect(Collectors.toList()); + return IntStream.range(0, c.multiverseid().size()).mapToObj((i) -> Paths.get(SettingsDialog.settings().inventory.scans(), c.multiverseid().get(i) + ";" + i + ".jpg").toFile()).collect(Collectors.toList()); default: return Collections.emptyList(); } @@ -306,7 +306,7 @@ public static JPanel createStatusBar() private static List> getURLs(Card c) throws MalformedURLException { List> urls = new ArrayList<>(); - switch (SettingsDialog.settings().inventory.imageSource) + switch (SettingsDialog.settings().inventory.imageSource()) { case "Scryfall": switch (c.layout()) @@ -562,7 +562,7 @@ public void setCard(Card c) faceImages.clear(); try { - Files.createDirectories(Path.of(SettingsDialog.settings().inventory.scans)); + Files.createDirectories(Path.of(SettingsDialog.settings().inventory.scans())); if (getFiles(card).stream().map(File::toPath).allMatch(Files::exists)) loadImages(); else diff --git a/src/main/java/editor/gui/display/CardJList.java b/src/main/java/editor/gui/display/CardJList.java index abdc484cf..fe250d73d 100644 --- a/src/main/java/editor/gui/display/CardJList.java +++ b/src/main/java/editor/gui/display/CardJList.java @@ -67,7 +67,7 @@ public int getSize() return cards.size(); } }); - setVisibleRowCount(SettingsDialog.settings().editor.categories.explicits); + setVisibleRowCount(SettingsDialog.settings().editor.categories.explicits()); } /** diff --git a/src/main/java/editor/gui/editor/CalculateHandPanel.java b/src/main/java/editor/gui/editor/CalculateHandPanel.java index baf618c5f..24dd8d572 100644 --- a/src/main/java/editor/gui/editor/CalculateHandPanel.java +++ b/src/main/java/editor/gui/editor/CalculateHandPanel.java @@ -130,7 +130,7 @@ public Object getValueAt(int rowIndex, int columnIndex) if (columnIndex == CATEGORY) yield category; else if (columnIndex - (E_INFO_COLS - 1) < expectedCounts.get(category).size()) - yield ROUND_MODE.get(SettingsDialog.settings().editor.hand.rounding).apply(expectedCounts.get(category).get(columnIndex - (E_INFO_COLS - 1))); + yield ROUND_MODE.get(SettingsDialog.settings().editor.hand.rounding()).apply(expectedCounts.get(category).get(columnIndex - (E_INFO_COLS - 1))); else yield ""; } diff --git a/src/main/java/editor/gui/editor/CategoryPanel.java b/src/main/java/editor/gui/editor/CategoryPanel.java index 2d224f217..b14c05a58 100644 --- a/src/main/java/editor/gui/editor/CategoryPanel.java +++ b/src/main/java/editor/gui/editor/CategoryPanel.java @@ -264,7 +264,7 @@ public CategoryPanel(Deck d, String n, EditorFrame editor) name = n; background = getBackground(); flashTimer = new FlashTimer(); - tableRows = SettingsDialog.settings().editor.categories.rows; + tableRows = SettingsDialog.settings().editor.categories.rows(); // Each category is surrounded by a border with a title setBorder(border = BorderFactory.createTitledBorder(name)); @@ -362,7 +362,7 @@ public void mouseDragged(MouseEvent e) Point p = SwingUtilities.convertPoint((Component)e.getSource(), e.getPoint(), table); setCursor(new Cursor(Cursor.S_RESIZE_CURSOR)); final int minRows = 1; - final int maxRows = Math.max(deck.getCategoryList(name).total(), SettingsDialog.settings().editor.categories.rows); + final int maxRows = Math.max(deck.getCategoryList(name).total(), SettingsDialog.settings().editor.categories.rows()); if (p.y <= base - table.getRowHeight()/2 && tableRows > minRows) { int n = Math.min(((base - p.y) + table.getRowHeight() - 1)/table.getRowHeight(), tableRows - minRows); diff --git a/src/main/java/editor/gui/editor/EditorFrame.java b/src/main/java/editor/gui/editor/EditorFrame.java index 2843b3226..54b8e9144 100644 --- a/src/main/java/editor/gui/editor/EditorFrame.java +++ b/src/main/java/editor/gui/editor/EditorFrame.java @@ -584,7 +584,7 @@ public EditorFrame(MainFrame p, int u, DeckSerializer manager) unsaved = false; undoBuffer = new Stack<>(); redoBuffer = new Stack<>(); - startingHandSize = SettingsDialog.settings().editor.hand.size; + startingHandSize = SettingsDialog.settings().editor.hand.size(); if (manager.canSaveFile()) setFile(manager.file()); else @@ -834,7 +834,7 @@ public EditorFrame(MainFrame p, int u, DeckSerializer manager) imagePanel.setLayout(new BoxLayout(imagePanel, BoxLayout.X_AXIS)); imagePane = new JScrollPane(imagePanel); imagePane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); - setHandBackground(SettingsDialog.settings().editor.hand.background); + setHandBackground(SettingsDialog.settings().editor.hand.background()); // Control panel for manipulating the sample hand JPanel handModPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 5)); @@ -847,7 +847,7 @@ public EditorFrame(MainFrame p, int u, DeckSerializer manager) { CardImagePanel panel = new CardImagePanel(); panel.setCard(c); - panel.setBackground(SettingsDialog.settings().editor.hand.background); + panel.setBackground(SettingsDialog.settings().editor.hand.background()); imagePanel.add(panel); imagePanel.add(Box.createHorizontalStrut(10)); } @@ -865,7 +865,7 @@ public EditorFrame(MainFrame p, int u, DeckSerializer manager) CardImagePanel panel = new CardImagePanel(); imagePanel.add(panel); panel.setCard(c); - panel.setBackground(SettingsDialog.settings().editor.hand.background); + panel.setBackground(SettingsDialog.settings().editor.hand.background()); imagePanel.add(Box.createHorizontalStrut(10)); } imagePanel.validate(); @@ -878,7 +878,7 @@ public EditorFrame(MainFrame p, int u, DeckSerializer manager) { hand.draw(); CardImagePanel panel = new CardImagePanel(); - panel.setBackground(SettingsDialog.settings().editor.hand.background); + panel.setBackground(SettingsDialog.settings().editor.hand.background()); imagePanel.add(panel); panel.setCard(hand.get(hand.size() - 1)); imagePanel.add(Box.createHorizontalStrut(10)); @@ -1153,7 +1153,7 @@ public void applySettings() deck().table.getColumn(deck().model.getColumnName(i)).setCellEditor(CardTable.createCellEditor(this, deck().model.getColumnData(i))); for (CategoryPanel category : categoryPanels) category.applySettings(this); - startingHandSize = SettingsDialog.settings().editor.hand.size; + startingHandSize = SettingsDialog.settings().editor.hand.size(); updateStats(); update(); } diff --git a/src/main/java/editor/gui/editor/LegalityPanel.java b/src/main/java/editor/gui/editor/LegalityPanel.java index 64fa24527..9534160e8 100644 --- a/src/main/java/editor/gui/editor/LegalityPanel.java +++ b/src/main/java/editor/gui/editor/LegalityPanel.java @@ -136,20 +136,20 @@ public void setSelectionInterval(int index0, int index1) // Panel containing check box for enabling commander search Box cmdrPanel = Box.createHorizontalBox(); - JCheckBox cmdrCheck = new JCheckBox("", SettingsDialog.settings().editor.legality.searchForCommander); + JCheckBox cmdrCheck = new JCheckBox("", SettingsDialog.settings().editor.legality.searchForCommander()); cmdrCheck.setText(cmdrCheck.isSelected() ? "Search for commander in:" : "Search for commander"); cmdrPanel.add(cmdrCheck); List names = new ArrayList<>(List.of(MAIN_DECK, ALL_LISTS)); names.addAll(editor.getExtraNames()); var cmdrBox = new JComboBox<>(names.toArray(String[]::new)); - cmdrBox.setVisible(SettingsDialog.settings().editor.legality.searchForCommander); - if (SettingsDialog.settings().editor.legality.main) + cmdrBox.setVisible(SettingsDialog.settings().editor.legality.searchForCommander()); + if (SettingsDialog.settings().editor.legality.main()) cmdrBox.setSelectedIndex(names.indexOf(MAIN_DECK)); - else if (SettingsDialog.settings().editor.legality.all) + else if (SettingsDialog.settings().editor.legality.all()) cmdrBox.setSelectedIndex(names.indexOf(ALL_LISTS)); else { - String name = SettingsDialog.settings().editor.legality.list; + String name = SettingsDialog.settings().editor.legality.list(); cmdrBox.setSelectedIndex(names.contains(name) ? names.indexOf(name) : names.indexOf(MAIN_DECK)); } cmdrBox.setMaximumSize(cmdrBox.getPreferredSize()); @@ -162,7 +162,7 @@ else if (SettingsDialog.settings().editor.legality.all) final JComboBox sideCombo; if (!editor.getExtraNames().isEmpty()) { - String sb = SettingsDialog.settings().editor.legality.sideboard; + String sb = SettingsDialog.settings().editor.legality.sideboard(); add(Box.createVerticalStrut(2)); Box sideboardBox = Box.createHorizontalBox(); diff --git a/src/main/java/editor/gui/filter/editor/DefaultsFilterPanel.java b/src/main/java/editor/gui/filter/editor/DefaultsFilterPanel.java index fb44a38f1..d8b151f62 100644 --- a/src/main/java/editor/gui/filter/editor/DefaultsFilterPanel.java +++ b/src/main/java/editor/gui/filter/editor/DefaultsFilterPanel.java @@ -41,7 +41,7 @@ public DefaultsFilterPanel() categories = new HashMap<>(); - var presets = SettingsDialog.settings().editor.categories.presets; + var presets = SettingsDialog.settings().editor.categories.presets(); String[] names = presets.stream().map(CategorySpec::getName).toArray(String[]::new); for (int i = 0; i < presets.size(); i++) categories.put(names[i], presets.get(i)); diff --git a/src/main/java/editor/gui/inventory/InventoryLoader.java b/src/main/java/editor/gui/inventory/InventoryLoader.java index f37f4797f..4e63ee8db 100644 --- a/src/main/java/editor/gui/inventory/InventoryLoader.java +++ b/src/main/java/editor/gui/inventory/InventoryLoader.java @@ -191,7 +191,7 @@ public void windowClosing(WindowEvent e) } catch (CancellationException e) {} - if (SettingsDialog.settings().inventory.warn && !loader.warnings().isEmpty()) + if (SettingsDialog.settings().inventory.warn() && !loader.warnings().isEmpty()) { SwingUtilities.invokeLater(() -> { StringJoiner join = new StringJoiner("
  • ", "", ""); @@ -201,7 +201,7 @@ public void windowClosing(WindowEvent e) JPanel warningPanel = new JPanel(new BorderLayout()); JLabel warningLabel = new JLabel(join.toString()); warningPanel.add(warningLabel, BorderLayout.CENTER); - JCheckBox suppressBox = new JCheckBox("Don't show this warning in the future", !SettingsDialog.settings().inventory.warn); + JCheckBox suppressBox = new JCheckBox("Don't show this warning in the future", !SettingsDialog.settings().inventory.warn()); warningPanel.add(suppressBox, BorderLayout.SOUTH); JOptionPane.showMessageDialog(null, warningPanel, "Warning", JOptionPane.WARNING_MESSAGE); SettingsDialog.setShowInventoryWarnings(!suppressBox.isSelected()); @@ -686,10 +686,10 @@ protected Inventory doInBackground() throws Exception Inventory inventory = new Inventory(cards); - if (Files.exists(Path.of(SettingsDialog.settings().inventory.tags))) + if (Files.exists(Path.of(SettingsDialog.settings().inventory.tags()))) { @SuppressWarnings("unchecked") - var rawTags = (Map>)MainFrame.SERIALIZER.fromJson(String.join("\n", Files.readAllLines(Path.of(SettingsDialog.settings().inventory.tags))), new TypeToken>>() {}.getType()); + var rawTags = (Map>)MainFrame.SERIALIZER.fromJson(String.join("\n", Files.readAllLines(Path.of(SettingsDialog.settings().inventory.tags()))), new TypeToken>>() {}.getType()); Card.tags.clear(); Card.tags.putAll(rawTags.entrySet().stream().collect(Collectors.toMap((e) -> inventory.find(e.getKey()), Map.Entry::getValue))); } diff --git a/src/main/java/editor/gui/settings/Settings.java b/src/main/java/editor/gui/settings/Settings.java index 52c168f7e..a8bca6852 100644 --- a/src/main/java/editor/gui/settings/Settings.java +++ b/src/main/java/editor/gui/settings/Settings.java @@ -37,72 +37,23 @@ public final class Settings * * @author Alec Roelke */ - public static final class InventorySettings - { - /** Site containing the inventory to download. */ - public final String source; - /** Actual inventory file to download (without .zip). */ - public final String file; - /** File name containing latest inventory version. */ - public final String versionFile; - /** Version of the stored inventory. */ - public final DatabaseVersion version; - /** Directory to store inventory file in. */ - public final String location; - /** Directory to store card images in. */ - public final String scans; - /** Web site to download images from. */ - public final String imageSource; - /** Whether or not to limit the number of images to cache. */ - public final boolean imageLimitEnable; - /** How many images should be cached at a time. */ - public final int imageLimit; - /** File to store tags in. */ - public final String tags; - /** Check for inventory update on startup or don't. */ - public final UpdateFrequency update; - /** Show warnings from loading inventory. */ - public final boolean warn; - /** Card attributes to show in inventory table. */ - public final List columns; - /** Background color of card image panel. */ - public final Color background; - /** Stripe color of inventory table. */ - public final Color stripe; - - private InventorySettings(String source, - String file, - String versionFile, - DatabaseVersion version, - String location, - String scans, - String imageSource, - boolean imageLimitEnable, - int imageLimit, - String tags, - UpdateFrequency update, - boolean warn, - List columns, - Color background, - Color stripe) - { - this.source = source; - this.file = file; - this.versionFile = versionFile; - this.version = version; - this.location = location; - this.scans = scans; - this.imageSource = imageSource; - this.imageLimitEnable = imageLimitEnable; - this.imageLimit = imageLimit; - this.tags = tags; - this.update = update; - this.warn = warn; - this.columns = Collections.unmodifiableList(new ArrayList<>(columns)); - this.background = background; - this.stripe = stripe; - } - + public static record InventorySettings( + String source, + String file, + String versionFile, + DatabaseVersion version, + String location, + String scans, + String imageSource, + boolean imageLimitEnable, + int imageLimit, + String tags, + UpdateFrequency update, + boolean warn, + List columns, + Color background, + Color stripe + ) { private InventorySettings() { this( @@ -150,30 +101,6 @@ public String versionSite() { return source + versionFile; } - - @Override - public boolean equals(Object other) - { - if (other == null) - return false; - if (other == this) - return true; - if (other instanceof InventorySettings o) - return source.equals(o.source) && - file.equals(o.file) && - versionFile.equals(o.versionFile) && - version.equals(o.version) && - location.equals(o.location) && - scans.equals(o.scans) && - imageSource.equals(o.imageSource) && - tags.equals(o.tags) && - update == o.update && - warn == o.warn && - columns.equals(o.columns) && - background.equals(o.background) && - stripe.equals(o.stripe); - return false; - } } /** @@ -189,41 +116,12 @@ public static final class EditorSettings * * @author Alec Roelke */ - public static final class RecentsSettings + public static record RecentsSettings(int count, List files) { - /** Number of recent files to store. */ - public final int count; - /** List of recently-edited files. */ - public final List files; - - private RecentsSettings(int count, List files) - { - this.count = count; - this.files = Collections.unmodifiableList(new ArrayList<>(files)); - } - private RecentsSettings() { this(4, Collections.emptyList()); } - - @Override - public boolean equals(Object other) - { - if (other == null) - return false; - if (other == this) - return true; - if (other instanceof RecentsSettings o) - return count == o.count && files.equals(o.files); - return false; - } - - @Override - public int hashCode() - { - return Objects.hash(count, files); - } } /** @@ -231,22 +129,8 @@ public int hashCode() * * @author Alec Roelke */ - public static final class CategoriesSettings + public static record CategoriesSettings(List presets, int rows, int explicits) { - /** Preset categories for quickly adding to decks. */ - public final List presets; - /** Max number of rows to display cards in category tables. */ - public final int rows; - /** Number of rows to show in white- or blacklists. */ - public final int explicits; - - private CategoriesSettings(List presets, int rows, int explicits) - { - this.presets = Collections.unmodifiableList(new ArrayList<>(presets)); - this.rows = rows; - this.explicits = explicits; - } - private CategoriesSettings() { this( @@ -263,24 +147,6 @@ private CategoriesSettings() 6, 3 ); } - - @Override - public boolean equals(Object other) - { - if (other == null) - return false; - if (other == this) - return true; - if (other instanceof CategoriesSettings o) - return presets.equals(o.presets) && rows == o.rows && explicits == o.explicits; - return false; - } - - @Override - public int hashCode() - { - return Objects.hash(presets, rows, explicits); - } } /** @@ -289,44 +155,12 @@ public int hashCode() * * @author Alec Roelke */ - public static final class HandSettings + public static record HandSettings(int size, String rounding, Color background) { - /** Initial size of opening hands before mulligans. */ - public final int size; - /** How to round statistics (nearest, truncate, or don't). */ - public final String rounding; - /** Background color for sample hand images. */ - public final Color background; - - private HandSettings(int size, String rounding, Color background) - { - this.size = size; - this.rounding = rounding; - this.background = background; - } - private HandSettings() { this(7, "No rounding", Color.WHITE); } - - @Override - public boolean equals(Object other) - { - if (other == null) - return false; - if (other == this) - return true; - if (other instanceof HandSettings o) - return size == o.size && rounding.equals(o.rounding) && background.equals(o.background); - return false; - } - - @Override - public int hashCode() - { - return Objects.hash(size, rounding, background); - } } /** @@ -334,54 +168,12 @@ public int hashCode() * * @author Alec Roelke */ - public static final class LegalitySettings + public static record LegalitySettings(boolean searchForCommander, boolean main, boolean all, String list, String sideboard) { - /** Whether or not to search for a commander if determine legality in applicable formats. */ - public final boolean searchForCommander; - /** If searching for a commander, whether or not to search just the main deck. */ - public final boolean main; - /** If searching for a commander, whether or not to check all lists. */ - public final boolean all; - /** If searching for a commander, default name of the list to search that isn't the main deck. */ - public final String list; - /** Include sideboard size in legality determination. */ - public final String sideboard; - - private LegalitySettings(boolean searchForCommander, boolean main, boolean all, String list, String sideboard) - { - this.searchForCommander = searchForCommander; - this.main = main; - this.all = all; - this.list = list; - this.sideboard = sideboard; - } - private LegalitySettings() { this(true, true, false, "", ""); } - - @Override - public boolean equals(Object other) - { - if (other == null) - return false; - if (other == this) - return true; - if (other instanceof LegalitySettings o) - return searchForCommander == o.searchForCommander && - main == o.main && - all == o.all && - list.equals(o.list) && - sideboard.equals(o.sideboard); - return false; - } - - @Override - public int hashCode() - { - return Objects.hash(searchForCommander, main, all, list, sideboard); - } } /** @see RecentsSettings */ diff --git a/src/main/java/editor/gui/settings/SettingsBuilder.java b/src/main/java/editor/gui/settings/SettingsBuilder.java index ca2baa77f..bd4a35d59 100644 --- a/src/main/java/editor/gui/settings/SettingsBuilder.java +++ b/src/main/java/editor/gui/settings/SettingsBuilder.java @@ -121,36 +121,36 @@ public Settings build() */ public SettingsBuilder copy(Settings original) { - inventorySource = original.inventory.source; - inventoryFile = original.inventory.file; - inventoryVersionFile = original.inventory.versionFile; - inventoryVersion = original.inventory.version; - inventoryLocation = original.inventory.location; - inventoryScans = original.inventory.scans; - imageSource = original.inventory.imageSource; - enableImageLimit = original.inventory.imageLimitEnable; - imageLimit = original.inventory.imageLimit; - inventoryTags = original.inventory.tags; - inventoryUpdate = original.inventory.update; - inventoryWarn = original.inventory.warn; - inventoryColumns = original.inventory.columns; - inventoryBackground = original.inventory.background; - inventoryStripe = original.inventory.stripe; - recentsCount = original.editor.recents.count; - recentsFiles = original.editor.recents.files; - presetCategories = new ArrayList<>(original.editor.categories.presets.stream().map(CategorySpec::new).collect(Collectors.toList())); - categoryRows = original.editor.categories.rows; - explicits = original.editor.categories.explicits; + inventorySource = original.inventory.source(); + inventoryFile = original.inventory.file(); + inventoryVersionFile = original.inventory.versionFile(); + inventoryVersion = original.inventory.version(); + inventoryLocation = original.inventory.location(); + inventoryScans = original.inventory.scans(); + imageSource = original.inventory.imageSource(); + enableImageLimit = original.inventory.imageLimitEnable(); + imageLimit = original.inventory.imageLimit(); + inventoryTags = original.inventory.tags(); + inventoryUpdate = original.inventory.update(); + inventoryWarn = original.inventory.warn(); + inventoryColumns = original.inventory.columns(); + inventoryBackground = original.inventory.background(); + inventoryStripe = original.inventory.stripe(); + recentsCount = original.editor.recents.count(); + recentsFiles = original.editor.recents.files(); + presetCategories = new ArrayList<>(original.editor.categories.presets().stream().map(CategorySpec::new).collect(Collectors.toList())); + categoryRows = original.editor.categories.rows(); + explicits = original.editor.categories.explicits(); editorColumns = original.editor.columns; editorStripe = original.editor.stripe; - handSize = original.editor.hand.size; - handRounding = original.editor.hand.rounding; - handBackground = original.editor.hand.background; - searchForCommander = original.editor.legality.searchForCommander; - main = original.editor.legality.main; - all = original.editor.legality.all; - list = original.editor.legality.list; - sideboard = original.editor.legality.sideboard; + handSize = original.editor.hand.size(); + handRounding = original.editor.hand.rounding(); + handBackground = original.editor.hand.background(); + searchForCommander = original.editor.legality.searchForCommander(); + main = original.editor.legality.main(); + all = original.editor.legality.all(); + list = original.editor.legality.list(); + sideboard = original.editor.legality.sideboard(); manaValue = original.editor.manaValue; cwd = original.cwd; diff --git a/src/main/java/editor/gui/settings/SettingsDialog.java b/src/main/java/editor/gui/settings/SettingsDialog.java index 1437bda01..d070c63a6 100644 --- a/src/main/java/editor/gui/settings/SettingsDialog.java +++ b/src/main/java/editor/gui/settings/SettingsDialog.java @@ -217,11 +217,11 @@ public static void save() throws IOException { if (!Card.tags.isEmpty()) { - Files.createDirectories(Path.of(settings.inventory.tags).getParent()); - Files.writeString(Path.of(settings.inventory.tags), MainFrame.SERIALIZER.toJson(Card.tags.entrySet().stream().collect(Collectors.toMap((e) -> e.getKey().multiverseid().get(0), Map.Entry::getValue)))); + Files.createDirectories(Path.of(settings.inventory.tags()).getParent()); + Files.writeString(Path.of(settings.inventory.tags()), MainFrame.SERIALIZER.toJson(Card.tags.entrySet().stream().collect(Collectors.toMap((e) -> e.getKey().multiverseid().get(0), Map.Entry::getValue)))); } else - Files.deleteIfExists(Path.of(settings.inventory.tags)); + Files.deleteIfExists(Path.of(settings.inventory.tags())); Files.writeString(PROPERTIES_FILE, MainFrame.SERIALIZER.toJson(settings)); } @@ -826,53 +826,53 @@ public SettingsDialog(MainFrame owner) @Override public void windowOpened(WindowEvent e) { - inventorySiteField.setText(settings.inventory.source); - inventoryFileField.setText(settings.inventory.file); - currentVersionLabel.setText("(Current version: " + settings.inventory.version + ")"); - inventoryDirField.setText(settings.inventory.location); + inventorySiteField.setText(settings.inventory.source()); + inventoryFileField.setText(settings.inventory.file()); + currentVersionLabel.setText("(Current version: " + settings.inventory.version() + ")"); + inventoryDirField.setText(settings.inventory.location()); inventoryChooser.setCurrentDirectory(new File(inventoryDirField.getText()).getAbsoluteFile()); - scansDirField.setText(settings.inventory.scans); + scansDirField.setText(settings.inventory.scans()); scansChooser.setCurrentDirectory(new File(scansDirField.getText()).getAbsoluteFile()); - imgSourceBox.setSelectedIndex(Math.max(IMAGE_SOURCES.indexOf(settings.inventory.imageSource), 0)); - limitImageBox.setSelected(settings.inventory.imageLimitEnable); - limitImageSpinner.setEnabled(settings.inventory.imageLimitEnable); - limitImageSpinner.setValue(settings.inventory.imageLimit); - updateBox.setSelectedIndex(settings.inventory.update.ordinal()); - suppressCheckBox.setSelected(settings.inventory.warn); + imgSourceBox.setSelectedIndex(Math.max(IMAGE_SOURCES.indexOf(settings.inventory.imageSource()), 0)); + limitImageBox.setSelected(settings.inventory.imageLimitEnable()); + limitImageSpinner.setEnabled(settings.inventory.imageLimitEnable()); + limitImageSpinner.setValue(settings.inventory.imageLimit()); + updateBox.setSelectedIndex(settings.inventory.update().ordinal()); + suppressCheckBox.setSelected(settings.inventory.warn()); viewWarningsButton.setEnabled(!inventoryWarnings.isEmpty()); for (var n : inventoryColumnCheckBoxes.entrySet()) - n.getValue().setSelected(settings.inventory.columns.contains(n.getKey())); - inventoryStripeColor.setColor(settings.inventory.stripe); - scanBGChooser.setColor(settings.inventory.background); - recentSpinner.getModel().setValue(settings.editor.recents.count); - explicitsSpinner.getModel().setValue(Integer.valueOf(settings.editor.categories.explicits)); + n.getValue().setSelected(settings.inventory.columns().contains(n.getKey())); + inventoryStripeColor.setColor(settings.inventory.stripe()); + scanBGChooser.setColor(settings.inventory.background()); + recentSpinner.getModel().setValue(settings.editor.recents.count()); + explicitsSpinner.getModel().setValue(Integer.valueOf(settings.editor.categories.explicits())); manaValueBox.setSelectedIndex(Math.max(MANA_VALUE_OPTIONS.indexOf(settings.editor.manaValue), 0)); - for (CategorySpec preset : settings.editor.categories.presets) + for (CategorySpec preset : settings.editor.categories.presets()) categoriesList.addCategory(new CategorySpec(preset)); - rowsSpinner.getModel().setValue(settings.editor.categories.rows); + rowsSpinner.getModel().setValue(settings.editor.categories.rows()); for (var n : editorColumnCheckBoxes.entrySet()) n.getValue().setSelected(settings.editor.columns.contains(n.getKey())); editorStripeColor.setColor(settings.editor.stripe); - startingSizeSpinner.getModel().setValue(settings.editor.hand.size); + startingSizeSpinner.getModel().setValue(settings.editor.hand.size()); for (JRadioButton mode : modeButtons) - mode.setSelected(mode.getText().equals(settings.editor.hand.rounding)); - handBGColor.setColor(settings.editor.hand.background); - cmdrCheck.setSelected(settings.editor.legality.searchForCommander); - sideCheck.setSelected(!settings.editor.legality.sideboard.isEmpty()); + mode.setSelected(mode.getText().equals(settings.editor.hand.rounding())); + handBGColor.setColor(settings.editor.hand.background()); + cmdrCheck.setSelected(settings.editor.legality.searchForCommander()); + sideCheck.setSelected(!settings.editor.legality.sideboard().isEmpty()); sideCheck.setText(sideCheck.isSelected() ? "Default sideboard name:" : "Include sideboard"); - sideField.setText(settings.editor.legality.sideboard); + sideField.setText(settings.editor.legality.sideboard()); sideField.setVisible(sideCheck.isSelected()); - if (settings.editor.legality.searchForCommander) + if (settings.editor.legality.searchForCommander()) { cmdrCheck.setText("Search for commander in:"); - if (settings.editor.legality.main || (!settings.editor.legality.all && settings.editor.legality.list.isEmpty())) + if (settings.editor.legality.main() || (!settings.editor.legality.all() && settings.editor.legality.list().isEmpty())) cmdrMainDeck.setSelected(true); - else if (settings.editor.legality.all) + else if (settings.editor.legality.all()) cmdrAllLists.setSelected(true); else cmdrList.setSelected(true); cmdrListName.setEnabled(cmdrList.isSelected()); - cmdrListName.setText(settings.editor.legality.list); + cmdrListName.setText(settings.editor.legality.list()); } else { @@ -937,8 +937,8 @@ public void confirmSettings() e.printStackTrace(); } - if (settings.inventory.columns.isEmpty()) - settings = new SettingsBuilder(settings).inventoryColumns(new SettingsBuilder().defaults().build().inventory.columns).build(); + if (settings.inventory.columns().isEmpty()) + settings = new SettingsBuilder(settings).inventoryColumns(new SettingsBuilder().defaults().build().inventory.columns()).build(); if (settings.editor.columns.isEmpty()) settings = new SettingsBuilder(settings).editorColumns(new SettingsBuilder().defaults().build().editor.columns).build(); @@ -950,7 +950,7 @@ public void confirmSettings() */ public void rejectSettings() { - parent.setImageBackground(settings.inventory.background); - parent.setHandBackground(settings.editor.hand.background); + parent.setImageBackground(settings.inventory.background()); + parent.setHandBackground(settings.editor.hand.background()); } }