Skip to content

Commit

Permalink
added edge selection to example
Browse files Browse the repository at this point in the history
  • Loading branch information
Dmitrii Samsonov committed Jan 28, 2024
1 parent caab7c1 commit 7dc9b0a
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 20 deletions.
70 changes: 50 additions & 20 deletions examples/label_change/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
use eframe::{run_native, App, CreationContext};
use egui::{Context, SidePanel, TextEdit};
use egui::{CentralPanel, Context, SidePanel, TextEdit};
use egui_graphs::{
DefaultEdgeShape, DefaultNodeShape, Graph, GraphView, SettingsInteraction, SettingsStyle,
};
use petgraph::stable_graph::{NodeIndex, StableGraph};
use petgraph::stable_graph::{EdgeIndex, NodeIndex, StableGraph};

pub struct BasicApp {
g: Graph<(), ()>,
label_input: String,
selected_node: Option<NodeIndex>,
selected_edge: Option<EdgeIndex>,
}

impl BasicApp {
Expand All @@ -18,53 +19,81 @@ impl BasicApp {
g: Graph::from(&g),
label_input: String::default(),
selected_node: Option::default(),
selected_edge: Option::default(),
}
}

fn read_data(&mut self) {
if let Some((selected_idx, _)) = self.g.nodes_iter().find(|(_, n)| n.selected()) {
self.selected_node = Some(selected_idx);
self.label_input = self.g.node(selected_idx).unwrap().label();
if !self.g.selected_nodes().is_empty() {
let idx = self.g.selected_nodes().first().unwrap();
self.selected_node = Some(*idx);
self.selected_edge = None;
self.label_input = self.g.node(*idx).unwrap().label();
}
if !self.g.selected_edges().is_empty() {
let idx = self.g.selected_edges().first().unwrap();
self.selected_edge = Some(*idx);
self.selected_node = None;
self.label_input = self.g.edge(*idx).unwrap().label();
}
}

fn render(&mut self, ctx: &Context) {
SidePanel::right("right_panel").show(ctx, |ui| {
ui.label("Change Label");
ui.add_enabled_ui(self.selected_node.is_some(), |ui| {
TextEdit::singleline(&mut self.label_input)
.hint_text("select node")
.show(ui)
});
ui.add_enabled_ui(
self.selected_node.is_some() || self.selected_edge.is_some(),
|ui| {
TextEdit::singleline(&mut self.label_input)
.hint_text("select node or edge")
.show(ui)
},
);
if ui.button("reset").clicked() {
self.reset()
}
});
egui::CentralPanel::default().show(ctx, |ui| {
CentralPanel::default().show(ctx, |ui| {
let widget =
&mut GraphView::<_, _, _, _, DefaultNodeShape, DefaultEdgeShape>::new(&mut self.g)
.with_interactions(
&SettingsInteraction::default().with_node_selection_enabled(true),
&SettingsInteraction::default()
.with_node_selection_enabled(true)
.with_edge_selection_enabled(true),
)
.with_styles(&SettingsStyle::default().with_labels_always(true));
ui.add(widget);
});
}

fn update_data(&mut self) {
if self.selected_node.is_none() {
if self.selected_node.is_none() && self.selected_edge.is_none() {
return;
}

let idx = self.selected_node.unwrap();
if idx.index().to_string() == self.label_input {
return;
if self.selected_node.is_some() {
let idx = self.selected_node.unwrap();
if idx.index().to_string() == self.label_input {
return;
}

self.g
.node_mut(idx)
.unwrap()
.set_label(self.label_input.clone());
}

self.g
.node_mut(idx)
.unwrap()
.set_label(self.label_input.clone());
if self.selected_edge.is_some() {
let idx = self.selected_edge.unwrap();
if idx.index().to_string() == self.label_input {
return;
}

self.g
.edge_mut(idx)
.unwrap()
.set_label(self.label_input.clone());
}
}

fn reset(&mut self) {
Expand All @@ -73,6 +102,7 @@ impl BasicApp {
g: Graph::from(&g),
label_input: String::default(),
selected_node: Option::default(),
selected_edge: Option::default(),
};
}
}
Expand Down
4 changes: 4 additions & 0 deletions src/elements/edge.rs
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,8 @@ impl<
self.props.label = label;
self
}

pub fn label(&self) -> String {
self.props.label.clone()
}
}

0 comments on commit 7dc9b0a

Please sign in to comment.