From f699cc61e3397e60775b951e5b98ab123535acbd Mon Sep 17 00:00:00 2001 From: Dane Johnson Date: Tue, 10 May 2022 15:22:48 -0500 Subject: [PATCH] Edit edges --- board-builder-impl-egui/src/main.rs | 21 +++++++++++++++++++-- board-builder-impl-fltk/src/main.rs | 3 +-- board.zip | Bin 512026 -> 512077 bytes src/lib.rs | 5 +++++ 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/board-builder-impl-egui/src/main.rs b/board-builder-impl-egui/src/main.rs index 0d0f4d0..fe5c5e8 100644 --- a/board-builder-impl-egui/src/main.rs +++ b/board-builder-impl-egui/src/main.rs @@ -21,6 +21,7 @@ struct BoardBuilderApp { image: Option, edit_mode: EditMode, create_node_dialog: CreateNodeDialog, + selected_node: Option, } #[derive(Clone, Copy)] @@ -153,13 +154,18 @@ impl BoardBuilderApp { } fn draw_board(&self, painter: &Painter, view: View) { - for node in self.board.nodes.values() { + for (&id, node) in &self.board.nodes { + let color = if Some(id) == self.selected_node { + Color32::RED + } else { + Color32::BLACK + }; painter.text( view.from_coords(node.x, node.y), Align2::CENTER_CENTER, &node.name, FontId::proportional(16.0), - Color32::BLACK, + color, ); let stroke = Stroke { width: 1.0, color: Color32::BLACK }; for edge in &node.edges { @@ -177,9 +183,20 @@ impl BoardBuilderApp { use PointerButton::*; match (btn, self.edit_mode) { (Primary, Nodes) => self.create_node_dialog.show(x, y), + (Primary, Edges) => self.select_edge(x, y), _ => {}, } } + + fn select_edge(&mut self, x: f32, y:f32) { + if let Some(nearest_id) = self.board.nearest_node(x, y) { + match self.selected_node { + None => self.selected_node = Some(nearest_id), + Some(id) if id == nearest_id => self.selected_node = None, + Some(id) => self.board.add_edge(id, nearest_id), + } + } + } } #[derive(Clone, Copy)] diff --git a/board-builder-impl-fltk/src/main.rs b/board-builder-impl-fltk/src/main.rs index da641cf..6128c94 100644 --- a/board-builder-impl-fltk/src/main.rs +++ b/board-builder-impl-fltk/src/main.rs @@ -117,8 +117,7 @@ mod dispatch { if selected == nearest { state.selected_node = None; } else { - let node = state.board.nodes.get_mut(&selected).unwrap(); - node.edges.insert(nearest); + state.board.add_edge(selected, nearest); } app::redraw(); } diff --git a/board.zip b/board.zip index fa3c9bf6f111ce96c7465d36d9af4f3ae76f3303..a79a7bb91ca907bae58c58881dc0dd3636fcf522 100644 GIT binary patch delta 619 zcmbQWK>q9k`T78FW)=|!1_lm>(~DMxT;48l=m8@Gg9s}F0~b&FGZclEcGy?@`|eR%TtujR>e?ryDrp7giiq0Sa}`+X^G zx9zuyzh7dqh^cpuZNK;0o^2E4O8w`(z4`pY?uhN4pO0Vu@XogA(XYnmEYn$cD%uAL8|SF^)_{4C~BRoLJ$wcIj5(ES+UjiX8brK5>q37mCf66u!31 zr)rY}^8`&HIjQS^cXn-Gwxa&Vn~JluT^(7{BK)qgU;k>?c6WQg_kTNfzmA=MV$qCj ztLuTPt1o4!MX6W+(EsxLMck{jP}hy$o;+Hpv|<`pmcbI=gT9A9XV01|dDl#}dx@f{ z)N>~m_P}YWTF-SC%^-y<3jSC4|Ch;L-=vpfB9y3?EOlm~bA3d~ z?~BL(t-4!tS@eXbs-&;i8PBa-U6vGG(zl!EopX7jR`4~BiRbPYeOYy7BA5B$;>S(a z(>Qsz&oPti)}6h@IaHU~?%$cx)&G}uz1#Oo;`P4X^Q!yWa^*ZVMVBbfNxZOa(}d-J zlfT%R=*g_#l-I{E6382-@ob65C9R45Uwy5vNL(~Ms-7E`d3W*Yr}oHcq4^2E{*aOVz*#=j^fG<@d3G(P(~G9xKF==0#KAQE=XrK%wiD;sfvE@p D77Zj9 delta 594 zcmX@RKz`N&`T78FW)=|!1_lm>kF!>VY>rluSj))3kjKKnzy%adFG?)P(90^$&#Rq$ zI_rsnfNTBIi%~pPQ{wiXZb>XNo^WP@>j|gMsePTw&1)uz|9wAEHaaLL<1|Os!ozEK zZMO?Z&yO`<@Rxm8LHoAv8TGyYz9`zgIX5pR)N*_ z%g-_NYvky;cWhG7%HCxwzkEBn(Ds+?oX>N=`ZDc$W?;8JY{tC@N)Kn8&|;PhJ`%ub zJi&9_l4Uc$Uw4Qs%Uo zIx49=4tidqtjk(YKIwj*Sf7#08ok-WO>nJg#!S;7Es=*aORn8~xKST zC#4)kwcGw|axOXe{@-u2U1{Z#xjrYF+I)|@ss$^kUam^h<~=DLmeSVzdE?jRRnJr{ zJ!ei_kT%1|>$v^pI=0{U%G3jnaz1F9rQ;o>x@46{@rL)$WAttIz1-r}%fwut!pY0A z%u=&=-g2|%x2s}LUOt@U+p5(SpT4Zu5)L`Ir&O^{{(#o(Nn4YRvkeA-9&(yBZ#0bP7ni+^$fS47C*|zI5u`fN#hng&=KRVB@#q@F3biNDh UGE7$)r|Vo`mu8!Ko*if?05Gcl>Hq)$ diff --git a/src/lib.rs b/src/lib.rs index 9359387..3c2983a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -43,6 +43,11 @@ impl Board { } } + pub fn add_edge(&mut self, from: usize, to: usize) { + let node = self.nodes.get_mut(&from).expect("Could not find node"); + node.edges.insert(to); + } + pub fn nearest_node(&self, x: f32, y: f32) -> Option { let f = |n: &Node| dist_sq((n.x, n.y), (x, y)); let mut iter = self.nodes.iter();