diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/AcquisitionTab.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/AcquisitionTab.java index a82abc7a..1a90a6b7 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/AcquisitionTab.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/AcquisitionTab.java @@ -186,7 +186,7 @@ private void createUserInterface() { // set ui sizes, should match the MigLayout constraints pnlChannelTable_.setAbsoluteSize(280, 400); pnlLeft.setAbsoluteSize(300, 580); - pnlRight_.setAbsoluteSize(300, 420); + pnlRight_.setAbsoluteSize(300, 580); // acquisition buttons pnlButtons_.add(btnRunAcquisition_, ""); @@ -208,8 +208,8 @@ private void createUserInterface() { pnlCenter.add(cmbAcquisitionModes_, ""); pnlRight_.add(pnlVolumeSettings_, "growx, wrap"); - pnlRight_.add(model_.acquisitions().settings().isUsingAdvancedTiming() ? - pnlAdvancedTiming_ : pnlSliceSettings_, "growx, wrap"); + pnlRight_.add(pnlSliceSettings_, "growx, wrap"); + pnlRight_.add(pnlAdvancedTiming_, "growx, wrap"); pnlRight_.add(cbxUseAdvancedTiming_, "growx"); // add panels @@ -299,13 +299,8 @@ private void createEventHandlers() { * @param useAdvancedTiming {@code true} to swap to the advanced timing panel */ private void swapTimingSettingsPanels(final boolean useAdvancedTiming) { - pnlRight_.removeAll(); - pnlRight_.add(pnlVolumeSettings_, "growx, wrap"); - pnlRight_.add(useAdvancedTiming ? - pnlAdvancedTiming_ : pnlSliceSettings_, "growx, wrap"); - pnlRight_.add(cbxUseAdvancedTiming_, "growx"); - pnlRight_.revalidate(); - pnlRight_.repaint(); + pnlAdvancedTiming_.setPanelEnabled(useAdvancedTiming); + pnlSliceSettings_.setPanelEnabled(!useAdvancedTiming); } public PositionPanel getMultiPositionPanel() { diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/DeviceTab.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/DeviceTab.java deleted file mode 100644 index b6c6a062..00000000 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/DeviceTab.java +++ /dev/null @@ -1,75 +0,0 @@ -package org.micromanager.lightsheetmanager.gui.tabs; - -import org.micromanager.lightsheetmanager.gui.components.Button; -import org.micromanager.lightsheetmanager.gui.components.ListeningPanel; -import org.micromanager.lightsheetmanager.gui.components.Panel; -import org.micromanager.lightsheetmanager.model.DeviceManager; -import org.micromanager.lightsheetmanager.LightSheetManager; - -import javax.swing.JLabel; -import java.util.Objects; - -/** - * - */ -public class DeviceTab extends Panel implements ListeningPanel { - - private Button btnCreateConfigGroup_; - - private DeviceManager devices_; - private LightSheetManager model_; - - public DeviceTab(final LightSheetManager model) { - model_ = Objects.requireNonNull(model); - devices_ = model_.devices(); - createUserInterface(); - createEventHandlers(); - } - - private void createUserInterface() { - - setMigLayout( - "", - "[]0[]", - "[]0[]" - ); - - btnCreateConfigGroup_ = new Button("Create Devices Configuration Group", 220, 30); - - final JLabel lblGeometryType = new JLabel("Microscope Geometry: " - + devices_.adapter().geometry()); - final JLabel lblLightSheetType = new JLabel("Light Sheet Type: " - + devices_.adapter().lightSheetType()); - final JLabel lblNumImagingPaths = new JLabel("Imaging Paths: " - + devices_.adapter().numImagingPaths()); - final JLabel lblNumIlluminationPaths = new JLabel("Illumination Paths: " - + devices_.adapter().numIlluminationPaths()); - final JLabel lblNumSimultaneousCameras = new JLabel("Simultaneous Cameras: " - + devices_.adapter().numSimultaneousCameras()); - - btnCreateConfigGroup_.setToolTipText("Creates or updates the \"LightSheetManager::Devices\" " + - "configuration group with all editable properties from the Light Sheet Manager device adapter."); - - add(lblGeometryType, "wrap"); - add(lblLightSheetType, "wrap"); - add(lblNumImagingPaths, "wrap"); - add(lblNumIlluminationPaths, "wrap"); - add(lblNumSimultaneousCameras, "wrap"); - add(btnCreateConfigGroup_, "gaptop 100"); - } - - private void createEventHandlers() { - btnCreateConfigGroup_.registerListener( - () -> devices_.createConfigGroup()); - } - - @Override - public void selected() { - - } - - @Override - public void unselected() { - - } -} diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/HelpTab.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/HelpTab.java deleted file mode 100644 index 328cb94a..00000000 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/HelpTab.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.micromanager.lightsheetmanager.gui.tabs; - -import org.micromanager.lightsheetmanager.gui.components.ListeningPanel; -import org.micromanager.lightsheetmanager.gui.components.Panel; -import org.micromanager.lightsheetmanager.gui.components.TextPane; - -/** - * - */ -public class HelpTab extends Panel implements ListeningPanel { - - private TextPane textPane_; - - public HelpTab() { - createUserInterface(); - createEventHandlers(); - } - - // TODO: update text - private void createUserInterface() { - - textPane_ = new TextPane(); - textPane_.setText("This plugin is a work in progress"); -// textPane_.setText( -// "This plugin is a work in progress; please contact the authors " -// + "Jon and Nico with bug reports or feature requests " -// + "(jon@asiimaging.com)." -// + "

If you encounter bugs, the first step is to check and see if your " -// + "problem has already been fixed by using a recent nightly build of Micro-Manager. " -// + "If not, it is helpful to generate a problem report using \"Help\"" -// + "-> \"Report Problem...\" in the main Micro-Manager window. After clicking " -// + "\"Done\", click \"View Report\", save the text as a file, " -// + "and then email that file directly to Jon." -// + "

Further information and instructions are on the Micro-Manager wiki " -// + "" -// + "ASIdiSPIM Plugin" -// + " as well as in the " -// + "" -// + "diSPIM User Manual." -// ); - - // add ui elements to the panel - add(textPane_, ""); - } - - private void createEventHandlers() { - textPane_.registerHyperlinkListener(); - - } - - @Override - public void selected() { - - } - - @Override - public void unselected() { - - } -} diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/SettingsTab.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/SettingsTab.java index 3a09aa44..8c4e6764 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/SettingsTab.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/SettingsTab.java @@ -2,6 +2,7 @@ import org.micromanager.lightsheetmanager.api.data.GeometryType; import org.micromanager.lightsheetmanager.api.internal.ScapeAcquisitionSettings; +import org.micromanager.lightsheetmanager.gui.components.Button; import org.micromanager.lightsheetmanager.gui.components.CheckBox; import org.micromanager.lightsheetmanager.gui.components.ListeningPanel; import org.micromanager.lightsheetmanager.gui.components.Panel; @@ -28,6 +29,8 @@ public class SettingsTab extends Panel implements ListeningPanel { private Spinner spnSliceAxisFilterFreq_; private Spinner spnLiveScanPeriod_; + private Button btnCreateConfigGroup_; + // changes the ui setup private boolean isUsingPLogic_; private boolean isUsingScanSettings_; @@ -47,6 +50,21 @@ private void createUserInterface() { isUsingPLogic_ = model_.devices().isUsingPLogic(); isUsingScanSettings_ = model_.devices().hasStageScanning(); + btnCreateConfigGroup_ = new Button("Create Devices Configuration Group", 220, 30); + btnCreateConfigGroup_.setToolTipText("Creates or updates the \"System::Startup\" configuration " + + "group with all editable properties from the Light Sheet Manager device adapter."); + + final JLabel lblGeometryType = new JLabel("Microscope Geometry: " + + model_.devices().adapter().geometry()); + final JLabel lblLightSheetType = new JLabel("Light Sheet Type: " + + model_.devices().adapter().lightSheetType()); + final JLabel lblNumImagingPaths = new JLabel("Imaging Paths: " + + model_.devices().adapter().numImagingPaths()); + final JLabel lblNumIlluminationPaths = new JLabel("Illumination Paths: " + + model_.devices().adapter().numIlluminationPaths()); + final JLabel lblNumSimultaneousCameras = new JLabel("Simultaneous Cameras: " + + model_.devices().adapter().numSimultaneousCameras()); + final Panel pnlScanSettings = new Panel("Stage Scan Settings"); pnlScanSettings.setMigLayout( "", @@ -99,6 +117,12 @@ private void createUserInterface() { spnSliceAxisFilterFreq_ = Spinner.createDoubleSpinner(0.4, 0.1, 1.0, 0.1); spnLiveScanPeriod_ = Spinner.createIntegerSpinner(20, 2, 10000, 100); + add(lblGeometryType, "wrap"); + add(lblLightSheetType, "wrap"); + add(lblNumImagingPaths, "wrap"); + add(lblNumIlluminationPaths, "wrap"); + add(lblNumSimultaneousCameras, "wrap"); + // scan settings panel if (isUsingScanSettings_) { pnlScanSettings.add(lblScanAcceleration, ""); @@ -134,6 +158,8 @@ private void createUserInterface() { if (isUsingPLogic_) { add(pnlLightSheet, "growx"); } + + add(btnCreateConfigGroup_, "gaptop 40"); } private void createEventHandlers() { @@ -175,6 +201,8 @@ private void createEventHandlers() { () -> scanner.setFilterFreqY(spnSliceAxisFilterFreq_.getDouble())); } + btnCreateConfigGroup_.registerListener(() -> model_.devices().createConfigGroup()); + // TODO: make this work with diSPIM settings // spnLiveScanPeriod_.registerListener( // e -> model_.acquisitions().settingsBuilder() diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/SetupPathTab.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/SetupPathTab.java index 849ee8fa..a36e6d8e 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/SetupPathTab.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/SetupPathTab.java @@ -1,6 +1,7 @@ package org.micromanager.lightsheetmanager.gui.tabs; import org.micromanager.lightsheetmanager.api.data.CameraMode; +import org.micromanager.lightsheetmanager.api.data.GeometryType; import org.micromanager.lightsheetmanager.gui.components.Label; import org.micromanager.lightsheetmanager.gui.components.ListeningPanel; import org.micromanager.lightsheetmanager.gui.components.Panel; @@ -24,7 +25,8 @@ public SetupPathTab(final LightSheetManager model, final int pathNum) { } private void createUserInterface() { - final String title = "Setup Path " + pathNum_; + final String title = (model_.devices().adapter().numImagingPaths() > 1) + ? ("Setup Path " + pathNum_) : "Setup Path"; final Label lblTitle = new Label(title, Font.BOLD, 16); setupPanel_ = new SetupPanel(model_, pathNum_); diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/TabPanel.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/TabPanel.java index 76198da6..0c7a0a2a 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/TabPanel.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/TabPanel.java @@ -3,6 +3,7 @@ import org.micromanager.lightsheetmanager.api.data.CameraMode; import org.micromanager.lightsheetmanager.LightSheetManagerFrame; import org.micromanager.lightsheetmanager.LightSheetManager; +import org.micromanager.lightsheetmanager.api.data.GeometryType; import org.micromanager.lightsheetmanager.model.DeviceManager; import org.micromanager.lightsheetmanager.gui.components.Panel; import org.micromanager.lightsheetmanager.gui.components.TabbedPane; @@ -19,10 +20,8 @@ public class TabPanel extends Panel { private NavigationTab navigationTab_; private AcquisitionTab acquisitionTab_; private AutofocusTab autofocusTab_; - private DeviceTab deviceTab_; private CameraTab cameraTab_; private SettingsTab settingsTab_; - private HelpTab helpTab_; private ArrayList setupPathTabs_; private final TabbedPane tabbedPane_; @@ -55,9 +54,7 @@ private void createUserInterface() { acquisitionTab_ = new AcquisitionTab(model_, frame_); autofocusTab_ = new AutofocusTab(model_); cameraTab_ = new CameraTab(model_); - deviceTab_ = new DeviceTab(model_); settingsTab_ = new SettingsTab(model_); - helpTab_ = new HelpTab(); // add tabs to the pane tabbedPane_.addTab(createTabTitle("Navigation"), navigationTab_); @@ -66,16 +63,18 @@ private void createUserInterface() { final int numImagingPaths = devices_.adapter().numImagingPaths(); for (int i = 0; i < numImagingPaths; i++) { SetupPathTab setupPathTab = new SetupPathTab(model_, i + 1); - tabbedPane_.add(createTabTitle("Setup Path " + (i + 1)), setupPathTab); + if (numImagingPaths > 1) { + tabbedPane_.add(createTabTitle("Setup Path " + (i + 1)), setupPathTab); + } else { + tabbedPane_.add(createTabTitle("Setup Path"), setupPathTab); + } setupPathTabs_.add(setupPathTab); } tabbedPane_.addTab(createTabTitle("Acquisition"), acquisitionTab_); tabbedPane_.addTab(createTabTitle("Autofocus"), autofocusTab_); tabbedPane_.addTab(createTabTitle("Cameras"), cameraTab_); - tabbedPane_.addTab(createTabTitle("Devices"), deviceTab_); tabbedPane_.addTab(createTabTitle("Settings"), settingsTab_); - tabbedPane_.addTab(createTabTitle("Help"), helpTab_); // set acquisition tab to default tabbedPane_.setSelectedIndex(numImagingPaths + 1); @@ -114,10 +113,6 @@ public AcquisitionTab getAcquisitionTab() { return acquisitionTab_; } - public DeviceTab getDeviceTab() { - return deviceTab_; - } - public CameraTab getCameraTab() { return cameraTab_; } diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/AdvancedTimingPanel.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/AdvancedTimingPanel.java index b30c4d7a..1803a6fe 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/AdvancedTimingPanel.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/AdvancedTimingPanel.java @@ -2,7 +2,6 @@ import org.micromanager.lightsheetmanager.api.AcquisitionSettings; import org.micromanager.lightsheetmanager.api.TimingSettings; -import org.micromanager.lightsheetmanager.api.internal.DefaultTimingSettings; import org.micromanager.lightsheetmanager.api.internal.ScapeAcquisitionSettings; import org.micromanager.lightsheetmanager.gui.components.CheckBox; import org.micromanager.lightsheetmanager.gui.components.Label; @@ -16,6 +15,15 @@ public class AdvancedTimingPanel extends Panel implements SettingsListener { + private Label lblDelayBeforeScan_; + private Label lblScansPerSlice_; + private Label lblScanDuration_; + private Label lblDelayBeforeLaser_; + private Label lblDelayBeforeCamera_; + private Label lblLaserTriggerDuration_; + private Label lblCameraTriggerDuration_; + private Label lblCameraExposure_; + private Spinner spnDelayBeforeScan_; private Spinner spnDelayBeforeLaser_; private Spinner spnDelayBeforeCamera_; @@ -44,14 +52,14 @@ private void createUserInterface() { "[]5[]" ); - final Label lblDelayBeforeScan = new Label("Delay Before Scan [ms]: "); - final Label lblDelayBeforeLaser = new Label("Delay Before Laser [ms]: "); - final Label lblDelayBeforeCamera = new Label("Delay Before Camera [ms]: "); - final Label lblLaserTriggerDuration = new Label("Laser Trigger Duration [ms]: "); - final Label lblCameraTriggerDuration = new Label("Camera Trigger Duration [ms]: "); - final Label lblScanDuration = new Label("Scan Duration [ms]: "); - final Label lblScansPerSlice = new Label("Scans Per Slice: "); - final Label lblCameraExposure = new Label("Camera Exposure [ms]: "); + lblDelayBeforeScan_ = new Label("Delay Before Scan [ms]: "); + lblScansPerSlice_ = new Label("Scans Per Slice: "); + lblScanDuration_ = new Label("Scan Duration [ms]: "); + lblDelayBeforeLaser_ = new Label("Delay Before Laser [ms]: "); + lblDelayBeforeCamera_ = new Label("Delay Before Camera [ms]: "); + lblLaserTriggerDuration_ = new Label("Laser Trigger Duration [ms]: "); + lblCameraTriggerDuration_ = new Label("Camera Trigger Duration [ms]: "); + lblCameraExposure_ = new Label("Camera Exposure [ms]: "); final TimingSettings timingSettings = model_.acquisitions().settings().timing(); @@ -75,21 +83,21 @@ private void createUserInterface() { cbxAlternateScanDirection_ = new CheckBox( "Alternate scan direction", false, CheckBox.LEFT); - add(lblDelayBeforeScan, ""); + add(lblDelayBeforeScan_, ""); add(spnDelayBeforeScan_, "wrap"); - add(lblScansPerSlice, ""); + add(lblScansPerSlice_, ""); add(spnScansPerSlice_, "wrap"); - add(lblScanDuration, ""); + add(lblScanDuration_, ""); add(spnScanDuration_, "wrap"); - add(lblDelayBeforeLaser, ""); + add(lblDelayBeforeLaser_, ""); add(spnDelayBeforeLaser_, "wrap"); - add(lblLaserTriggerDuration, ""); + add(lblLaserTriggerDuration_, ""); add(spnLaserTriggerDuration_, "wrap"); - add(lblDelayBeforeCamera, ""); + add(lblDelayBeforeCamera_, ""); add(spnDelayBeforeCamera_, "wrap"); - add(lblCameraTriggerDuration, ""); + add(lblCameraTriggerDuration_, ""); add(spnCameraTriggerDuration_, "wrap"); - add(lblCameraExposure, ""); + add(lblCameraExposure_, ""); add(spnCameraExposure_, "wrap"); add(cbxAlternateScanDirection_, ""); } @@ -192,6 +200,33 @@ private void createEventHandlers() { }); } + /** + * Set the enabled state of the entire panel. + * + * @param state true to set to enabled + */ + public void setPanelEnabled(final boolean state) { + // labels + lblDelayBeforeScan_.setEnabled(state); + lblScansPerSlice_.setEnabled(state); + lblScanDuration_.setEnabled(state); + lblDelayBeforeLaser_.setEnabled(state); + lblDelayBeforeCamera_.setEnabled(state); + lblLaserTriggerDuration_.setEnabled(state); + lblCameraTriggerDuration_.setEnabled(state); + lblCameraExposure_.setEnabled(state); + // spinners + spnDelayBeforeScan_.setEnabled(state); + spnScansPerSlice_.setEnabled(state); + spnScanDuration_.setEnabled(state); + spnDelayBeforeLaser_.setEnabled(state); + spnLaserTriggerDuration_.setEnabled(state); + spnDelayBeforeCamera_.setEnabled(state); + spnCameraTriggerDuration_.setEnabled(state); + spnCameraExposure_.setEnabled(state); + cbxAlternateScanDirection_.setEnabled(state); + } + /** * Updates the spinner values from the timing settings builder. */ diff --git a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/SlicePanel.java b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/SlicePanel.java index 79bca30f..4bead3b3 100644 --- a/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/SlicePanel.java +++ b/src/main/java/org/micromanager/lightsheetmanager/gui/tabs/acquisition/SlicePanel.java @@ -17,7 +17,7 @@ public class SlicePanel extends Panel implements SettingsListener { // regular panel - private CheckBox cbxMinimizeSlicePeriod_; + private CheckBox cbxMinimizePeriod_; private Label lblSlicePeriod_; private Label lblSampleExposure_; private Spinner spnSlicePeriod_; @@ -56,7 +56,7 @@ private void createUserInterface() { // regular panel lblSlicePeriod_ = new Label("Slice period [ms]:"); lblSampleExposure_ = new Label("Sample exposure [ms]:"); - cbxMinimizeSlicePeriod_ = new CheckBox( + cbxMinimizePeriod_ = new CheckBox( "Minimize slice period", 12, periodMinimized, CheckBox.RIGHT); spnSlicePeriod_ = Spinner.createDoubleSpinner( sliceSettings.period(), 0.0, Double.MAX_VALUE, 0.25); @@ -94,8 +94,8 @@ private void createUserInterface() { private void createEventHandlers() { // regular panel - cbxMinimizeSlicePeriod_.registerListener(() -> { - final boolean selected = cbxMinimizeSlicePeriod_.isSelected(); + cbxMinimizePeriod_.registerListener(() -> { + final boolean selected = cbxMinimizePeriod_.isSelected(); lblSlicePeriod_.setEnabled(!selected); spnSlicePeriod_.setEnabled(!selected); model_.acquisitions().settingsBuilder() @@ -154,7 +154,7 @@ private void createEventHandlers() { private void switchDisplayPanel(final CameraMode cameraMode) { removeAll(); if (cameraMode != CameraMode.VIRTUAL_SLIT) { - add(cbxMinimizeSlicePeriod_, "wrap"); + add(cbxMinimizePeriod_, "wrap"); add(lblSlicePeriod_, ""); add(spnSlicePeriod_, "wrap"); add(lblSampleExposure_, ""); @@ -173,6 +173,22 @@ private void switchDisplayPanel(final CameraMode cameraMode) { repaint(); } + public void setPanelEnabled(final boolean state) { + cbxMinimizePeriod_.setEnabled(state); + if (!cbxMinimizePeriod_.isSelected()) { + lblSlicePeriod_.setEnabled(state); + spnSlicePeriod_.setEnabled(state); + } + lblSampleExposure_.setEnabled(state); + spnSampleExposure_.setEnabled(state); + } + + /** + * Sets the enabled status of the label and spinner. + * Used when the user clicks "Minimize Slice Period" + * + * @param state true to disable the spinner + */ private void setSpinnerEnabled(final boolean state) { lblSlicePeriod_.setEnabled(state); spnSlicePeriod_.setEnabled(state); @@ -186,7 +202,7 @@ public void onSettingsChanged(final AcquisitionSettings settings) { spnSlicePeriod_.setDouble(settingsScape.slice().period()); spnSampleExposure_.setDouble(settingsScape.slice().sampleExposure()); final boolean periodMinimized = settingsScape.slice().periodMinimized(); - cbxMinimizeSlicePeriod_.setSelected(periodMinimized); + cbxMinimizePeriod_.setSelected(periodMinimized); setSpinnerEnabled(!periodMinimized); } }