Passthrough widget implementation with treating as child
This commit is contained in:
parent
c4adca76c0
commit
d56a591a9f
1 changed files with 41 additions and 92 deletions
|
|
@ -1,3 +1,5 @@
|
||||||
|
// Renders image behind widget, and otherwise passes through all behavior
|
||||||
|
|
||||||
use cosmic::iced::{
|
use cosmic::iced::{
|
||||||
self,
|
self,
|
||||||
advanced::{
|
advanced::{
|
||||||
|
|
@ -34,86 +36,51 @@ impl<'a, Msg> Widget<Msg, cosmic::Renderer> for ImageBg<'a, Msg> {
|
||||||
fn children(&self) -> Vec<Tree>;
|
fn children(&self) -> Vec<Tree>;
|
||||||
fn width(&self) -> Length;
|
fn width(&self) -> Length;
|
||||||
fn height(&self) -> Length;
|
fn height(&self) -> Length;
|
||||||
|
fn layout(
|
||||||
|
&self,
|
||||||
|
tree: &mut Tree,
|
||||||
|
renderer: &cosmic::Renderer,
|
||||||
|
limits: &layout::Limits,
|
||||||
|
) -> layout::Node;
|
||||||
|
fn operate(
|
||||||
|
&self,
|
||||||
|
tree: &mut Tree,
|
||||||
|
layout: Layout<'_>,
|
||||||
|
renderer: &cosmic::Renderer,
|
||||||
|
operation: &mut dyn Operation<OperationOutputWrapper<Msg>>,
|
||||||
|
);
|
||||||
|
fn mouse_interaction(
|
||||||
|
&self,
|
||||||
|
tree: &Tree,
|
||||||
|
layout: Layout<'_>,
|
||||||
|
cursor: mouse::Cursor,
|
||||||
|
viewport: &Rectangle,
|
||||||
|
renderer: &cosmic::Renderer,
|
||||||
|
) -> mouse::Interaction;
|
||||||
}
|
}
|
||||||
|
|
||||||
to self.content.as_widget_mut() {
|
to self.content.as_widget_mut() {
|
||||||
fn diff(&mut self, tree: &mut Tree);
|
fn diff(&mut self, tree: &mut Tree);
|
||||||
|
fn on_event(
|
||||||
|
&mut self,
|
||||||
|
tree: &mut Tree,
|
||||||
|
event: Event,
|
||||||
|
layout: Layout<'_>,
|
||||||
|
cursor: mouse::Cursor,
|
||||||
|
renderer: &cosmic::Renderer,
|
||||||
|
clipboard: &mut dyn Clipboard,
|
||||||
|
shell: &mut Shell<'_, Msg>,
|
||||||
|
viewport: &Rectangle,
|
||||||
|
) -> event::Status;
|
||||||
|
fn overlay<'b>(
|
||||||
|
&'b mut self,
|
||||||
|
tree: &'b mut Tree,
|
||||||
|
layout: Layout<'_>,
|
||||||
|
renderer: &cosmic::Renderer,
|
||||||
|
) -> Option<overlay::Element<'b, Msg, cosmic::Renderer>>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn layout(
|
|
||||||
&self,
|
|
||||||
tree: &mut Tree,
|
|
||||||
renderer: &cosmic::Renderer,
|
|
||||||
limits: &layout::Limits,
|
|
||||||
) -> layout::Node {
|
|
||||||
let content = self.content.as_widget().layout(tree, renderer, limits);
|
|
||||||
//let size = limits.resolve(content.size());
|
|
||||||
let size = content.size();
|
|
||||||
layout::Node::with_children(size, vec![content])
|
|
||||||
}
|
|
||||||
|
|
||||||
fn operate(
|
|
||||||
&self,
|
|
||||||
tree: &mut Tree,
|
|
||||||
layout: Layout<'_>,
|
|
||||||
renderer: &cosmic::Renderer,
|
|
||||||
operation: &mut dyn Operation<OperationOutputWrapper<Msg>>,
|
|
||||||
) {
|
|
||||||
operation.container(
|
|
||||||
None, // XXX id
|
|
||||||
layout.bounds(),
|
|
||||||
&mut |operation| {
|
|
||||||
self.content.as_widget().operate(
|
|
||||||
tree,
|
|
||||||
layout.children().next().unwrap(),
|
|
||||||
renderer,
|
|
||||||
operation,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
fn on_event(
|
|
||||||
&mut self,
|
|
||||||
tree: &mut Tree,
|
|
||||||
event: Event,
|
|
||||||
layout: Layout<'_>,
|
|
||||||
cursor: mouse::Cursor,
|
|
||||||
renderer: &cosmic::Renderer,
|
|
||||||
clipboard: &mut dyn Clipboard,
|
|
||||||
shell: &mut Shell<'_, Msg>,
|
|
||||||
viewport: &Rectangle,
|
|
||||||
) -> event::Status {
|
|
||||||
self.content.as_widget_mut().on_event(
|
|
||||||
tree,
|
|
||||||
event,
|
|
||||||
layout.children().next().unwrap(),
|
|
||||||
cursor,
|
|
||||||
renderer,
|
|
||||||
clipboard,
|
|
||||||
shell,
|
|
||||||
viewport,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn mouse_interaction(
|
|
||||||
&self,
|
|
||||||
tree: &Tree,
|
|
||||||
layout: Layout<'_>,
|
|
||||||
cursor: mouse::Cursor,
|
|
||||||
viewport: &Rectangle,
|
|
||||||
renderer: &cosmic::Renderer,
|
|
||||||
) -> mouse::Interaction {
|
|
||||||
self.content.as_widget().mouse_interaction(
|
|
||||||
tree,
|
|
||||||
layout.children().next().unwrap(),
|
|
||||||
cursor,
|
|
||||||
viewport,
|
|
||||||
renderer,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn draw(
|
fn draw(
|
||||||
&self,
|
&self,
|
||||||
state: &Tree,
|
state: &Tree,
|
||||||
|
|
@ -157,26 +124,8 @@ impl<'a, Msg> Widget<Msg, cosmic::Renderer> for ImageBg<'a, Msg> {
|
||||||
);
|
);
|
||||||
//});
|
//});
|
||||||
|
|
||||||
self.content.draw(
|
|
||||||
state,
|
|
||||||
renderer,
|
|
||||||
theme,
|
|
||||||
style,
|
|
||||||
layout.children().next().unwrap(),
|
|
||||||
cursor,
|
|
||||||
viewport,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn overlay<'b>(
|
|
||||||
&'b mut self,
|
|
||||||
tree: &'b mut Tree,
|
|
||||||
layout: Layout<'_>,
|
|
||||||
renderer: &cosmic::Renderer,
|
|
||||||
) -> Option<overlay::Element<'b, Msg, cosmic::Renderer>> {
|
|
||||||
self.content
|
self.content
|
||||||
.as_widget_mut()
|
.draw(state, renderer, theme, style, layout, cursor, viewport)
|
||||||
.overlay(tree, layout.children().next().unwrap(), renderer)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue