Split Shell::request_redraw into two different methods
This commit is contained in:
parent
7fbc195b11
commit
752403d70c
15 changed files with 89 additions and 114 deletions
|
|
@ -1,3 +1,4 @@
|
||||||
|
use crate::time::Instant;
|
||||||
use crate::window;
|
use crate::window;
|
||||||
|
|
||||||
/// A connection to the state of a shell.
|
/// A connection to the state of a shell.
|
||||||
|
|
@ -35,14 +36,19 @@ impl<'a, Message> Shell<'a, Message> {
|
||||||
self.messages.push(message);
|
self.messages.push(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Requests a new frame to be drawn.
|
/// Requests a new frame to be drawn as soon as possible.
|
||||||
pub fn request_redraw(&mut self, request: window::RedrawRequest) {
|
pub fn request_redraw(&mut self) {
|
||||||
|
self.redraw_request = Some(window::RedrawRequest::NextFrame);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Requests a new frame to be drawn at the given [`Instant`].
|
||||||
|
pub fn request_redraw_at(&mut self, at: Instant) {
|
||||||
match self.redraw_request {
|
match self.redraw_request {
|
||||||
None => {
|
None => {
|
||||||
self.redraw_request = Some(request);
|
self.redraw_request = Some(window::RedrawRequest::At(at));
|
||||||
}
|
}
|
||||||
Some(current) if request < current => {
|
Some(window::RedrawRequest::At(current)) if at < current => {
|
||||||
self.redraw_request = Some(request);
|
self.redraw_request = Some(window::RedrawRequest::At(at));
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
@ -95,8 +101,12 @@ impl<'a, Message> Shell<'a, Message> {
|
||||||
pub fn merge<B>(&mut self, other: Shell<'_, B>, f: impl Fn(B) -> Message) {
|
pub fn merge<B>(&mut self, other: Shell<'_, B>, f: impl Fn(B) -> Message) {
|
||||||
self.messages.extend(other.messages.drain(..).map(f));
|
self.messages.extend(other.messages.drain(..).map(f));
|
||||||
|
|
||||||
if let Some(at) = other.redraw_request {
|
if let Some(new) = other.redraw_request {
|
||||||
self.request_redraw(at);
|
self.redraw_request = Some(
|
||||||
|
self.redraw_request
|
||||||
|
.map(|current| if current < new { current } else { new })
|
||||||
|
.unwrap_or(new),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.is_layout_invalid =
|
self.is_layout_invalid =
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ use iced::event;
|
||||||
use iced::mouse;
|
use iced::mouse;
|
||||||
use iced::time::Instant;
|
use iced::time::Instant;
|
||||||
use iced::widget::canvas;
|
use iced::widget::canvas;
|
||||||
use iced::window::{self, RedrawRequest};
|
use iced::window;
|
||||||
use iced::{
|
use iced::{
|
||||||
Background, Color, Element, Event, Length, Radians, Rectangle, Renderer,
|
Background, Color, Element, Event, Length, Radians, Rectangle, Renderer,
|
||||||
Size, Vector,
|
Size, Vector,
|
||||||
|
|
@ -283,7 +283,7 @@ where
|
||||||
);
|
);
|
||||||
|
|
||||||
state.cache.clear();
|
state.cache.clear();
|
||||||
shell.request_redraw(RedrawRequest::NextFrame);
|
shell.request_redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
event::Status::Ignored
|
event::Status::Ignored
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ use iced::advanced::{self, Clipboard, Layout, Shell, Widget};
|
||||||
use iced::event;
|
use iced::event;
|
||||||
use iced::mouse;
|
use iced::mouse;
|
||||||
use iced::time::Instant;
|
use iced::time::Instant;
|
||||||
use iced::window::{self, RedrawRequest};
|
use iced::window;
|
||||||
use iced::{Background, Color, Element, Event, Length, Rectangle, Size};
|
use iced::{Background, Color, Element, Event, Length, Rectangle, Size};
|
||||||
|
|
||||||
use super::easing::{self, Easing};
|
use super::easing::{self, Easing};
|
||||||
|
|
@ -192,7 +192,7 @@ where
|
||||||
if let Event::Window(window::Event::RedrawRequested(now)) = event {
|
if let Event::Window(window::Event::RedrawRequested(now)) = event {
|
||||||
*state = state.timed_transition(self.cycle_duration, now);
|
*state = state.timed_transition(self.cycle_duration, now);
|
||||||
|
|
||||||
shell.request_redraw(RedrawRequest::NextFrame);
|
shell.request_redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
event::Status::Ignored
|
event::Status::Ignored
|
||||||
|
|
|
||||||
|
|
@ -500,8 +500,6 @@ mod toast {
|
||||||
shell: &mut Shell<'_, Message>,
|
shell: &mut Shell<'_, Message>,
|
||||||
) -> event::Status {
|
) -> event::Status {
|
||||||
if let Event::Window(window::Event::RedrawRequested(now)) = &event {
|
if let Event::Window(window::Event::RedrawRequested(now)) = &event {
|
||||||
let mut next_redraw: Option<window::RedrawRequest> = None;
|
|
||||||
|
|
||||||
self.instants.iter_mut().enumerate().for_each(
|
self.instants.iter_mut().enumerate().for_each(
|
||||||
|(index, maybe_instant)| {
|
|(index, maybe_instant)| {
|
||||||
if let Some(instant) = maybe_instant.as_mut() {
|
if let Some(instant) = maybe_instant.as_mut() {
|
||||||
|
|
@ -512,22 +510,12 @@ mod toast {
|
||||||
if remaining == Duration::ZERO {
|
if remaining == Duration::ZERO {
|
||||||
maybe_instant.take();
|
maybe_instant.take();
|
||||||
shell.publish((self.on_close)(index));
|
shell.publish((self.on_close)(index));
|
||||||
next_redraw =
|
|
||||||
Some(window::RedrawRequest::NextFrame);
|
|
||||||
} else {
|
} else {
|
||||||
let redraw_at =
|
shell.request_redraw_at(*now + remaining);
|
||||||
window::RedrawRequest::At(*now + remaining);
|
|
||||||
next_redraw = next_redraw
|
|
||||||
.map(|redraw| redraw.min(redraw_at))
|
|
||||||
.or(Some(redraw_at));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
if let Some(redraw) = next_redraw {
|
|
||||||
shell.request_redraw(redraw);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let viewport = layout.bounds();
|
let viewport = layout.bounds();
|
||||||
|
|
|
||||||
|
|
@ -366,13 +366,8 @@ where
|
||||||
|
|
||||||
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
||||||
self.status = Some(current_status);
|
self.status = Some(current_status);
|
||||||
} else {
|
} else if self.status.is_some_and(|status| status != current_status) {
|
||||||
match self.status {
|
shell.request_redraw();
|
||||||
Some(status) if status != current_status => {
|
|
||||||
shell.request_redraw(window::RedrawRequest::NextFrame);
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
update_status
|
update_status
|
||||||
|
|
|
||||||
|
|
@ -345,13 +345,11 @@ where
|
||||||
|
|
||||||
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
||||||
self.last_status = Some(current_status);
|
self.last_status = Some(current_status);
|
||||||
} else {
|
} else if self
|
||||||
match self.last_status {
|
.last_status
|
||||||
Some(status) if status != current_status => {
|
.is_some_and(|status| status != current_status)
|
||||||
shell.request_redraw(window::RedrawRequest::NextFrame);
|
{
|
||||||
}
|
shell.request_redraw();
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
event::Status::Ignored
|
event::Status::Ignored
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ use crate::core::overlay;
|
||||||
use crate::core::renderer;
|
use crate::core::renderer;
|
||||||
use crate::core::widget;
|
use crate::core::widget;
|
||||||
use crate::core::widget::tree::{self, Tree};
|
use crate::core::widget::tree::{self, Tree};
|
||||||
|
use crate::core::window;
|
||||||
use crate::core::{
|
use crate::core::{
|
||||||
self, Clipboard, Element, Length, Point, Rectangle, Shell, Size, Vector,
|
self, Clipboard, Element, Length, Point, Rectangle, Shell, Size, Vector,
|
||||||
Widget,
|
Widget,
|
||||||
|
|
@ -342,7 +343,14 @@ where
|
||||||
local_shell.revalidate_layout(|| shell.invalidate_layout());
|
local_shell.revalidate_layout(|| shell.invalidate_layout());
|
||||||
|
|
||||||
if let Some(redraw_request) = local_shell.redraw_request() {
|
if let Some(redraw_request) = local_shell.redraw_request() {
|
||||||
shell.request_redraw(redraw_request);
|
match redraw_request {
|
||||||
|
window::RedrawRequest::NextFrame => {
|
||||||
|
shell.request_redraw();
|
||||||
|
}
|
||||||
|
window::RedrawRequest::At(at) => {
|
||||||
|
shell.request_redraw_at(at);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !local_messages.is_empty() {
|
if !local_messages.is_empty() {
|
||||||
|
|
@ -620,7 +628,14 @@ where
|
||||||
local_shell.revalidate_layout(|| shell.invalidate_layout());
|
local_shell.revalidate_layout(|| shell.invalidate_layout());
|
||||||
|
|
||||||
if let Some(redraw_request) = local_shell.redraw_request() {
|
if let Some(redraw_request) = local_shell.redraw_request() {
|
||||||
shell.request_redraw(redraw_request);
|
match redraw_request {
|
||||||
|
window::RedrawRequest::NextFrame => {
|
||||||
|
shell.request_redraw();
|
||||||
|
}
|
||||||
|
window::RedrawRequest::At(at) => {
|
||||||
|
shell.request_redraw_at(at);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !local_messages.is_empty() {
|
if !local_messages.is_empty() {
|
||||||
|
|
|
||||||
|
|
@ -435,9 +435,7 @@ where
|
||||||
.publish(on_option_hovered(option.clone()));
|
.publish(on_option_hovered(option.clone()));
|
||||||
}
|
}
|
||||||
|
|
||||||
shell.request_redraw(
|
shell.request_redraw();
|
||||||
window::RedrawRequest::NextFrame,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -472,14 +470,12 @@ where
|
||||||
|
|
||||||
let state = tree.state.downcast_mut::<ListState>();
|
let state = tree.state.downcast_mut::<ListState>();
|
||||||
|
|
||||||
if state.is_hovered.is_some_and(|is_hovered| {
|
|
||||||
is_hovered != cursor.is_over(layout.bounds())
|
|
||||||
}) {
|
|
||||||
shell.request_redraw(window::RedrawRequest::NextFrame);
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
||||||
state.is_hovered = Some(cursor.is_over(layout.bounds()));
|
state.is_hovered = Some(cursor.is_over(layout.bounds()));
|
||||||
|
} else if state.is_hovered.is_some_and(|is_hovered| {
|
||||||
|
is_hovered != cursor.is_over(layout.bounds())
|
||||||
|
}) {
|
||||||
|
shell.request_redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
event::Status::Ignored
|
event::Status::Ignored
|
||||||
|
|
|
||||||
|
|
@ -535,13 +535,11 @@ where
|
||||||
|
|
||||||
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
||||||
self.last_status = Some(status);
|
self.last_status = Some(status);
|
||||||
} else {
|
} else if self
|
||||||
match self.last_status {
|
.last_status
|
||||||
Some(last_status) if last_status != status => {
|
.is_some_and(|last_status| last_status != status)
|
||||||
shell.request_redraw(window::RedrawRequest::NextFrame);
|
{
|
||||||
}
|
shell.request_redraw();
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
event_status
|
event_status
|
||||||
|
|
|
||||||
|
|
@ -360,13 +360,11 @@ where
|
||||||
|
|
||||||
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
||||||
self.last_status = Some(current_status);
|
self.last_status = Some(current_status);
|
||||||
} else {
|
} else if self
|
||||||
match self.last_status {
|
.last_status
|
||||||
Some(status) if status != current_status => {
|
.is_some_and(|last_status| last_status != current_status)
|
||||||
shell.request_redraw(window::RedrawRequest::NextFrame);
|
{
|
||||||
}
|
shell.request_redraw();
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
event::Status::Ignored
|
event::Status::Ignored
|
||||||
|
|
|
||||||
|
|
@ -931,7 +931,7 @@ where
|
||||||
.last_status
|
.last_status
|
||||||
.is_some_and(|last_status| last_status != status)
|
.is_some_and(|last_status| last_status != status)
|
||||||
{
|
{
|
||||||
shell.request_redraw(window::RedrawRequest::NextFrame);
|
shell.request_redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
event_status
|
event_status
|
||||||
|
|
|
||||||
|
|
@ -432,13 +432,8 @@ where
|
||||||
|
|
||||||
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
||||||
self.status = Some(current_status);
|
self.status = Some(current_status);
|
||||||
} else {
|
} else if self.status.is_some_and(|status| status != current_status) {
|
||||||
match self.status {
|
shell.request_redraw();
|
||||||
Some(status) if status != current_status => {
|
|
||||||
shell.request_redraw(window::RedrawRequest::NextFrame);
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
update_status
|
update_status
|
||||||
|
|
|
||||||
|
|
@ -624,7 +624,7 @@ where
|
||||||
focus.is_window_focused = true;
|
focus.is_window_focused = true;
|
||||||
focus.updated_at = Instant::now();
|
focus.updated_at = Instant::now();
|
||||||
|
|
||||||
shell.request_redraw(window::RedrawRequest::NextFrame);
|
shell.request_redraw();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Event::Window(window::Event::RedrawRequested(now)) => {
|
Event::Window(window::Event::RedrawRequested(now)) => {
|
||||||
|
|
@ -637,11 +637,11 @@ where
|
||||||
- (now - focus.updated_at).as_millis()
|
- (now - focus.updated_at).as_millis()
|
||||||
% Focus::CURSOR_BLINK_INTERVAL_MILLIS;
|
% Focus::CURSOR_BLINK_INTERVAL_MILLIS;
|
||||||
|
|
||||||
shell.request_redraw(window::RedrawRequest::At(
|
shell.request_redraw_at(
|
||||||
now + Duration::from_millis(
|
now + Duration::from_millis(
|
||||||
millis_until_redraw as u64,
|
millis_until_redraw as u64,
|
||||||
),
|
),
|
||||||
));
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -751,7 +751,7 @@ where
|
||||||
state.last_click = Some(click);
|
state.last_click = Some(click);
|
||||||
|
|
||||||
if cursor_before != state.cursor {
|
if cursor_before != state.cursor {
|
||||||
shell.request_redraw(window::RedrawRequest::NextFrame);
|
shell.request_redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
return event::Status::Captured;
|
return event::Status::Captured;
|
||||||
|
|
@ -806,7 +806,7 @@ where
|
||||||
}
|
}
|
||||||
|
|
||||||
if selection_before != state.cursor.selection(&value) {
|
if selection_before != state.cursor.selection(&value) {
|
||||||
shell.request_redraw(window::RedrawRequest::NextFrame);
|
shell.request_redraw();
|
||||||
}
|
}
|
||||||
|
|
||||||
return event::Status::Captured;
|
return event::Status::Captured;
|
||||||
|
|
@ -914,9 +914,7 @@ where
|
||||||
if cursor_before != state.cursor {
|
if cursor_before != state.cursor {
|
||||||
focus.updated_at = Instant::now();
|
focus.updated_at = Instant::now();
|
||||||
|
|
||||||
shell.request_redraw(
|
shell.request_redraw();
|
||||||
window::RedrawRequest::NextFrame,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return event::Status::Captured;
|
return event::Status::Captured;
|
||||||
|
|
@ -1037,9 +1035,7 @@ where
|
||||||
if cursor_before != state.cursor {
|
if cursor_before != state.cursor {
|
||||||
focus.updated_at = Instant::now();
|
focus.updated_at = Instant::now();
|
||||||
|
|
||||||
shell.request_redraw(
|
shell.request_redraw();
|
||||||
window::RedrawRequest::NextFrame,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return event::Status::Captured;
|
return event::Status::Captured;
|
||||||
|
|
@ -1059,9 +1055,7 @@ where
|
||||||
if cursor_before != state.cursor {
|
if cursor_before != state.cursor {
|
||||||
focus.updated_at = Instant::now();
|
focus.updated_at = Instant::now();
|
||||||
|
|
||||||
shell.request_redraw(
|
shell.request_redraw();
|
||||||
window::RedrawRequest::NextFrame,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return event::Status::Captured;
|
return event::Status::Captured;
|
||||||
|
|
@ -1083,9 +1077,7 @@ where
|
||||||
if cursor_before != state.cursor {
|
if cursor_before != state.cursor {
|
||||||
focus.updated_at = Instant::now();
|
focus.updated_at = Instant::now();
|
||||||
|
|
||||||
shell.request_redraw(
|
shell.request_redraw();
|
||||||
window::RedrawRequest::NextFrame,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return event::Status::Captured;
|
return event::Status::Captured;
|
||||||
|
|
@ -1107,9 +1099,7 @@ where
|
||||||
if cursor_before != state.cursor {
|
if cursor_before != state.cursor {
|
||||||
focus.updated_at = Instant::now();
|
focus.updated_at = Instant::now();
|
||||||
|
|
||||||
shell.request_redraw(
|
shell.request_redraw();
|
||||||
window::RedrawRequest::NextFrame,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return event::Status::Captured;
|
return event::Status::Captured;
|
||||||
|
|
@ -1136,9 +1126,7 @@ where
|
||||||
if cursor_before != state.cursor {
|
if cursor_before != state.cursor {
|
||||||
focus.updated_at = Instant::now();
|
focus.updated_at = Instant::now();
|
||||||
|
|
||||||
shell.request_redraw(
|
shell.request_redraw();
|
||||||
window::RedrawRequest::NextFrame,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return event::Status::Captured;
|
return event::Status::Captured;
|
||||||
|
|
@ -1165,9 +1153,7 @@ where
|
||||||
if cursor_before != state.cursor {
|
if cursor_before != state.cursor {
|
||||||
focus.updated_at = Instant::now();
|
focus.updated_at = Instant::now();
|
||||||
|
|
||||||
shell.request_redraw(
|
shell.request_redraw();
|
||||||
window::RedrawRequest::NextFrame,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return event::Status::Captured;
|
return event::Status::Captured;
|
||||||
|
|
@ -1218,7 +1204,7 @@ where
|
||||||
focus.is_window_focused = true;
|
focus.is_window_focused = true;
|
||||||
focus.updated_at = Instant::now();
|
focus.updated_at = Instant::now();
|
||||||
|
|
||||||
shell.request_redraw(window::RedrawRequest::NextFrame);
|
shell.request_redraw();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Event::Window(window::Event::RedrawRequested(now)) => {
|
Event::Window(window::Event::RedrawRequested(now)) => {
|
||||||
|
|
@ -1237,11 +1223,11 @@ where
|
||||||
- (*now - focus.updated_at).as_millis()
|
- (*now - focus.updated_at).as_millis()
|
||||||
% CURSOR_BLINK_INTERVAL_MILLIS;
|
% CURSOR_BLINK_INTERVAL_MILLIS;
|
||||||
|
|
||||||
shell.request_redraw(window::RedrawRequest::At(
|
shell.request_redraw_at(
|
||||||
*now + Duration::from_millis(
|
*now + Duration::from_millis(
|
||||||
millis_until_redraw as u64,
|
millis_until_redraw as u64,
|
||||||
),
|
),
|
||||||
));
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1265,13 +1251,11 @@ where
|
||||||
|
|
||||||
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
||||||
self.last_status = Some(status);
|
self.last_status = Some(status);
|
||||||
} else {
|
} else if self
|
||||||
match self.last_status {
|
.last_status
|
||||||
Some(last_status) if status != last_status => {
|
.is_some_and(|last_status| status != last_status)
|
||||||
shell.request_redraw(window::RedrawRequest::NextFrame);
|
{
|
||||||
}
|
shell.request_redraw();
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
event::Status::Ignored
|
event::Status::Ignored
|
||||||
|
|
|
||||||
|
|
@ -352,13 +352,11 @@ where
|
||||||
|
|
||||||
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
if let Event::Window(window::Event::RedrawRequested(_now)) = event {
|
||||||
self.last_status = Some(current_status);
|
self.last_status = Some(current_status);
|
||||||
} else {
|
} else if self
|
||||||
match self.last_status {
|
.last_status
|
||||||
Some(status) if status != current_status => {
|
.is_some_and(|status| status != current_status)
|
||||||
shell.request_redraw(window::RedrawRequest::NextFrame);
|
{
|
||||||
}
|
shell.request_redraw();
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
event_status
|
event_status
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue