Expand clip_rects slightly to allow widgets just on the border

This commit is contained in:
Emil Ernerfeldt 2020-04-22 19:40:22 +02:00
parent 104f2191a0
commit 9b404159c5
2 changed files with 8 additions and 12 deletions

View file

@ -7,7 +7,8 @@ This is the core library crate Emigui. It is fully platform independent without
* [x] Button * [x] Button
* [x] Checkbox * [x] Checkbox
* [x] Radiobutton * [x] Radiobutton
* [x] Slider * [x] Horizontal slider
* [ ] Vertical slider
* [x] Collapsing header region * [x] Collapsing header region
* [x] Tooltip * [x] Tooltip
* [x] Movable/resizable windows * [x] Movable/resizable windows
@ -32,16 +33,7 @@ Add extremely quick animations for some things, maybe 2-3 frames. For instance:
* [x] Separate Region::clip_rect from Region::rect * [x] Separate Region::clip_rect from Region::rect
* [x] Use clip rectangles when painting * [x] Use clip rectangles when painting
* [ ] Use clip rectangles when interacting * [ ] Use clip rectangles when interacting
* [x] Adjust clip rects so edges of child widgets aren't clipped
When drawing children, they are drawn just on the edge of the clip rect.
This means e.g. the leftmost side of a button or slider handle is clipped.
We can fix this in three ways:
* A) Each component minds its bounds, so button offset their position by their outline width + one pixel for AA
* B) Each region enlarges the clip_rect slightly to handle inner children
* C) Each region shrinks its rect slightly so children move further in in child regions (creates unintentional indentation. ugh)
I think A) is the correct solution, but might be tedious to get right for every component. For instance, the outline may grow on mouse-over, but we don't want to move the component as a consequence.
### Other ### Other
* [ ] Generalize Layout so we can create grid layouts etc * [ ] Generalize Layout so we can create grid layouts etc

View file

@ -71,12 +71,16 @@ impl Region {
} }
pub fn child_region(&self, child_rect: Rect) -> Self { pub fn child_region(&self, child_rect: Rect) -> Self {
// Allow child widgets to be just on the border and still have an outline with some thickness
const CLIP_RECT_MARGIN: f32 = 3.0;
Region { Region {
ctx: self.ctx.clone(), ctx: self.ctx.clone(),
layer: self.layer, layer: self.layer,
style: self.style, style: self.style,
id: self.id, id: self.id,
clip_rect: self.clip_rect.intersect(child_rect), clip_rect: self
.clip_rect
.intersect(child_rect.expand(CLIP_RECT_MARGIN)),
desired_rect: child_rect, desired_rect: child_rect,
cursor: child_rect.min(), cursor: child_rect.min(),
bounding_size: vec2(0.0, 0.0), bounding_size: vec2(0.0, 0.0),