Skip to content

Commit eb54a50

Browse files
committed
Fix duplicate entries in image selections
Previously, image selections (e.g. in a Swing UI) would show three entries in a dropdown for each image opened as a Dataset. The issue was that multiple converters would add convertible inputs to the set of compatible inputs without checking if another converter has addes a different represenation of the same data (e.g. ImageTitle, ImageDisplay, Dataset). This commit changes the implementation in ImageTitleToImagePlusConverter to check if a Dataset is available, i.e. it preferes Datasets. Similar changes check for an available Dataset in the ImageDisplayToImagePlusConverter to prefer that.
1 parent fc16672 commit eb54a50

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

src/main/java/net/imagej/legacy/convert/ImageDisplayToImagePlusConverter.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@
3535

3636
import java.lang.reflect.Type;
3737
import java.util.Collection;
38+
import java.util.List;
3839

40+
import net.imagej.DatasetService;
3941
import net.imagej.display.ImageDisplay;
4042
import net.imagej.legacy.LegacyService;
4143

@@ -65,6 +67,9 @@ public class ImageDisplayToImagePlusConverter extends
6567
@Parameter(required = false)
6668
private ObjectService objectService;
6769

70+
@Parameter(required = false)
71+
private DatasetService datasetService;
72+
6873
// -- Converter methods --
6974

7075
@Override
@@ -106,7 +111,12 @@ public <T> T convert(final Object src, final Class<T> dest) {
106111
@Override
107112
public void populateInputCandidates(final Collection<Object> objects) {
108113
if (objectService == null) return;
109-
objects.addAll(objectService.getObjects(ImageDisplay.class));
114+
List<ImageDisplay> imageDisplays = objectService.getObjects(ImageDisplay.class);
115+
for (ImageDisplay imageDisplay : imageDisplays) {
116+
if (datasetService.getDatasets(imageDisplay).isEmpty()) {
117+
objects.add(imageDisplay);
118+
}
119+
}
110120
}
111121

112122
@Override

src/main/java/net/imagej/legacy/convert/ImageTitleToImagePlusConverter.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,14 @@
3636

3737
import java.util.Collection;
3838

39+
import net.imagej.DatasetService;
40+
import net.imagej.display.ImageDisplay;
41+
import net.imagej.legacy.LegacyService;
42+
3943
import org.scijava.convert.AbstractConverter;
4044
import org.scijava.convert.ConvertService;
4145
import org.scijava.convert.Converter;
46+
import org.scijava.plugin.Parameter;
4247
import org.scijava.plugin.Plugin;
4348
import org.scijava.widget.ObjectWidget;
4449
import org.scijava.widget.WidgetModel;
@@ -66,6 +71,12 @@ public class ImageTitleToImagePlusConverter extends
6671
AbstractConverter<ImageTitleToImagePlusConverter.ImageTitle, ImagePlus>
6772
{
6873

74+
@Parameter(required = false)
75+
private DatasetService datasetService;
76+
77+
@Parameter(required = false)
78+
private LegacyService legacyService;
79+
6980
// -- Converter methods --
7081

7182
@Override
@@ -80,7 +91,14 @@ public void populateInputCandidates(final Collection<Object> objects) {
8091
if (imageIDs == null) return;
8192
for (final int imageID : imageIDs) {
8293
final ImagePlus imp = WindowManager.getImage(imageID);
83-
if (imp != null) objects.add(new ImageTitle(imp));
94+
if (imp != null) {
95+
ImageTitle imageTitle = new ImageTitle(imp);
96+
// Prefer a Dataset if it is available (don't add to objects)
97+
ImageDisplay imageDisplay = legacyService.getImageMap().lookupDisplay(imp);
98+
if(datasetService.getDatasets(imageDisplay).isEmpty()) {
99+
objects.add(imageTitle);
100+
}
101+
}
84102
}
85103
}
86104

0 commit comments

Comments
 (0)