altosui: sitemap uses rocket gps if no pad gps
[fw/altos] / ao-tools / altosui / AltosSiteMap.java
index 802eb68ce6c5f5d4a5a524c998aaedafc30d09d6..d4a4cbf43dbaa66b7c0c69ca6da2be09bef08e5c 100644 (file)
@@ -230,16 +230,19 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay {
                // if insufficient gps data, nothing to update
                if (state.gps == null)
                        return;
-               if (state.pad_lat == 0 && state.pad_lon == 0)
+               if (!state.gps.locked && state.gps.nsat < 4)
                        return;
-               if (!state.gps.locked) {
-                       if (state.gps.nsat < 4)
-                               return;
-               }
 
                if (!initialised) {
-                       initMaps(state.pad_lat, state.pad_lon);
-                       initialised = true;
+                       if (state.pad_lat != 0 || state.pad_lon != 0) {
+                               initMaps(state.pad_lat, state.pad_lon);
+                               initialised = true;
+                       } else if (state.gps.lat != 0 || state.gps.lon != 0) {
+                               initMaps(state.gps.lat, state.gps.lon);
+                               initialised = true;
+                       } else {
+                               return;
+                       }
                }
 
                final Point2D.Double pt = pt(state.gps.lat, state.gps.lon);
@@ -273,6 +276,8 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay {
                        finishTileLater(tile, offset);
                }
 
+               scrollRocketToVisible(pt);
+
                if (offset != tileOffset(last_pt)) {
                        ensureTilesAround(offset);
                }
@@ -281,8 +286,8 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay {
                last_state = state.state;
        }
 
-       private AltosSiteMapTile createTile(final Point offset) {
-               final AltosSiteMapTile tile = new AltosSiteMapTile(px_size);
+       private AltosSiteMapTile createTile(Point offset) {
+               AltosSiteMapTile tile = new AltosSiteMapTile(px_size);
                mapTiles.put(offset, tile);
                return tile;
        }
@@ -292,7 +297,6 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay {
                SwingUtilities.invokeLater( new Runnable() {
                        public void run() {
                                addTileAt(tile, offset);
-                               tile.setScrollable();
                        }
                } );
        }
@@ -310,6 +314,18 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay {
                }
        }
 
+       private Point topleft = new Point(0,0);
+       private void scrollRocketToVisible(Point2D.Double pt) {
+               Rectangle r = comp.getVisibleRect();
+               Point2D.Double copt = translatePoint(pt, tileCoordOffset(topleft));
+               int dx = (int)copt.x - r.width/2 - r.x;
+               int dy = (int)copt.y - r.height/2 - r.y;
+               if (Math.abs(dx) > r.width/4 || Math.abs(dy) > r.height/4) {
+                       r.x += dx;
+                       r.y += dy;
+                       comp.scrollRectToVisible(r);
+               }
+       }
 
        private void addTileAt(AltosSiteMapTile tile, Point offset) {
                if (Math.abs(offset.x) >= MAX_TILE_DELTA ||
@@ -320,6 +336,18 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay {
                        return;
                }
 
+               boolean review = false;
+               Rectangle r = comp.getVisibleRect();
+               if (offset.x < topleft.x) {
+                       r.x += (topleft.x - offset.x) * px_size;
+                       topleft.x = offset.x;
+                       review = true;
+               }
+               if (offset.y < topleft.y) {
+                       r.y += (topleft.y - offset.y) * px_size;
+                       topleft.y = offset.y;
+                       review = true;
+               }
                GridBagConstraints c = new GridBagConstraints();
                c.anchor = GridBagConstraints.CENTER;
                c.fill = GridBagConstraints.BOTH;
@@ -329,7 +357,11 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay {
                c.gridx = offset.x + MAX_TILE_DELTA;
                c.gridy = offset.y + MAX_TILE_DELTA;
                layout.setConstraints(tile, c);
+
                comp.add(tile);
+               if (review) {
+                       comp.scrollRectToVisible(r);
+               }
        }
 
        private AltosSiteMap(boolean knowWhatYouAreDoing) {
@@ -338,29 +370,19 @@ public class AltosSiteMap extends JScrollPane implements AltosFlightDisplay {
                }
        }
 
-       JComponent comp;
-       private GridBagLayout layout;
+       JComponent comp = new JComponent() { };
+       private GridBagLayout layout = new GridBagLayout();
 
        public AltosSiteMap() {
-               comp = new JComponent() {
-                       GrabNDrag scroller = new GrabNDrag(this);
-                       {
-                               addMouseMotionListener(scroller);
-                               addMouseListener(scroller);
-                               setAutoscrolls(true);
-                       }
-               };
+               GrabNDrag scroller = new GrabNDrag(comp);
 
-               layout = new GridBagLayout();
                comp.setLayout(layout);
 
                for (int x = -1; x <= 1; x++) {
                        for (int y = -1; y <= 1; y++) {
                                Point offset = new Point(x, y);
-                               AltosSiteMapTile t = new AltosSiteMapTile(px_size);
-                               mapTiles.put(offset, t);
+                               AltosSiteMapTile t = createTile(offset);
                                addTileAt(t, offset);
-                               t.setScrollable();
                        }
                }
                setViewportView(comp);