Update vulnerable dependencies and migrate to Iced 0.14.

This commit is contained in:
2026-08-09 17:16:26 +02:00
parent c757314c91
commit 520e1d86ea
38 changed files with 1105 additions and 1237 deletions

View File

@@ -70,9 +70,9 @@ mod tests {
..State::default()
};
let mut inventory = AccessKeyInventory::default();
inventory.custom(&mut visible, None);
inventory.custom(&mut offscreen, None);
inventory.custom(&mut disabled, None);
inventory.custom(None, Rectangle::default(), &mut visible);
inventory.custom(None, Rectangle::default(), &mut offscreen);
inventory.custom(None, Rectangle::default(), &mut disabled);
assert_eq!(inventory.control_count, 1);
assert_eq!(inventory.generic_count, 1);
}
@@ -115,8 +115,8 @@ mod tests {
count: 0,
exact: None,
};
prefix.custom(&mut first, None);
prefix.custom(&mut second, None);
prefix.custom(None, Rectangle::default(), &mut first);
prefix.custom(None, Rectangle::default(), &mut second);
assert_eq!(prefix.count, 2);
assert_eq!(prefix.exact, None);
@@ -125,8 +125,8 @@ mod tests {
count: 0,
exact: None,
};
complete.custom(&mut first, None);
complete.custom(&mut second, None);
complete.custom(None, Rectangle::default(), &mut first);
complete.custom(None, Rectangle::default(), &mut second);
assert_eq!(complete.count, 1);
assert_eq!(complete.exact.as_deref(), Some("AA"));
}
@@ -280,13 +280,6 @@ impl Focusable for State {
}
}
fn visit_children(
operation: &mut dyn Operation,
operate_on_children: &mut dyn FnMut(&mut dyn Operation),
) {
operate_on_children(operation);
}
#[derive(Default)]
struct AccessKeyInventory {
generic_count: usize,
@@ -295,16 +288,11 @@ struct AccessKeyInventory {
}
impl Operation for AccessKeyInventory {
fn container(
&mut self,
_id: Option<&Id>,
_bounds: Rectangle,
operate_on_children: &mut dyn FnMut(&mut dyn Operation),
) {
visit_children(self, operate_on_children);
fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) {
operate(self);
}
fn custom(&mut self, state: &mut dyn Any, _id: Option<&Id>) {
fn custom(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Any) {
let Some(state) = state.downcast_ref::<State>() else {
return;
};
@@ -327,16 +315,11 @@ struct AssignAccessKeys {
}
impl Operation for AssignAccessKeys {
fn container(
&mut self,
_id: Option<&Id>,
_bounds: Rectangle,
operate_on_children: &mut dyn FnMut(&mut dyn Operation),
) {
visit_children(self, operate_on_children);
fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) {
operate(self);
}
fn custom(&mut self, state: &mut dyn Any, _id: Option<&Id>) {
fn custom(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Any) {
let Some(state) = state.downcast_mut::<State>() else {
return;
};
@@ -359,16 +342,11 @@ struct SetAccessPrefix<'a> {
}
impl Operation for SetAccessPrefix<'_> {
fn container(
&mut self,
_id: Option<&Id>,
_bounds: Rectangle,
operate_on_children: &mut dyn FnMut(&mut dyn Operation),
) {
visit_children(self, operate_on_children);
fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) {
operate(self);
}
fn custom(&mut self, state: &mut dyn Any, _id: Option<&Id>) {
fn custom(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Any) {
if let Some(state) = state.downcast_mut::<State>()
&& state.access_mode
{
@@ -381,16 +359,11 @@ impl Operation for SetAccessPrefix<'_> {
struct CancelAccessKeys;
impl Operation for CancelAccessKeys {
fn container(
&mut self,
_id: Option<&Id>,
_bounds: Rectangle,
operate_on_children: &mut dyn FnMut(&mut dyn Operation),
) {
visit_children(self, operate_on_children);
fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) {
operate(self);
}
fn custom(&mut self, state: &mut dyn Any, _id: Option<&Id>) {
fn custom(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Any) {
if let Some(state) = state.downcast_mut::<State>() {
state.access_mode = false;
state.prefix.clear();
@@ -405,16 +378,11 @@ struct AccessKeyMatches<'a> {
}
impl Operation for AccessKeyMatches<'_> {
fn container(
&mut self,
_id: Option<&Id>,
_bounds: Rectangle,
operate_on_children: &mut dyn FnMut(&mut dyn Operation),
) {
visit_children(self, operate_on_children);
fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) {
operate(self);
}
fn custom(&mut self, state: &mut dyn Any, _id: Option<&Id>) {
fn custom(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Any) {
let Some(state) = state.downcast_ref::<State>() else {
return;
};
@@ -439,16 +407,11 @@ struct FocusAccessKey<'a> {
}
impl Operation for FocusAccessKey<'_> {
fn container(
&mut self,
_id: Option<&Id>,
_bounds: Rectangle,
operate_on_children: &mut dyn FnMut(&mut dyn Operation),
) {
visit_children(self, operate_on_children);
fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) {
operate(self);
}
fn custom(&mut self, state: &mut dyn Any, _id: Option<&Id>) {
fn custom(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Any) {
let Some(state) = state.downcast_mut::<State>() else {
self.next_is_target = false;
return;
@@ -457,7 +420,7 @@ impl Operation for FocusAccessKey<'_> {
state.pending_activation = self.next_is_target;
}
fn focusable(&mut self, state: &mut dyn Focusable, _id: Option<&Id>) {
fn focusable(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Focusable) {
if self.next_is_target {
state.focus();
} else {
@@ -474,20 +437,15 @@ struct FocusedEditable {
}
impl Operation for FocusedEditable {
fn container(
&mut self,
_id: Option<&Id>,
_bounds: Rectangle,
operate_on_children: &mut dyn FnMut(&mut dyn Operation),
) {
visit_children(self, operate_on_children);
fn traverse(&mut self, operate: &mut dyn FnMut(&mut dyn Operation)) {
operate(self);
}
fn custom(&mut self, state: &mut dyn Any, _id: Option<&Id>) {
fn custom(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Any) {
self.next_is_control = state.is::<State>();
}
fn focusable(&mut self, state: &mut dyn Focusable, _id: Option<&Id>) {
fn focusable(&mut self, _id: Option<&Id>, _bounds: Rectangle, state: &mut dyn Focusable) {
self.found |= state.is_focused() && !self.next_is_control;
self.next_is_control = false;
}
@@ -535,9 +493,9 @@ impl<'a, Message> FocusableControl<'a, Message> {
Event::Mouse(mouse::Event::ButtonPressed(mouse::Button::Left)),
Event::Mouse(mouse::Event::ButtonReleased(mouse::Button::Left)),
] {
let _ = self.content.as_widget_mut().on_event(
self.content.as_widget_mut().update(
&mut tree.children[0],
event,
&event,
layout,
cursor,
renderer,
@@ -574,18 +532,18 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for FocusableControl<'_, Me
}
fn layout(
&self,
&mut self,
tree: &mut Tree,
renderer: &iced::Renderer,
limits: &layout::Limits,
) -> layout::Node {
self.content
.as_widget()
.as_widget_mut()
.layout(&mut tree.children[0], renderer, limits)
}
fn operate(
&self,
&mut self,
tree: &mut Tree,
layout: Layout<'_>,
renderer: &iced::Renderer,
@@ -594,30 +552,34 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for FocusableControl<'_, Me
let state = tree.state.downcast_mut::<State>();
state.enabled = self.enabled;
state.direct_key = self.hotkey;
operation.custom(state, None);
operation.custom(None, layout.bounds(), state);
if self.enabled {
operation.focusable(state, None);
operation.focusable(None, layout.bounds(), state);
} else {
state.unfocus();
}
operation.container(None, layout.bounds(), &mut |operation| {
self.content
.as_widget()
.operate(&mut tree.children[0], layout, renderer, operation);
operation.container(None, layout.bounds());
operation.traverse(&mut |operation| {
self.content.as_widget_mut().operate(
&mut tree.children[0],
layout,
renderer,
operation,
);
});
}
fn on_event(
fn update(
&mut self,
tree: &mut Tree,
event: Event,
event: &Event,
layout: Layout<'_>,
cursor: mouse::Cursor,
renderer: &iced::Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status {
) {
let pending_activation = {
let state = tree.state.downcast_mut::<State>();
let pending = state.pending_activation;
@@ -626,11 +588,12 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for FocusableControl<'_, Me
};
if pending_activation && self.enabled {
self.activate(tree, layout, renderer, clipboard, shell, viewport);
return event::Status::Captured;
shell.capture_event();
return;
}
let child_status = self.content.as_widget_mut().on_event(
self.content.as_widget_mut().update(
&mut tree.children[0],
event.clone(),
event,
layout,
cursor,
renderer,
@@ -639,8 +602,8 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for FocusableControl<'_, Me
viewport,
);
let state = tree.state.downcast_mut::<State>();
if child_status == event::Status::Captured || !self.enabled {
return child_status;
if shell.is_event_captured() || !self.enabled {
return;
}
let activate = state.focused
&& matches!(
@@ -652,9 +615,7 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for FocusableControl<'_, Me
);
if activate {
self.activate(tree, layout, renderer, clipboard, shell, viewport);
event::Status::Captured
} else {
child_status
shell.capture_event();
}
}
@@ -743,8 +704,8 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for FocusableControl<'_, Me
size: Pixels(9.0),
line_height: text::LineHeight::Relative(1.0),
bounds: badge.size(),
horizontal_alignment: alignment::Horizontal::Center,
vertical_alignment: alignment::Vertical::Center,
align_x: alignment::Horizontal::Center.into(),
align_y: alignment::Vertical::Center,
shaping: text::Shaping::Advanced,
wrapping: text::Wrapping::None,
},
@@ -758,13 +719,18 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for FocusableControl<'_, Me
fn overlay<'b>(
&'b mut self,
tree: &'b mut Tree,
layout: Layout<'_>,
layout: Layout<'b>,
renderer: &iced::Renderer,
viewport: &Rectangle,
translation: Vector,
) -> Option<overlay::Element<'b, Message, Theme, iced::Renderer>> {
self.content
.as_widget_mut()
.overlay(&mut tree.children[0], layout, renderer, translation)
self.content.as_widget_mut().overlay(
&mut tree.children[0],
layout,
renderer,
viewport,
translation,
)
}
}
@@ -802,18 +768,18 @@ impl<'a, Message> AccessKeyScope<'a, Message> {
}
fn operate(
&self,
&mut self,
tree: &mut Tree,
layout: Layout<'_>,
renderer: &iced::Renderer,
operation: &mut dyn Operation,
) {
self.content
.as_widget()
.as_widget_mut()
.operate(&mut tree.children[0], layout, renderer, operation);
}
fn begin(&self, tree: &mut Tree, layout: Layout<'_>, renderer: &iced::Renderer) -> bool {
fn begin(&mut self, tree: &mut Tree, layout: Layout<'_>, renderer: &iced::Renderer) -> bool {
let mut focused_editable = FocusedEditable::default();
self.operate(tree, layout, renderer, &mut focused_editable);
if focused_editable.found {
@@ -834,7 +800,7 @@ impl<'a, Message> AccessKeyScope<'a, Message> {
true
}
fn cancel(&self, tree: &mut Tree, layout: Layout<'_>, renderer: &iced::Renderer) {
fn cancel(&mut self, tree: &mut Tree, layout: Layout<'_>, renderer: &iced::Renderer) {
self.operate(tree, layout, renderer, &mut CancelAccessKeys);
}
}
@@ -861,41 +827,45 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for AccessKeyScope<'_, Mess
}
fn layout(
&self,
&mut self,
tree: &mut Tree,
renderer: &iced::Renderer,
limits: &layout::Limits,
) -> layout::Node {
self.content
.as_widget()
.as_widget_mut()
.layout(&mut tree.children[0], renderer, limits)
}
fn operate(
&self,
&mut self,
tree: &mut Tree,
layout: Layout<'_>,
renderer: &iced::Renderer,
operation: &mut dyn Operation,
) {
operation.container(None, layout.bounds(), &mut |operation| {
self.content
.as_widget()
.operate(&mut tree.children[0], layout, renderer, operation);
operation.container(None, layout.bounds());
operation.traverse(&mut |operation| {
self.content.as_widget_mut().operate(
&mut tree.children[0],
layout,
renderer,
operation,
);
});
}
fn on_event(
fn update(
&mut self,
tree: &mut Tree,
event: Event,
event: &Event,
layout: Layout<'_>,
cursor: mouse::Cursor,
renderer: &iced::Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status {
) {
let modifier_update = match &event {
Event::Keyboard(keyboard::Event::ModifiersChanged(modifiers))
| Event::Keyboard(keyboard::Event::KeyPressed { modifiers, .. })
@@ -939,7 +909,8 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for AccessKeyScope<'_, Mess
state.active = false;
state.prefix.clear();
state.cancelled_until_modifiers_release = true;
return event::Status::Captured;
shell.capture_event();
return;
}
if let Event::Keyboard(keyboard::Event::KeyPressed { key, modifiers, .. }) = &event
@@ -955,12 +926,13 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for AccessKeyScope<'_, Mess
)
};
if cancelled {
return event::Status::Captured;
shell.capture_event();
return;
}
if !active {
active = self.begin(tree, layout, renderer);
if !active {
return self.content.as_widget_mut().on_event(
self.content.as_widget_mut().update(
&mut tree.children[0],
event,
layout,
@@ -970,6 +942,7 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for AccessKeyScope<'_, Mess
shell,
viewport,
);
return;
}
let state = tree.state.downcast_mut::<AccessKeyScopeState>();
state.active = true;
@@ -987,7 +960,8 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for AccessKeyScope<'_, Mess
let exact = matches.exact.take();
drop(matches);
if count == 0 {
return event::Status::Captured;
shell.capture_event();
return;
}
self.operate(
@@ -1008,7 +982,7 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for AccessKeyScope<'_, Mess
next_is_target: false,
},
);
let _ = self.content.as_widget_mut().on_event(
self.content.as_widget_mut().update(
&mut tree.children[0],
event,
layout,
@@ -1024,7 +998,8 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for AccessKeyScope<'_, Mess
state.prefix.clear();
state.cancelled_until_modifiers_release = true;
}
return event::Status::Captured;
shell.capture_event();
return;
}
if matches!(event, Event::Mouse(mouse::Event::ButtonPressed(_)))
@@ -1036,7 +1011,7 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for AccessKeyScope<'_, Mess
state.prefix.clear();
}
self.content.as_widget_mut().on_event(
self.content.as_widget_mut().update(
&mut tree.children[0],
event,
layout,
@@ -1045,7 +1020,7 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for AccessKeyScope<'_, Mess
clipboard,
shell,
viewport,
)
);
}
fn mouse_interaction(
@@ -1089,13 +1064,18 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for AccessKeyScope<'_, Mess
fn overlay<'b>(
&'b mut self,
tree: &'b mut Tree,
layout: Layout<'_>,
layout: Layout<'b>,
renderer: &iced::Renderer,
viewport: &Rectangle,
translation: Vector,
) -> Option<overlay::Element<'b, Message, Theme, iced::Renderer>> {
self.content
.as_widget_mut()
.overlay(&mut tree.children[0], layout, renderer, translation)
self.content.as_widget_mut().overlay(
&mut tree.children[0],
layout,
renderer,
viewport,
translation,
)
}
}
@@ -1130,18 +1110,18 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for SuspendedKeyboard<'_, M
}
fn layout(
&self,
&mut self,
tree: &mut Tree,
renderer: &iced::Renderer,
limits: &layout::Limits,
) -> layout::Node {
self.content
.as_widget()
.as_widget_mut()
.layout(&mut tree.children[0], renderer, limits)
}
fn operate(
&self,
&mut self,
_tree: &mut Tree,
_layout: Layout<'_>,
_renderer: &iced::Renderer,
@@ -1149,21 +1129,21 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for SuspendedKeyboard<'_, M
) {
}
fn on_event(
fn update(
&mut self,
tree: &mut Tree,
event: Event,
event: &Event,
layout: Layout<'_>,
cursor: mouse::Cursor,
renderer: &iced::Renderer,
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status {
) {
if matches!(event, Event::Keyboard(_)) {
event::Status::Captured
shell.capture_event();
} else {
self.content.as_widget_mut().on_event(
self.content.as_widget_mut().update(
&mut tree.children[0],
event,
layout,
@@ -1172,7 +1152,7 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for SuspendedKeyboard<'_, M
clipboard,
shell,
viewport,
)
);
}
}
@@ -1217,13 +1197,18 @@ impl<Message> Widget<Message, Theme, iced::Renderer> for SuspendedKeyboard<'_, M
fn overlay<'b>(
&'b mut self,
tree: &'b mut Tree,
layout: Layout<'_>,
layout: Layout<'b>,
renderer: &iced::Renderer,
viewport: &Rectangle,
translation: Vector,
) -> Option<overlay::Element<'b, Message, Theme, iced::Renderer>> {
self.content
.as_widget_mut()
.overlay(&mut tree.children[0], layout, renderer, translation)
self.content.as_widget_mut().overlay(
&mut tree.children[0],
layout,
renderer,
viewport,
translation,
)
}
}