feat: redesign View tab and fix Annotate/tab order
- Redesign View ribbon tab with 8 groups matching AutoCAD layout: Viewport Tools (UCS Icon, ViewCube, Navigation Bar), Navigate, Model Viewports (Viewport Configuration, Named, Join, Restore), Visual Style (dropdown), Projection, Preset, Palettes (Tool Palettes, Properties, Sheet Set Manager), Interface (File Tabs, Layout Tabs, Tile Horiz/Vert, Cascade) - Add Extract Data and Link Data tools to Annotate → Tables group - Fix tab order to Home → Insert → Annotate → View → Manage via build.rs PRIORITY list - Add 17 new SVG icons for all new commands Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6
assets/icons/cascade.svg
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- Three cascaded windows -->
|
||||||
|
<rect x="8" y="10" width="13" height="11" rx="1"/>
|
||||||
|
<rect x="5" y="7" width="13" height="11" rx="1"/>
|
||||||
|
<rect x="2" y="4" width="13" height="11" rx="1"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 359 B |
10
assets/icons/data_extract.svg
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- Table grid -->
|
||||||
|
<rect x="2" y="4" width="14" height="12" rx="1"/>
|
||||||
|
<line x1="2" y1="8" x2="16" y2="8"/>
|
||||||
|
<line x1="2" y1="12" x2="16" y2="12"/>
|
||||||
|
<line x1="7" y1="4" x2="7" y2="16"/>
|
||||||
|
<!-- Arrow pointing right/out -->
|
||||||
|
<line x1="18" y1="10" x2="23" y2="10"/>
|
||||||
|
<polyline points="20,7 23,10 20,13"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 479 B |
11
assets/icons/data_link.svg
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- Table grid -->
|
||||||
|
<rect x="2" y="4" width="12" height="12" rx="1"/>
|
||||||
|
<line x1="2" y1="8" x2="14" y2="8"/>
|
||||||
|
<line x1="2" y1="12" x2="14" y2="12"/>
|
||||||
|
<line x1="6" y1="4" x2="6" y2="16"/>
|
||||||
|
<!-- Link chain -->
|
||||||
|
<path d="M17 10 h2 a3 3 0 0 1 0 6 h-2"/>
|
||||||
|
<path d="M19 13 h-4"/>
|
||||||
|
<path d="M17 13 h-2 a3 3 0 0 1 0-6 h2"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 494 B |
11
assets/icons/file_tabs.svg
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- Tab bar at top -->
|
||||||
|
<rect x="2" y="5" width="6" height="4" rx="1"/>
|
||||||
|
<rect x="9" y="5" width="6" height="4" rx="1"/>
|
||||||
|
<rect x="16" y="5" width="6" height="4" rx="1"/>
|
||||||
|
<!-- Document area below -->
|
||||||
|
<rect x="2" y="9" width="20" height="12" rx="0 0 1 1"/>
|
||||||
|
<!-- File icon inside -->
|
||||||
|
<polyline points="7,12 7,18 17,18 17,12"/>
|
||||||
|
<polyline points="7,12 11,12 12,11 17,12" stroke-width="1"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 570 B |
9
assets/icons/layout_tabs.svg
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- Document area -->
|
||||||
|
<rect x="2" y="3" width="20" height="15" rx="1"/>
|
||||||
|
<!-- Layout tabs at bottom -->
|
||||||
|
<rect x="2" y="18" width="6" height="3" rx="1 1 0 0"/>
|
||||||
|
<rect x="9" y="18" width="6" height="3" rx="1 1 0 0"/>
|
||||||
|
<!-- Page border inside -->
|
||||||
|
<rect x="5" y="6" width="14" height="9" rx="0.5"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 475 B |
10
assets/icons/navbar.svg
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- Compass rose -->
|
||||||
|
<circle cx="12" cy="12" r="9"/>
|
||||||
|
<line x1="12" y1="3" x2="12" y2="8"/>
|
||||||
|
<line x1="12" y1="16" x2="12" y2="21"/>
|
||||||
|
<line x1="3" y1="12" x2="8" y2="12"/>
|
||||||
|
<line x1="16" y1="12" x2="21" y2="12"/>
|
||||||
|
<!-- N marker -->
|
||||||
|
<text x="9.5" y="7" font-size="4.5" fill="currentColor" stroke="none">N</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 491 B |
15
assets/icons/properties.svg
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- Properties panel -->
|
||||||
|
<rect x="4" y="2" width="16" height="20" rx="1"/>
|
||||||
|
<!-- Header -->
|
||||||
|
<line x1="4" y1="6" x2="20" y2="6"/>
|
||||||
|
<!-- Property rows: label + value -->
|
||||||
|
<line x1="6" y1="10" x2="11" y2="10"/>
|
||||||
|
<line x1="13" y1="10" x2="18" y2="10"/>
|
||||||
|
<line x1="6" y1="14" x2="11" y2="14"/>
|
||||||
|
<line x1="13" y1="14" x2="18" y2="14"/>
|
||||||
|
<line x1="6" y1="18" x2="11" y2="18"/>
|
||||||
|
<line x1="13" y1="18" x2="18" y2="18"/>
|
||||||
|
<!-- Divider between label and value -->
|
||||||
|
<line x1="12" y1="7" x2="12" y2="20" stroke-dasharray="2 2"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 701 B |
9
assets/icons/sheetset.svg
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- Stack of sheets -->
|
||||||
|
<rect x="5" y="6" width="14" height="16" rx="1"/>
|
||||||
|
<rect x="3" y="4" width="14" height="16" rx="1"/>
|
||||||
|
<!-- Lines on top sheet -->
|
||||||
|
<line x1="5" y1="8" x2="15" y2="8"/>
|
||||||
|
<line x1="5" y1="11" x2="15" y2="11"/>
|
||||||
|
<line x1="5" y1="14" x2="11" y2="14"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 450 B |
5
assets/icons/tile_horiz.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- Two windows stacked horizontally -->
|
||||||
|
<rect x="2" y="3" width="20" height="8" rx="1"/>
|
||||||
|
<rect x="2" y="13" width="20" height="8" rx="1"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 315 B |
5
assets/icons/tile_vert.svg
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- Two windows side by side vertically -->
|
||||||
|
<rect x="2" y="3" width="9" height="18" rx="1"/>
|
||||||
|
<rect x="13" y="3" width="9" height="18" rx="1"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 318 B |
15
assets/icons/tool_palettes.svg
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- Palette panel (vertical strip) -->
|
||||||
|
<rect x="3" y="2" width="7" height="20" rx="1"/>
|
||||||
|
<!-- Tab on top -->
|
||||||
|
<rect x="3" y="2" width="7" height="4" rx="1"/>
|
||||||
|
<!-- Stacked items inside -->
|
||||||
|
<line x1="5" y1="9" x2="8" y2="9"/>
|
||||||
|
<rect x="4" y="7" width="2" height="2"/>
|
||||||
|
<line x1="5" y1="14" x2="8" y2="14"/>
|
||||||
|
<rect x="4" y="12" width="2" height="2"/>
|
||||||
|
<line x1="5" y1="19" x2="8" y2="19"/>
|
||||||
|
<rect x="4" y="17" width="2" height="2"/>
|
||||||
|
<!-- Shadow panel behind -->
|
||||||
|
<rect x="11" y="4" width="7" height="16" rx="1" stroke-dasharray="3 2"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 720 B |
10
assets/icons/ucs_icon.svg
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- X axis (red-ish) -->
|
||||||
|
<line x1="4" y1="18" x2="14" y2="18"/>
|
||||||
|
<polyline points="11,15 14,18 11,21"/>
|
||||||
|
<text x="15" y="21" font-size="5" fill="currentColor" stroke="none">X</text>
|
||||||
|
<!-- Y axis -->
|
||||||
|
<line x1="4" y1="18" x2="4" y2="6"/>
|
||||||
|
<polyline points="1,9 4,6 7,9"/>
|
||||||
|
<text x="1" y="5" font-size="5" fill="currentColor" stroke="none">Y</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 526 B |
8
assets/icons/viewcube.svg
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- Front face -->
|
||||||
|
<rect x="6" y="10" width="10" height="10" rx="1"/>
|
||||||
|
<!-- Top face -->
|
||||||
|
<polygon points="6,10 10,6 20,6 16,10"/>
|
||||||
|
<!-- Right face -->
|
||||||
|
<polygon points="16,10 20,6 20,16 16,20"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 373 B |
7
assets/icons/vports_config.svg
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- 4 viewport grid -->
|
||||||
|
<rect x="2" y="2" width="9" height="9" rx="1"/>
|
||||||
|
<rect x="13" y="2" width="9" height="9" rx="1"/>
|
||||||
|
<rect x="2" y="13" width="9" height="9" rx="1"/>
|
||||||
|
<rect x="13" y="13" width="9" height="9" rx="1"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 399 B |
10
assets/icons/vports_join.svg
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- Two small viewports -->
|
||||||
|
<rect x="2" y="4" width="9" height="7" rx="1"/>
|
||||||
|
<rect x="2" y="13" width="9" height="7" rx="1"/>
|
||||||
|
<!-- Arrow merging into one -->
|
||||||
|
<line x1="13" y1="12" x2="18" y2="12"/>
|
||||||
|
<polyline points="16,9 18,12 16,15"/>
|
||||||
|
<!-- Result: one big viewport -->
|
||||||
|
<rect x="19" y="4" width="3" height="16" rx="0.5"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 506 B |
8
assets/icons/vports_named.svg
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- Two viewports side by side -->
|
||||||
|
<rect x="2" y="4" width="9" height="16" rx="1"/>
|
||||||
|
<rect x="13" y="4" width="9" height="16" rx="1"/>
|
||||||
|
<!-- Label line on each -->
|
||||||
|
<line x1="4" y1="7" x2="9" y2="7"/>
|
||||||
|
<line x1="15" y1="7" x2="20" y2="7"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 417 B |
7
assets/icons/vports_restore.svg
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<!-- Single viewport with restore arrow -->
|
||||||
|
<rect x="3" y="4" width="18" height="16" rx="1"/>
|
||||||
|
<!-- Restore/refresh arrow inside -->
|
||||||
|
<path d="M9 14 A4 4 0 1 1 15 14"/>
|
||||||
|
<polyline points="15,11 15,14 18,14"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 384 B |
2
build.rs
|
|
@ -22,7 +22,7 @@ use std::fs;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
// Display order for known modules; unknown modules follow alphabetically.
|
// Display order for known modules; unknown modules follow alphabetically.
|
||||||
const PRIORITY: &[&str] = &["home", "annotate", "insert", "view", "manage"];
|
const PRIORITY: &[&str] = &["home", "insert", "annotate", "view", "manage"];
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let mods_dir = Path::new("src/modules");
|
let mods_dir = Path::new("src/modules");
|
||||||
|
|
|
||||||
14
src/modules/annotate/data_extract.rs
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
// DATAEXTRACTION command — launches the Data Extraction wizard.
|
||||||
|
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/data_extract.svg"));
|
||||||
|
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef {
|
||||||
|
id: "DATAEXTRACTION",
|
||||||
|
label: "Extract\nData",
|
||||||
|
icon: ICON,
|
||||||
|
event: ModuleEvent::Command("DATAEXTRACTION".to_string()),
|
||||||
|
}
|
||||||
|
}
|
||||||
14
src/modules/annotate/data_link.rs
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
// DATALINK command — manages data links to external spreadsheets.
|
||||||
|
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/data_link.svg"));
|
||||||
|
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef {
|
||||||
|
id: "DATALINK",
|
||||||
|
label: "Link\nData",
|
||||||
|
icon: ICON,
|
||||||
|
event: ModuleEvent::Command("DATALINK".to_string()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
// Annotate module — dimension, text, leader, table, and markup tools.
|
// Annotate module — dimension, text, leader, table, and markup tools.
|
||||||
|
|
||||||
pub mod aligned_dim;
|
pub mod aligned_dim;
|
||||||
|
pub mod data_extract;
|
||||||
|
pub mod data_link;
|
||||||
pub mod angular_dim;
|
pub mod angular_dim;
|
||||||
pub mod ddedit;
|
pub mod ddedit;
|
||||||
pub mod diameter_dim;
|
pub mod diameter_dim;
|
||||||
|
|
@ -152,7 +154,12 @@ impl CadModule for AnnotateModule {
|
||||||
style_key: StyleKey::TableStyle,
|
style_key: StyleKey::TableStyle,
|
||||||
combo_id: "TABLE_STYLE_COMBO",
|
combo_id: "TABLE_STYLE_COMBO",
|
||||||
manager_cmd: Some("TABLESTYLE"),
|
manager_cmd: Some("TABLESTYLE"),
|
||||||
rows: vec![],
|
rows: vec![
|
||||||
|
vec![
|
||||||
|
data_extract::tool(),
|
||||||
|
data_link::tool(),
|
||||||
|
],
|
||||||
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@ use crate::modules::CadModule;
|
||||||
pub fn all_modules() -> Vec<Box<dyn CadModule>> {
|
pub fn all_modules() -> Vec<Box<dyn CadModule>> {
|
||||||
vec![
|
vec![
|
||||||
Box::new(super::home::HomeModule),
|
Box::new(super::home::HomeModule),
|
||||||
Box::new(super::annotate::AnnotateModule),
|
|
||||||
Box::new(super::insert::InsertModule),
|
Box::new(super::insert::InsertModule),
|
||||||
|
Box::new(super::annotate::AnnotateModule),
|
||||||
Box::new(super::view::ViewModule),
|
Box::new(super::view::ViewModule),
|
||||||
Box::new(super::manage::ManageModule),
|
Box::new(super::manage::ManageModule),
|
||||||
Box::new(super::layout::LayoutModule),
|
Box::new(super::layout::LayoutModule),
|
||||||
|
|
|
||||||
5
src/modules/view/cascade.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/cascade.svg"));
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef { id: "CASCADE", label: "Cascade", icon: ICON, event: ModuleEvent::Command("CASCADE".to_string()) }
|
||||||
|
}
|
||||||
5
src/modules/view/file_tabs.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/file_tabs.svg"));
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef { id: "FILETAB", label: "File\nTabs", icon: ICON, event: ModuleEvent::Command("FILETAB".to_string()) }
|
||||||
|
}
|
||||||
5
src/modules/view/layout_tabs.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/layout_tabs.svg"));
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef { id: "LAYOUTTAB", label: "Layout\nTabs", icon: ICON, event: ModuleEvent::Command("LAYOUTTAB".to_string()) }
|
||||||
|
}
|
||||||
|
|
@ -1,15 +1,30 @@
|
||||||
// View module — navigation, visual styles, and viewport presets.
|
// View module — viewport tools, navigation, visual styles, palettes, interface.
|
||||||
|
|
||||||
|
mod cascade;
|
||||||
|
mod file_tabs;
|
||||||
mod hidden;
|
mod hidden;
|
||||||
|
mod layout_tabs;
|
||||||
|
mod navbar;
|
||||||
mod orbit;
|
mod orbit;
|
||||||
mod ortho;
|
mod ortho;
|
||||||
mod pan;
|
mod pan;
|
||||||
mod persp;
|
mod persp;
|
||||||
|
mod properties_palette;
|
||||||
|
mod sheetset;
|
||||||
mod solid;
|
mod solid;
|
||||||
|
mod tile_horiz;
|
||||||
|
mod tile_vert;
|
||||||
|
mod tool_palettes;
|
||||||
|
mod ucs_icon;
|
||||||
|
mod viewcube;
|
||||||
mod view_front;
|
mod view_front;
|
||||||
mod view_iso;
|
mod view_iso;
|
||||||
mod view_right;
|
mod view_right;
|
||||||
mod view_top;
|
mod view_top;
|
||||||
|
mod vports_config;
|
||||||
|
mod vports_join;
|
||||||
|
mod vports_named;
|
||||||
|
mod vports_restore;
|
||||||
mod wireframe;
|
mod wireframe;
|
||||||
mod xray;
|
mod xray;
|
||||||
mod zoom_ext;
|
mod zoom_ext;
|
||||||
|
|
@ -18,7 +33,7 @@ mod zoom_out;
|
||||||
pub mod plot_window;
|
pub mod plot_window;
|
||||||
pub mod zoom_window;
|
pub mod zoom_window;
|
||||||
|
|
||||||
use crate::modules::{CadModule, RibbonGroup};
|
use crate::modules::{CadModule, RibbonGroup, RibbonItem};
|
||||||
|
|
||||||
pub struct ViewModule;
|
pub struct ViewModule;
|
||||||
|
|
||||||
|
|
@ -32,40 +47,94 @@ impl CadModule for ViewModule {
|
||||||
|
|
||||||
fn ribbon_groups(&self) -> Vec<RibbonGroup> {
|
fn ribbon_groups(&self) -> Vec<RibbonGroup> {
|
||||||
vec![
|
vec![
|
||||||
|
// ── Viewport Tools ───────────────────────────────────────────────
|
||||||
|
RibbonGroup {
|
||||||
|
title: "Viewport Tools",
|
||||||
|
tools: vec![
|
||||||
|
RibbonItem::LargeTool(ucs_icon::tool()),
|
||||||
|
RibbonItem::LargeTool(viewcube::tool()),
|
||||||
|
RibbonItem::LargeTool(navbar::tool()),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
// ── Navigate ─────────────────────────────────────────────────────
|
||||||
RibbonGroup {
|
RibbonGroup {
|
||||||
title: "Navigate",
|
title: "Navigate",
|
||||||
tools: vec![
|
tools: vec![
|
||||||
zoom_ext::tool().into(),
|
RibbonItem::LargeTool(zoom_ext::tool()),
|
||||||
zoom_in::tool().into(),
|
RibbonItem::Tool(zoom_in::tool()),
|
||||||
zoom_out::tool().into(),
|
RibbonItem::Tool(zoom_out::tool()),
|
||||||
pan::tool().into(),
|
RibbonItem::Tool(pan::tool()),
|
||||||
orbit::tool().into(),
|
RibbonItem::Tool(orbit::tool()),
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
// ── Model Viewports ───────────────────────────────────────────────
|
||||||
|
RibbonGroup {
|
||||||
|
title: "Model Viewports",
|
||||||
|
tools: vec![
|
||||||
|
RibbonItem::LargeTool(vports_config::tool()),
|
||||||
|
RibbonItem::Tool(vports_named::tool()),
|
||||||
|
RibbonItem::Tool(vports_join::tool()),
|
||||||
|
RibbonItem::Tool(vports_restore::tool()),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
// ── Visual Style ──────────────────────────────────────────────────
|
||||||
RibbonGroup {
|
RibbonGroup {
|
||||||
// WIREFRAME and SOLID ids are special-cased in ribbon.rs
|
// WIREFRAME and SOLID ids are special-cased in ribbon.rs
|
||||||
// for toggle-state highlighting based on Ribbon::wireframe.
|
// for toggle-state highlighting based on Ribbon::wireframe.
|
||||||
title: "Visual Style",
|
title: "Visual Style",
|
||||||
tools: vec![
|
tools: vec![
|
||||||
wireframe::tool().into(),
|
RibbonItem::LargeDropdown {
|
||||||
solid::tool().into(),
|
id: "VISUAL_STYLE",
|
||||||
hidden::tool().into(),
|
label: "Visual\nStyle",
|
||||||
xray::tool().into(),
|
icon: wireframe::tool().icon,
|
||||||
|
items: vec![
|
||||||
|
("WIREFRAME", "Wireframe", wireframe::tool().icon),
|
||||||
|
("SOLID", "Shaded", solid::tool().icon),
|
||||||
|
("HIDDEN", "Hidden", hidden::tool().icon),
|
||||||
|
("XRAY", "X-Ray", xray::tool().icon),
|
||||||
|
],
|
||||||
|
default: "WIREFRAME",
|
||||||
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
// ── Projection ────────────────────────────────────────────────────
|
||||||
RibbonGroup {
|
RibbonGroup {
|
||||||
// ORTHO and PERSP ids are special-cased in ribbon.rs
|
// ORTHO and PERSP ids are special-cased in ribbon.rs
|
||||||
// for toggle-state highlighting based on Camera::projection.
|
// for toggle-state highlighting based on Camera::projection.
|
||||||
title: "Projection",
|
title: "Projection",
|
||||||
tools: vec![ortho::tool().into(), persp::tool().into()],
|
tools: vec![
|
||||||
|
RibbonItem::LargeTool(ortho::tool()),
|
||||||
|
RibbonItem::LargeTool(persp::tool()),
|
||||||
|
],
|
||||||
},
|
},
|
||||||
|
// ── Preset Views ──────────────────────────────────────────────────
|
||||||
RibbonGroup {
|
RibbonGroup {
|
||||||
title: "Preset",
|
title: "Preset",
|
||||||
tools: vec![
|
tools: vec![
|
||||||
view_top::tool().into(),
|
RibbonItem::Tool(view_top::tool()),
|
||||||
view_front::tool().into(),
|
RibbonItem::Tool(view_front::tool()),
|
||||||
view_right::tool().into(),
|
RibbonItem::Tool(view_right::tool()),
|
||||||
view_iso::tool().into(),
|
RibbonItem::Tool(view_iso::tool()),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
// ── Palettes ──────────────────────────────────────────────────────
|
||||||
|
RibbonGroup {
|
||||||
|
title: "Palettes",
|
||||||
|
tools: vec![
|
||||||
|
RibbonItem::LargeTool(tool_palettes::tool()),
|
||||||
|
RibbonItem::LargeTool(properties_palette::tool()),
|
||||||
|
RibbonItem::LargeTool(sheetset::tool()),
|
||||||
|
],
|
||||||
|
},
|
||||||
|
// ── Interface ─────────────────────────────────────────────────────
|
||||||
|
RibbonGroup {
|
||||||
|
title: "Interface",
|
||||||
|
tools: vec![
|
||||||
|
RibbonItem::LargeTool(file_tabs::tool()),
|
||||||
|
RibbonItem::LargeTool(layout_tabs::tool()),
|
||||||
|
RibbonItem::Tool(tile_horiz::tool()),
|
||||||
|
RibbonItem::Tool(tile_vert::tool()),
|
||||||
|
RibbonItem::Tool(cascade::tool()),
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
|
||||||
5
src/modules/view/navbar.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/navbar.svg"));
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef { id: "NAVBAR", label: "Navigation\nBar", icon: ICON, event: ModuleEvent::Command("NAVBAR".to_string()) }
|
||||||
|
}
|
||||||
5
src/modules/view/properties_palette.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/properties.svg"));
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef { id: "PROPERTIES", label: "Properties", icon: ICON, event: ModuleEvent::Command("PROPERTIES".to_string()) }
|
||||||
|
}
|
||||||
5
src/modules/view/sheetset.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/sheetset.svg"));
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef { id: "SHEETSET", label: "Sheet Set\nManager", icon: ICON, event: ModuleEvent::Command("SHEETSET".to_string()) }
|
||||||
|
}
|
||||||
5
src/modules/view/tile_horiz.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/tile_horiz.svg"));
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef { id: "HORIZONTAL", label: "Tile\nHoriz.", icon: ICON, event: ModuleEvent::Command("HORIZONTAL".to_string()) }
|
||||||
|
}
|
||||||
5
src/modules/view/tile_vert.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/tile_vert.svg"));
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef { id: "VERTICAL", label: "Tile\nVert.", icon: ICON, event: ModuleEvent::Command("VERTICAL".to_string()) }
|
||||||
|
}
|
||||||
5
src/modules/view/tool_palettes.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/tool_palettes.svg"));
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef { id: "TOOLPALETTES", label: "Tool\nPalettes", icon: ICON, event: ModuleEvent::Command("TOOLPALETTES".to_string()) }
|
||||||
|
}
|
||||||
5
src/modules/view/ucs_icon.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/ucs_icon.svg"));
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef { id: "UCSICON", label: "UCS\nIcon", icon: ICON, event: ModuleEvent::Command("UCSICON".to_string()) }
|
||||||
|
}
|
||||||
5
src/modules/view/viewcube.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/viewcube.svg"));
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef { id: "NAVVCUBE", label: "View\nCube", icon: ICON, event: ModuleEvent::Command("NAVVCUBE".to_string()) }
|
||||||
|
}
|
||||||
5
src/modules/view/vports_config.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/vports_config.svg"));
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef { id: "VPORTS", label: "Viewport\nConfiguration", icon: ICON, event: ModuleEvent::Command("VPORTS".to_string()) }
|
||||||
|
}
|
||||||
5
src/modules/view/vports_join.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/vports_join.svg"));
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef { id: "VPJOIN", label: "Join", icon: ICON, event: ModuleEvent::Command("VPJOIN".to_string()) }
|
||||||
|
}
|
||||||
5
src/modules/view/vports_named.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/vports_named.svg"));
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef { id: "VPORTS_NAMED", label: "Named", icon: ICON, event: ModuleEvent::Command("VPORTS".to_string()) }
|
||||||
|
}
|
||||||
5
src/modules/view/vports_restore.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||||
|
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/vports_restore.svg"));
|
||||||
|
pub fn tool() -> ToolDef {
|
||||||
|
ToolDef { id: "VPORTS_RESTORE", label: "Restore", icon: ICON, event: ModuleEvent::Command("VPORTS".to_string()) }
|
||||||
|
}
|
||||||