Add support for custom gpx width

This commit is contained in:
Vitaliy 2020-06-26 18:44:49 +03:00
parent ddd66a9f84
commit 5dc3a5a484

View file

@ -20,11 +20,13 @@ import androidx.annotation.Nullable;
import androidx.appcompat.content.res.AppCompatResources; import androidx.appcompat.content.res.AppCompatResources;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities; import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile; import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.TrkSegment; import net.osmand.GPXUtilities.TrkSegment;
import net.osmand.GPXUtilities.WptPt; import net.osmand.GPXUtilities.WptPt;
import net.osmand.Location; import net.osmand.Location;
import net.osmand.PlatformUtil;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
import net.osmand.data.PointDescription; import net.osmand.data.PointDescription;
import net.osmand.data.QuadRect; import net.osmand.data.QuadRect;
@ -54,6 +56,8 @@ import net.osmand.render.RenderingRulesStorage;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils; import net.osmand.util.MapUtils;
import org.apache.commons.logging.Log;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -66,6 +70,8 @@ import static net.osmand.plus.dialogs.ConfigureMapMenu.CURRENT_TRACK_WIDTH_ATTR;
public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IMoveObjectProvider, MapTextProvider<WptPt> { public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IMoveObjectProvider, MapTextProvider<WptPt> {
private static final Log log = PlatformUtil.getLog(GPXLayer.class);
private static final double TOUCH_RADIUS_MULTIPLIER = 1.5; private static final double TOUCH_RADIUS_MULTIPLIER = 1.5;
private static final int START_ZOOM = 7; private static final int START_ZOOM = 7;
@ -73,10 +79,11 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
private Paint paint; private Paint paint;
private Paint shadowPaint; private Paint shadowPaint;
private Paint paintIcon;
private int cachedHash; private int cachedHash;
private int cachedColor; private int cachedColor;
private float defaultTrackWidth;
private Map<String, Float> cachedTrackWidth = new HashMap<>(); private Map<String, Float> cachedTrackWidth = new HashMap<>();
private Paint paintIcon;
private int currentTrackColor; private int currentTrackColor;
private LayerDrawable selectedPoint; private LayerDrawable selectedPoint;
@ -209,6 +216,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
if (hash != cachedHash) { if (hash != cachedHash) {
cachedHash = hash; cachedHash = hash;
cachedColor = ContextCompat.getColor(view.getApplication(), R.color.gpx_track); cachedColor = ContextCompat.getColor(view.getApplication(), R.color.gpx_track);
defaultTrackWidth = 7 * view.getDensity();
if (rrs != null) { if (rrs != null) {
RenderingRuleSearchRequest req = new RenderingRuleSearchRequest(rrs); RenderingRuleSearchRequest req = new RenderingRuleSearchRequest(rrs);
req.setBooleanFilter(rrs.PROPS.R_NIGHT_MODE, nightMode); req.setBooleanFilter(rrs.PROPS.R_NIGHT_MODE, nightMode);
@ -252,8 +260,10 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
searchTrackWidth(key, rrs, req, rc); searchTrackWidth(key, rrs, req, rc);
} }
} else { } else {
System.err.println("Rendering attribute gpx is not found !"); log.error("Rendering attribute gpx is not found !");
paint.setStrokeWidth(7 * view.getDensity()); for (String key : cachedTrackWidth.keySet()) {
cachedTrackWidth.put(key, defaultTrackWidth);
}
} }
} }
} }
@ -266,6 +276,16 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
} }
private void searchTrackWidth(String widthKey, RenderingRulesStorage rrs, RenderingRuleSearchRequest req, RenderingContext rc) { private void searchTrackWidth(String widthKey, RenderingRulesStorage rrs, RenderingRuleSearchRequest req, RenderingContext rc) {
if (!Algorithms.isEmpty(widthKey) && Algorithms.isInt(widthKey)) {
try {
int widthDp = Integer.parseInt(widthKey);
float widthF = AndroidUtils.dpToPx(view.getApplication(), widthDp);
cachedTrackWidth.put(widthKey, widthF);
} catch (NumberFormatException e) {
log.error(e.getMessage(), e);
cachedTrackWidth.put(widthKey, defaultTrackWidth);
}
} else {
RenderingRuleProperty ctWidth = rrs.PROPS.get(CURRENT_TRACK_WIDTH_ATTR); RenderingRuleProperty ctWidth = rrs.PROPS.get(CURRENT_TRACK_WIDTH_ATTR);
if (ctWidth != null) { if (ctWidth != null) {
req.setStringFilter(ctWidth, widthKey); req.setStringFilter(ctWidth, widthKey);
@ -275,6 +295,7 @@ public class GPXLayer extends OsmandMapLayer implements IContextMenuProvider, IM
cachedTrackWidth.put(widthKey, widthF); cachedTrackWidth.put(widthKey, widthF);
} }
} }
}
private int calculateHash(Object... o) { private int calculateHash(Object... o) {
return Arrays.hashCode(o); return Arrays.hashCode(o);