altoslib: Add all known launch sites and names to map preload
authorKeith Packard <keithp@keithp.com>
Fri, 4 Dec 2020 22:58:15 +0000 (14:58 -0800)
committerKeith Packard <keithp@keithp.com>
Fri, 15 Jan 2021 20:05:15 +0000 (12:05 -0800)
This shows all of the known launch sites and their names in the map
preload screen.

Signed-off-by: Keith Packard <keithp@keithp.com>
altosdroid/app/src/main/java/org/altusmetrum/AltosDroid/AltosMapOffline.java
altoslib/AltosMap.java
altoslib/AltosMapInterface.java
altoslib/AltosMapMark.java
altosuilib/AltosUIMap.java
altosuilib/AltosUIMapPreload.java

index cca958c50f873f1f0afbed954f241bebfdfd8bbb..60c209e105cf22fee5cb891be1d008c5cff87657 100644 (file)
@@ -223,12 +223,20 @@ public class AltosMapOffline extends View implements ScaleGestureDetector.OnScal
                MapMark(double lat, double lon, int state) {
                        super(lat, lon, state);
                }
+
+               MapMark(double lat, double lon, int state, String label) {
+                       super(lat, lon, state, label);
+               }
        }
 
        public AltosMapMark new_mark(double lat, double lon, int state) {
                return new MapMark(lat, lon, state);
        }
 
+       public AltosMapMark new_mark(double lat, double lon, int state, String label) {
+               return new MapMark(lat, lon, state, label);
+       }
+
        public int width() {
                return getWidth();
        }
index 519ecfdf1f31f800a89a02484930e0bae897ff04..3877c7dce7a3631419c1c7e4ac37011c493fc267 100644 (file)
@@ -82,7 +82,7 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener {
        static final long auto_scroll_delay = 20 * 1000;
 
        public AltosMapTransform        transform;
-       AltosLatLon             centre;
+       public AltosLatLon              centre;
 
        public void reset() {
                // nothing
@@ -289,10 +289,10 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener {
                        centre(lat_lon);
        }
 
-       public AltosMapMark add_mark(double lat, double lon, int state) {
+       public AltosMapMark add_mark(double lat, double lon, int state, String label) {
                AltosMapMark mark;
                synchronized(marks) {
-                       mark = map_interface.new_mark(lat, lon, state);
+                       mark = map_interface.new_mark(lat, lon, state, label);
                        if (mark != null)
                                marks.add(mark);
                }
@@ -300,6 +300,10 @@ public class AltosMap implements AltosMapTileListener, AltosMapStoreListener {
                return mark;
        }
 
+       public AltosMapMark add_mark(double lat, double lon, int state) {
+               return add_mark(lat, lon, state, null);
+       }
+
        public void del_mark(AltosMapMark mark) {
                marks.remove(mark);
        }
index 0ce49d128c4babbad57ddc3d514e579fd38d8203..560f85da20e401e68e78a36609110cdee1c6e7ba 100644 (file)
@@ -30,6 +30,8 @@ public interface AltosMapInterface {
 
        public abstract AltosMapMark new_mark(double lat, double lon, int state);
 
+       public abstract AltosMapMark new_mark(double lat, double lon, int state, String label);
+
        public abstract AltosMapTile new_tile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size, int scale);
 
        public abstract int width();
index dcb75430d1bca0df099c107eff583dfa15f46531..0676f54f566b24f38e0b4c0e07b5df651943a317 100644 (file)
@@ -27,13 +27,23 @@ public abstract class AltosMapMark {
 
        public AltosLatLon      lat_lon;
        public int              state;
+       public String           label;
 
        static public int stroke_width = 6;
 
        public abstract void paint(AltosMapTransform t);
 
-       public AltosMapMark (double lat, double lon, int state) {
+       public AltosMapMark (double lat, double lon, int state, String label) {
                lat_lon = new AltosLatLon(lat, lon);
                this.state = state;
+               this.label = label;
+       }
+
+       public AltosMapMark (double lat, double lon, int state) {
+               this(lat, lon, state, null);
+       }
+
+       public AltosMapMark () {
+               this(0, 0, 0);
        }
 }
index 5f1b7ae6f03429a4db89c39ad38763e59c6e05b6..58371f05a090d892f88bc4f74ade73763a00039b 100644 (file)
@@ -62,6 +62,28 @@ public class AltosUIMap extends JComponent implements AltosFlightDisplay, AltosM
                        g.drawOval((int)pt.x-5, (int)pt.y-5, 10, 10);
                        g.drawOval((int)pt.x-20, (int)pt.y-20, 40, 40);
                        g.drawOval((int)pt.x-35, (int)pt.y-35, 70, 70);
+
+                       if (label != null) {
+                               Rectangle2D     bounds;
+                               bounds = line_font.getStringBounds(label, g.getFontRenderContext());
+                               float x = (float) pt.x;
+                               float y = (float) pt.y + (float) bounds.getHeight() / 2.0f;
+
+                               g.setFont(line_font);
+                               g.setColor(Color.WHITE);
+                               for (int dy = -2; dy <= 2; dy += 2)
+                                       for (int dx = -2; dx <= 2; dx += 2)
+                                               g.drawString(label, x + dx, y + dy);
+                               if (0 <= state && state < AltosUIMap.stateColors.length)
+                                       g.setColor(AltosUIMap.stateColors[state]);
+                               else
+                                       g.setColor(AltosUIMap.stateColors[AltosLib.ao_flight_invalid]);
+                               g.drawString(label, x, y);
+                       }
+               }
+
+               MapMark(double lat, double lon, int state, String label) {
+                       super(lat, lon, state, label);
                }
 
                MapMark(double lat, double lon, int state) {
@@ -403,6 +425,10 @@ public class AltosUIMap extends JComponent implements AltosFlightDisplay, AltosM
                return new MapMark(lat, lon, state);
        }
 
+       public AltosMapMark new_mark(double lat, double lon, int state, String label) {
+               return new MapMark(lat, lon, state, label);
+       }
+
        public AltosMapTile new_tile(AltosMapCache cache, AltosLatLon upper_left, AltosLatLon center, int zoom, int maptype, int px_size, int scale) {
                return new MapTile(cache, upper_left, center, zoom, maptype, px_size, scale);
        }
@@ -476,6 +502,10 @@ public class AltosUIMap extends JComponent implements AltosFlightDisplay, AltosM
                map.add_mark(lat, lon, status);
        }
 
+       public void add_mark(double lat, double lon, int status, String label) {
+               map.add_mark(lat, lon, status, label);
+       }
+
        public void clear_marks() {
                map.clear_marks();
        }
index 9ba273553885242686840c1f74230ba5798dc400..1fec169cd0e6e70ba0ad5b0c2e3f6f4d1a613225 100644 (file)
@@ -139,6 +139,7 @@ public class AltosUIMapPreload extends AltosUIFrame implements ActionListener, I
        JProgressBar    pbar;
 
        JLabel          site_list_label;
+       java.util.List<AltosLaunchSite> sites;
        JComboBox<AltosLaunchSite>      site_list;
 
        JToggleButton   load_button;
@@ -227,10 +228,33 @@ public class AltosUIMapPreload extends AltosUIFrame implements ActionListener, I
                return 1 << AltosMap.maptype_hybrid;
        }
 
+       void add_mark(double lat, double lon, int state, String label) {
+               map.add_mark(lat, lon, state, label);
+               if (lon <= 0)
+                       map.add_mark(lat, lon + 360, state, label);
+               if (lon >= 0)
+                       map.add_mark(lat, lon - 360, state, label);
+       }
+
+       void reset_marks() {
+               map.clear_marks();
+               AltosLatLon centre = null;
+               String centre_name = null;
+               if (map != null && map.map != null)
+                       centre = map.map.centre;
+               for (AltosLaunchSite site : sites) {
+                       if (centre != null && centre.lat == site.latitude && centre.lon == site.longitude)
+                               centre_name = site.name;
+                       else
+                               add_mark(site.latitude, site.longitude, AltosLib.ao_flight_main, site.name);
+               }
+               if (centre != null)
+                       add_mark(centre.lat, centre.lon, AltosLib.ao_flight_boost, centre_name);
+       }
+
        void center_map(double latitude, double longitude) {
                map.map.centre(new AltosLatLon(latitude, longitude));
-               map.clear_marks();
-               map.add_mark(latitude, longitude, AltosLib.ao_flight_boost);
+               reset_marks();
        }
 
        void center_map() {
@@ -294,6 +318,7 @@ public class AltosUIMapPreload extends AltosUIFrame implements ActionListener, I
        }
 
        public void notify_launch_sites(final java.util.List<AltosLaunchSite> sites) {
+               this.sites = sites;
                SwingUtilities.invokeLater(new Runnable() {
                                public void run() {
                                        int     i = 1;
@@ -301,6 +326,7 @@ public class AltosUIMapPreload extends AltosUIFrame implements ActionListener, I
                                                site_list.insertItemAt(site, i);
                                                i++;
                                        }
+                                       reset_marks();
                                }
                        });
        }