Fix VisibilityWrapper widget
I believe this fixes how the widget works, though it's hard to tell since the behavior was inconsistent. There are still issues related to drag-and-drop in cosmic-comp or `iced_sctk`, which need to be fixed to get things working fully.
This commit is contained in:
parent
6f45933971
commit
8365efb30d
1 changed files with 80 additions and 50 deletions
|
|
@ -32,61 +32,77 @@ pub struct VisibilityWrapper<'a, Msg> {
|
||||||
impl<'a, Msg> Widget<Msg, cosmic::Theme, cosmic::Renderer> for VisibilityWrapper<'a, Msg> {
|
impl<'a, Msg> Widget<Msg, cosmic::Theme, cosmic::Renderer> for VisibilityWrapper<'a, Msg> {
|
||||||
delegate::delegate! {
|
delegate::delegate! {
|
||||||
to self.content.as_widget() {
|
to self.content.as_widget() {
|
||||||
fn tag(&self) -> tree::Tag;
|
|
||||||
fn state(&self) -> tree::State;
|
|
||||||
fn children(&self) -> Vec<Tree>;
|
|
||||||
fn size(&self) -> Size<Length>;
|
fn size(&self) -> Size<Length>;
|
||||||
fn size_hint(&self) -> Size<Length>;
|
fn size_hint(&self) -> Size<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;
|
|
||||||
fn id(&self) -> Option<Id>;
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
to self.content.as_widget_mut() {
|
fn operate(
|
||||||
fn diff(&mut self, tree: &mut Tree);
|
&self,
|
||||||
fn on_event(
|
tree: &mut Tree,
|
||||||
&mut self,
|
layout: Layout<'_>,
|
||||||
tree: &mut Tree,
|
renderer: &cosmic::Renderer,
|
||||||
event: Event,
|
operation: &mut dyn Operation<OperationOutputWrapper<Msg>>,
|
||||||
layout: Layout<'_>,
|
) {
|
||||||
cursor: mouse::Cursor,
|
self.content
|
||||||
renderer: &cosmic::Renderer,
|
.as_widget()
|
||||||
clipboard: &mut dyn Clipboard,
|
.operate(&mut tree.children[0], layout, renderer, operation);
|
||||||
shell: &mut Shell<'_, Msg>,
|
}
|
||||||
viewport: &Rectangle,
|
|
||||||
) -> event::Status;
|
fn on_event(
|
||||||
fn overlay<'b>(
|
&mut self,
|
||||||
&'b mut self,
|
tree: &mut Tree,
|
||||||
tree: &'b mut Tree,
|
event: Event,
|
||||||
layout: Layout<'_>,
|
layout: Layout<'_>,
|
||||||
renderer: &cosmic::Renderer,
|
cursor: mouse::Cursor,
|
||||||
) -> Option<overlay::Element<'b, Msg, cosmic::Theme, cosmic::Renderer>>;
|
renderer: &cosmic::Renderer,
|
||||||
fn set_id(&mut self, id: Id);
|
clipboard: &mut dyn Clipboard,
|
||||||
}
|
shell: &mut Shell<'_, Msg>,
|
||||||
|
viewport: &Rectangle,
|
||||||
|
) -> event::Status {
|
||||||
|
self.content.as_widget_mut().on_event(
|
||||||
|
&mut tree.children[0],
|
||||||
|
event,
|
||||||
|
layout,
|
||||||
|
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.children[0],
|
||||||
|
layout,
|
||||||
|
cursor,
|
||||||
|
viewport,
|
||||||
|
renderer,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn layout(
|
||||||
|
&self,
|
||||||
|
tree: &mut Tree,
|
||||||
|
renderer: &cosmic::Renderer,
|
||||||
|
limits: &layout::Limits,
|
||||||
|
) -> layout::Node {
|
||||||
|
self.content
|
||||||
|
.as_widget()
|
||||||
|
.layout(&mut tree.children[0], renderer, limits)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn draw(
|
fn draw(
|
||||||
&self,
|
&self,
|
||||||
state: &Tree,
|
tree: &Tree,
|
||||||
renderer: &mut cosmic::Renderer,
|
renderer: &mut cosmic::Renderer,
|
||||||
theme: &cosmic::Theme,
|
theme: &cosmic::Theme,
|
||||||
style: &renderer::Style,
|
style: &renderer::Style,
|
||||||
|
|
@ -95,11 +111,25 @@ impl<'a, Msg> Widget<Msg, cosmic::Theme, cosmic::Renderer> for VisibilityWrapper
|
||||||
viewport: &Rectangle,
|
viewport: &Rectangle,
|
||||||
) {
|
) {
|
||||||
if self.visible {
|
if self.visible {
|
||||||
self.content
|
self.content.as_widget().draw(
|
||||||
.as_widget()
|
&tree.children[0],
|
||||||
.draw(state, renderer, theme, style, layout, cursor, viewport);
|
renderer,
|
||||||
|
theme,
|
||||||
|
style,
|
||||||
|
layout,
|
||||||
|
cursor,
|
||||||
|
viewport,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn children(&self) -> Vec<Tree> {
|
||||||
|
vec![Tree::new(&self.content)]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn diff(&mut self, tree: &mut Tree) {
|
||||||
|
tree.diff_children(&mut [&mut self.content]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, Msg: 'a> From<VisibilityWrapper<'a, Msg>> for cosmic::Element<'a, Msg> {
|
impl<'a, Msg: 'a> From<VisibilityWrapper<'a, Msg>> for cosmic::Element<'a, Msg> {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue