From d4af0e985e1d60048d67bdb0f1a9b3a6512ef8b8 Mon Sep 17 00:00:00 2001 From: gobbo_a Date: Mon, 8 Dec 2025 14:23:30 +0100 Subject: [PATCH] Protect write to permanent pipelines --- .../src/main/java/ScreenPanelSLS.java | 72 +++++++++++++++---- 1 file changed, 60 insertions(+), 12 deletions(-) diff --git a/screenpanel-sls/src/main/java/ScreenPanelSLS.java b/screenpanel-sls/src/main/java/ScreenPanelSLS.java index 010e7d7..1463a51 100755 --- a/screenpanel-sls/src/main/java/ScreenPanelSLS.java +++ b/screenpanel-sls/src/main/java/ScreenPanelSLS.java @@ -21,7 +21,6 @@ import ch.psi.pshell.swing.SwingUtils.OptionType; import ch.psi.pshell.screenpanel.Options; import ch.psi.pshell.screenpanel.CamServerViewer; import ch.psi.pshell.utils.Threading; -import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.io.IOException; @@ -30,11 +29,15 @@ import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.DefaultComboBoxModel; +import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.JSpinner; import javax.swing.JTextField; import javax.swing.SwingUtilities; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; /** * @@ -60,6 +63,10 @@ public class ScreenPanelSLS extends Panel implements CamServerViewer.CamServerVi boolean detached; String detachedInstance; String originalInstance; + boolean pipelineControlsEnabled; + + final boolean disable_detach; + final boolean edit_permanent; final Logger logger; @@ -76,6 +83,7 @@ public class ScreenPanelSLS extends Panel implements CamServerViewer.CamServerVi public ScreenPanelSLS() { logger = Logger.getLogger(getClass().getName()); initComponents(); + pipelineControlsEnabled = true; panelParameters.setVisible(false); panelScreen.setVisible(false); panelControls.setVisible(false); @@ -87,7 +95,9 @@ public class ScreenPanelSLS extends Panel implements CamServerViewer.CamServerVi camServerViewer.setSidePanelVisible(true); camServerViewer.setShowFit(true); camServerViewer.setShowProfile(true); - camServerViewer.setShowReticle(true); + camServerViewer.setShowReticle(true); + disable_detach = App.hasAdditionalArgument("disable_detach"); + edit_permanent = !disable_detach && App.hasAdditionalArgument("edit_permanent"); } @Override @@ -114,6 +124,28 @@ public class ScreenPanelSLS extends Panel implements CamServerViewer.CamServerVi } catch (Exception ex) { logger.log(Level.SEVERE, null, ex); } + + if (!edit_permanent){ + camServerViewer.getRenderer().getPopupMenu().addPopupMenuListener(new PopupMenuListener() { + @Override + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + if (!pipelineControlsEnabled){ + SwingUtilities.invokeLater(()->{ + SwingUtils.getMenuItem(camServerViewer.getRenderer().getPopupMenu(), "Set ROI", true).setEnabled(false); + SwingUtils.getMenuItem(camServerViewer.getRenderer().getPopupMenu(), "Reset ROI", true).setEnabled(false); + }); + } + } + + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + } + + @Override + public void popupMenuCanceled(PopupMenuEvent e) { + } + }); + } } @Override @@ -154,8 +186,17 @@ public class ScreenPanelSLS extends Panel implements CamServerViewer.CamServerVi } } } - - + + void setPipelineControlsEnabled(boolean value){ + pipelineControlsEnabled = value; + for (JCheckBox button : SwingUtils.getComponentsByType(camServerViewer.getPanelPipeline(), JCheckBox.class)){ + button.setEnabled(value); + } + for (JSpinner spinner : SwingUtils.getComponentsByType(camServerViewer.getPanelPipeline(), JSpinner.class)){ + spinner.setEnabled(value); + } + } + @Override protected void onTimer() { //for (Device dev : new Device[]{screen, exposure}) { @@ -207,10 +248,12 @@ public class ScreenPanelSLS extends Panel implements CamServerViewer.CamServerVi panelParameters.setVisible(false); panelScreen.setVisible(false); panelControls.setVisible(false); - } - boolean wasDetached = detached && detachedInstance.startsWith(name); - detached = (name!=null) && name.contains("detached_instance"); - panelEpicsHandler.setVisible(detached || wasDetached); + } + if (!disable_detach){ + boolean wasDetached = detached && detachedInstance.startsWith(name); + detached = (name!=null) && name.contains("detached_instance"); + panelEpicsHandler.setVisible(detached || wasDetached); + } updateDialogTitle(); } @@ -237,10 +280,15 @@ public class ScreenPanelSLS extends Panel implements CamServerViewer.CamServerVi panelScreen.setVisible(cameraControls); panelControls.setVisible(cameraControls); - if(permanentInstances!=null){ - boolean permanent = permanentInstances.keySet().contains(instance); - ckDebugEpicsHandler.setSelected(detached); - panelEpicsHandler.setVisible(detached || permanent); + if (!disable_detach){ + if(permanentInstances!=null){ + boolean permanent = permanentInstances.keySet().contains(instance); + ckDebugEpicsHandler.setSelected(detached); + panelEpicsHandler.setVisible(detached || permanent); + if (!edit_permanent){ + setPipelineControlsEnabled(!permanent); + } + } } if (cameraName!=null){