Skip to content

Commit 346a78d

Browse files
committed
make single layers toggleable
1 parent b479c68 commit 346a78d

6 files changed

Lines changed: 59 additions & 64 deletions

File tree

.DS_Store

-8 KB
Binary file not shown.

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
/target
22
/cache
3-
**/*.rs.bk
3+
**/*.rs.bk
4+
.DS_Store

src/bin/drawing/ui/mod.rs

Lines changed: 7 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use osm::css::CSSValue;
2121
use osm::css::Color;
2222
use osm::css::Number;
2323
use osm::css::Rule;
24+
use osm::css::Selector;
2425
use wgpu::SurfaceConfiguration;
2526

2627
use crate::app_state::AppState;
@@ -181,15 +182,15 @@ fn add_slider_float(ui: &mut Ui, rule: &mut Rule, attribute: &str) {
181182
.insert(attribute.to_string(), CSSValue::Number(Number::Px(value)));
182183
}
183184

184-
fn add_display_none(ui: &mut Ui, rule: &mut Rule) {
185+
fn add_display_none(ui: &mut Ui, rule: &mut Rule, label: &str) {
185186
let attribute = "display";
186187
let mut value = if let Some(CSSValue::String(value)) = rule.kvs.get(attribute) {
187188
!matches!(&value[..], "none")
188189
} else {
189190
true
190191
};
191192

192-
ui.checkbox(&mut value, WidgetText::from(attribute));
193+
ui.checkbox(&mut value, WidgetText::from(label));
193194

194195
if !value {
195196
rule.kvs
@@ -326,7 +327,7 @@ impl MainWindow {
326327
add_color_picker(ui, rule, "border-color");
327328
add_slider_float(ui, rule, "border-width");
328329
add_slider_float(ui, rule, "line-width");
329-
add_display_none(ui, rule);
330+
add_display_none(ui, rule, "display");
330331
});
331332
}
332333
} else {
@@ -409,46 +410,10 @@ impl SidePanel {
409410
.show(ctx, |ui| {
410411
ScrollArea::vertical().max_height(800.0).show(ui, |ui| {
411412
let feature_collection = app_state.feature_collection();
412-
let css_cache = app_state.css_cache_mut();
413413
let mut features = feature_collection.write().unwrap();
414-
let features = features.features_mut();
415-
for feature in features {
416-
let mut rules = css_cache.get_matching_rules_mut(&feature.selector);
417-
418-
println!("{}", feature.selector);
419-
// assert!(rules.len() <= 1);
420-
let rule = rules.first_mut();
421-
if rule.is_none() {
422-
css_cache.add_rule(Rule {
423-
selector: feature.selector.clone(),
424-
kvs: BTreeMap::new(),
425-
});
426-
}
427-
let mut rules = css_cache.get_matching_rules_mut(&feature.selector);
428-
// TODO: Ugly!
429-
let rule = rules.first_mut().unwrap();
430-
let value = rule
431-
.kvs
432-
.entry("display".to_string())
433-
.or_insert(CSSValue::String("block".to_string()));
434-
let mut display_mut = false;
435-
match &value {
436-
CSSValue::String(value) => match &value[..] {
437-
"none" => display_mut = false,
438-
_ => display_mut = true,
439-
},
440-
value => log::info!(
441-
"The value '{:?}' is currently not supported for 'display'.",
442-
value
443-
),
444-
}
445-
446-
ui.checkbox(&mut display_mut, feature.selector.to_string());
447-
if display_mut {
448-
*value = CSSValue::String("block".to_string());
449-
} else {
450-
*value = CSSValue::String("none".to_string());
451-
}
414+
let layers = features.layers_mut();
415+
for layer in layers {
416+
ui.checkbox(&mut layer.display, &layer.name);
452417
}
453418
})
454419
});

src/lib/feature/collection.rs

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,26 @@ use super::{Feature, FeatureStyle};
66
pub struct FeatureCollection {
77
features: Vec<Feature>,
88
n_features_max: u32,
9-
layers: Vec<(usize, String)>,
9+
layers: Vec<LayerInfo>,
10+
}
11+
12+
#[derive(Debug, Clone)]
13+
pub struct LayerInfo {
14+
pub id: usize,
15+
pub name: String,
16+
pub display: bool,
1017
}
1118

1219
impl FeatureCollection {
1320
pub fn new(n_features_max: u32) -> Self {
1421
Self {
1522
features: vec![],
1623
n_features_max,
17-
layers: vec![],
24+
layers: vec![LayerInfo {
25+
id: 0,
26+
name: "background".to_string(),
27+
display: true,
28+
}],
1829
}
1930
}
2031

@@ -26,12 +37,12 @@ impl FeatureCollection {
2637
&mut self.features
2738
}
2839

29-
pub fn layers(&self) -> &Vec<(usize, String)> {
40+
pub fn layers(&self) -> &Vec<LayerInfo> {
3041
&self.layers
3142
}
3243

33-
pub fn set_layers(&mut self, layers: Vec<(usize, String)>) {
34-
self.layers = layers
44+
pub fn layers_mut(&mut self) -> &mut Vec<LayerInfo> {
45+
&mut self.layers
3546
}
3647

3748
fn get_feature_id(&mut self, selector: &crate::css::Selector) -> Option<u32> {
@@ -49,11 +60,11 @@ impl FeatureCollection {
4960
self.features.len() as u32 - 1
5061
}
5162

52-
pub fn ensure_feature(&mut self, selector: &Selector) -> u32 {
63+
pub fn ensure_feature(&mut self, selector: &Selector, layer_id: usize) -> u32 {
5364
if let Some(feature_id) = self.get_feature_id(selector) {
5465
feature_id
5566
} else {
56-
self.add_feature(Feature::new(selector.clone(), 0))
67+
self.add_feature(Feature::new(selector.clone(), layer_id))
5768
}
5869
}
5970

@@ -84,7 +95,15 @@ impl FeatureCollection {
8495

8596
pub fn load_styles(&mut self, zoom: f32, css_cache: &mut RulesCache) {
8697
for feature in &mut self.features {
87-
feature.load_style(zoom, css_cache)
98+
feature.load_style(
99+
zoom,
100+
css_cache,
101+
self.layers
102+
.iter()
103+
.find(|l| l.id == feature.layer_id)
104+
.map(|l| l.display)
105+
.unwrap_or_default(),
106+
)
88107
}
89108
}
90109

src/lib/feature/mod.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ pub struct FeatureStyle {
3434
#[derive(Debug, Clone, Default)]
3535
pub struct Feature {
3636
pub selector: Selector,
37-
pub layer_id: u32,
37+
pub layer_id: usize,
3838
pub id: u32,
3939
pub style: FeatureStyle,
4040
}
4141

4242
impl Feature {
43-
pub fn new(selector: Selector, layer_id: u32) -> Self {
43+
pub fn new(selector: Selector, layer_id: usize) -> Self {
4444
Self {
4545
selector,
4646
layer_id,
@@ -50,7 +50,7 @@ impl Feature {
5050
}
5151
}
5252

53-
pub fn load_style(&mut self, zoom: f32, css_cache: &mut RulesCache) {
53+
pub fn load_style(&mut self, zoom: f32, css_cache: &mut RulesCache, display_override: bool) {
5454
let rules = css_cache.get_matching_rules(
5555
&self
5656
.selector
@@ -159,6 +159,8 @@ impl Feature {
159159
self.style.display = true;
160160
}
161161

162+
self.style.display = self.style.display && display_override;
163+
162164
let line_width = rules
163165
.iter()
164166
.filter_map(|r| r.kvs.get("line-width"))

src/lib/vector_tile/tile.rs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::*;
22
use egui::TextBuffer;
3+
use feature::collection::LayerInfo;
34
use glyphon::{
45
Attrs, Buffer, Color, Family, FontSystem, Metrics, Shaping, TextArea, TextBounds, Weight,
56
};
@@ -132,7 +133,6 @@ impl Tile {
132133
let extent = tile.layers[0].extent as u16;
133134
let mut features = vec![];
134135
let mut text = vec![];
135-
let mut layers = vec![];
136136

137137
// Add a background feature to the tile data.
138138
let (mut current_feature_id, object, range) =
@@ -142,13 +142,25 @@ impl Tile {
142142

143143
// Transform all features of the tile.
144144
for layer in tile.layers {
145+
let mut fc = feature_collection.write().unwrap();
146+
let layers = fc.layers_mut();
145147
let mut map: std::collections::HashMap<Selector, Vec<(GeomType, Vec<Path>)>> =
146148
HashMap::new();
147149
let layer_name = layer.name.to_string();
148-
if !layers.contains(&(0, layer_name.clone())) {
150+
let layer_id = if let Some(layer) = layers.iter().find(|l| l.name == layer_name) {
151+
layer.id
152+
} else {
149153
println!("{}", layer.name);
150-
layers.push((0, layer_name));
151-
}
154+
let id = layers.len();
155+
let value = LayerInfo {
156+
id,
157+
name: layer_name,
158+
display: true,
159+
};
160+
layers.push(value);
161+
id
162+
};
163+
drop(fc);
152164

153165
// Preevaluate the selectors and group features by the selector they belong to.
154166
for feature in &layer.features {
@@ -198,7 +210,7 @@ impl Tile {
198210
current_feature_id = {
199211
// Scope the lock guard real tight to ensure it's released quickly.
200212
let mut feature_collection = feature_collection.write().unwrap();
201-
feature_collection.ensure_feature(&selector)
213+
feature_collection.ensure_feature(&selector, layer_id)
202214
};
203215
builder.set_current_feature_id(current_feature_id);
204216

@@ -220,10 +232,6 @@ impl Tile {
220232
features.extend(inner_features);
221233
}
222234

223-
let mut feature_collection = feature_collection.write().unwrap();
224-
feature_collection.set_layers(layers);
225-
drop(feature_collection);
226-
227235
let collider = Arc::new(RwLock::new(TileCollider::new()));
228236
let _collider_keep = collider.clone();
229237
let objects = Arc::new(RwLock::new(objects));
@@ -340,7 +348,7 @@ impl Tile {
340348
let current_feature_id = {
341349
// Scope the lock guard real tight to ensure it's released quickly.
342350
let mut feature_collection = feature_collection.write().unwrap();
343-
feature_collection.ensure_feature(&selector)
351+
feature_collection.ensure_feature(&selector, 0)
344352
};
345353
builder.set_current_feature_id(current_feature_id);
346354

0 commit comments

Comments
 (0)