feat: make edit overlay component lookups robust to missing elements in custom themes

This commit is contained in:
Etoile (@porkyoot) 2026-06-29 09:28:19 +02:00
parent da394ec2c7
commit 5b1395807a
3 changed files with 80 additions and 48 deletions

View File

@ -468,50 +468,68 @@ fn reset_panel(
let mut com = panel.layout.common();
let c = panel
if let Ok(c) = panel
.parser_state
.fetch_component_as::<ComponentButton>("top_grab")?;
c.set_sticky_state(&mut com, !state.grabbable);
.fetch_component_as::<ComponentButton>("top_grab")
{
c.set_sticky_state(&mut com, !state.grabbable);
}
let c = panel
if let Ok(c) = panel
.parser_state
.fetch_component_as::<ComponentSlider>("lerp_slider")?;
c.set_value_primary(&mut com, state.positioning.get_lerp().unwrap_or(1.0));
.fetch_component_as::<ComponentSlider>("lerp_slider")
{
c.set_value_primary(&mut com, state.positioning.get_lerp().unwrap_or(1.0));
}
let c = panel
if let Ok(c) = panel
.parser_state
.fetch_component_as::<ComponentSlider>("alpha_slider")?;
c.set_value_primary(&mut com, state.alpha);
.fetch_component_as::<ComponentSlider>("alpha_slider")
{
c.set_value_primary(&mut com, state.alpha);
}
let c = panel
if let Ok(c) = panel
.parser_state
.fetch_component_as::<ComponentSlider>("curve_slider")?;
c.set_value_primary(&mut com, state.curvature.unwrap_or(0.0));
.fetch_component_as::<ComponentSlider>("curve_slider")
{
c.set_value_primary(&mut com, state.curvature.unwrap_or(0.0));
}
let c = panel
if let Ok(c) = panel
.parser_state
.fetch_component_as::<ComponentCheckbox>("additive_box")?;
c.set_checked(&mut com, state.additive);
.fetch_component_as::<ComponentCheckbox>("additive_box")
{
c.set_checked(&mut com, state.additive);
}
let c = panel
if let Ok(c) = panel
.parser_state
.fetch_component_as::<ComponentCheckbox>("align_box")?;
c.set_checked(&mut com, state.positioning.get_align().unwrap_or(false));
.fetch_component_as::<ComponentCheckbox>("align_box")
{
c.set_checked(&mut com, state.positioning.get_align().unwrap_or(false));
}
let c = panel
if let Ok(c) = panel
.parser_state
.fetch_component_as::<ComponentCheckbox>("global_box")?;
c.set_checked(&mut com, owc.global);
.fetch_component_as::<ComponentCheckbox>("global_box")
{
c.set_checked(&mut com, owc.global);
}
let c = panel
if let Ok(c) = panel
.parser_state
.fetch_component_as::<ComponentCheckbox>("angle_fade_box")?;
c.set_checked(&mut com, state.angle_fade);
.fetch_component_as::<ComponentCheckbox>("angle_fade_box")
{
c.set_checked(&mut com, state.angle_fade);
}
let c = panel
if let Ok(c) = panel
.parser_state
.fetch_component_as::<ComponentCheckbox>("block_input_box")?;
c.set_checked(&mut com, state.block_input);
.fetch_component_as::<ComponentCheckbox>("block_input_box")
{
c.set_checked(&mut com, state.block_input);
}
panel.state.pos.reset(&mut com, &state.positioning.into());
panel.state.lock.reset(&mut com, state.interactable);
@ -526,10 +544,12 @@ fn reset_panel(
// Set the checkbox label based on stereo mode
let translation = get_stereo_full_frame_translation(stereo);
let c = panel
if let Ok(c) = panel
.parser_state
.fetch_component_as::<ComponentCheckbox>("stereo_full_frame_box")?;
c.set_text(&mut com, Translation::from_translation_key(translation));
.fetch_component_as::<ComponentCheckbox>("stereo_full_frame_box")
{
c.set_text(&mut com, Translation::from_translation_key(translation));
}
} else {
panel.state.tabs.set_tab_visible(&mut com, "stereo", false);
}
@ -548,20 +568,24 @@ fn reset_panel(
owc.backend.get_attrib(BackendAttrib::StereoFullFrame),
BackendAttribValue::StereoFullFrame
) {
let c = panel
if let Ok(c) = panel
.parser_state
.fetch_component_as::<ComponentCheckbox>("stereo_full_frame_box")?;
c.set_checked(&mut com, full_frame);
.fetch_component_as::<ComponentCheckbox>("stereo_full_frame_box")
{
c.set_checked(&mut com, full_frame);
}
}
if let Some(adjust_mouse) = attrib_value!(
owc.backend.get_attrib(BackendAttrib::StereoAdjustMouse),
BackendAttribValue::StereoAdjustMouse
) {
let c = panel
if let Ok(c) = panel
.parser_state
.fetch_component_as::<ComponentCheckbox>("stereo_adjust_mouse_box")?;
c.set_checked(&mut com, adjust_mouse);
.fetch_component_as::<ComponentCheckbox>("stereo_adjust_mouse_box")
{
c.set_checked(&mut com, adjust_mouse);
}
}
Ok(())
@ -666,9 +690,16 @@ fn set_up_checkbox(
id: &str,
callback: fn(&mut AppState, &mut OverlayWindowConfig, bool),
) -> anyhow::Result<()> {
let checkbox = panel
let checkbox = match panel
.parser_state
.fetch_component_as::<ComponentCheckbox>(id)?;
.fetch_component_as::<ComponentCheckbox>(id)
{
Ok(c) => c,
Err(e) => {
log::warn!("Component checkbox '{id}' not found in theme: {e:?}");
return Ok(());
}
};
let tasks = panel.state.tasks.clone();
let overlay_id = panel.state.id.clone();
checkbox.on_toggle(Box::new(move |_common, e| {

View File

@ -13,7 +13,8 @@ pub fn new_stereo_tab_handler(
// Fetch the checkbox component first, before creating the closure
let checkbox = panel
.parser_state
.fetch_component_as::<ComponentCheckbox>("stereo_full_frame_box")?;
.fetch_component_as::<ComponentCheckbox>("stereo_full_frame_box")
.ok();
SpriteTabHandler::new(
panel,
@ -23,7 +24,9 @@ pub fn new_stereo_tab_handler(
let stereo = *state;
let translation = get_stereo_full_frame_translation(stereo);
checkbox.set_text(common, Translation::from_translation_key(translation));
if let Some(ref cb) = checkbox {
cb.set_text(common, Translation::from_translation_key(translation));
}
Box::new(move |app, owc| {
owc.backend

View File

@ -631,15 +631,13 @@ impl<T> OverlayWindowManager<T> {
}
if enabled {
self.wrappers
.wrap_edit_mode(id, &mut overlay.config, app)
.inspect_err(|e| log::error!("{e:?}"))
.unwrap(); // FIXME: unwrap
if let Err(e) = self.wrappers.wrap_edit_mode(id, &mut overlay.config, app) {
log::error!("Could not wrap edit mode for overlay {id:?}: {e:?}");
}
} else {
self.wrappers
.unwrap_edit_mode(&mut overlay.config, app)
.inspect_err(|e| log::error!("{e:?}"))
.unwrap(); // FIXME: unwrap
if let Err(e) = self.wrappers.unwrap_edit_mode(&mut overlay.config, app) {
log::error!("Could not unwrap edit mode for overlay {id:?}: {e:?}");
}
}
}