[window] visually indicate which windows can be resized

This commit is contained in:
Emil Ernerfeldt 2020-08-26 20:40:25 +02:00
parent 9ed6a5f5ab
commit a764b0d23f
3 changed files with 31 additions and 9 deletions

View file

@ -151,7 +151,7 @@ impl Resize {
let corner_interact = if self.resizable { let corner_interact = if self.resizable {
// Resize-corner: // Resize-corner:
let corner_size = Vec2::splat(16.0); // TODO: style let corner_size = Vec2::splat(ui.style().resize_corner_size);
let corner_rect = Rect::from_min_size( let corner_rect = Rect::from_min_size(
position + state.desired_size + self.handle_offset - corner_size, position + state.desired_size + self.handle_offset - corner_size,
corner_size, corner_size,
@ -274,21 +274,24 @@ impl Resize {
} }
} }
fn paint_resize_corner(ui: &mut Ui, interact: &InteractInfo) { use crate::paint::LineStyle;
pub fn paint_resize_corner(ui: &mut Ui, interact: &InteractInfo) {
let color = ui.style().interact(interact).stroke_color; let color = ui.style().interact(interact).stroke_color;
let width = ui.style().interact(interact).stroke_width; let width = ui.style().interact(interact).stroke_width;
paint_resize_corner_with_style(ui, &interact.rect, LineStyle::new(width, color));
}
pub fn paint_resize_corner_with_style(ui: &mut Ui, rect: &Rect, style: LineStyle) {
let painter = ui.painter(); let painter = ui.painter();
let corner = painter.round_pos_to_pixels(rect.right_bottom());
let corner = painter.round_pos_to_pixels(interact.rect.right_bottom());
let mut w = 2.0; let mut w = 2.0;
while w < 12.0 { while w < 12.0 {
painter.add(paint::PaintCmd::line_segment( painter.add(paint::PaintCmd::LineSegment {
[pos2(corner.x - w, corner.y), pos2(corner.x, corner.y - w)], points: [pos2(corner.x - w, corner.y), pos2(corner.x, corner.y - w)],
color, style,
width, });
));
w += 4.0; w += 4.0;
} }
} }

View file

@ -235,6 +235,7 @@ impl<'open> Window<'open> {
{ {
// BEGIN FRAME -------------------------------- // BEGIN FRAME --------------------------------
let frame_outline = frame.outline;
let mut frame = frame.begin(&mut area_content_ui); let mut frame = frame.begin(&mut area_content_ui);
let default_expanded = true; let default_expanded = true;
@ -269,6 +270,12 @@ impl<'open> Window<'open> {
.map(|ri| ri.1); .map(|ri| ri.1);
let outer_rect = frame.end(&mut area_content_ui); let outer_rect = frame.end(&mut area_content_ui);
if possible.resizable {
// TODO: draw BEHIND contents ?
paint_resize_corner(&mut area_content_ui, outer_rect, frame_outline);
}
// END FRAME -------------------------------- // END FRAME --------------------------------
title_bar.ui( title_bar.ui(
@ -307,6 +314,15 @@ impl<'open> Window<'open> {
} }
} }
fn paint_resize_corner(ui: &mut Ui, outer_rect: Rect, frame_outline: Option<LineStyle>) {
let corner_size = Vec2::splat(ui.style().resize_corner_size);
let handle_offset = -Vec2::splat(2.0);
let corner_rect =
Rect::from_min_size(outer_rect.max - corner_size + handle_offset, corner_size);
let outline = frame_outline.unwrap_or_else(|| LineStyle::new(1.0, color::GRAY));
crate::resize::paint_resize_corner_with_style(ui, &corner_rect, outline);
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug)]

View file

@ -32,6 +32,8 @@ pub struct Style {
/// Mouse must be the close to the corner of a window to resize /// Mouse must be the close to the corner of a window to resize
pub resize_interact_radius_corner: f32, pub resize_interact_radius_corner: f32,
pub resize_corner_size: f32,
// ----------------------------------------------- // -----------------------------------------------
// Purely visual: // Purely visual:
pub interact: Interact, pub interact: Interact,
@ -82,6 +84,7 @@ impl Default for Style {
start_icon_width: 14.0, start_icon_width: 14.0,
resize_interact_radius_side: 5.0, resize_interact_radius_side: 5.0,
resize_interact_radius_corner: 10.0, resize_interact_radius_corner: 10.0,
resize_corner_size: 16.0,
interact: Default::default(), interact: Default::default(),
text_color: gray(160, 255), text_color: gray(160, 255),
line_width: 1.0, line_width: 1.0,