Skip to main content

style/
style.rs

1//! Any MapLibre style in your terminal: an OpenFreeMap name (liberty, positron, bright, dark,
2//! fiord), a style URL or a file. Click a feature to see its layer. `q` quits.
3//!
4//!     cargo run --release --example style -- dark
5
6use std::time::{Duration, Instant};
7
8use crossterm::event::{self, Event, KeyCode};
9use mapterm::{Camera, Controller, Map, Viewport};
10
11#[tokio::main]
12async fn main() -> anyhow::Result<()> {
13    let spec = std::env::args().nth(1).unwrap_or_else(|| "liberty".into());
14    let mut map = Map::from_style(&spec).await?;
15    for w in map.warnings() {
16        eprintln!("warning: {w}");
17    }
18    let mut ctl = Controller::new(Camera::new(-77.0353, 38.8895, 13.0), 0.0, 17.0);
19    let mut status = format!("{spec}: {} layers", map.layer_ids().len());
20    let mut term = ratatui::init();
21    crossterm::execute!(std::io::stdout(), event::EnableMouseCapture)?;
22    loop {
23        ctl.tick(Instant::now());
24        let area = term.get_frame().area();
25        ctl.set_area(area);
26        let _ = map.load_tiles(&ctl.cam, area).await;
27        term.draw(|f| {
28            f.render_widget(map.view(&ctl.cam), area);
29            f.render_widget(ratatui::text::Line::from(status.as_str()), area);
30        })?;
31        if let Some(click) = ctl.take_click() {
32            let dot = Viewport::new(&ctl.cam, area).dot_ll(click.lon, click.lat);
33            let hits = map.query_rendered_features(&ctl.cam, area, dot, None);
34            let names: Vec<String> = hits.iter().take(4).map(|p| format!("{}: {}", p.style_layer.as_deref().unwrap_or("?"), p.title())).collect();
35            status = names.join(" | ");
36        }
37        if event::poll(Duration::from_millis(if ctl.animating() { 16 } else { 250 }))? {
38            match event::read()? {
39                Event::Key(k) if k.code == KeyCode::Char('q') => break,
40                Event::Key(k) => _ = ctl.key(k),
41                Event::Mouse(m) => _ = ctl.mouse(m),
42                _ => {}
43            }
44        }
45    }
46    crossterm::execute!(std::io::stdout(), event::DisableMouseCapture)?;
47    ratatui::restore();
48    Ok(())
49}