Prevent recreating HeaderSearch, temporarily losing state
Diff
shalom/src/magic/header_search.rs | 42 ++++++++++++++++++++++++++++++++++++++----
shalom/src/pages/room.rs | 8 ++++++--
shalom/src/widgets/image_background.rs | 29 +++++++++++++++++++++++++++++
shalom/src/pages/room/listen.rs | 2 +-
4 files changed, 68 insertions(+), 13 deletions(-)
@@ -6,11 +6,11 @@
layout::{Limits, Node},
mouse,
renderer::{Quad, Style},
widget::Tree,
widget::{tree::Tag, Tree},
Clipboard, Layout, Renderer as IRenderer, Shell, Widget,
},
event::Status,
mouse::Cursor,
mouse::{Cursor, Interaction},
widget::{
text_input::{Appearance, Id},
Text,
@@ -57,6 +57,7 @@
}
}
#[derive(Debug)]
pub enum BoxSize {
Fill,
Min,
@@ -283,12 +284,16 @@
*state = std::mem::take(next_state);
match &state {
State::Open => shell.publish((self.on_state_change)(true)),
State::Closed => shell.publish((self.on_state_change)(false)),
State::Open => {
shell.publish((self.on_state_change)(true));
self.current_search_box_size = BoxSize::Fill;
}
State::Closed => {
shell.publish((self.on_state_change)(false));
self.current_search_box_size = BoxSize::Min;
}
State::Animate { .. } => {}
}
self.current_search_box_size = BoxSize::Fill;
}
shell.request_redraw(RedrawRequest::NextFrame);
@@ -312,16 +317,37 @@
} else {
status
}
}
fn mouse_interaction(
&self,
state: &Tree,
layout: Layout<'_>,
cursor: Cursor,
viewport: &Rectangle,
renderer: &Renderer,
) -> Interaction {
self.input.as_widget().mouse_interaction(
&state.children[0],
layout.children().nth(1).unwrap().children().nth(1).unwrap(),
cursor,
viewport,
renderer,
)
}
fn state(&self) -> iced::advanced::widget::tree::State {
iced::advanced::widget::tree::State::Some(Box::new(
iced::advanced::widget::tree::State::new(
if matches!(self.current_search_box_size, BoxSize::Fill) {
State::Open
} else {
State::Closed
},
))
)
}
fn tag(&self) -> Tag {
Tag::of::<State>()
}
fn children(&self) -> Vec<Tree> {
@@ -7,7 +7,7 @@
advanced::graphics::core::Element,
font::{Stretch, Weight},
theme,
widget::{container, row, text, Column},
widget::{container, lazy, row, text, Column},
Color, Font, Length, Renderer, Subscription,
};
@@ -69,7 +69,11 @@
.style(theme::Text::Color(Color::WHITE));
let header = if let Page::Listen = self.current_page {
self.listen.header_magic(header).map(Message::Listen)
Element::from(lazy(self.room.name.as_ref(), move |_| {
self.listen
.header_magic(header.clone())
.map(Message::Listen)
}))
} else {
Element::from(header)
};
@@ -1,14 +1,14 @@
use iced::{
advanced::{
image::Data,
layout::{Limits, Node},
overlay,
renderer::Style,
widget::Tree,
widget::{Operation, Tree},
Clipboard, Layout, Shell, Widget,
},
event::Status,
mouse::Cursor,
mouse::{Cursor, Interaction},
widget::image,
Alignment, ContentFit, Element, Event, Length, Point, Rectangle, Size, Vector,
};
@@ -192,6 +192,31 @@
shell,
&layout.bounds(),
)
}
fn mouse_interaction(
&self,
layout: Layout<'_>,
cursor: Cursor,
viewport: &Rectangle,
renderer: &R,
) -> Interaction {
self.el.as_widget().mouse_interaction(
self.tree,
layout.children().next().unwrap(),
cursor,
viewport,
renderer,
)
}
fn operate(&mut self, layout: Layout<'_>, renderer: &R, operation: &mut dyn Operation<M>) {
self.el.as_widget().operate(
self.tree,
layout.children().next().unwrap(),
renderer,
operation,
);
}
}
@@ -47,7 +47,7 @@
}
}
pub fn header_magic<'a>(&'a self, text: Text<'a>) -> Element<'a, Message> {
pub fn header_magic<'a>(&self, text: Text<'a>) -> Element<'a, Message> {
header_search(
Message::OnSearchTerm,
Message::OnSearchVisibleChange,