Add emit_signal method (#611)

Co-authored-by: Daniel McNab <36049421+DJMcNab@users.noreply.github.com>
This commit is contained in:
Olivier FAURE 2024-09-24 19:34:43 +02:00 committed by GitHub
parent d4f3fc8523
commit fa4eff5648
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 20 additions and 34 deletions

View File

@ -560,8 +560,7 @@ impl_context_method!(
pub fn submit_action(&mut self, action: Action) {
trace!("submit_action");
self.global_state
.signal_queue
.push_back(RenderRootSignal::Action(action, self.widget_state.id));
.emit_signal(RenderRootSignal::Action(action, self.widget_state.id));
}
/// Request a timer event.

View File

@ -39,9 +39,7 @@ fn compose_widget(
// TODO - Add unit tests for this.
if moved {
let ime_area = state.item.get_ime_area();
global_state
.signal_queue
.push_back(RenderRootSignal::new_ime_moved_signal(ime_area));
global_state.emit_signal(RenderRootSignal::new_ime_moved_signal(ime_area));
}
// We need to update the accessibility node's coordinates and repaint it at the new position.

View File

@ -168,8 +168,7 @@ pub(crate) fn run_update_pointer_pass(root: &mut RenderRoot, root_state: &mut Wi
if root.state.cursor_icon != new_cursor {
root.state
.signal_queue
.push_back(RenderRootSignal::SetCursor(new_cursor));
.emit_signal(RenderRootSignal::SetCursor(new_cursor));
}
root.state.cursor_icon = new_cursor;
@ -260,19 +259,16 @@ pub(crate) fn run_update_focus_pass(root: &mut RenderRoot, root_state: &mut Widg
});
if prev_focused.is_some() && was_ime_active {
root.state.signal_queue.push_back(RenderRootSignal::EndIme);
root.state.emit_signal(RenderRootSignal::EndIme);
}
if next_focused.is_some() && is_ime_active {
root.state
.signal_queue
.push_back(RenderRootSignal::StartIme);
root.state.emit_signal(RenderRootSignal::StartIme);
}
if let Some(id) = next_focused {
let ime_area = root.widget_arena.get_state(id).item.get_ime_area();
root.state
.signal_queue
.push_back(RenderRootSignal::new_ime_moved_signal(ime_area));
.emit_signal(RenderRootSignal::new_ime_moved_signal(ime_area));
}
}

View File

@ -193,17 +193,13 @@ impl RenderRoot {
// TODO - What we'd really like is to request a repaint and an accessibility
// pass for every single widget.
self.root_state().needs_layout = true;
self.state
.signal_queue
.push_back(RenderRootSignal::RequestRedraw);
self.state.emit_signal(RenderRootSignal::RequestRedraw);
Handled::Yes
}
WindowEvent::Resize(size) => {
self.size = size;
self.root_state().needs_layout = true;
self.state
.signal_queue
.push_back(RenderRootSignal::RequestRedraw);
self.state.emit_signal(RenderRootSignal::RequestRedraw);
Handled::Yes
}
WindowEvent::AnimFrame => {
@ -229,9 +225,7 @@ impl RenderRoot {
}
WindowEvent::RebuildAccessTree => {
self.rebuild_access_tree = true;
self.state
.signal_queue
.push_back(RenderRootSignal::RequestRedraw);
self.state.emit_signal(RenderRootSignal::RequestRedraw);
Handled::Yes
}
}
@ -288,9 +282,7 @@ impl RenderRoot {
}
if self.root_state().needs_layout {
warn!("Widget requested layout during layout pass");
self.state
.signal_queue
.push_back(RenderRootSignal::RequestRedraw);
self.state.emit_signal(RenderRootSignal::RequestRedraw);
}
// TODO - Improve caching of scenes.
@ -447,9 +439,7 @@ impl RenderRoot {
let new_size = LogicalSize::new(size.width, size.height).to_physical(self.scale_factor);
if self.size != new_size {
self.size = new_size;
self.state
.signal_queue
.push_back(RenderRootSignal::SetSize(new_size));
self.state.emit_signal(RenderRootSignal::SetSize(new_size));
}
}
@ -525,9 +515,7 @@ impl RenderRoot {
run_update_focus_pass(self, widget_state);
if self.root_state().request_anim {
self.state
.signal_queue
.push_back(RenderRootSignal::RequestAnimFrame);
self.state.emit_signal(RenderRootSignal::RequestAnimFrame);
}
// We request a redraw if either the render tree or the accessibility
@ -538,9 +526,7 @@ impl RenderRoot {
|| self.root_state().needs_accessibility
|| self.root_state().needs_layout
{
self.state
.signal_queue
.push_back(RenderRootSignal::RequestRedraw);
self.state.emit_signal(RenderRootSignal::RequestRedraw);
}
run_mutate_pass(self, widget_state);
@ -593,6 +579,13 @@ impl RenderRoot {
}
}
impl RenderRootState {
/// Send a signal to the runner of this app, which allows global actions to be triggered by a widget.
pub(crate) fn emit_signal(&mut self, signal: RenderRootSignal) {
self.signal_queue.push_back(signal);
}
}
impl RenderRootSignal {
pub(crate) fn new_ime_moved_signal(area: Rect) -> Self {
RenderRootSignal::ImeMoved(