mirror of
https://github.com/storytold/craft-libs.git
synced 2026-11-04 17:50:08 +00:00
docking: a loaded layout's monitor and monitor size are validated
This commit is contained in:
1 parent
e19b1b684d
commit
0ac8f80f64
2 files changed
+16
-4
No files matched your search
@@ -540,6 +540,11 @@ pub(super) fn valid_rect(rect: [f32; 4]) -> bool {
|
||||
rect.iter().all(|v| v.is_finite() && v.abs() <= MAX_EXTENT) && rect.get(2).is_some_and(|v| *v > 0.0) && rect.get(3).is_some_and(|v| *v > 0.0)
|
||||
}
|
||||
|
||||
/// A floating window's saved monitor and monitor size, each where given.
|
||||
fn valid_monitor(monitor: Option<&Monitor>, monitor_size: Option<[f32; 2]>) -> bool {
|
||||
monitor.is_none_or(|m| valid_rect(m.rect) && m.scale.is_finite() && m.scale > 0.0) && monitor_size.is_none_or(|[w, h]| valid_rect([0.0, 0.0, w, h]))
|
||||
}
|
||||
|
||||
pub(super) fn valid_width(width: f32) -> bool {
|
||||
width.is_finite() && width > 0.0 && width <= MAX_EXTENT
|
||||
}
|
||||
@@ -615,7 +620,10 @@ impl<P: Clone + Eq + Hash> Layout<P> {
|
||||
}
|
||||
}
|
||||
for floating in &self.floating {
|
||||
if !valid_rect(floating.rect) || floating.native.is_some_and(|r| !valid_rect(r)) {
|
||||
if !valid_rect(floating.rect)
|
||||
|| floating.native.is_some_and(|r| !valid_rect(r))
|
||||
|| !valid_monitor(floating.monitor.as_ref(), floating.monitor_size)
|
||||
{
|
||||
return Err(DockError::InvalidGeometry);
|
||||
}
|
||||
let mut visit = vec![(&floating.root, 1usize)];
|
||||
@@ -1180,9 +1188,7 @@ impl<P: Clone + Eq + Hash> Layout<P> {
|
||||
Ok(())
|
||||
}
|
||||
Action::SetMonitor { panel, monitor, monitor_size } => {
|
||||
let valid = monitor.as_ref().is_none_or(|m| valid_rect(m.rect) && m.scale.is_finite() && m.scale > 0.0)
|
||||
&& monitor_size.is_none_or(|[w, h]| valid_rect([0.0, 0.0, w, h]));
|
||||
if !valid {
|
||||
if !valid_monitor(monitor.as_ref(), monitor_size) {
|
||||
return Err(DockError::InvalidGeometry);
|
||||
}
|
||||
let window = self.floating.iter_mut().find(|g| g.contains(&panel)).ok_or(DockError::InvalidPlacement)?;
|
||||
|
||||
@@ -275,6 +275,12 @@ fn dock_validation_rejects_two_docks_per_side_nested_docks_empty_columns_and_bad
|
||||
let mut native = docked();
|
||||
native.floating[0].native = Some([0.0, 0.0, -1.0, 10.0]);
|
||||
assert_eq!(native.validate(), Err(DockError::InvalidGeometry));
|
||||
let mut monitor = docked();
|
||||
monitor.floating[0].monitor = Some(super::Monitor { name: None, rect: [0.0, 0.0, 1920.0, 1080.0], scale: f32::NAN });
|
||||
assert_eq!(monitor.validate(), Err(DockError::InvalidGeometry));
|
||||
let mut monitor_size = docked();
|
||||
monitor_size.floating[0].monitor_size = Some([f32::NAN, 1080.0]);
|
||||
assert_eq!(monitor_size.validate(), Err(DockError::InvalidGeometry));
|
||||
let mut layout = docked();
|
||||
assert_eq!(layout.apply(Action::ResizeColumn { panel: 2, width: f32::NAN }), Err(DockError::InvalidGeometry));
|
||||
assert_eq!(layout.apply(Action::ResizeColumn { panel: 11, width: 50.0 }), Err(DockError::InvalidPlacement));
|
||||
|
||||
Reference in new issue
Block a user