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:
@@ -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
|
||||
_ => {}
|
||||
|
||||
Reference in New Issue
Block a user