From 863dd555c15dc08931dd35e9dd6240e279a9ad24 Mon Sep 17 00:00:00 2001 From: gianlucafiore Date: Thu, 3 Sep 2026 19:23:37 -0300 Subject: [PATCH] feat(ribbon): add measurement dropdown --- assets/icons/area.svg | 106 +++++++++++++++++++++++++++++++ assets/icons/distance.svg | 44 +++++++++++++ src/modules/draw/inquiry/area.rs | 3 + src/modules/draw/inquiry/dist.rs | 5 +- src/modules/draw/mod.rs | 16 +++++ 5 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 assets/icons/area.svg create mode 100644 assets/icons/distance.svg diff --git a/assets/icons/area.svg b/assets/icons/area.svg new file mode 100644 index 000000000..d3f754b24 --- /dev/null +++ b/assets/icons/area.svg @@ -0,0 +1,106 @@ + + + + + + χ2 diff --git a/assets/icons/distance.svg b/assets/icons/distance.svg new file mode 100644 index 000000000..8969fc734 --- /dev/null +++ b/assets/icons/distance.svg @@ -0,0 +1,44 @@ + + + + diff --git a/src/modules/draw/inquiry/area.rs b/src/modules/draw/inquiry/area.rs index de7330314..2e41e149a 100644 --- a/src/modules/draw/inquiry/area.rs +++ b/src/modules/draw/inquiry/area.rs @@ -8,7 +8,10 @@ use crate::command::{ use crate::entities::curve::entity_curve; use crate::entities::traits::EntityTypeOps; use crate::scene::model::wire_model::WireModel; +use crate::modules::IconKind; +pub const ICON: IconKind = + IconKind::Svg(include_bytes!("../../../../assets/icons/area.svg")); #[derive(Clone, Copy, PartialEq, Eq)] enum AreaMode { Single, diff --git a/src/modules/draw/inquiry/dist.rs b/src/modules/draw/inquiry/dist.rs index a05274858..ff3729f19 100644 --- a/src/modules/draw/inquiry/dist.rs +++ b/src/modules/draw/inquiry/dist.rs @@ -4,8 +4,8 @@ use glam::DVec3; use crate::t; use crate::command::{CadCommand, CmdResult, WorkingPlane}; +use crate::modules::IconKind; use crate::scene::model::wire_model::WireModel; - pub struct DistCommand { // Keep the picked point in full f64 precision. Downcasting to f32 here // loses ~0.03–0.06 units at survey-scale coordinates (e.g. eastings near @@ -13,7 +13,8 @@ pub struct DistCommand { first: Option, plane: WorkingPlane, } - +pub const ICON: IconKind = + IconKind::Svg(include_bytes!("../../../../assets/icons/distance.svg")); impl DistCommand { pub fn new() -> Self { Self { diff --git a/src/modules/draw/mod.rs b/src/modules/draw/mod.rs index 9b860ea12..a9db09f43 100644 --- a/src/modules/draw/mod.rs +++ b/src/modules/draw/mod.rs @@ -43,6 +43,7 @@ impl CadModule for DrawModule { array, copy, delete, explode, fillet, mirror, offset, rotate, scale, stretch, translate, trim, }; + use inquiry::{area, dist}; use properties::match_prop; static GROUPS: std::sync::OnceLock> = std::sync::OnceLock::new(); @@ -231,6 +232,21 @@ impl CadModule for DrawModule { cut::tool().into(), ], }, + RibbonGroup { + title: "Measure", + tools: vec![ + RibbonItem::LargeDropdown { + id: "MEASURE_MENU", + label: "Measure", + icon: dist::ICON, + items: vec![ + ("DIST", "Distance", dist::ICON), + ("AREA", "Area", area::ICON), + ], + default: "DIST", + }, + ], + }, // Support group lives on the Start tab now (see view.rs: // start_page_view). Removed from the Draw ribbon to declutter. ]