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>
This commit is contained in:
Hakan Seven 2026-04-09 13:27:40 +03:00
commit fce611d782
18 changed files with 170 additions and 6 deletions

10
assets/icons/audit.svg Normal file
View 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

View 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

View 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

View 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

View 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

View 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
View 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

View 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

View 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()) }
}

View 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()) }
}

View 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()) }
}

View 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()) }
}

View 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()) }
}

View file

@ -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()),
],
},
]
}
}

View file

@ -1,4 +1,5 @@
use crate::modules::{IconKind, ModuleEvent, ToolDef};
#[allow(dead_code)]
pub fn tool() -> ToolDef {
ToolDef {
id: "OPTIONS",

View 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()) }
}

View 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()) }
}

View 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()) }
}