Move common node creation/editing ui to own function, can edit whole node from creation menu
This commit is contained in:
parent
079c4c9004
commit
9f4520e2c5
@ -115,23 +115,8 @@ impl eframe::App for BoardBuilderApp {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if self.create_node_dialog.open {
|
|
||||||
Window::new("Create Node")
|
self.create_node_dialog.ui(ctx);
|
||||||
.collapsible(false)
|
|
||||||
.show(ctx, |ui| {
|
|
||||||
let mut board = self.board.borrow_mut();
|
|
||||||
ui.label("Name:");
|
|
||||||
ui.text_edit_singleline(&mut self.create_node_dialog.name);
|
|
||||||
if ui.button("Add").clicked() {
|
|
||||||
self.create_node_dialog.close();
|
|
||||||
board.add_node(
|
|
||||||
self.create_node_dialog.x,
|
|
||||||
self.create_node_dialog.y,
|
|
||||||
self.create_node_dialog.name.clone(),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
self.edit_node_dialog.ui(ctx);
|
self.edit_node_dialog.ui(ctx);
|
||||||
self.edit_labels_dialog.ui(ctx);
|
self.edit_labels_dialog.ui(ctx);
|
||||||
}
|
}
|
||||||
@ -194,7 +179,10 @@ impl BoardBuilderApp {
|
|||||||
use EditMode::*;
|
use EditMode::*;
|
||||||
use PointerButton::*;
|
use PointerButton::*;
|
||||||
match (btn, self.edit_mode) {
|
match (btn, self.edit_mode) {
|
||||||
(Primary, Nodes) => self.create_node_dialog.show(x, y),
|
(Primary, Nodes) => {
|
||||||
|
let board = Rc::clone(&self.board);
|
||||||
|
self.create_node_dialog.show(x, y, board);
|
||||||
|
}
|
||||||
(Primary, Edges) => self.select_edge(x, y),
|
(Primary, Edges) => self.select_edge(x, y),
|
||||||
(Secondary, Nodes) => {
|
(Secondary, Nodes) => {
|
||||||
let board = Rc::clone(&self.board);
|
let board = Rc::clone(&self.board);
|
||||||
@ -228,22 +216,38 @@ impl CoordTransformer<Pos2> for View {
|
|||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct CreateNodeDialog {
|
struct CreateNodeDialog {
|
||||||
open: bool,
|
open: bool,
|
||||||
name: String,
|
node: Node,
|
||||||
x: f32,
|
board: Rc<RefCell<Board>>,
|
||||||
y: f32,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CreateNodeDialog {
|
impl CreateNodeDialog {
|
||||||
fn show(&mut self, x: f32, y: f32) {
|
fn show(&mut self, x: f32, y: f32, board: Rc<RefCell<Board>>) {
|
||||||
self.open = true;
|
self.open = true;
|
||||||
self.x = x;
|
self.board = board;
|
||||||
self.y = y;
|
|
||||||
self.name = String::new();
|
self.node = Node {
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
..Node::default()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn close(&mut self) {
|
fn ui(&mut self, ctx: &Context) {
|
||||||
|
if !self.open { return }
|
||||||
|
Window::new("Create Node")
|
||||||
|
.collapsible(false)
|
||||||
|
.show(ctx, |ui| {
|
||||||
|
let mut board = self.board.borrow_mut();
|
||||||
|
node_common_ui(ui, &mut self.node, &board);
|
||||||
|
if ui.button("Ok").clicked() {
|
||||||
|
board.insert_node(self.node.clone());
|
||||||
self.open = false;
|
self.open = false;
|
||||||
}
|
}
|
||||||
|
if ui.button("Cancel").clicked() {
|
||||||
|
self.open = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
@ -268,19 +272,7 @@ impl EditNodeDialog {
|
|||||||
.collapsible(false)
|
.collapsible(false)
|
||||||
.show(ctx, |ui| {
|
.show(ctx, |ui| {
|
||||||
let mut board = self.board.borrow_mut();
|
let mut board = self.board.borrow_mut();
|
||||||
ui.text_edit_singleline(&mut self.node.name);
|
node_common_ui(ui, &mut self.node, &board);
|
||||||
for (key, choices) in &board.labels {
|
|
||||||
let choices = choices.clone();
|
|
||||||
let default = choices.iter().next().unwrap().clone();
|
|
||||||
let current = self.node.labels.entry(key.clone()).or_insert(default);
|
|
||||||
ComboBox::from_label(key)
|
|
||||||
.selected_text(current.to_string())
|
|
||||||
.show_ui(ui, |ui| {
|
|
||||||
for choice in choices {
|
|
||||||
ui.selectable_value(current, choice.clone(), choice);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if ui.button("Ok").clicked() {
|
if ui.button("Ok").clicked() {
|
||||||
board.nodes.insert(self.id, self.node.clone());
|
board.nodes.insert(self.id, self.node.clone());
|
||||||
self.open = false;
|
self.open = false;
|
||||||
@ -412,3 +404,19 @@ impl StringDialog {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn node_common_ui(ui: &mut Ui, node: &mut Node, board: &Board) {
|
||||||
|
ui.text_edit_singleline(&mut node.name);
|
||||||
|
for (key, choices) in &board.labels {
|
||||||
|
let choices = choices.clone();
|
||||||
|
let default = choices.iter().next().unwrap().clone();
|
||||||
|
let current = node.labels.entry(key.clone()).or_insert(default);
|
||||||
|
ComboBox::from_label(key)
|
||||||
|
.selected_text(current.to_string())
|
||||||
|
.show_ui(ui, |ui| {
|
||||||
|
for choice in choices {
|
||||||
|
ui.selectable_value(current, choice.clone(), choice);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -34,6 +34,12 @@ impl Board {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn insert_node(&mut self, node: Node) -> usize {
|
||||||
|
let id = self.next_id();
|
||||||
|
self.nodes.insert(id, node);
|
||||||
|
id
|
||||||
|
}
|
||||||
|
|
||||||
pub fn remove_node(&mut self, id: usize) {
|
pub fn remove_node(&mut self, id: usize) {
|
||||||
// We remove this node from the graph, then drop it from each
|
// We remove this node from the graph, then drop it from each
|
||||||
// other nodes edge.
|
// other nodes edge.
|
||||||
|
Loading…
Reference in New Issue
Block a user