Display top contents in hover widget when focused
This commit is contained in:
parent
422568dee4
commit
0ce81a0e0e
1 changed files with 26 additions and 4 deletions
|
|
@ -4,7 +4,8 @@ use crate::checkbox::{self, Checkbox};
|
||||||
use crate::combo_box::{self, ComboBox};
|
use crate::combo_box::{self, ComboBox};
|
||||||
use crate::container::{self, Container};
|
use crate::container::{self, Container};
|
||||||
use crate::core;
|
use crate::core;
|
||||||
use crate::core::widget::operation;
|
use crate::core::widget::operation::{self, Operation};
|
||||||
|
use crate::core::window;
|
||||||
use crate::core::{Element, Length, Pixels, Widget};
|
use crate::core::{Element, Length, Pixels, Widget};
|
||||||
use crate::keyed;
|
use crate::keyed;
|
||||||
use crate::overlay;
|
use crate::overlay;
|
||||||
|
|
@ -397,6 +398,7 @@ where
|
||||||
struct Hover<'a, Message, Theme, Renderer> {
|
struct Hover<'a, Message, Theme, Renderer> {
|
||||||
base: Element<'a, Message, Theme, Renderer>,
|
base: Element<'a, Message, Theme, Renderer>,
|
||||||
top: Element<'a, Message, Theme, Renderer>,
|
top: Element<'a, Message, Theme, Renderer>,
|
||||||
|
is_top_focused: bool,
|
||||||
is_top_overlay_active: bool,
|
is_top_overlay_active: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -472,7 +474,9 @@ where
|
||||||
viewport,
|
viewport,
|
||||||
);
|
);
|
||||||
|
|
||||||
if cursor.is_over(layout.bounds()) || self.is_top_overlay_active
|
if cursor.is_over(layout.bounds())
|
||||||
|
|| self.is_top_focused
|
||||||
|
|| self.is_top_overlay_active
|
||||||
{
|
{
|
||||||
let (top_layout, top_tree) = children.next().unwrap();
|
let (top_layout, top_tree) = children.next().unwrap();
|
||||||
|
|
||||||
|
|
@ -515,6 +519,24 @@ where
|
||||||
) -> event::Status {
|
) -> event::Status {
|
||||||
let mut children = layout.children().zip(&mut tree.children);
|
let mut children = layout.children().zip(&mut tree.children);
|
||||||
let (base_layout, base_tree) = children.next().unwrap();
|
let (base_layout, base_tree) = children.next().unwrap();
|
||||||
|
let (top_layout, top_tree) = children.next().unwrap();
|
||||||
|
|
||||||
|
if matches!(event, Event::Window(window::Event::RedrawRequested(_)))
|
||||||
|
{
|
||||||
|
let mut count_focused = operation::focusable::count();
|
||||||
|
|
||||||
|
self.top.as_widget_mut().operate(
|
||||||
|
top_tree,
|
||||||
|
top_layout,
|
||||||
|
renderer,
|
||||||
|
&mut operation::black_box(&mut count_focused),
|
||||||
|
);
|
||||||
|
|
||||||
|
self.is_top_focused = match count_focused.finish() {
|
||||||
|
operation::Outcome::Some(count) => count.focused.is_some(),
|
||||||
|
_ => false,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
let top_status = if matches!(
|
let top_status = if matches!(
|
||||||
event,
|
event,
|
||||||
|
|
@ -523,10 +545,9 @@ where
|
||||||
| mouse::Event::ButtonReleased(_)
|
| mouse::Event::ButtonReleased(_)
|
||||||
)
|
)
|
||||||
) || cursor.is_over(layout.bounds())
|
) || cursor.is_over(layout.bounds())
|
||||||
|
|| self.is_top_focused
|
||||||
|| self.is_top_overlay_active
|
|| self.is_top_overlay_active
|
||||||
{
|
{
|
||||||
let (top_layout, top_tree) = children.next().unwrap();
|
|
||||||
|
|
||||||
self.top.as_widget_mut().on_event(
|
self.top.as_widget_mut().on_event(
|
||||||
top_tree,
|
top_tree,
|
||||||
event.clone(),
|
event.clone(),
|
||||||
|
|
@ -612,6 +633,7 @@ where
|
||||||
Element::new(Hover {
|
Element::new(Hover {
|
||||||
base: base.into(),
|
base: base.into(),
|
||||||
top: top.into(),
|
top: top.into(),
|
||||||
|
is_top_focused: false,
|
||||||
is_top_overlay_active: false,
|
is_top_overlay_active: false,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue