Daylight bar chrome + embedded launcher, v0.7.5 pins #5
1 changed files with 33 additions and 6 deletions
|
|
@ -413,13 +413,40 @@ impl WorkspaceTrail {
|
||||||
|
|
||||||
fn from_geom(&self, from: Option<>k4::Button>) -> Option<Geom> {
|
fn from_geom(&self, from: Option<>k4::Button>) -> Option<Geom> {
|
||||||
let st = self.inner.borrow();
|
let st = self.inner.borrow();
|
||||||
// A leftover mid-stretch can be as wide as the whole row — never
|
let live = if self.pill.is_visible() && st.geom.w > 0.5 {
|
||||||
// treat that as the start of the next animation.
|
Some(st.geom)
|
||||||
if self.pill.is_visible() && st.geom.w > 0.5 && st.geom.w <= MAX_CHIP_W {
|
} else {
|
||||||
return Some(st.geom);
|
None
|
||||||
}
|
};
|
||||||
drop(st);
|
drop(st);
|
||||||
from.and_then(|b| button_geom(b, &self.host).map(inset_pill))
|
|
||||||
|
let natural = from.and_then(|b| button_geom(b, &self.host).map(inset_pill));
|
||||||
|
|
||||||
|
// Continuity without accumulation.
|
||||||
|
//
|
||||||
|
// Interrupting an in-flight stretch should carry the pill's CURRENT
|
||||||
|
// POSITION into the next animation, so a rapid sequence of switches
|
||||||
|
// reads as one continuous movement. It must not carry the current
|
||||||
|
// WIDTH: mid-stretch the pill deliberately spans both the old and new
|
||||||
|
// buttons, and `ease_overshoot` (c = 1.4) pushes it wider still past
|
||||||
|
// the target. Feeding that span back in as the next `from` made each
|
||||||
|
// interrupted switch start wider than the last, so spamming workspace
|
||||||
|
// switches grew the pill until it hit MAX_CHIP_W — which only capped
|
||||||
|
// the runaway, it never stopped the compounding.
|
||||||
|
//
|
||||||
|
// Taking position from the live geometry and width from the source
|
||||||
|
// button's natural size keeps the motion continuous while making width
|
||||||
|
// a pure function of which button we started from.
|
||||||
|
match (live, natural) {
|
||||||
|
(Some(live), Some(natural)) => Some(Geom {
|
||||||
|
x: live.x,
|
||||||
|
y: live.y,
|
||||||
|
w: natural.w,
|
||||||
|
h: natural.h,
|
||||||
|
}),
|
||||||
|
(Some(live), None) if live.w <= MAX_CHIP_W => Some(live),
|
||||||
|
(_, natural) => natural,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue