From 6adce20b6bd51e40869fd9954f86d88cae8a0ba3 Mon Sep 17 00:00:00 2001
From: Alberto Nidasio <alberto.nidasio@skywarder.eu>
Date: Mon, 13 Jan 2025 18:56:45 +0100
Subject: [PATCH] Improved PID centering

---
 src/ui/panes/pid_drawing_tool.rs     | 23 +++++++++++++++++++----
 src/ui/panes/pid_drawing_tool/pos.rs |  4 ++++
 2 files changed, 23 insertions(+), 4 deletions(-)

diff --git a/src/ui/panes/pid_drawing_tool.rs b/src/ui/panes/pid_drawing_tool.rs
index 16e04b3..a2354be 100644
--- a/src/ui/panes/pid_drawing_tool.rs
+++ b/src/ui/panes/pid_drawing_tool.rs
@@ -424,10 +424,25 @@ impl PidPane {
     fn center(&mut self, ui: &Ui) {
         let ui_center = ui.max_rect().center();
 
-        let elements_center = self.elements.iter().fold(Vec2::ZERO, |acc, e| {
-            acc + e.position.to_relative_pos2(&self.grid).to_vec2()
-        }) / self.elements.len() as f32;
+        let points: Vec<Pos> = self
+            .elements
+            .iter()
+            .map(|e| e.position.clone())
+            .chain(
+                self.connections
+                    .iter()
+                    .flat_map(|conn| conn.middle_points.clone()),
+            )
+            .collect();
+
+        let min_x = points.iter().map(|p| p.x).min().unwrap();
+        let max_x = points.iter().map(|p| p.x).max().unwrap();
+        let min_y = points.iter().map(|p| p.y).min().unwrap();
+        let max_y = points.iter().map(|p| p.y).max().unwrap();
+
+        let pid_center =
+            Pos::new((max_x + min_x) / 2, (max_y + min_y) / 2).to_relative_pos2(&self.grid);
 
-        self.grid.zero_pos = ui_center - elements_center;
+        self.grid.zero_pos = ui_center - pid_center.to_vec2();
     }
 }
diff --git a/src/ui/panes/pid_drawing_tool/pos.rs b/src/ui/panes/pid_drawing_tool/pos.rs
index 2a85b4b..8817861 100644
--- a/src/ui/panes/pid_drawing_tool/pos.rs
+++ b/src/ui/panes/pid_drawing_tool/pos.rs
@@ -10,6 +10,10 @@ pub struct Pos {
 }
 
 impl Pos {
+    pub fn new(x: i32, y: i32) -> Self {
+        Self { x, y }
+    }
+
     pub fn add_size(&self, size: i32) -> Self {
         Self {
             x: self.x + size,
-- 
GitLab