mirror of
https://github.com/danbulant/cushy
synced 2026-06-19 06:21:15 +00:00
Moved arc path generation to Kludgine
This commit is contained in:
parent
c4151d649c
commit
87fa4a3478
4 changed files with 37 additions and 75 deletions
36
Cargo.lock
generated
36
Cargo.lock
generated
|
|
@ -623,7 +623,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "figures"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/khonsulabs/figures#312f390a33025c902e94124cfab10c3dafdfb5f1"
|
||||
source = "git+https://github.com/khonsulabs/figures#5b84202e60b52cc2c57c0e49031fe1a0ff87b9ec"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
"euclid",
|
||||
|
|
@ -810,7 +810,6 @@ dependencies = [
|
|||
"interner",
|
||||
"kempt",
|
||||
"kludgine",
|
||||
"lyon_geom",
|
||||
"palette",
|
||||
"pollster",
|
||||
"rand",
|
||||
|
|
@ -1063,7 +1062,7 @@ checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
|
|||
[[package]]
|
||||
name = "kludgine"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/khonsulabs/kludgine#a9c9335df7c40f695c82b4ac74c63330d8021885"
|
||||
source = "git+https://github.com/khonsulabs/kludgine#32b7e160966c58d129657f0762ecb79a4ce482a3"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"alot",
|
||||
|
|
@ -1090,9 +1089,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
|||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.150"
|
||||
version = "0.2.151"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
|
||||
checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4"
|
||||
|
||||
[[package]]
|
||||
name = "libloading"
|
||||
|
|
@ -1303,12 +1302,6 @@ dependencies = [
|
|||
"paste",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "minimal-lexical"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
|
||||
|
||||
[[package]]
|
||||
name = "miniz_oxide"
|
||||
version = "0.7.1"
|
||||
|
|
@ -1391,16 +1384,6 @@ dependencies = [
|
|||
"memoffset",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nom"
|
||||
version = "7.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"minimal-lexical",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nu-ansi-term"
|
||||
version = "0.46.0"
|
||||
|
|
@ -1753,9 +1736,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "profiling"
|
||||
version = "1.0.11"
|
||||
version = "1.0.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f89dff0959d98c9758c88826cc002e2c3d0b9dfac4139711d1f30de442f1139b"
|
||||
checksum = "1de09527cd2ea2c2d59fb6c2f8c1ab8c71709ed9d1b6d60b0e1c9fbb6fdcb33c"
|
||||
|
||||
[[package]]
|
||||
name = "quick-xml"
|
||||
|
|
@ -3074,12 +3057,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "xcursor"
|
||||
version = "0.3.4"
|
||||
version = "0.3.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7"
|
||||
dependencies = [
|
||||
"nom",
|
||||
]
|
||||
checksum = "6a0ccd7b4a5345edfcd0c3535718a4e9ff7798ffc536bb5b5a0e26ff84732911"
|
||||
|
||||
[[package]]
|
||||
name = "xkbcommon-dl"
|
||||
|
|
|
|||
|
|
@ -29,7 +29,6 @@ gooey-macros = { version = "0.1.0", path = "gooey-macros" }
|
|||
arboard = "3.2.1"
|
||||
zeroize = "1.6.1"
|
||||
unicode-segmentation = "1.10.1"
|
||||
lyon_geom = "1.0.4"
|
||||
|
||||
|
||||
# [patch."https://github.com/khonsulabs/kludgine"]
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ use alot::{LotId, Lots};
|
|||
use intentional::Cast;
|
||||
use kempt::Set;
|
||||
use kludgine::figures::units::{Lp, Px, UPx};
|
||||
use kludgine::figures::{Ranged, UnscaledUnit, Zero};
|
||||
use kludgine::figures::{Angle, Ranged, UnscaledUnit, Zero};
|
||||
use kludgine::Color;
|
||||
|
||||
use crate::animation::easings::Linear;
|
||||
|
|
@ -873,6 +873,14 @@ impl LinearInterpolate for f64 {
|
|||
}
|
||||
}
|
||||
|
||||
impl LinearInterpolate for Angle {
|
||||
fn lerp(&self, target: &Self, percent: f32) -> Self {
|
||||
let this = self.into_degrees::<f32>();
|
||||
let delta = target.into_degrees::<f32>() - this;
|
||||
Self::degrees_f(this + delta * percent)
|
||||
}
|
||||
}
|
||||
|
||||
impl LinearInterpolate for bool {
|
||||
fn lerp(&self, target: &Self, percent: f32) -> Self {
|
||||
if percent >= 0.5 {
|
||||
|
|
|
|||
|
|
@ -4,10 +4,9 @@ use std::ops::RangeInclusive;
|
|||
use std::time::Duration;
|
||||
|
||||
use kludgine::figures::units::Px;
|
||||
use kludgine::figures::{FloatConversion, Point, Ranged, ScreenScale, Zero};
|
||||
use kludgine::shapes::{Path, PathEvent, StrokeOptions};
|
||||
use kludgine::figures::{Angle, Point, Ranged, ScreenScale, Size, Zero};
|
||||
use kludgine::shapes::{Path, StrokeOptions};
|
||||
use kludgine::Color;
|
||||
use lyon_geom::Arc;
|
||||
|
||||
use crate::animation::easings::{EaseInQuadradic, EaseOutQuadradic};
|
||||
use crate::animation::{
|
||||
|
|
@ -70,7 +69,7 @@ impl MakeWidgetWithId for ProgressBar {
|
|||
let mut indeterminant_animation = None;
|
||||
|
||||
let (slider, degree_offset) = if self.spinner {
|
||||
let degree_offset = Dynamic::new(0.);
|
||||
let degree_offset = Dynamic::new(Angle::degrees(270));
|
||||
(
|
||||
Spinner {
|
||||
start: start.clone(),
|
||||
|
|
@ -124,7 +123,7 @@ fn update_progress_bar(
|
|||
indeterminant_animation: &mut Option<IndeterminantAnimations>,
|
||||
start: &Dynamic<ZeroToOne>,
|
||||
end: &Dynamic<ZeroToOne>,
|
||||
degree_offset: Option<&Dynamic<f32>>,
|
||||
degree_offset: Option<&Dynamic<Angle>>,
|
||||
) {
|
||||
match progress {
|
||||
Progress::Indeterminant => {
|
||||
|
|
@ -164,11 +163,11 @@ fn update_progress_bar(
|
|||
.spawn(),
|
||||
_degree_offset: degree_offset.map(|degree_offset| {
|
||||
degree_offset
|
||||
.transition_to(0.)
|
||||
.transition_to(Angle::MIN)
|
||||
.immediately()
|
||||
.and_then(
|
||||
degree_offset
|
||||
.transition_to(359.9)
|
||||
.transition_to(Angle::MAX)
|
||||
.over(Duration::from_secs_f32(1.66)),
|
||||
)
|
||||
.cycle()
|
||||
|
|
@ -180,7 +179,7 @@ fn update_progress_bar(
|
|||
Progress::Percent(value) => {
|
||||
let _stopped_animation = indeterminant_animation.take();
|
||||
if let Some(degree_offset) = degree_offset {
|
||||
degree_offset.set(0.);
|
||||
degree_offset.set(Angle::degrees(270));
|
||||
}
|
||||
start.set(ZeroToOne::ZERO);
|
||||
end.set(value);
|
||||
|
|
@ -303,52 +302,28 @@ where
|
|||
pub struct Spinner {
|
||||
start: Dynamic<ZeroToOne>,
|
||||
end: Dynamic<ZeroToOne>,
|
||||
degree_offset: Dynamic<f32>,
|
||||
degree_offset: Dynamic<Angle>,
|
||||
}
|
||||
|
||||
impl Spinner {
|
||||
fn draw_arc(
|
||||
track_size: Px,
|
||||
radius: f32,
|
||||
degree_offset: f32,
|
||||
radius: Px,
|
||||
degree_offset: Angle,
|
||||
start: ZeroToOne,
|
||||
sweep: ZeroToOne,
|
||||
color: Color,
|
||||
context: &mut crate::context::GraphicsContext<'_, '_, '_, '_, '_>,
|
||||
) {
|
||||
let mut events = Vec::<PathEvent<Px>>::new();
|
||||
Arc {
|
||||
center: lyon_geom::point(
|
||||
radius + track_size.into_float() / 2.,
|
||||
radius + track_size.into_float() / 2.,
|
||||
),
|
||||
radii: lyon_geom::vector(radius, radius),
|
||||
start_angle: lyon_geom::Angle::degrees(*start * 360. - 90. + degree_offset),
|
||||
sweep_angle: lyon_geom::Angle::degrees(*sweep * 360.),
|
||||
x_rotation: lyon_geom::Angle::zero(),
|
||||
}
|
||||
.for_each_cubic_bezier(&mut |segment| {
|
||||
if events.is_empty() {
|
||||
events.push(PathEvent::Begin {
|
||||
at: Point::new(segment.from.x, segment.from.y).cast(),
|
||||
texture: Point::ZERO,
|
||||
});
|
||||
}
|
||||
events.push(PathEvent::Cubic {
|
||||
ctrl1: Point::new(segment.ctrl1.x, segment.ctrl1.y).cast(),
|
||||
ctrl2: Point::new(segment.ctrl2.x, segment.ctrl2.y).cast(),
|
||||
to: Point::new(segment.to.x, segment.to.y).cast(),
|
||||
texture: Point::ZERO,
|
||||
});
|
||||
});
|
||||
let full = sweep == ZeroToOne::ONE;
|
||||
if !events.is_empty() {
|
||||
events.push(PathEvent::End { close: full });
|
||||
if sweep > 0. {
|
||||
context.gfx.draw_shape(
|
||||
&events
|
||||
.into_iter()
|
||||
.collect::<Path<Px, false>>()
|
||||
.stroke(StrokeOptions::px_wide(track_size).colored(color)),
|
||||
&Path::arc(
|
||||
Point::squared(radius + track_size / 2),
|
||||
Size::squared(radius),
|
||||
Angle::degrees_f(*start * 360.) + degree_offset,
|
||||
Angle::degrees_f(*sweep * 360.),
|
||||
)
|
||||
.stroke(StrokeOptions::px_wide(track_size).colored(color)),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -360,8 +335,8 @@ impl Widget for Spinner {
|
|||
let start = self.start.get_tracking_refresh(context);
|
||||
let end = self.end.get_tracking_refresh(context);
|
||||
let size = context.gfx.region().size;
|
||||
let render_size = size.width.min(size.height).into_float();
|
||||
let radius = render_size / 2. - track_size.into_float();
|
||||
let render_size = size.width.min(size.height);
|
||||
let radius = render_size / 2 - track_size;
|
||||
let degree_offset = self.degree_offset.get();
|
||||
|
||||
if start > ZeroToOne::ZERO {
|
||||
|
|
|
|||
Loading…
Reference in a new issue