Преглед изворни кода

Move MIN_ZOOM_LEVEL, MAX_ZOOM_LEVEL to map_view

Johannes Hofmann пре 7 година
родитељ
комит
f70407d4ce
4 измењених фајлова са 45 додато и 35 уклоњено
  1. 20
    2
      src/map_view.rs
  2. 16
    31
      src/map_view_gl.rs
  3. 4
    2
      src/mercator_view.rs
  4. 5
    0
      src/orthografic_view.rs

+ 20
- 2
src/map_view.rs Прегледај датотеку

@@ -1,6 +1,9 @@
1 1
 use coord::MapCoord;
2 2
 
3 3
 
4
+pub const MIN_ZOOM_LEVEL: f64 = 0.0;
5
+pub const MAX_ZOOM_LEVEL: f64 = 22.0;
6
+
4 7
 /// A view of a map with a rectangular viewport and a zoom.
5 8
 #[derive(Clone, Debug)]
6 9
 pub struct MapView {
@@ -51,11 +54,26 @@ impl MapView {
51 54
 
52 55
     /// Set the zoom value.
53 56
     pub fn set_zoom(&mut self, zoom: f64) {
54
-        self.zoom = zoom;
57
+        self.zoom = zoom
58
+            .max(MIN_ZOOM_LEVEL)
59
+            .min(MAX_ZOOM_LEVEL);
55 60
     }
56 61
 
57 62
     /// Change zoom value by `zoom_delta`.
58 63
     pub fn zoom(&mut self, zoom_delta: f64) {
59
-        self.zoom += zoom_delta;
64
+        self.zoom = (self.zoom + zoom_delta)
65
+            .max(MIN_ZOOM_LEVEL)
66
+            .min(MAX_ZOOM_LEVEL);
67
+    }
68
+
69
+    pub fn step_zoom(&mut self, steps: i32, step_size: f64) {
70
+        self.zoom = {
71
+            let z = (self.zoom + f64::from(steps) * step_size) / step_size;
72
+            if steps > 0 {
73
+                z.ceil() * step_size
74
+            } else {
75
+                z.floor() * step_size
76
+            }
77
+        }.max(MIN_ZOOM_LEVEL).min(MAX_ZOOM_LEVEL);
60 78
     }
61 79
 }

+ 16
- 31
src/map_view_gl.rs Прегледај датотеку

@@ -1,7 +1,7 @@
1 1
 use atmos_layer::AtmosLayer;
2 2
 use context::Context;
3 3
 use coord::{MapCoord, ScreenCoord};
4
-use map_view::MapView;
4
+use map_view::{MapView, MIN_ZOOM_LEVEL, MAX_ZOOM_LEVEL};
5 5
 use marker_layer::MarkerLayer;
6 6
 use mercator_tile_layer::MercatorTileLayer;
7 7
 use mercator_view::MercatorView;
@@ -15,9 +15,6 @@ use tile_cache::TileCache;
15 15
 use tile_source::TileSource;
16 16
 
17 17
 
18
-const MIN_ZOOM_LEVEL: f64 = 0.0;
19
-const MAX_ZOOM_LEVEL: f64 = 22.0;
20
-
21 18
 #[derive(Debug)]
22 19
 pub struct MapViewGl {
23 20
     map_view: MapView,
@@ -57,16 +54,12 @@ impl MapViewGl {
57 54
     {
58 55
         let tile_size = 256;
59 56
 
60
-        let mut map_view = MercatorView::initial_map_view(
57
+        let map_view = MercatorView::initial_map_view(
61 58
             f64::from(initial_size.0),
62 59
             f64::from(initial_size.1),
63 60
             tile_size,
64 61
         );
65 62
 
66
-        if map_view.zoom < MIN_ZOOM_LEVEL {
67
-            map_view.zoom = MIN_ZOOM_LEVEL;
68
-        }
69
-
70 63
         let atlas_size = {
71 64
             let default_size = 2048;
72 65
             let max_size = cx.max_texture_size() as u32;
@@ -242,27 +235,12 @@ impl MapViewGl {
242 235
         }
243 236
     }
244 237
 
245
-    pub fn step_zoom(&mut self, steps: i32, step_size: f64) {
246
-        let new_zoom = {
247
-            let z = (self.map_view.zoom + f64::from(steps) * step_size) / step_size;
248
-            if steps > 0 {
249
-                z.ceil() * step_size
250
-            } else {
251
-                z.floor() * step_size
252
-            }
253
-        }.max(MIN_ZOOM_LEVEL).min(MAX_ZOOM_LEVEL);
254
-
255
-        self.map_view.set_zoom(new_zoom);
238
+    pub fn zoom(&mut self, zoom_delta: f64) {
239
+        self.map_view.zoom(zoom_delta);
256 240
     }
257 241
 
258
-    pub fn zoom(&mut self, zoom_delta: f64) {
259
-        if self.map_view.zoom + zoom_delta < MIN_ZOOM_LEVEL {
260
-            self.map_view.set_zoom(MIN_ZOOM_LEVEL);
261
-        } else if self.map_view.zoom + zoom_delta > MAX_ZOOM_LEVEL {
262
-            self.map_view.set_zoom(MAX_ZOOM_LEVEL);
263
-        } else {
264
-            self.map_view.zoom(zoom_delta);
265
-        }
242
+    pub fn step_zoom(&mut self, steps: i32, step_size: f64) {
243
+        self.map_view.step_zoom(steps, step_size);
266 244
     }
267 245
 
268 246
     pub fn zoom_at(&mut self, pos: ScreenCoord, zoom_delta: f64) {
@@ -278,8 +256,13 @@ impl MapViewGl {
278 256
                 self.map_view.center.normalize_xy();
279 257
             },
280 258
             Projection::Orthografic => {
281
-                //TODO ensure new zoom level in between min/max zoom level
282
-                OrthograficView::zoom_at(&mut self.map_view, pos, zoom_delta);
259
+                if self.map_view.zoom + zoom_delta < MIN_ZOOM_LEVEL {
260
+                    OrthograficView::set_zoom_at(&mut self.map_view, pos, MIN_ZOOM_LEVEL);
261
+                } else if self.map_view.zoom + zoom_delta > MAX_ZOOM_LEVEL {
262
+                    OrthograficView::set_zoom_at(&mut self.map_view, pos, MAX_ZOOM_LEVEL);
263
+                } else {
264
+                    OrthograficView::zoom_at(&mut self.map_view, pos, zoom_delta);
265
+                }
283 266
             },
284 267
         }
285 268
     }
@@ -299,7 +282,9 @@ impl MapViewGl {
299 282
     pub fn restore_session(&mut self, session: &Session) {
300 283
         self.map_view.center = session.view_center;
301 284
         self.map_view.center.normalize_xy();
302
-        self.map_view.zoom = MIN_ZOOM_LEVEL.max(MAX_ZOOM_LEVEL.min(session.zoom));
285
+        self.map_view.zoom = session.zoom
286
+            .max(MIN_ZOOM_LEVEL)
287
+            .min(MAX_ZOOM_LEVEL);
303 288
         self.projection = session.projection;
304 289
     }
305 290
 

+ 4
- 2
src/mercator_view.rs Прегледај датотеку

@@ -1,5 +1,5 @@
1 1
 use coord::{MapCoord, ScreenCoord, ScreenRect, TextureRect, TileCoord};
2
-use map_view::MapView;
2
+use map_view::{MapView, MIN_ZOOM_LEVEL, MAX_ZOOM_LEVEL};
3 3
 
4 4
 
5 5
 /// A view of a tiled map with a rectangular viewport and a zoom.
@@ -27,7 +27,9 @@ impl MercatorView {
27 27
     /// with the given dimensions.
28 28
     pub fn initial_map_view(width: f64, height: f64, tile_size: u32) -> MapView {
29 29
         let min_dimension = width.min(height);
30
-        let zoom = (min_dimension / f64::from(tile_size)).log2().ceil();
30
+        let zoom = (min_dimension / f64::from(tile_size)).log2().ceil()
31
+            .max(MIN_ZOOM_LEVEL)
32
+            .min(MAX_ZOOM_LEVEL);
31 33
         MapView {
32 34
             width,
33 35
             height,

+ 5
- 0
src/orthografic_view.rs Прегледај датотеку

@@ -361,6 +361,11 @@ impl OrthograficView {
361 361
         map_view.zoom += zoom_delta;
362 362
     }
363 363
 
364
+    /// Change zoom value by `zoom_delta` and zoom to a position given in screen coordinates.
365
+    pub fn set_zoom_at(map_view: &mut MapView, pos: ScreenCoord, zoom: f64) {
366
+        //TODO Do something sophisticated, just like with Self::zoom_at
367
+        map_view.zoom = zoom;
368
+    }
364 369
 }
365 370
 
366 371
 #[cfg(test)]