From 9ab8b93460dff75299274027304e5c4f5ab9eb91 Mon Sep 17 00:00:00 2001
From: Alberto Nidasio <alberto.nidasio@skywarder.eu>
Date: Tue, 7 Jan 2025 21:03:24 +0100
Subject: [PATCH] Enables rotating PID elements

---
 src/ui/panes/pid_drawing_tool.rs              | 29 +++++++++++++++++--
 src/ui/panes/pid_drawing_tool/pid_elements.rs |  1 +
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/src/ui/panes/pid_drawing_tool.rs b/src/ui/panes/pid_drawing_tool.rs
index 712cfa5..26150f1 100644
--- a/src/ui/panes/pid_drawing_tool.rs
+++ b/src/ui/panes/pid_drawing_tool.rs
@@ -1,8 +1,9 @@
 mod pid_elements;
 
-use egui::{epaint::PathStroke, Color32, PointerButton, Pos2, Sense, Stroke, Theme};
+use egui::{epaint::PathStroke, Color32, PointerButton, Pos2, Sense, Theme, Vec2};
 use pid_elements::{PidElement, PidSymbol};
 use serde::{Deserialize, Serialize};
+use std::f32::consts::PI;
 use strum::IntoEnumIterator;
 
 use crate::ui::composable_view::PaneResponse;
@@ -84,7 +85,9 @@ impl PaneBehavior for PidPane {
                 ),
             );
 
-            egui::Image::new(element.get_image(theme)).paint_at(ui, image_rect);
+            egui::Image::new(element.get_image(theme))
+                .rotate(element.rotation, Vec2::new(0.5, 0.5))
+                .paint_at(ui, image_rect);
         }
 
         let (_, response) = ui.allocate_at_least(window_rect.size(), Sense::click_and_drag());
@@ -108,6 +111,27 @@ impl PaneBehavior for PidPane {
                         .position(|element| element.contains(self.context_menu_pos));
                     ui.close_menu();
                 }
+
+                if ui.button("Rotate 90° ⟲").clicked() {
+                    if let Some(elem) = self
+                        .elements
+                        .iter_mut()
+                        .find(|element| element.contains(self.context_menu_pos))
+                    {
+                        elem.rotation += PI / 2.0;
+                    }
+                    ui.close_menu();
+                }
+                if ui.button("Rotate 90° ⟳").clicked() {
+                    if let Some(elem) = self
+                        .elements
+                        .iter_mut()
+                        .find(|element| element.contains(self.context_menu_pos))
+                    {
+                        elem.rotation -= PI / 2.0;
+                    }
+                    ui.close_menu();
+                }
             }
 
             ui.menu_button("Symbols", |ui| {
@@ -117,6 +141,7 @@ impl PaneBehavior for PidPane {
                             pos: self.context_menu_pos,
                             size: 10,
                             symbol,
+                            rotation: 0.0,
                         });
                         ui.close_menu();
                     }
diff --git a/src/ui/panes/pid_drawing_tool/pid_elements.rs b/src/ui/panes/pid_drawing_tool/pid_elements.rs
index 7c12961..fd571ae 100644
--- a/src/ui/panes/pid_drawing_tool/pid_elements.rs
+++ b/src/ui/panes/pid_drawing_tool/pid_elements.rs
@@ -7,6 +7,7 @@ pub struct PidElement {
     pub pos: (i32, i32),
     pub size: i32,
     pub symbol: PidSymbol,
+    pub rotation: f32,
 }
 
 #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, EnumIter, Display)]
-- 
GitLab