diff options
author | 2020-06-05 14:02:29 +0200 | |
---|---|---|
committer | 2020-06-05 14:02:29 +0200 | |
commit | 4dc5bffdfbfb09a017f35c12b484301fcf044876 (patch) | |
tree | 2175e006a72050aaef4789bc1bf8d5513274057f /graphics | |
parent | e8e656b3300093e384771a6083e25e9395bbeb50 (diff) | |
download | iced-4dc5bffdfbfb09a017f35c12b484301fcf044876.tar.gz iced-4dc5bffdfbfb09a017f35c12b484301fcf044876.tar.bz2 iced-4dc5bffdfbfb09a017f35c12b484301fcf044876.zip |
Draft draggable and graphics logic for `TitleBar`
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/src/widget/container.rs | 33 | ||||
-rw-r--r-- | graphics/src/widget/pane_grid.rs | 78 |
2 files changed, 85 insertions, 26 deletions
diff --git a/graphics/src/widget/container.rs b/graphics/src/widget/container.rs index 070cb48b..576062d4 100644 --- a/graphics/src/widget/container.rs +++ b/graphics/src/widget/container.rs @@ -39,20 +39,10 @@ where let (content, mouse_interaction) = content.draw(self, &defaults, content_layout, cursor_position); - if style.background.is_some() || style.border_width > 0 { - let quad = Primitive::Quad { - bounds, - background: style - .background - .unwrap_or(Background::Color(Color::TRANSPARENT)), - border_radius: style.border_radius, - border_width: style.border_width, - border_color: style.border_color, - }; - + if let Some(background) = background(bounds, &style) { ( Primitive::Group { - primitives: vec![quad, content], + primitives: vec![background, content], }, mouse_interaction, ) @@ -61,3 +51,22 @@ where } } } + +pub(crate) fn background( + bounds: Rectangle, + style: &container::Style, +) -> Option<Primitive> { + if style.background.is_none() && style.border_width > 0 { + return None; + } + + Some(Primitive::Quad { + bounds, + background: style + .background + .unwrap_or(Background::Color(Color::TRANSPARENT)), + border_radius: style.border_radius, + border_width: style.border_width, + border_color: style.border_color, + }) +} diff --git a/graphics/src/widget/pane_grid.rs b/graphics/src/widget/pane_grid.rs index 71b1658a..27b4f211 100644 --- a/graphics/src/widget/pane_grid.rs +++ b/graphics/src/widget/pane_grid.rs @@ -35,7 +35,7 @@ where &mut self, defaults: &Self::Defaults, content: &[(Pane, Content<'_, Message, Self>)], - dragging: Option<Pane>, + dragging: Option<(Pane, Point)>, resizing: Option<Axis>, layout: Layout<'_>, cursor_position: Point, @@ -63,32 +63,40 @@ where mouse_interaction = new_mouse_interaction; } - if Some(*id) == dragging { - dragged_pane = Some((i, layout)); + if let Some((dragging, origin)) = dragging { + if *id == dragging { + dragged_pane = Some((i, layout, origin)); + } } primitive }) .collect(); - let primitives = if let Some((index, layout)) = dragged_pane { + let primitives = if let Some((index, layout, origin)) = dragged_pane { let pane = panes.remove(index); let bounds = layout.bounds(); + if let Primitive::Group { primitives } = &pane { + panes.push( + primitives.first().cloned().unwrap_or(Primitive::None), + ); + } + // TODO: Fix once proper layering is implemented. // This is a pretty hacky way to achieve layering. let clip = Primitive::Clip { bounds: Rectangle { - x: cursor_position.x - bounds.width / 2.0, - y: cursor_position.y - bounds.height / 2.0, + x: cursor_position.x - origin.x, + y: cursor_position.y - origin.y, width: bounds.width + 0.5, height: bounds.height + 0.5, }, offset: Vector::new(0, 0), content: Box::new(Primitive::Translate { translation: Vector::new( - cursor_position.x - bounds.x - bounds.width / 2.0, - cursor_position.y - bounds.y - bounds.height / 2.0, + cursor_position.x - bounds.x - origin.x, + cursor_position.y - bounds.y - origin.y, ), content: Box::new(pane), }), @@ -119,48 +127,77 @@ where fn draw_pane<Message>( &mut self, defaults: &Self::Defaults, + bounds: Rectangle, + style_sheet: &Self::Style, title_bar: Option<(&TitleBar<'_, Message, Self>, Layout<'_>)>, body: (&Element<'_, Message, Self>, Layout<'_>), cursor_position: Point, ) -> Self::Output { + let style = style_sheet.style(); let (body, body_layout) = body; let (body_primitive, body_interaction) = body.draw(self, defaults, body_layout, cursor_position); + let background = crate::widget::container::background(bounds, &style); + if let Some((title_bar, title_bar_layout)) = title_bar { + let show_controls = bounds.contains(cursor_position); + let is_over_draggable = + title_bar.is_over_draggable(title_bar_layout, cursor_position); + let (title_bar_primitive, title_bar_interaction) = title_bar.draw( self, defaults, title_bar_layout, cursor_position, + show_controls, ); ( Primitive::Group { - primitives: vec![title_bar_primitive, body_primitive], + primitives: vec![ + background.unwrap_or(Primitive::None), + title_bar_primitive, + body_primitive, + ], }, - if title_bar_interaction > body_interaction { + if is_over_draggable { + mouse::Interaction::Grab + } else if title_bar_interaction > body_interaction { title_bar_interaction } else { body_interaction }, ) } else { - (body_primitive, body_interaction) + ( + if let Some(background) = background { + Primitive::Group { + primitives: vec![background, body_primitive], + } + } else { + body_primitive + }, + body_interaction, + ) } } fn draw_title_bar<Message>( &mut self, defaults: &Self::Defaults, - style: &<Self as iced_native::container::Renderer>::Style, + bounds: Rectangle, + style_sheet: &Self::Style, title: (&Element<'_, Message, Self>, Layout<'_>), controls: Option<(&Element<'_, Message, Self>, Layout<'_>)>, cursor_position: Point, ) -> Self::Output { + let style = style_sheet.style(); let (title, title_layout) = title; + let background = crate::widget::container::background(bounds, &style); + let (title_primitive, _) = title.draw(self, defaults, title_layout, cursor_position); @@ -170,12 +207,25 @@ where ( Primitive::Group { - primitives: vec![title_primitive, controls_primitive], + primitives: vec![ + background.unwrap_or(Primitive::None), + title_primitive, + controls_primitive, + ], }, controls_interaction, ) } else { - (title_primitive, mouse::Interaction::default()) + ( + if let Some(background) = background { + Primitive::Group { + primitives: vec![background, title_primitive], + } + } else { + title_primitive + }, + mouse::Interaction::default(), + ) } } } |