diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java b/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java index 55e5d98bc19..e54fa6feac0 100644 --- a/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java +++ b/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java @@ -165,7 +165,7 @@ public GeoImageLayer(final List data, GpxLayer gpxLayer, final Strin * @since 18078 */ public GeoImageLayer(final List data, GpxData gpxData, final String name, boolean useThumbs) { - super(name != null ? name : tr("Geotagged Images")); + super(!Utils.isBlank(name) ? name : tr("Geotagged Images")); this.data = new ImageData(data); this.gpxData = gpxData; this.useThumbs = useThumbs; diff --git a/src/org/openstreetmap/josm/gui/layer/geoimage/ImagesLoader.java b/src/org/openstreetmap/josm/gui/layer/geoimage/ImagesLoader.java index 49afbab28b1..eb9edaee527 100644 --- a/src/org/openstreetmap/josm/gui/layer/geoimage/ImagesLoader.java +++ b/src/org/openstreetmap/josm/gui/layer/geoimage/ImagesLoader.java @@ -11,10 +11,14 @@ import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.TreeMap; +import java.util.stream.Collectors; import javax.swing.JOptionPane; +import org.openstreetmap.josm.data.preferences.BooleanProperty; import org.openstreetmap.josm.gui.MainApplication; import org.openstreetmap.josm.gui.PleaseWaitRunnable; import org.openstreetmap.josm.gui.io.importexport.ImageImporter; @@ -33,12 +37,14 @@ final class ImagesLoader extends PleaseWaitRunnable { private boolean canceled; - private GeoImageLayer layer; + private final List layers = new ArrayList<>(); private final Collection selection; private final Set loadedDirectories = new HashSet<>(); private final Set errorMessages; private final GpxLayer gpxLayer; + private static final BooleanProperty PROP_ONE_LAYER_PER_FOLDER = new BooleanProperty("geoimage.one-layer-per-folder", false); + /** * Constructs a new {@code ImagesLoader}. * @param selection image files to load @@ -72,7 +78,7 @@ protected void realRun() throws IOException { progressMonitor.setTicksCount(files.size()); // read the image files - List entries = new ArrayList<>(files.size()); + Map> entries = new TreeMap<>(); for (File f : files) { @@ -85,9 +91,14 @@ protected void realRun() throws IOException { ImageEntry e = new ImageEntry(f); e.extractExif(); - entries.add(e); + File parentFile = f.getParentFile(); + entries.computeIfAbsent(parentFile != null ? parentFile.getName() : "", x -> new ArrayList<>()).add(e); + } + if (Boolean.TRUE.equals(PROP_ONE_LAYER_PER_FOLDER.get())) { + entries.entrySet().stream().map(e -> new GeoImageLayer(e.getValue(), gpxLayer, e.getKey())).forEach(layers::add); + } else { + layers.add(new GeoImageLayer(entries.values().stream().flatMap(List::stream).collect(Collectors.toList()), gpxLayer)); } - layer = new GeoImageLayer(entries, gpxLayer); files.clear(); } @@ -159,7 +170,7 @@ protected void finish() { JOptionPane.ERROR_MESSAGE ); } - if (layer != null) { + for (GeoImageLayer layer : layers) { MainApplication.getLayerManager().addLayer(layer); if (!canceled && !layer.getImageData().getImages().isEmpty()) {