pub struct PolylineWidget {
pub points: Vec<Vec3>,
pub colour: [f32; 4],
pub line_width: f32,
pub handle_colour: [f32; 4],
pub hovered_point: Option<usize>,
pub active_point: Option<usize>,
/* private fields */
}Expand description
An interactive polyline widget with N draggable control points.
Unlike crate::SplineWidget, this uses straight line segments between points (no
interpolation). Control points can be added and removed programmatically, and via
double-click when ctx.double_clicked is set by the host.
§Usage
let mut pw = PolylineWidget::new(vec![
glam::Vec3::new(-2.0, 0.0, 0.0),
glam::Vec3::new( 0.0, 1.0, 0.0),
glam::Vec3::new( 2.0, 0.0, 0.0),
]);
// Each frame:
let result = pw.update(&ctx);
fd.scene.polylines.push(pw.polyline_item(PL_ID));
fd.scene.glyphs.push(pw.handle_glyphs(HANDLE_ID, &ctx));Fields§
§points: Vec<Vec3>Control point positions in world space.
colour: [f32; 4]RGBA colour for the line segments.
line_width: f32Line width in pixels.
handle_colour: [f32; 4]RGBA colour for the drag handles.
hovered_point: Option<usize>Index of the currently hovered control point.
active_point: Option<usize>Index of the point actively being dragged.
Implementations§
Source§impl PolylineWidget
impl PolylineWidget
Sourcepub fn new(points: Vec<Vec3>) -> Self
pub fn new(points: Vec<Vec3>) -> Self
Create a new polyline widget. Must have at least two points; extras are ignored if fewer are provided by adding a default second point.
Sourcepub fn remove_point(&mut self, index: usize)
pub fn remove_point(&mut self, index: usize)
Remove the point at index. No-op if the polyline would drop below two points.
Sourcepub fn update(&mut self, ctx: &WidgetContext) -> WidgetResult
pub fn update(&mut self, ctx: &WidgetContext) -> WidgetResult
Process input for this frame. Returns Updated if state changed.
Double-click behavior (requires ctx.double_clicked):
- On a hovered control point: removes that point (minimum 2 enforced).
- On a line segment: inserts a new point at the projected position.
Sourcepub fn polyline_item(&self, id: u64) -> PolylineItem
pub fn polyline_item(&self, id: u64) -> PolylineItem
Build a PolylineItem through all control points.
Sourcepub fn handle_glyphs(&self, id_base: u64, ctx: &WidgetContext) -> GlyphItem
pub fn handle_glyphs(&self, id_base: u64, ctx: &WidgetContext) -> GlyphItem
Build a GlyphItem with sphere handles for each control point.
Hovered and active handles appear brighter (scalar = 1.0 vs 0.2).
id_base is the pick ID for the first point; each subsequent point uses id_base + i.
Auto Trait Implementations§
impl Freeze for PolylineWidget
impl RefUnwindSafe for PolylineWidget
impl Send for PolylineWidget
impl Sync for PolylineWidget
impl Unpin for PolylineWidget
impl UnsafeUnpin for PolylineWidget
impl UnwindSafe for PolylineWidget
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.