From 45564f952b4aa8082393118a6ab118c211a6ef79 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Sun, 3 May 2020 13:28:47 +0200 Subject: [PATCH] Kinetic windows --- emigui/README.md | 2 +- emigui/src/containers/floating.rs | 20 +++- emigui/src/context.rs | 31 ++++- emigui/src/emigui.rs | 47 +------- emigui/src/input.rs | 193 ++++++++++++++++++++++++++++++ emigui/src/lib.rs | 4 + emigui/src/movement_tracker.rs | 120 +++++++++++++++++++ emigui/src/texture_atlas.rs | 5 +- emigui/src/types.rs | 141 +--------------------- emigui/src/widgets.rs | 4 +- example_glium/src/main.rs | 34 +++--- example_wasm/src/lib.rs | 26 ++-- 12 files changed, 398 insertions(+), 229 deletions(-) create mode 100644 emigui/src/input.rs create mode 100644 emigui/src/movement_tracker.rs diff --git a/emigui/README.md b/emigui/README.md index effb9611..97928b7d 100644 --- a/emigui/README.md +++ b/emigui/README.md @@ -12,7 +12,7 @@ This is the core library crate Emigui. It is fully platform independent without * [x] Collapsing header region * [x] Tooltip * [x] Movable/resizable windows - * [ ] Kinetic windows + * [x] Kinetic windows * [ ] BUG FIX: Don't catch clicks on closed windows * [ ] Scroll areas * [x] Vertical scrolling diff --git a/emigui/src/containers/floating.rs b/emigui/src/containers/floating.rs index 028756f9..e6d176e7 100644 --- a/emigui/src/containers/floating.rs +++ b/emigui/src/containers/floating.rs @@ -14,6 +14,10 @@ pub(crate) struct State { /// Last know size. Used for catching clicks. pub size: Vec2, + + /// You can throw a Floating thing. It's fun. + #[serde(skip)] + pub vel: Vec2, } // TODO: rename Floating to something else. Area? @@ -56,6 +60,7 @@ impl Floating { let state = State { pos: default_pos, size: Vec2::zero(), + vel: Vec2::zero(), }; (state, true) } @@ -75,8 +80,21 @@ impl Floating { let clip_rect = Rect::everything(); let move_interact = ctx.interact(layer, &clip_rect, &rect, Some(id.with("move"))); + let input = ctx.input(); if move_interact.active { - state.pos += ctx.input().mouse_move; + state.pos += input.mouse_move; + state.vel = input.mouse_velocity; + } else { + let stop_speed = 20.0; // Pixels per second. + let friction_coeff = 1000.0; // Pixels per second squared. + + let friction = friction_coeff * input.dt; + if friction > state.vel.length() || state.vel.length() < stop_speed { + state.vel = Vec2::zero(); + } else { + state.vel -= friction * state.vel.normalized(); + state.pos += state.vel * input.dt; + } } // Constrain to screen: diff --git a/emigui/src/context.rs b/emigui/src/context.rs index 44825368..63090332 100644 --- a/emigui/src/context.rs +++ b/emigui/src/context.rs @@ -10,8 +10,9 @@ pub struct Context { pub(crate) style: Mutex