From 0e7b51c95c56e0bb6c47ae0eec86aa15ad698551 Mon Sep 17 00:00:00 2001 From: Brandon Date: Thu, 25 Jun 2026 13:46:59 -0700 Subject: [PATCH 1/3] only write acq_settings.json to disk if saving image files --- .../model/acquisitions/AcquisitionEngineScape.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java index 02a3a28..670280c 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java +++ b/src/main/java/org/micromanager/lightsheetmanager/model/acquisitions/AcquisitionEngineScape.java @@ -241,7 +241,9 @@ boolean run() { // TODO: put this in AcquisitionEngine base class, between setup and run once structure is better // save settings as JSON to the save directory - FileUtils.writeStringToFile(saveDir + File.separator + "acq_settings.json", settingsJson); + if (model_.acquisitions().settings().isSavingImagesDuringAcquisition()) { + FileUtils.writeStringToFile(saveDir + File.separator + "acq_settings.json", settingsJson); + } // write the position list if we are using multiple positions if (model_.acquisitions().settings().isUsingMultiplePositions()) { From e6e0ee29114dad712c94d3f36781a473ae30238f Mon Sep 17 00:00:00 2001 From: Brandon Date: Thu, 25 Jun 2026 14:45:54 -0700 Subject: [PATCH 2/3] validate windows filenames when entering save name --- .../gui/components/TextField.java | 75 +++++++++++++++++++ .../gui/tabs/acquisition/SavePanel.java | 7 ++ 2 files changed, 82 insertions(+) diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/components/TextField.java b/src/main/java/org/micromanager/lightsheetmanager/gui/components/TextField.java index 6e0e49a..fc26338 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/components/TextField.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/components/TextField.java @@ -1,24 +1,99 @@ package org.micromanager.lightsheetmanager.gui.components; import javax.swing.JTextField; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import java.awt.Color; +import java.util.function.Consumer; public class TextField extends JTextField { + private static final String ILLEGAL_FILENAME_CHARS = "\\/:*?\"<>|"; + private static final Color ERROR_COLOR = new Color(110, 25, 25); + + private final Color defaultColor_; + public TextField() { setColumns(5); + defaultColor_ = getBackground(); } public TextField(final int size) { setColumns(size); + defaultColor_ = getBackground(); } public TextField(final String text, final int size) { super(text); setColumns(size); + defaultColor_ = getBackground(); } public void registerListener(final Runnable listener) { + // fires when enter is pressed addActionListener(e -> listener.run()); } + /** + * Registers a listener that validates the current text as a Windows + * filename whenever the document changes. + * + * @param listener receives {@code true} if the current text is valid + */ + public void registerFilenameValidationListener(final Consumer listener) { + final Runnable validate = () -> { + final boolean isValid = isValidWindowsFilename(getText()); + setBackground(isValid ? defaultColor_ : ERROR_COLOR); + listener.accept(isValid); + }; + + final DocumentListener docListener = new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + validate.run(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + validate.run(); + } + + @Override + public void changedUpdate(DocumentEvent e) { + validate.run(); + } + }; + + getDocument().addDocumentListener(docListener); + } + + /** + * Returns {@code true} if the filename is valid on Windows. + * + * @param name the name to check + * @return {@code true} if the filename is valid + */ + private static boolean isValidWindowsFilename(final String name) { + // empty names are invalid + if (name.isEmpty()) { + return false; + } + + // trailing space or period + final char last = name.charAt(name.length() - 1); + if (last == ' ' || last == '.') { + return false; + } + + // check for illegal characters and control characters + for (int i = 0; i < name.length(); i++) { + final char c = name.charAt(i); + // c < 32 rejects all ASCII control characters (0x00–0x1F) + if (c < 32 || ILLEGAL_FILENAME_CHARS.indexOf(c) >= 0) { + return false; + } + } + + return true; + } } diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/SavePanel.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/SavePanel.java index dfa10e5..c6df766 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/SavePanel.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/SavePanel.java @@ -164,6 +164,13 @@ public void createEventHandlers() { () -> model_.acquisitions().settingsBuilder() .saveNamePrefix(txtSaveFileName_.getText())); + txtSaveFileName_.registerFilenameValidationListener(isValid -> { + if (isValid) { + model_.acquisitions().settingsBuilder() + .saveNamePrefix(txtSaveFileName_.getText()); + } + }); + cbxSaveMode_.registerListener( () -> model_.acquisitions().settingsBuilder() .saveMode(cbxSaveMode_.getSelected())); From 2d3538d426f4668fbab274840db5384782f7cb71 Mon Sep 17 00:00:00 2001 From: Brandon Date: Thu, 25 Jun 2026 15:16:29 -0700 Subject: [PATCH 3/3] update version --- .../micromanager/lightsheetmanager/LightSheetManagerPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/micromanager/lightsheetmanager/LightSheetManagerPlugin.java b/src/main/java/org/micromanager/lightsheetmanager/LightSheetManagerPlugin.java index 2c4aa77..bacc1e9 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/LightSheetManagerPlugin.java +++ b/src/main/java/org/micromanager/lightsheetmanager/LightSheetManagerPlugin.java @@ -14,7 +14,7 @@ public class LightSheetManagerPlugin implements MenuPlugin, SciJavaPlugin { public static final String copyright = "Applied Scientific Instrumentation (ASI), 2022-2026"; public static final String description = "A plugin to control various types of light sheet microscopes."; public static final String menuName = "Light Sheet Manager"; - public static final String version = "0.6.8"; + public static final String version = "0.6.9"; private Studio studio_; private LightSheetManager model_;