forked from 1b-agent/opencadstudio-upstream
feat(ui): show ribbon command icons in menus and suggestions
The ribbon definition beside each command stays the one source of its label and icon. One cached lookup (modules::registry::ribbon_commands) walks the core ribbon and the expanded Draw/Modify panels; the shortcut list, the right-click menu, the grip menu and the command-line suggestions read it. - Context menu: command rows carry their ribbon icon; Undo/Redo and Isolate use interface glyphs, Draw Order its ribbon icon; icons and the caret fade on disabled rows. - Grip menu: Stretch, Move, Rotate, Scale, Mirror and Copy icons. - Suggestions: an icon column, aligned when a command has none. - Shortcut list: dropdown entries were read as (label, command) though the ribbon stores (command, label), so they never got a label or icon. Reworked from #1449. Co-Authored-By: MarcelP102 <30177694+MarcelP102@users.noreply.github.com> Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
6b37476687
commit
7ed6a362dc
8 files changed
+195
-81
No files matched your search
+6
-46
@@ -299,7 +299,7 @@ impl OpenCADStudio {
|
||||
}
|
||||
|
||||
pub(super) fn actions() -> Vec<Action> {
|
||||
use crate::modules::{IconKind, ModuleEvent, RibbonItem, ToolDef};
|
||||
use crate::modules::IconKind;
|
||||
use std::collections::BTreeMap;
|
||||
let mut names = crate::command::all_registered_command_names();
|
||||
names.extend([
|
||||
@@ -342,56 +342,16 @@ pub(super) fn actions() -> Vec<Action> {
|
||||
)
|
||||
})
|
||||
.collect();
|
||||
fn describe(
|
||||
actions: &mut BTreeMap<String, Action>,
|
||||
command: &str,
|
||||
label: &str,
|
||||
icon: IconKind,
|
||||
) {
|
||||
if let Some(action) = actions.get_mut(command) {
|
||||
action.label = crate::t!(label).into_owned();
|
||||
for (command, (label, icon)) in crate::modules::registry::ribbon_commands() {
|
||||
if let Some(action) = actions.get_mut(command.as_str()) {
|
||||
action.label = crate::t!(*label).into_owned();
|
||||
action.description = format!("{} ({command})", action.label);
|
||||
action.icon = match icon {
|
||||
IconKind::Svg(bytes) => Some(bytes),
|
||||
_ => None,
|
||||
IconKind::Svg(bytes) => Some(*bytes),
|
||||
IconKind::Glyph(_) => None,
|
||||
};
|
||||
}
|
||||
}
|
||||
fn tool(actions: &mut BTreeMap<String, Action>, tool: &ToolDef) {
|
||||
if let ModuleEvent::Command(command) = &tool.event {
|
||||
describe(actions, command, tool.label, tool.icon);
|
||||
}
|
||||
}
|
||||
for module in crate::modules::registry::all_modules() {
|
||||
for group in module.ribbon_groups() {
|
||||
for item in &group.tools {
|
||||
match item {
|
||||
RibbonItem::Tool(t) | RibbonItem::LabeledTool(t) | RibbonItem::LargeTool(t) => {
|
||||
tool(&mut actions, t)
|
||||
}
|
||||
RibbonItem::Dropdown { items, .. }
|
||||
| RibbonItem::LabeledDropdown { items, .. }
|
||||
| RibbonItem::LargeDropdown { items, .. } => {
|
||||
for (label, command, icon) in items {
|
||||
describe(&mut actions, command, label, *icon);
|
||||
}
|
||||
}
|
||||
RibbonItem::ToolGrid { columns }
|
||||
| RibbonItem::StyleComboGroup { rows: columns, .. } => {
|
||||
for t in columns.iter().flatten() {
|
||||
tool(&mut actions, t);
|
||||
}
|
||||
}
|
||||
RibbonItem::LayerComboGroup { row2, row3 } => {
|
||||
for t in row2.iter().chain(row3) {
|
||||
tool(&mut actions, t);
|
||||
}
|
||||
}
|
||||
RibbonItem::PropertiesGroup { match_prop } => tool(&mut actions, match_prop),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
actions.into_values().collect()
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user