feat: redesign Manage tab to match reference layout
- Add Customization group: User Interface (CUI), Tool Palettes (large), Import, Export, Edit Aliases dropdown (small) - Add Cleanup group: Find Non-Purgeable Items (large), Purge, Overkill, Audit (small) - Add 8 new SVG icons for all new commands Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
10
assets/icons/audit.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">
|
||||
<!-- Clipboard with checkmarks -->
|
||||
<path d="M9 3 H5 a1 1 0 0 0 -1 1 v16 a1 1 0 0 0 1 1 h14 a1 1 0 0 0 1 -1 V4 a1 1 0 0 0 -1 -1 h-4"/>
|
||||
<rect x="9" y="1" width="6" height="4" rx="1"/>
|
||||
<!-- Check items -->
|
||||
<polyline points="7,10 9,12 13,8"/>
|
||||
<line x1="15" y1="10" x2="17" y2="10"/>
|
||||
<polyline points="7,15 9,17 13,13"/>
|
||||
<line x1="15" y1="15" x2="17" y2="15"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 540 B |
9
assets/icons/cui_export.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">
|
||||
<!-- File -->
|
||||
<path d="M4 4 h10 l4 4 v13 H4 Z"/>
|
||||
<polyline points="14,4 14,8 18,8"/>
|
||||
<!-- Arrow pointing out (export) -->
|
||||
<line x1="10" y1="14" x2="20" y2="14"/>
|
||||
<polyline points="17,11 20,14 17,17"/>
|
||||
<line x1="10" y1="11" x2="10" y2="17"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 423 B |
8
assets/icons/cui_import.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">
|
||||
<!-- File -->
|
||||
<path d="M4 4 h10 l4 4 v13 H4 Z"/>
|
||||
<polyline points="14,4 14,8 18,8"/>
|
||||
<!-- Arrow pointing in (import) -->
|
||||
<line x1="12" y1="14" x2="20" y2="14"/>
|
||||
<polyline points="17,11 20,14 17,17"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 380 B |
16
assets/icons/edit_aliases.svg
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
<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">
|
||||
<!-- List of alias pairs -->
|
||||
<rect x="2" y="3" width="20" height="18" rx="1"/>
|
||||
<line x1="2" y1="7" x2="22" y2="7"/>
|
||||
<line x1="12" y1="7" x2="12" y2="21"/>
|
||||
<!-- Header -->
|
||||
<line x1="4" y1="5" x2="8" y2="5" stroke-width="1"/>
|
||||
<line x1="14" y1="5" x2="18" y2="5" stroke-width="1"/>
|
||||
<!-- Rows -->
|
||||
<line x1="4" y1="11" x2="10" y2="11"/>
|
||||
<line x1="14" y1="11" x2="20" y2="11"/>
|
||||
<line x1="4" y1="15" x2="10" y2="15"/>
|
||||
<line x1="14" y1="15" x2="20" y2="15"/>
|
||||
<line x1="4" y1="19" x2="10" y2="19"/>
|
||||
<line x1="14" y1="19" x2="20" y2="19"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 726 B |
8
assets/icons/find_nonpurgeable.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">
|
||||
<!-- Magnifier -->
|
||||
<circle cx="10" cy="10" r="7"/>
|
||||
<line x1="15" y1="15" x2="21" y2="21"/>
|
||||
<!-- Lock inside (non-purgeable / protected) -->
|
||||
<rect x="7" y="10" width="6" height="5" rx="0.5"/>
|
||||
<path d="M8 10 V8 a2 2 0 0 1 4 0 V10"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 411 B |
8
assets/icons/overkill.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 overlapping lines (duplicates) -->
|
||||
<line x1="3" y1="10" x2="21" y2="10"/>
|
||||
<line x1="3" y1="12" x2="21" y2="12" stroke-dasharray="3 2"/>
|
||||
<!-- X to remove duplicate -->
|
||||
<line x1="16" y1="15" x2="21" y2="20"/>
|
||||
<line x1="21" y1="15" x2="16" y2="20"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 436 B |
10
assets/icons/purge.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">
|
||||
<!-- Trash can -->
|
||||
<polyline points="3,6 5,6 19,6"/>
|
||||
<path d="M8 6 V4 h8 v2"/>
|
||||
<rect x="5" y="6" width="14" height="15" rx="1"/>
|
||||
<!-- Vertical lines inside -->
|
||||
<line x1="9" y1="10" x2="9" y2="17"/>
|
||||
<line x1="12" y1="10" x2="12" y2="17"/>
|
||||
<line x1="15" y1="10" x2="15" y2="17"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 462 B |
12
assets/icons/user_interface.svg
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
<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">
|
||||
<!-- Monitor -->
|
||||
<rect x="2" y="3" width="20" height="14" rx="1"/>
|
||||
<!-- Screen content: ribbon bar -->
|
||||
<line x1="2" y1="7" x2="22" y2="7"/>
|
||||
<rect x="4" y="4" width="3" height="2.5" rx="0.3"/>
|
||||
<rect x="8" y="4" width="3" height="2.5" rx="0.3"/>
|
||||
<rect x="12" y="4" width="3" height="2.5" rx="0.3"/>
|
||||
<!-- Stand -->
|
||||
<line x1="12" y1="17" x2="12" y2="21"/>
|
||||
<line x1="8" y1="21" x2="16" y2="21"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 579 B |
5
src/modules/manage/audit.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/audit.svg"));
|
||||
pub fn tool() -> ToolDef {
|
||||
ToolDef { id: "AUDIT", label: "Audit", icon: ICON, event: ModuleEvent::Command("AUDIT".to_string()) }
|
||||
}
|
||||
5
src/modules/manage/cui_export.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/cui_export.svg"));
|
||||
pub fn tool() -> ToolDef {
|
||||
ToolDef { id: "CUIEXPORT", label: "Export", icon: ICON, event: ModuleEvent::Command("CUIEXPORT".to_string()) }
|
||||
}
|
||||
5
src/modules/manage/cui_import.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/cui_import.svg"));
|
||||
pub fn tool() -> ToolDef {
|
||||
ToolDef { id: "CUIIMPORT", label: "Import", icon: ICON, event: ModuleEvent::Command("CUIIMPORT".to_string()) }
|
||||
}
|
||||
7
src/modules/manage/edit_aliases.rs
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||
#[allow(dead_code)]
|
||||
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/edit_aliases.svg"));
|
||||
#[allow(dead_code)]
|
||||
pub fn tool() -> ToolDef {
|
||||
ToolDef { id: "ALIASEDIT", label: "Edit Aliases", icon: ICON, event: ModuleEvent::Command("ALIASEDIT".to_string()) }
|
||||
}
|
||||
5
src/modules/manage/find_nonpurgeable.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/find_nonpurgeable.svg"));
|
||||
pub fn tool() -> ToolDef {
|
||||
ToolDef { id: "FINDNONPURGEABLE", label: "Find Non-\nPurgeable Items", icon: ICON, event: ModuleEvent::Command("FINDNONPURGEABLE".to_string()) }
|
||||
}
|
||||
|
|
@ -1,8 +1,16 @@
|
|||
// Manage module — application settings and customization tools.
|
||||
// Manage module — customization and drawing cleanup tools.
|
||||
|
||||
mod audit;
|
||||
mod cui_export;
|
||||
mod cui_import;
|
||||
mod edit_aliases;
|
||||
mod find_nonpurgeable;
|
||||
mod options;
|
||||
mod overkill;
|
||||
mod purge;
|
||||
mod user_interface;
|
||||
|
||||
use crate::modules::{CadModule, RibbonGroup};
|
||||
use crate::modules::{CadModule, IconKind, RibbonGroup, RibbonItem};
|
||||
|
||||
pub struct ManageModule;
|
||||
|
||||
|
|
@ -15,9 +23,41 @@ impl CadModule for ManageModule {
|
|||
}
|
||||
|
||||
fn ribbon_groups(&self) -> Vec<RibbonGroup> {
|
||||
vec![RibbonGroup {
|
||||
title: "Settings",
|
||||
tools: vec![options::tool().into()],
|
||||
}]
|
||||
vec![
|
||||
// ── Customization ─────────────────────────────────────────────────
|
||||
RibbonGroup {
|
||||
title: "Customization",
|
||||
tools: vec![
|
||||
RibbonItem::LargeTool(user_interface::tool()),
|
||||
RibbonItem::LargeTool(crate::modules::ToolDef {
|
||||
id: "TOOLPALETTES",
|
||||
label: "Tool\nPalettes",
|
||||
icon: IconKind::Svg(include_bytes!("../../../assets/icons/tool_palettes.svg")),
|
||||
event: crate::modules::ModuleEvent::Command("TOOLPALETTES".to_string()),
|
||||
}),
|
||||
RibbonItem::Tool(cui_import::tool()),
|
||||
RibbonItem::Tool(cui_export::tool()),
|
||||
RibbonItem::Dropdown {
|
||||
id: "ALIASEDIT_DROPDOWN",
|
||||
icon: IconKind::Svg(include_bytes!("../../../assets/icons/edit_aliases.svg")),
|
||||
items: vec![
|
||||
("ALIASEDIT", "Edit Aliases", IconKind::Svg(include_bytes!("../../../assets/icons/edit_aliases.svg"))),
|
||||
("CUILOAD", "Load Partial CUI", IconKind::Svg(include_bytes!("../../../assets/icons/cui_import.svg"))),
|
||||
],
|
||||
default: "ALIASEDIT",
|
||||
},
|
||||
],
|
||||
},
|
||||
// ── Cleanup ───────────────────────────────────────────────────────
|
||||
RibbonGroup {
|
||||
title: "Cleanup",
|
||||
tools: vec![
|
||||
RibbonItem::LargeTool(find_nonpurgeable::tool()),
|
||||
RibbonItem::Tool(purge::tool()),
|
||||
RibbonItem::Tool(overkill::tool()),
|
||||
RibbonItem::Tool(audit::tool()),
|
||||
],
|
||||
},
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||
#[allow(dead_code)]
|
||||
pub fn tool() -> ToolDef {
|
||||
ToolDef {
|
||||
id: "OPTIONS",
|
||||
|
|
|
|||
5
src/modules/manage/overkill.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/overkill.svg"));
|
||||
pub fn tool() -> ToolDef {
|
||||
ToolDef { id: "OVERKILL", label: "Overkill", icon: ICON, event: ModuleEvent::Command("OVERKILL".to_string()) }
|
||||
}
|
||||
5
src/modules/manage/purge.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/purge.svg"));
|
||||
pub fn tool() -> ToolDef {
|
||||
ToolDef { id: "PURGE", label: "Purge", icon: ICON, event: ModuleEvent::Command("PURGE".to_string()) }
|
||||
}
|
||||
5
src/modules/manage/user_interface.rs
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
use crate::modules::{IconKind, ModuleEvent, ToolDef};
|
||||
pub const ICON: IconKind = IconKind::Svg(include_bytes!("../../../assets/icons/user_interface.svg"));
|
||||
pub fn tool() -> ToolDef {
|
||||
ToolDef { id: "CUI", label: "User\nInterface", icon: ICON, event: ModuleEvent::Command("CUI".to_string()) }
|
||||
}
|
||||