From be2ba6d4eee3a97c56ffd9f7e223839d9121a7b0 Mon Sep 17 00:00:00 2001
From: Alberto Nidasio <alberto.nidasio@skywarder.eu>
Date: Mon, 13 Jan 2025 14:55:14 +0100
Subject: [PATCH] Implemented canvas pan in PID editor

---
 src/ui/panes/pid_drawing_tool.rs      | 43 +++++++++++++++++----------
 src/ui/panes/pid_drawing_tool/grid.rs |  2 ++
 2 files changed, 29 insertions(+), 16 deletions(-)

diff --git a/src/ui/panes/pid_drawing_tool.rs b/src/ui/panes/pid_drawing_tool.rs
index e0af184..d102e1d 100644
--- a/src/ui/panes/pid_drawing_tool.rs
+++ b/src/ui/panes/pid_drawing_tool.rs
@@ -27,6 +27,7 @@ enum Action {
     ContextMenu(Pos2),
     DragElement(usize),
     DragConnection(usize, usize),
+    DragGrid,
 }
 
 /// Piping and instrumentation diagram
@@ -49,7 +50,10 @@ impl Default for PidPane {
         Self {
             elements: Vec::default(),
             connections: Vec::default(),
-            grid: GridInfo { size: 10.0 },
+            grid: GridInfo {
+                zero_pos: Pos2::ZERO,
+                size: 10.0,
+            },
             action: None,
             editable: false,
         }
@@ -89,20 +93,23 @@ impl PaneBehavior for PidPane {
                 self.action = Some(Action::ContextMenu(pointer_pos.clone()));
             } else if self.editable {
                 if response.drag_started() {
-                    println!("Checking drag start at {:?}", pointer_pos);
-                    if let Some(drag_connection_point) = self
-                        .find_hovered_connection_point(pointer_pos)
-                        .map(|(idx1, idx2)| Action::DragConnection(idx1, idx2))
-                    {
-                        self.action = Some(drag_connection_point);
-                        println!("Connection point drag started");
-                    }
-                    if let Some(drag_element_action) = self
-                        .find_hovered_element_idx(pointer_pos)
-                        .map(|idx| Action::DragElement(idx))
-                    {
-                        self.action = Some(drag_element_action);
-                        println!("Element drag started");
+                    if response.dragged_by(PointerButton::Middle) {
+                        self.action = Some(Action::DragGrid);
+                        println!("Grid drag started");
+                    } else {
+                        if let Some(drag_element_action) = self
+                            .find_hovered_element_idx(pointer_pos)
+                            .map(|idx| Action::DragElement(idx))
+                        {
+                            self.action = Some(drag_element_action);
+                            println!("Element drag started");
+                        } else if let Some(drag_connection_point) = self
+                            .find_hovered_connection_point(pointer_pos)
+                            .map(|(idx1, idx2)| Action::DragConnection(idx1, idx2))
+                        {
+                            self.action = Some(drag_connection_point);
+                            println!("Connection point drag started");
+                        }
                     }
                 } else if response.drag_stopped() {
                     self.action.take();
@@ -138,6 +145,10 @@ impl PaneBehavior for PidPane {
                     self.connections[conn_idx].middle_points[midpoint_idx] =
                         Pos::from_pos2(&self.grid, &pointer_pos);
                 }
+                Some(Action::DragGrid) => {
+                    self.grid.zero_pos += response.drag_delta();
+                    // self.grid.zero_pos = pointer_pos - start_pos.to_vec2()
+                }
                 _ => {}
             }
         }
@@ -303,7 +314,7 @@ impl PidPane {
                 egui::Pos2::new(
                     element.position.x as f32 * self.grid.size,
                     element.position.y as f32 * self.grid.size,
-                ),
+                ) + self.grid.zero_pos.to_vec2(),
                 egui::Vec2::new(
                     element.size as f32 * self.grid.size,
                     element.size as f32 * self.grid.size,
diff --git a/src/ui/panes/pid_drawing_tool/grid.rs b/src/ui/panes/pid_drawing_tool/grid.rs
index e8adc1b..1e04422 100644
--- a/src/ui/panes/pid_drawing_tool/grid.rs
+++ b/src/ui/panes/pid_drawing_tool/grid.rs
@@ -1,8 +1,10 @@
+use egui::Pos2;
 use serde::{Deserialize, Serialize};
 
 pub const LINE_DISTANCE_THRESHOLD: f32 = 5.0; // Pixels
 
 #[derive(Clone, Serialize, Deserialize, PartialEq)]
 pub struct GridInfo {
+    pub zero_pos: Pos2,
     pub size: f32,
 }
-- 
GitLab