Hide all other series when alt-clicking in the legend (#4549)
https://github.com/emilk/egui/assets/49431240/75d32f53-4c1c-4713-b25e-e1787e465a48 * Closes #4548
This commit is contained in:
parent
ff7a3832b6
commit
192a111272
|
|
@ -99,11 +99,11 @@ impl LegendEntry {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ui(&mut self, ui: &mut Ui, text: String, text_style: &TextStyle) -> Response {
|
fn ui(&self, ui: &mut Ui, text: String, text_style: &TextStyle) -> Response {
|
||||||
let Self {
|
let Self {
|
||||||
color,
|
color,
|
||||||
checked,
|
checked,
|
||||||
hovered,
|
hovered: _,
|
||||||
} = self;
|
} = self;
|
||||||
|
|
||||||
let font_id = text_style.resolve(ui.style());
|
let font_id = text_style.resolve(ui.style());
|
||||||
|
|
@ -162,9 +162,6 @@ impl LegendEntry {
|
||||||
let text_position = pos2(text_position_x, rect.center().y - 0.5 * galley.size().y);
|
let text_position = pos2(text_position_x, rect.center().y - 0.5 * galley.size().y);
|
||||||
painter.galley(text_position, galley, visuals.text_color());
|
painter.galley(text_position, galley, visuals.text_color());
|
||||||
|
|
||||||
*checked ^= response.clicked_by(PointerButton::Primary);
|
|
||||||
*hovered = response.hovered();
|
|
||||||
|
|
||||||
response
|
response
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -267,14 +264,55 @@ impl Widget for &mut LegendWidget {
|
||||||
.multiply_with_opacity(config.background_alpha);
|
.multiply_with_opacity(config.background_alpha);
|
||||||
background_frame
|
background_frame
|
||||||
.show(ui, |ui| {
|
.show(ui, |ui| {
|
||||||
entries
|
let mut focus_on_item = None;
|
||||||
|
|
||||||
|
let response_union = entries
|
||||||
.iter_mut()
|
.iter_mut()
|
||||||
.map(|(name, entry)| entry.ui(ui, name.clone(), &config.text_style))
|
.map(|(name, entry)| {
|
||||||
|
let response = entry.ui(ui, name.clone(), &config.text_style);
|
||||||
|
|
||||||
|
// Handle interactions. Alt-clicking must be deferred to end of loop
|
||||||
|
// since it may affect all entries.
|
||||||
|
handle_interaction_on_legend_item(&response, entry);
|
||||||
|
if response.clicked() && ui.input(|r| r.modifiers.alt) {
|
||||||
|
focus_on_item = Some(name.clone());
|
||||||
|
}
|
||||||
|
|
||||||
|
response
|
||||||
|
})
|
||||||
.reduce(|r1, r2| r1.union(r2))
|
.reduce(|r1, r2| r1.union(r2))
|
||||||
.unwrap()
|
.unwrap();
|
||||||
|
|
||||||
|
if let Some(focus_on_item) = focus_on_item {
|
||||||
|
handle_focus_on_legend_item(&focus_on_item, entries);
|
||||||
|
}
|
||||||
|
|
||||||
|
response_union
|
||||||
})
|
})
|
||||||
.inner
|
.inner
|
||||||
})
|
})
|
||||||
.inner
|
.inner
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Handle per-entry interactions.
|
||||||
|
fn handle_interaction_on_legend_item(response: &Response, entry: &mut LegendEntry) {
|
||||||
|
entry.checked ^= response.clicked_by(PointerButton::Primary);
|
||||||
|
entry.hovered = response.hovered();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Handle alt-click interaction (which may affect all entries).
|
||||||
|
fn handle_focus_on_legend_item(
|
||||||
|
clicked_entry_name: &str,
|
||||||
|
entries: &mut BTreeMap<String, LegendEntry>,
|
||||||
|
) {
|
||||||
|
// if all other items are already hidden, we show everything
|
||||||
|
let is_focus_item_only_visible = entries
|
||||||
|
.iter()
|
||||||
|
.all(|(name, entry)| !entry.checked || (clicked_entry_name == name));
|
||||||
|
|
||||||
|
// either show everything or show only the focus item
|
||||||
|
for (name, entry) in entries.iter_mut() {
|
||||||
|
entry.checked = is_focus_item_only_visible || clicked_entry_name == name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue