altosdroid: Place icons on screen instead of drawing path
[fw/altos] / altoslib / AltosMap.java
index 7c7c7305438fab7595be6af0caad31e98db38f38..762054a33f158fcefb0698a00091359b97c6e5bd 100644 (file)
@@ -22,7 +22,7 @@ import java.lang.*;
 import java.util.*;
 import java.util.concurrent.*;
 
-public class AltosMap implements AltosFlightDisplay, AltosMapTileListener, AltosMapStoreListener {
+public class AltosMap implements AltosMapTileListener, AltosMapStoreListener {
 
        public static final int px_size = 512;
 
@@ -54,18 +54,13 @@ public class AltosMap implements AltosFlightDisplay, AltosMapTileListener, Altos
 
        AltosMapCache           cache;
 
-       LinkedList<AltosMapMark> marks = new LinkedList<AltosMapMark>();
-
-       LinkedList<AltosMapZoomListener> zoom_listeners = new LinkedList<AltosMapZoomListener>();
+       public AltosMapCache cache() { return cache; }
 
-       public void add_zoom_listener(AltosMapZoomListener listener) {
-               if (!zoom_listeners.contains(listener))
-                       zoom_listeners.add(listener);
-       }
+       LinkedList<AltosMapMark> marks = new LinkedList<AltosMapMark>();
 
-       public void remove_zoom_listener(AltosMapZoomListener listener) {
-               zoom_listeners.remove(listener);
-       }
+       AltosMapPath            path;
+       AltosMapLine            line;
+       public AltosLatLon      last_position;
 
        boolean         have_boost = false;
        boolean         have_landed = false;
@@ -84,7 +79,7 @@ public class AltosMap implements AltosFlightDisplay, AltosMapTileListener, Altos
         */
        static final long auto_scroll_delay = 20 * 1000;
 
-       AltosMapTransform       transform;
+       public AltosMapTransform        transform;
        AltosLatLon             centre;
 
        public void reset() {
@@ -92,16 +87,14 @@ public class AltosMap implements AltosFlightDisplay, AltosMapTileListener, Altos
        }
 
        /* MapInterface wrapping functions */
-       public void set_units() {
-               map_interface.set_units();
-       }
 
-       public void repaint(AltosMapRectangle damage, int pad) {
-               map_interface.repaint(damage, pad);
+       public void repaint(int x, int y, int w, int h) {
+               map_interface.repaint(new AltosRectangle(x, y, w, h));
        }
 
-       public void repaint(double x, double y, double w, double h) {
-               map_interface.repaint(x, y, w, h);
+       public void repaint(AltosMapRectangle damage, int pad) {
+               AltosRectangle r = transform.screen(damage);
+               repaint(r.x - pad, r.y - pad, r.width + pad * 2, r.height + pad * 2);
        }
 
        public void repaint() {
@@ -156,30 +149,22 @@ public class AltosMap implements AltosFlightDisplay, AltosMapTileListener, Altos
                return false;
        }
 
-       public void font_size_changed(int font_size) {
-               map_interface.line().font_size_changed(font_size);
-               for (AltosMapTile tile : tiles.values())
-                       tile.font_size_changed(font_size);
+       public void set_transform() {
+               transform = new AltosMapTransform(width(), height(), zoom, centre);
                repaint();
        }
 
-       public void units_changed(boolean imperial_units) {
+       private void set_zoom_label() {
+               map_interface.set_zoom_label(String.format("Zoom %d", get_zoom() - default_zoom));
        }
 
-       private void set_transform() {
-               transform = new AltosMapTransform(width(), height(), zoom, centre);
-               repaint();
-       }
 
        public boolean set_zoom(int zoom) {
                if (AltosMap.min_zoom <= zoom && zoom <= AltosMap.max_zoom && zoom != this.zoom) {
                        this.zoom = zoom;
                        tiles.clear();
                        set_transform();
-
-                       for (AltosMapZoomListener listener : zoom_listeners)
-                               listener.zoom_changed(this.zoom);
-
+                       set_zoom_label();
                        return true;
                }
                return false;
@@ -211,8 +196,6 @@ public class AltosMap implements AltosFlightDisplay, AltosMapTileListener, Altos
                if (!gps.locked && gps.nsat < 4)
                        return;
 
-               AltosMapRectangle       damage = map_interface.path().add(gps.lat, gps.lon, state.state);
-
                switch (state.state) {
                case AltosLib.ao_flight_boost:
                        if (!have_boost) {
@@ -228,8 +211,15 @@ public class AltosMap implements AltosFlightDisplay, AltosMapTileListener, Altos
                        break;
                }
 
-               if (damage != null)
-                       repaint(damage, AltosMapPath.stroke_width);
+               if (path != null) {
+                       AltosMapRectangle       damage = path.add(gps.lat, gps.lon, state.state);
+
+                       if (damage != null)
+                               repaint(damage, AltosMapPath.stroke_width);
+               }
+
+               last_position = new AltosLatLon(gps.lat, gps.lon);
+
                maybe_centre(gps.lat, gps.lon);
        }
 
@@ -303,7 +293,7 @@ public class AltosMap implements AltosFlightDisplay, AltosMapTileListener, Altos
                                        AltosLatLon     ul = transform.lat_lon(new AltosPointDouble(x, y));
                                        AltosLatLon     center = transform.lat_lon(new AltosPointDouble(x + AltosMap.px_size/2, y + AltosMap.px_size/2));
                                        AltosMapTile tile = map_interface.new_tile(this, ul, center, zoom, maptype,
-                                                                                  AltosMap.px_size);
+                                                                                  px_size);
                                        tiles.put(point, tile);
                                }
                        }
@@ -339,9 +329,11 @@ public class AltosMap implements AltosFlightDisplay, AltosMapTileListener, Altos
                                mark.paint(transform);
                }
 
-               map_interface.path().paint(transform);
+               if (path != null)
+                       path.paint(transform);
 
-               map_interface.line().paint(transform);
+               if (line != null)
+                       line.paint(transform);
        }
 
        /* AltosMapTileListener methods */
@@ -363,9 +355,62 @@ public class AltosMap implements AltosFlightDisplay, AltosMapTileListener, Altos
                }
        }
 
+       /* UI elements */
+
+       AltosPointInt   drag_start;
+
+       private void drag(int x, int y) {
+               if (drag_start == null)
+                       return;
+
+               int dx = x - drag_start.x;
+               int dy = y - drag_start.y;
+
+               AltosLatLon new_centre = transform.screen_lat_lon(new AltosPointInt(width() / 2 - dx, height() / 2 - dy));
+               centre(new_centre);
+               drag_start = new AltosPointInt(x, y);
+       }
+
+       private void drag_start(int x, int y) {
+               drag_start = new AltosPointInt(x, y);
+       }
+
+       private void line_start(int x, int y) {
+               if (line != null) {
+                       line.pressed(new AltosPointInt(x, y), transform);
+                       repaint();
+               }
+       }
+
+       private void line(int x, int y) {
+               if (line != null) {
+                       line.dragged(new AltosPointInt(x, y), transform);
+                       repaint();
+               }
+       }
+
+       public void touch_start(int x, int y, boolean is_drag) {
+               notice_user_input();
+               if (is_drag)
+                       drag_start(x, y);
+               else
+                       line_start(x, y);
+       }
+
+       public void touch_continue(int x, int y, boolean is_drag) {
+               notice_user_input();
+               if (is_drag)
+                       drag(x, y);
+               else
+                       line(x, y);
+       }
+
        public AltosMap(AltosMapInterface map_interface) {
                this.map_interface = map_interface;
                cache = new AltosMapCache(map_interface);
+               line = map_interface.new_line();
+               path = map_interface.new_path();
+               set_zoom_label();
                centre(0, 0);
        }
 }