Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
package org.micromanager.lightsheetmanager;

import com.google.common.eventbus.Subscribe;
import net.miginfocom.swing.MigLayout;

import org.micromanager.Studio;
import org.micromanager.events.ExposureChangedEvent;
import org.micromanager.events.LiveModeEvent;

import org.micromanager.lightsheetmanager.api.data.GeometryType;
import org.micromanager.lightsheetmanager.gui.components.Label;
import org.micromanager.lightsheetmanager.gui.data.Icons;
Expand All @@ -23,24 +18,25 @@
*/
public class LightSheetManagerFrame extends JFrame {

private final Studio studio_;
private TabPanel tabPanel_;

private final LightSheetManager model_;

public LightSheetManagerFrame(final LightSheetManager model, final boolean isLoaded) {
model_ = Objects.requireNonNull(model);
studio_ = model_.studio();

// save window position
WindowPositioning.setUpBoundsMemory(
this, this.getClass(), this.getClass().getSimpleName());
WindowPositioning.setUpBoundsMemory(this,
this.getClass(), this.getClass().getSimpleName());

// window setup
setTitle(LightSheetManagerPlugin.menuName);
setIconImage(Icons.MICROSCOPE.getImage());
setResizable(false);

// create the user interface
if (isLoaded) {
initDialogs();
final GeometryType geometryType = model_.devices().adapter().geometry();
switch (geometryType) {
openDialogs(); // ask the user to change settings
final GeometryType geometry = model_.devices().adapter().geometry();
switch (geometry) {
case DISPIM:
createUserInterface();
break;
Expand All @@ -55,54 +51,38 @@ public LightSheetManagerFrame(final LightSheetManager model, final boolean isLoa
model_.acquisitions().updateDurationLabels();
break;
default:
model_.setErrorText("Microscope geometry type "
+ geometryType + " is not supported yet.");
model_.setErrorText("Microscope geometry type " + geometry + " is not supported yet.");
createErrorUserInterface();
break;
}
} else {
// error text set in model_ setup
createErrorUserInterface();
}

}

/**
* This is the window that opens when the plugin encounters an error.
* The window that opens when the plugin encounters an error, it
* displays the error message set during {@code model_.setup()}.
*/
private void createErrorUserInterface() {
setTitle(LightSheetManagerPlugin.menuName);
setResizable(false);

// use MigLayout as the layout manager
setLayout(new MigLayout(
"insets 10 10 10 10",
"[]10[]",
"[]10[]"
));
final Label lblTitle = new Label("Light Sheet Manager", Font.BOLD, 16);

final Label lblTitle = new Label(LightSheetManagerPlugin.menuName, Font.BOLD, 16);
final Label lblError = new Label(model_.getErrorText(), Font.BOLD, 14);

add(lblTitle, "wrap");
add(lblError, "");

pack(); // fit window size to layout
setIconImage(Icons.MICROSCOPE.getImage());

// clean up resources when the frame is closed
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}

/**
* The user interface for diSPIM or SCAPE.
*/
private void createUserInterface() {
setTitle(LightSheetManagerPlugin.menuName);
setResizable(false);

final Label lblTitle = new Label(LightSheetManagerPlugin.menuName, Font.BOLD, 20);
lblTitle.setFont(new Font(Font.MONOSPACED, Font.BOLD, 20));

// use MigLayout as the layout manager
setLayout(new MigLayout(
"insets 10 10 10 10",
Expand All @@ -115,63 +95,32 @@ private void createUserInterface() {
final int height = 680;
tabPanel_ = new TabPanel(model_, this, width, height);

// add ui elements to the panel
add(lblTitle, "wrap");
add(tabPanel_, "wrap");

pack(); // fit window size to layout
setIconImage(Icons.MICROSCOPE.getImage());

// clean up resources when the frame is closed
setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

// register micro-manager events
studio_.events().registerForEvents(this);
final Label lblTitle = new Label(LightSheetManagerPlugin.menuName, Font.BOLD, 20);
lblTitle.setFont(new Font(Font.MONOSPACED, Font.BOLD, 20));

// restore the polling state from settings
if (model_.pluginSettings().isPollingPositions()) {
model_.positions().startPolling();
}

// TODO: make this better, put it in plugin class
// window close event
WindowUtils.registerWindowClosingEvent(this, event -> {
tabPanel_.getAcquisitionTab().getMultiPositionPanel().getXYZGridFrame().dispose();
model_.positions().stopPolling();
model_.userSettings().save();
studio_.logs().logMessage("user settings saved");
if (tabPanel_ != null) {
tabPanel_.getAcquisitionTab().getMultiPositionPanel().getXYZGridFrame().dispose();
}
});

add(lblTitle, "wrap");
add(tabPanel_, "wrap");
}

/**
* Detect settings after the model is loaded,
* ask to change settings with dialogs.
*/
private void initDialogs() {
private void openDialogs() {
model_.devices().checkDevices(this);
}

public void toggleLiveMode() {
if (studio_.live().isLiveModeOn()) {
studio_.live().setLiveModeOn(false);
// close the live mode window if it exists
if (studio_.live().getDisplay() != null) {
studio_.live().getDisplay().close();
}
} else {
studio_.live().setLiveModeOn(true);
}
}

// Note: doesn't seem to work for all cameras
@Subscribe
public void liveModeListener(LiveModeEvent event) {
// if (!studio_.live().isLiveModeOn()) {
// }
}

@Subscribe
public void onExposureChanged(ExposureChangedEvent event) {
// System.out.println("Exposure changed!");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import org.scijava.plugin.Plugin;
import org.scijava.plugin.SciJavaPlugin;

import javax.swing.JFrame;

@Plugin(type = MenuPlugin.class)
public class LightSheetManagerPlugin implements MenuPlugin, SciJavaPlugin {
public static final String copyright = "Applied Scientific Instrumentation (ASI), 2022-2026";
Expand All @@ -30,24 +32,50 @@ public String getSubMenu() {

@Override
public void onPluginSelected() {
// only one instance of the plugin can be open
// restore the window if the plugin is already open
if (WindowUtils.isOpen(frame_)) {
WindowUtils.close(frame_);
if (WindowUtils.isMinimized(frame_)) {
frame_.setState(JFrame.NORMAL);
}
frame_.setVisible(true);
frame_.toFront();
frame_.requestFocus();
return; // early exit => plugin is already open
}

// TODO: capture all errors like this?
// start the plugin
try {
// create the data model and load settings
model_ = new LightSheetManager(studio_);
final boolean isLoaded = model_.setup();

// create the ui; show an error ui on failure
frame_ = new LightSheetManagerFrame(model_, isLoaded);
frame_.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

if (isLoaded) {
model_.acquisitions().setFrame(frame_);
}

WindowUtils.registerWindowClosingEvent(frame_, event -> {
model_.positions().stopPolling();
model_.userSettings().save();
});

WindowUtils.registerWindowClosedEvent(frame_, event -> {
frame_ = null;
model_ = null;
});

frame_.pack();
frame_.setVisible(true);
frame_.toFront();
} catch (Exception e) {
// cleanup resources
frame_ = null;
model_ = null;
if (studio_ != null) {
studio_.logs().showError(e);
studio_.logs().showError(e, "Error starting Light Sheet Manager");
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public void setAbsoluteSize(final int width, final int height) {
setMaximumSize(size);
}

public void registerListener(final Method method) {
addActionListener(method::run);
public void registerListener(final Runnable listener) {
addActionListener(e -> listener.run());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import javax.swing.JCheckBox;
import javax.swing.SwingConstants;
import java.awt.Font;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;

public class CheckBox extends JCheckBox {

Expand Down Expand Up @@ -38,10 +40,10 @@ public CheckBox(final String text, final int fontSize, final boolean defaultStat
*/
public void setLocked(final boolean locked) {
isLocked_ = locked;
if (locked) {
setFont(getFont().deriveFont(java.awt.Font.BOLD));
if (isLocked_) {
setFont(getFont().deriveFont(Font.BOLD));
} else {
setFont(getFont().deriveFont(java.awt.Font.PLAIN));
setFont(getFont().deriveFont(Font.PLAIN));
}
}

Expand All @@ -61,28 +63,28 @@ public void setSelected(boolean state, boolean shouldFire) {
}
}

public void registerListener(final Method method) {
addActionListener(method::run);
}

@Override
public void setSelected(boolean state) {
// default to true, always fires events
setSelected(state, true);
}

@Override
protected void processMouseEvent(java.awt.event.MouseEvent e) {
protected void processMouseEvent(MouseEvent e) {
if (!isLocked_) {
super.processMouseEvent(e);
}
}

@Override
protected void processKeyEvent(java.awt.event.KeyEvent e) {
protected void processKeyEvent(KeyEvent e) {
if (!isLocked_) {
super.processKeyEvent(e);
}
}

public void registerListener(final Runnable listener) {
addActionListener(e -> listener.run());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import javax.swing.JComboBox;

import java.awt.Dimension;
import java.util.Arrays;

public class ComboBox<T> extends JComboBox<T> {

Expand All @@ -30,8 +29,8 @@ public void setAbsoluteSize(final int width, final int height) {
setMaximumSize(size);
}

public void registerListener(final Method method) {
addActionListener(method::run);
public void registerListener(final Runnable listener) {
addActionListener(e -> listener.run());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

import javax.swing.JLabel;

import java.awt.*;
import java.awt.Color;
import java.awt.Font;

public class Label extends JLabel {

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,9 @@ public int getSelectedIndex() {
return -1;
}

public void registerListener(final Method method) {
public void registerListener(final Runnable listener) {
for (final JRadioButton button : buttons) {
button.addActionListener(method::run);
button.addActionListener(e -> listener.run());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.micromanager.lightsheetmanager.gui.components;

import org.micromanager.lightsheetmanager.api.AcquisitionSettings;

@FunctionalInterface
public interface SettingsListener {
void onSettingsChanged(final AcquisitionSettings settings);
}
Loading
Loading