gemini feat: optimize drawing performance by caching layer styles during strokes and improve UI/UX for layer styles and menus, improved drop shadow

This commit is contained in:
2026-07-13 14:37:22 +03:00
parent 356fac571d
commit 2284a7d81f
50 changed files with 777 additions and 239 deletions
+94 -72
View File
@@ -1080,13 +1080,74 @@ impl HcieIcedApp {
)
});
// Determine new enabled state:
// - Style doesn't exist → first click enables it (true)
// - Style exists → toggle current state
let new_enabled = match existing {
None => true, // First click: create ENABLED
// Determine new style:
// - Style doesn't exist → create default style with enabled: true
// - Style exists → clone and toggle enabled flag
let new_style = match existing {
None => {
println!("LayerStyleToggle: Style {} not found, creating new", disc);
match disc {
"DropShadow" => LayerStyle::DropShadow {
enabled: true,
opacity: 0.75, angle: 120.0, distance: 5.0, spread: 0.0, size: 5.0,
color: [0, 0, 0, 255], blend_mode: "Multiply".to_string(),
},
"InnerShadow" => LayerStyle::InnerShadow {
enabled: true,
opacity: 0.75, angle: 120.0, distance: 5.0, spread: 0.0, size: 5.0,
color: [0, 0, 0, 255], blend_mode: "Multiply".to_string(),
},
"OuterGlow" => LayerStyle::OuterGlow {
enabled: true,
opacity: 0.75, spread: 0.0, size: 5.0,
color: [255, 255, 190, 255], blend_mode: "Screen".to_string(),
},
"InnerGlow" => LayerStyle::InnerGlow {
enabled: true,
opacity: 0.75, spread: 0.0, size: 5.0,
color: [255, 255, 190, 255], blend_mode: "Screen".to_string(),
},
"BevelEmboss" => LayerStyle::BevelEmboss {
enabled: true,
depth: 1.0, size: 5.0, angle: 120.0, altitude: 30.0,
highlight_opacity: 0.75, shadow_opacity: 0.75,
direction: "Up".to_string(), style: "InnerBevel".to_string(),
technique: "Smooth".to_string(), soften: 0.0,
highlight_blend_mode: "Screen".to_string(),
highlight_color: [255, 255, 255, 255],
shadow_blend_mode: "Multiply".to_string(),
shadow_color: [0, 0, 0, 255],
},
"Satin" => LayerStyle::Satin {
enabled: true,
opacity: 0.5, angle: 120.0, distance: 11.0, size: 14.0,
color: [0, 0, 0, 255], invert: true,
},
"ColorOverlay" => LayerStyle::ColorOverlay {
enabled: true,
opacity: 1.0, color: [255, 0, 0, 255], blend_mode: "Normal".to_string(),
},
"GradientOverlay" => LayerStyle::GradientOverlay {
enabled: true,
opacity: 1.0, blend_mode: "Normal".to_string(),
angle: 90.0, scale: 1.0, gradient_type: 0,
},
"PatternOverlay" => LayerStyle::PatternOverlay {
enabled: true,
opacity: 1.0, blend_mode: "Normal".to_string(),
scale: 1.0, pattern_name: "".to_string(),
},
"Stroke" => LayerStyle::Stroke {
enabled: true,
size: 3.0, position: "Outside".to_string(),
opacity: 1.0, color: [255, 0, 0, 255], blend_mode: "Normal".to_string(),
},
_ => unreachable!(),
}
}
Some(s) => {
let was_enabled = match s {
let mut cloned = s.clone();
match &mut cloned {
LayerStyle::DropShadow { enabled, .. }
| LayerStyle::InnerShadow { enabled, .. }
| LayerStyle::OuterGlow { enabled, .. }
@@ -1096,70 +1157,15 @@ impl HcieIcedApp {
| LayerStyle::ColorOverlay { enabled, .. }
| LayerStyle::GradientOverlay { enabled, .. }
| LayerStyle::PatternOverlay { enabled, .. }
| LayerStyle::Stroke { enabled, .. } => *enabled,
};
!was_enabled // Toggle
| LayerStyle::Stroke { enabled, .. } => {
*enabled = !*enabled;
println!("LayerStyleToggle: Style {} found, toggling to {}", disc, *enabled);
}
}
cloned
}
};
let new_style = match disc {
"DropShadow" => LayerStyle::DropShadow {
enabled: new_enabled,
opacity: 0.75, angle: 120.0, distance: 5.0, spread: 0.0, size: 5.0,
color: [0, 0, 0, 255], blend_mode: "Multiply".to_string(),
},
"InnerShadow" => LayerStyle::InnerShadow {
enabled: new_enabled,
opacity: 0.75, angle: 120.0, distance: 5.0, spread: 0.0, size: 5.0,
color: [0, 0, 0, 255], blend_mode: "Multiply".to_string(),
},
"OuterGlow" => LayerStyle::OuterGlow {
enabled: new_enabled,
opacity: 0.75, spread: 0.0, size: 5.0,
color: [255, 255, 190, 255], blend_mode: "Screen".to_string(),
},
"InnerGlow" => LayerStyle::InnerGlow {
enabled: new_enabled,
opacity: 0.75, spread: 0.0, size: 5.0,
color: [255, 255, 190, 255], blend_mode: "Screen".to_string(),
},
"BevelEmboss" => LayerStyle::BevelEmboss {
enabled: new_enabled,
depth: 1.0, size: 5.0, angle: 120.0, altitude: 30.0,
highlight_opacity: 0.75, shadow_opacity: 0.75,
direction: "Up".to_string(), style: "InnerBevel".to_string(),
technique: "Smooth".to_string(), soften: 0.0,
highlight_blend_mode: "Screen".to_string(),
highlight_color: [255, 255, 255, 255],
shadow_blend_mode: "Multiply".to_string(),
shadow_color: [0, 0, 0, 255],
},
"Satin" => LayerStyle::Satin {
enabled: new_enabled,
opacity: 0.5, angle: 120.0, distance: 11.0, size: 14.0,
color: [0, 0, 0, 255], invert: true,
},
"ColorOverlay" => LayerStyle::ColorOverlay {
enabled: new_enabled,
opacity: 1.0, color: [255, 0, 0, 255], blend_mode: "Normal".to_string(),
},
"GradientOverlay" => LayerStyle::GradientOverlay {
enabled: new_enabled,
opacity: 1.0, blend_mode: "Normal".to_string(),
angle: 90.0, scale: 1.0, gradient_type: 0,
},
"PatternOverlay" => LayerStyle::PatternOverlay {
enabled: new_enabled,
opacity: 1.0, blend_mode: "Normal".to_string(),
scale: 1.0, pattern_name: "".to_string(),
},
"Stroke" => LayerStyle::Stroke {
enabled: new_enabled,
size: 3.0, position: "Outside".to_string(),
opacity: 1.0, color: [255, 0, 0, 255], blend_mode: "Normal".to_string(),
},
_ => unreachable!(),
};
println!("LayerStyleToggle: Calling update_layer_style with new_style: {:?}", new_style);
self.documents[self.active_doc].engine.update_layer_style(layer_id, new_style);
}
}
@@ -1228,6 +1234,10 @@ impl HcieIcedApp {
(LayerStyle::BevelEmboss { angle, .. }, "angle") => *angle = value,
(LayerStyle::BevelEmboss { altitude, .. }, "altitude") => *altitude = value,
(LayerStyle::BevelEmboss { soften, .. }, "soften") => *soften = value,
(LayerStyle::BevelEmboss { highlight_opacity, shadow_opacity, .. }, "opacity") => {
*highlight_opacity = value;
*shadow_opacity = value;
},
(LayerStyle::Satin { opacity, .. }, "opacity") => *opacity = value,
(LayerStyle::Satin { angle, .. }, "angle") => *angle = value,
(LayerStyle::Satin { distance, .. }, "distance") => *distance = value,
@@ -2234,10 +2244,22 @@ impl HcieIcedApp {
// (7, 7) = separator
// (7, 8) = Debug Mode — TODO
// ── Help menu (8) ──
// (8, 0) = About — TODO
// (8, 1) = Documentation — TODO
// (8, 2) = License — TODO
// ── Window menu (8) ──
(8, 0) => self.dock.reopen_pane(PaneType::Layers),
(8, 1) => self.dock.reopen_pane(PaneType::History),
(8, 2) => self.dock.reopen_pane(PaneType::Brushes),
(8, 3) => self.dock.reopen_pane(PaneType::Filters),
(8, 4) => self.dock.reopen_pane(PaneType::ColorPicker),
(8, 5) => self.dock.reopen_pane(PaneType::Properties),
(8, 6) => self.dock.reopen_pane(PaneType::AiChat),
(8, 7) => self.dock.reopen_pane(PaneType::Geometry),
(8, 8) => self.dock.reopen_pane(PaneType::Script),
(8, 9) => self.dock.reopen_pane(PaneType::LayerDetails),
// ── Help menu (9) ──
// (9, 0) = About — TODO
// (9, 1) = Documentation — TODO
// (9, 2) = License — TODO
// Ignore separators and unimplemented items
_ => {}