Decrease allocations from listing the layers

Signed-off-by: Taylor Smock <tsmock@meta.com>
pull/35/head v810
Taylor Smock 2023-08-08 13:52:36 -06:00
rodzic a2372c6e49
commit dd3cb880a6
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 233BB2E466604E27
3 zmienionych plików z 42 dodań i 21 usunięć

Wyświetl plik

@ -648,6 +648,16 @@ public class MapWithAIInfo extends
return this.categories != null ? Collections.unmodifiableList(this.categories) : Collections.emptyList(); return this.categories != null ? Collections.unmodifiableList(this.categories) : Collections.emptyList();
} }
/**
* Check if this layer has a specified category
*
* @param category The category to look for
* @return {@code true} if this layer has the specified category
*/
public boolean hasCategory(MapWithAICategory category) {
return this.category == category || (this.categories != null && this.categories.contains(category));
}
/** /**
* Set the key that indicates an object is already conflated, and if so, to what * Set the key that indicates an object is already conflated, and if so, to what
* *

Wyświetl plik

@ -24,7 +24,6 @@ import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask; import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask; import java.util.concurrent.RecursiveTask;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
import org.openstreetmap.gui.jmapviewer.tilesources.TileSourceInfo; import org.openstreetmap.gui.jmapviewer.tilesources.TileSourceInfo;
import org.openstreetmap.josm.actions.ExpertToggleAction; import org.openstreetmap.josm.actions.ExpertToggleAction;
@ -32,6 +31,7 @@ import org.openstreetmap.josm.data.Preferences;
import org.openstreetmap.josm.data.StructUtils; import org.openstreetmap.josm.data.StructUtils;
import org.openstreetmap.josm.data.imagery.ImageryInfo; import org.openstreetmap.josm.data.imagery.ImageryInfo;
import org.openstreetmap.josm.data.preferences.BooleanProperty; import org.openstreetmap.josm.data.preferences.BooleanProperty;
import org.openstreetmap.josm.data.preferences.CachingProperty;
import org.openstreetmap.josm.gui.MainApplication; import org.openstreetmap.josm.gui.MainApplication;
import org.openstreetmap.josm.gui.PleaseWaitRunnable; import org.openstreetmap.josm.gui.PleaseWaitRunnable;
import org.openstreetmap.josm.gui.util.GuiHelper; import org.openstreetmap.josm.gui.util.GuiHelper;
@ -55,7 +55,8 @@ public class MapWithAILayerInfo {
/** /**
* A boolean preference used to determine if preview datasets should be shown * A boolean preference used to determine if preview datasets should be shown
*/ */
public static final BooleanProperty SHOW_PREVIEW = new BooleanProperty("mapwithai.sources.preview", false); public static final CachingProperty<Boolean> SHOW_PREVIEW = new BooleanProperty("mapwithai.sources.preview", false)
.cached();
/** Finish listeners */ /** Finish listeners */
private ListenerList<FinishListener> finishListenerListenerList = ListenerList.create(); private ListenerList<FinishListener> finishListenerListenerList = ListenerList.create();
@ -612,13 +613,25 @@ public class MapWithAILayerInfo {
* not {@code true}. * not {@code true}.
*/ */
private static List<MapWithAIInfo> filterPreview(List<MapWithAIInfo> layers) { private static List<MapWithAIInfo> filterPreview(List<MapWithAIInfo> layers) {
if (Boolean.TRUE.equals(SHOW_PREVIEW.get()) && ExpertToggleAction.isExpert()) { final var newList = new ArrayList<>(layers);
return layers; newList.removeIf(MapWithAILayerInfo::isFiltered);
return newList;
}
/**
* Check if the layer should be filtered out
*
* @param info The layer to check
* @return {@code true} if the layer should be filtered
*/
public static boolean isFiltered(MapWithAIInfo info) {
if (info == null || !info.hasValidUrl()) {
return true;
} }
return layers.stream() if (ExpertToggleAction.isExpert() && Boolean.TRUE.equals(SHOW_PREVIEW.get())) {
.filter(i -> i.getCategory() != MapWithAICategory.PREVIEW return false;
&& !i.getAdditionalCategories().contains(MapWithAICategory.PREVIEW)) }
.filter(MapWithAIInfo::hasValidUrl).collect(Collectors.toList()); return info.hasCategory(MapWithAICategory.PREVIEW);
} }
/** /**

Wyświetl plik

@ -4,6 +4,13 @@ package org.openstreetmap.josm.plugins.mapwithai.gui;
import static org.openstreetmap.josm.tools.I18n.tr; import static org.openstreetmap.josm.tools.I18n.tr;
import static org.openstreetmap.josm.tools.I18n.trc; import static org.openstreetmap.josm.tools.I18n.trc;
import javax.swing.Action;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
import java.awt.Component; import java.awt.Component;
import java.awt.GraphicsEnvironment; import java.awt.GraphicsEnvironment;
import java.awt.MenuComponent; import java.awt.MenuComponent;
@ -16,14 +23,6 @@ import java.util.EnumMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import javax.swing.Action;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuListener;
import org.openstreetmap.josm.actions.JosmAction; import org.openstreetmap.josm.actions.JosmAction;
import org.openstreetmap.josm.data.coor.LatLon; import org.openstreetmap.josm.data.coor.LatLon;
@ -31,7 +30,6 @@ import org.openstreetmap.josm.data.imagery.Shape;
import org.openstreetmap.josm.data.sources.SourceInfo; import org.openstreetmap.josm.data.sources.SourceInfo;
import org.openstreetmap.josm.gui.ImageryMenu; import org.openstreetmap.josm.gui.ImageryMenu;
import org.openstreetmap.josm.gui.MainApplication; import org.openstreetmap.josm.gui.MainApplication;
import org.openstreetmap.josm.gui.MapView;
import org.openstreetmap.josm.gui.MenuScroller; import org.openstreetmap.josm.gui.MenuScroller;
import org.openstreetmap.josm.gui.preferences.imagery.ImageryPreference; import org.openstreetmap.josm.gui.preferences.imagery.ImageryPreference;
import org.openstreetmap.josm.plugins.mapwithai.actions.AddMapWithAILayerAction; import org.openstreetmap.josm.plugins.mapwithai.actions.AddMapWithAILayerAction;
@ -138,12 +136,12 @@ public class MapWithAIMenu extends JMenu {
// list all imagery entries where the current map location is within the imagery // list all imagery entries where the current map location is within the imagery
// bounds // bounds
if (MainApplication.isDisplayingMapView()) { if (MainApplication.isDisplayingMapView()) {
MapView mv = MainApplication.getMap().mapView; final var mv = MainApplication.getMap().mapView;
LatLon pos = mv.getProjection().eastNorth2latlon(mv.getCenter()); final var pos = mv.getProjection().eastNorth2latlon(mv.getCenter());
final List<MapWithAIInfo> inViewLayers = MapWithAILayerInfo.getInstance().getAllDefaultLayers().stream() final var inViewLayers = MapWithAILayerInfo.getInstance().getAllDefaultLayers().stream()
.filter(i -> i.getBounds() != null && i.getBounds().contains(pos) && !alreadyInUse.contains(i) .filter(i -> i.getBounds() != null && i.getBounds().contains(pos) && !alreadyInUse.contains(i)
&& !savedLayers.contains(i) && isPosInOneShapeIfAny(i, pos)) && !savedLayers.contains(i) && isPosInOneShapeIfAny(i, pos))
.sorted(alphabeticSourceComparator).collect(Collectors.toList()); .sorted(alphabeticSourceComparator).toList();
if (!inViewLayers.isEmpty()) { if (!inViewLayers.isEmpty()) {
if (inViewLayers.stream().anyMatch(i -> i.getCategory() == i.getCategory().getDefault())) { if (inViewLayers.stream().anyMatch(i -> i.getCategory() == i.getCategory().getDefault())) {
addDynamicSeparator(); addDynamicSeparator();