polyhorn_yoga/
lib.rs

1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4
5extern crate ordered_float;
6#[cfg(feature = "serde_support")]
7extern crate serde;
8#[macro_use]
9#[cfg(feature = "serde_support")]
10extern crate serde_derive;
11
12// API created by bindgen
13mod internal {
14	#![allow(dead_code)]
15	include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
16	pub use self::root::*;
17}
18
19// Public re-exports of Yoga enums
20mod ffi_types {
21	pub mod align;
22	pub mod config_ref;
23	pub mod dimension;
24	pub mod direction;
25	pub mod display;
26	pub mod edge;
27	pub mod flex_direction;
28	pub mod justify;
29	pub mod log_level;
30	pub mod measure_mode;
31	pub mod node_ref;
32	pub mod node_type;
33	pub mod overflow;
34	pub mod position_type;
35	pub mod print_options;
36	pub mod size;
37	pub mod style_unit;
38	pub mod undefined;
39	pub mod wrap;
40}
41
42pub mod prelude;
43pub mod traits;
44pub mod types;
45
46use std::any::Any;
47pub use types::*;
48
49#[repr(C)]
50#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
51pub struct Config {
52	inner_config: ConfigRef,
53}
54
55#[repr(C)]
56#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
57pub struct Node {
58	inner_node: NodeRef,
59}
60
61impl Config {
62	pub fn new() -> Config {
63		Config {
64			inner_config: unsafe { internal::YGConfigNew() },
65		}
66	}
67}
68
69impl Node {
70	pub fn new() -> Node {
71		Node {
72			inner_node: unsafe { internal::YGNodeNew() },
73		}
74	}
75
76	pub fn new_with_config(config: &mut Config) -> Node {
77		Node {
78			inner_node: unsafe { internal::YGNodeNewWithConfig(config.inner_config) },
79		}
80	}
81
82	pub fn reset(&mut self) {
83		unsafe {
84			internal::YGNodeReset(self.inner_node);
85		}
86	}
87
88	pub fn mark_dirty(&mut self) {
89		unsafe {
90			internal::YGNodeMarkDirty(self.inner_node);
91		}
92	}
93
94	pub fn apply_styles<'a, I>(&mut self, styles: I)
95	where
96		I: IntoIterator<Item = &'a FlexStyle>,
97	{
98		for style in styles {
99			self.apply_style(style);
100		}
101	}
102
103	pub fn apply_style(&mut self, style: &FlexStyle) {
104		use FlexStyle::*;
105
106		match *style {
107			AlignContent(align) => self.set_align_content(align),
108			AlignItems(align) => self.set_align_items(align),
109			AlignSelf(align) => self.set_align_self(align),
110			AspectRatio(a) => self.set_aspect_ratio(a.into_inner()),
111			BorderBottom(b) => self.set_border(Edge::Bottom, b.into_inner()),
112			BorderEnd(b) => self.set_border(Edge::End, b.into_inner()),
113			BorderLeft(b) => self.set_border(Edge::Left, b.into_inner()),
114			BorderRight(b) => self.set_border(Edge::Right, b.into_inner()),
115			BorderStart(b) => self.set_border(Edge::Start, b.into_inner()),
116			BorderTop(b) => self.set_border(Edge::Top, b.into_inner()),
117			Border(b) => self.set_border(Edge::All, b.into_inner()),
118			Bottom(b) => self.set_position(Edge::Bottom, b),
119			Display(d) => self.set_display(d),
120			End(e) => self.set_position(Edge::End, e),
121			Flex(f) => self.set_flex(f.into_inner()),
122			FlexBasis(f) => self.set_flex_basis(f),
123			FlexGrow(f) => self.set_flex_grow(f.into_inner()),
124			FlexDirection(flex_direction) => self.set_flex_direction(flex_direction),
125			FlexShrink(f) => self.set_flex_shrink(f.into_inner()),
126			FlexWrap(wrap) => self.set_flex_wrap(wrap),
127			Height(h) => self.set_height(h),
128			JustifyContent(justify) => self.set_justify_content(justify),
129			Left(l) => self.set_position(Edge::Left, l),
130			Margin(m) => self.set_margin(Edge::All, m),
131			MarginBottom(m) => self.set_margin(Edge::Bottom, m),
132			MarginEnd(m) => self.set_margin(Edge::End, m),
133			MarginHorizontal(m) => self.set_margin(Edge::Horizontal, m),
134			MarginLeft(m) => self.set_margin(Edge::Left, m),
135			MarginRight(m) => self.set_margin(Edge::Right, m),
136			MarginStart(m) => self.set_margin(Edge::Start, m),
137			MarginTop(m) => self.set_margin(Edge::Top, m),
138			MarginVertical(m) => self.set_margin(Edge::Vertical, m),
139			MaxHeight(h) => self.set_max_height(h),
140			MaxWidth(w) => self.set_max_width(w),
141			MinHeight(h) => self.set_min_height(h),
142			MinWidth(w) => self.set_min_width(w),
143			Overflow(o) => self.set_overflow(o),
144			Padding(p) => self.set_padding(Edge::All, p),
145			PaddingBottom(p) => self.set_padding(Edge::Bottom, p),
146			PaddingEnd(p) => self.set_padding(Edge::End, p),
147			PaddingHorizontal(p) => self.set_padding(Edge::Horizontal, p),
148			PaddingLeft(p) => self.set_padding(Edge::Left, p),
149			PaddingRight(p) => self.set_padding(Edge::Right, p),
150			PaddingStart(p) => self.set_padding(Edge::Start, p),
151			PaddingTop(p) => self.set_padding(Edge::Top, p),
152			PaddingVertical(p) => self.set_padding(Edge::Vertical, p),
153			Position(position_type) => self.set_position_type(position_type),
154			Right(r) => self.set_position(Edge::Right, r),
155			Start(s) => self.set_position(Edge::Start, s),
156			Top(t) => self.set_position(Edge::Top, t),
157			Width(w) => self.set_width(w),
158		}
159	}
160
161	pub fn insert_child(&mut self, child: &mut Node, index: u32) {
162		unsafe {
163			internal::YGNodeInsertChild(self.inner_node, child.inner_node, index);
164		}
165	}
166
167	pub fn remove_child(&mut self, child: &mut Node) {
168		unsafe {
169			internal::YGNodeRemoveChild(self.inner_node, child.inner_node);
170		}
171	}
172
173	pub fn child_count(&self) -> u32 {
174		unsafe { internal::YGNodeGetChildCount(self.inner_node) }
175	}
176
177	pub fn set_direction(&mut self, direction: Direction) {
178		unsafe {
179			internal::YGNodeStyleSetDirection(
180				self.inner_node,
181				internal::YGDirection::from(direction),
182			);
183		}
184	}
185
186	pub fn set_flex_direction(&mut self, direction: FlexDirection) {
187		unsafe {
188			internal::YGNodeStyleSetFlexDirection(
189				self.inner_node,
190				internal::YGFlexDirection::from(direction),
191			);
192		}
193	}
194
195	pub fn set_justify_content(&mut self, justify: Justify) {
196		unsafe {
197			internal::YGNodeStyleSetJustifyContent(
198				self.inner_node,
199				internal::YGJustify::from(justify),
200			);
201		}
202	}
203
204	pub fn set_align_content(&mut self, align: Align) {
205		unsafe {
206			internal::YGNodeStyleSetAlignContent(self.inner_node, internal::YGAlign::from(align));
207		}
208	}
209
210	pub fn set_align_items(&mut self, align: Align) {
211		unsafe {
212			internal::YGNodeStyleSetAlignItems(self.inner_node, internal::YGAlign::from(align));
213		}
214	}
215
216	pub fn set_align_self(&mut self, align: Align) {
217		unsafe {
218			internal::YGNodeStyleSetAlignSelf(self.inner_node, internal::YGAlign::from(align));
219		}
220	}
221
222	pub fn set_position_type(&mut self, position_type: PositionType) {
223		unsafe {
224			internal::YGNodeStyleSetPositionType(
225				self.inner_node,
226				internal::YGPositionType::from(position_type),
227			);
228		}
229	}
230
231	pub fn set_position(&mut self, edge: Edge, position: StyleUnit) {
232		unsafe {
233			match position {
234				StyleUnit::UndefinedValue => internal::YGNodeStyleSetPosition(
235					self.inner_node,
236					internal::YGEdge::from(edge),
237					Undefined,
238				),
239				StyleUnit::Point(val) => internal::YGNodeStyleSetPosition(
240					self.inner_node,
241					internal::YGEdge::from(edge),
242					val.into_inner(),
243				),
244				StyleUnit::Percent(val) => internal::YGNodeStyleSetPositionPercent(
245					self.inner_node,
246					internal::YGEdge::from(edge),
247					val.into_inner(),
248				),
249				// auto is not a valid value for position
250				StyleUnit::Auto => internal::YGNodeStyleSetPosition(
251					self.inner_node,
252					internal::YGEdge::from(edge),
253					Undefined,
254				),
255			}
256		}
257	}
258
259	pub fn set_flex_wrap(&mut self, wrap: Wrap) {
260		unsafe {
261			internal::YGNodeStyleSetFlexWrap(self.inner_node, internal::YGWrap::from(wrap));
262		}
263	}
264
265	pub fn set_overflow(&mut self, overflow: Overflow) {
266		unsafe {
267			internal::YGNodeStyleSetOverflow(self.inner_node, internal::YGOverflow::from(overflow));
268		}
269	}
270
271	pub fn set_flex(&mut self, flex: f32) {
272		unsafe {
273			internal::YGNodeStyleSetFlex(self.inner_node, flex);
274		}
275	}
276
277	pub fn set_flex_grow(&mut self, flex_grow: f32) {
278		unsafe {
279			internal::YGNodeStyleSetFlexGrow(self.inner_node, flex_grow);
280		}
281	}
282
283	pub fn set_flex_shrink(&mut self, flex_shrink: f32) {
284		unsafe {
285			internal::YGNodeStyleSetFlexShrink(self.inner_node, flex_shrink);
286		}
287	}
288
289	pub fn set_flex_basis(&mut self, flex_basis: StyleUnit) {
290		unsafe {
291			match flex_basis {
292				StyleUnit::UndefinedValue => {
293					internal::YGNodeStyleSetFlexBasis(self.inner_node, Undefined)
294				}
295				StyleUnit::Point(val) => {
296					internal::YGNodeStyleSetFlexBasis(self.inner_node, val.into_inner())
297				}
298				StyleUnit::Percent(val) => {
299					internal::YGNodeStyleSetFlexBasisPercent(self.inner_node, val.into_inner())
300				}
301				StyleUnit::Auto => internal::YGNodeStyleSetFlexBasisAuto(self.inner_node),
302			}
303		}
304	}
305
306	pub fn set_edge_position(&mut self, edge: Edge, position: f32) {
307		unsafe {
308			internal::YGNodeStyleSetPosition(
309				self.inner_node,
310				internal::YGEdge::from(edge),
311				position,
312			);
313		}
314	}
315
316	pub fn set_margin(&mut self, edge: Edge, margin: StyleUnit) {
317		unsafe {
318			match margin {
319				StyleUnit::UndefinedValue => internal::YGNodeStyleSetMargin(
320					self.inner_node,
321					internal::YGEdge::from(edge),
322					Undefined,
323				),
324				StyleUnit::Point(val) => internal::YGNodeStyleSetMargin(
325					self.inner_node,
326					internal::YGEdge::from(edge),
327					val.into_inner(),
328				),
329				StyleUnit::Percent(val) => internal::YGNodeStyleSetMarginPercent(
330					self.inner_node,
331					internal::YGEdge::from(edge),
332					val.into_inner(),
333				),
334				StyleUnit::Auto => internal::YGNodeStyleSetMarginAuto(
335					self.inner_node,
336					internal::YGEdge::from(edge),
337				),
338			}
339		}
340	}
341
342	pub fn set_padding(&mut self, edge: Edge, padding: StyleUnit) {
343		unsafe {
344			match padding {
345				StyleUnit::UndefinedValue => internal::YGNodeStyleSetPadding(
346					self.inner_node,
347					internal::YGEdge::from(edge),
348					Undefined,
349				),
350				StyleUnit::Point(val) => internal::YGNodeStyleSetPadding(
351					self.inner_node,
352					internal::YGEdge::from(edge),
353					val.into_inner(),
354				),
355				StyleUnit::Percent(val) => internal::YGNodeStyleSetPaddingPercent(
356					self.inner_node,
357					internal::YGEdge::from(edge),
358					val.into_inner(),
359				),
360				// auto is not a valid value for padding
361				StyleUnit::Auto => internal::YGNodeStyleSetPadding(
362					self.inner_node,
363					internal::YGEdge::from(edge),
364					Undefined,
365				),
366			}
367		}
368	}
369
370	pub fn set_border(&mut self, edge: Edge, border: f32) {
371		unsafe {
372			internal::YGNodeStyleSetBorder(self.inner_node, internal::YGEdge::from(edge), border);
373		}
374	}
375
376	pub fn set_width(&mut self, width: StyleUnit) {
377		unsafe {
378			match width {
379				StyleUnit::UndefinedValue => {
380					internal::YGNodeStyleSetWidth(self.inner_node, Undefined)
381				}
382				StyleUnit::Point(val) => {
383					internal::YGNodeStyleSetWidth(self.inner_node, val.into_inner())
384				}
385				StyleUnit::Percent(val) => {
386					internal::YGNodeStyleSetWidthPercent(self.inner_node, val.into_inner())
387				}
388				StyleUnit::Auto => internal::YGNodeStyleSetWidthAuto(self.inner_node),
389			}
390		}
391	}
392
393	pub fn set_height(&mut self, height: StyleUnit) {
394		unsafe {
395			match height {
396				StyleUnit::UndefinedValue => {
397					internal::YGNodeStyleSetHeight(self.inner_node, Undefined)
398				}
399				StyleUnit::Point(val) => {
400					internal::YGNodeStyleSetHeight(self.inner_node, val.into_inner())
401				}
402				StyleUnit::Percent(val) => {
403					internal::YGNodeStyleSetHeightPercent(self.inner_node, val.into_inner())
404				}
405				StyleUnit::Auto => internal::YGNodeStyleSetHeightAuto(self.inner_node),
406			}
407		}
408	}
409
410	pub fn set_min_width(&mut self, min_width: StyleUnit) {
411		unsafe {
412			match min_width {
413				StyleUnit::UndefinedValue => {
414					internal::YGNodeStyleSetMinWidth(self.inner_node, Undefined)
415				}
416				StyleUnit::Point(val) => {
417					internal::YGNodeStyleSetMinWidth(self.inner_node, val.into_inner())
418				}
419				StyleUnit::Percent(val) => {
420					internal::YGNodeStyleSetMinWidthPercent(self.inner_node, val.into_inner())
421				}
422				// auto is not a valid value for min_width
423				StyleUnit::Auto => internal::YGNodeStyleSetMinWidth(self.inner_node, Undefined),
424			}
425		}
426	}
427
428	pub fn set_min_height(&mut self, min_height: StyleUnit) {
429		unsafe {
430			match min_height {
431				StyleUnit::UndefinedValue => {
432					internal::YGNodeStyleSetMinHeight(self.inner_node, Undefined)
433				}
434				StyleUnit::Point(val) => {
435					internal::YGNodeStyleSetMinHeight(self.inner_node, val.into_inner())
436				}
437				StyleUnit::Percent(val) => {
438					internal::YGNodeStyleSetMinHeightPercent(self.inner_node, val.into_inner())
439				}
440				// auto is not a valid value for min_height
441				StyleUnit::Auto => internal::YGNodeStyleSetMinHeight(self.inner_node, Undefined),
442			}
443		}
444	}
445
446	pub fn set_max_width(&mut self, max_width: StyleUnit) {
447		unsafe {
448			match max_width {
449				StyleUnit::UndefinedValue => {
450					internal::YGNodeStyleSetMaxWidth(self.inner_node, Undefined)
451				}
452				StyleUnit::Point(val) => {
453					internal::YGNodeStyleSetMaxWidth(self.inner_node, val.into_inner())
454				}
455				StyleUnit::Percent(val) => {
456					internal::YGNodeStyleSetMaxWidthPercent(self.inner_node, val.into_inner())
457				}
458				// auto is not a valid value for max_width
459				StyleUnit::Auto => internal::YGNodeStyleSetMaxWidth(self.inner_node, Undefined),
460			}
461		}
462	}
463
464	pub fn set_max_height(&mut self, max_height: StyleUnit) {
465		unsafe {
466			match max_height {
467				StyleUnit::UndefinedValue => {
468					internal::YGNodeStyleSetMaxHeight(self.inner_node, Undefined)
469				}
470				StyleUnit::Point(val) => {
471					internal::YGNodeStyleSetMaxHeight(self.inner_node, val.into_inner())
472				}
473				StyleUnit::Percent(val) => {
474					internal::YGNodeStyleSetMaxHeightPercent(self.inner_node, val.into_inner())
475				}
476				// auto is not a valid value for max_height
477				StyleUnit::Auto => internal::YGNodeStyleSetMaxHeight(self.inner_node, Undefined),
478			}
479		}
480	}
481
482	pub fn set_aspect_ratio(&mut self, aspect_ratio: f32) {
483		unsafe {
484			internal::YGNodeStyleSetAspectRatio(self.inner_node, aspect_ratio);
485		}
486	}
487
488	pub fn calculate_layout(
489		&mut self,
490		available_width: f32,
491		available_height: f32,
492		parent_direction: Direction,
493	) {
494		unsafe {
495			internal::YGNodeCalculateLayout(
496				self.inner_node,
497				available_width,
498				available_height,
499				internal::YGDirection::from(parent_direction),
500			);
501		}
502	}
503
504	pub fn get_layout(&self) -> Layout {
505		unsafe {
506			Layout::new(
507				internal::YGNodeLayoutGetLeft(self.inner_node),
508				internal::YGNodeLayoutGetRight(self.inner_node),
509				internal::YGNodeLayoutGetTop(self.inner_node),
510				internal::YGNodeLayoutGetBottom(self.inner_node),
511				internal::YGNodeLayoutGetWidth(self.inner_node),
512				internal::YGNodeLayoutGetHeight(self.inner_node),
513			)
514		}
515	}
516
517	pub fn get_child_count(&self) -> u32 {
518		unsafe { internal::YGNodeGetChildCount(self.inner_node) }
519	}
520
521	pub fn get_child(&self, index: u32) -> NodeRef {
522		unsafe { internal::YGNodeGetChild(self.inner_node, index) }
523	}
524
525	pub fn get_style_direction(&self) -> Direction {
526		unsafe { internal::YGNodeStyleGetDirection(self.inner_node).into() }
527	}
528
529	pub fn get_flex_direction(&self) -> FlexDirection {
530		unsafe { internal::YGNodeStyleGetFlexDirection(self.inner_node).into() }
531	}
532
533	pub fn get_justify_content(&self) -> Justify {
534		unsafe { internal::YGNodeStyleGetJustifyContent(self.inner_node).into() }
535	}
536
537	pub fn get_align_content(&self) -> Align {
538		unsafe { internal::YGNodeStyleGetAlignContent(self.inner_node).into() }
539	}
540
541	pub fn get_align_items(&self) -> Align {
542		unsafe { internal::YGNodeStyleGetAlignItems(self.inner_node).into() }
543	}
544
545	pub fn get_align_self(&self) -> Align {
546		unsafe { internal::YGNodeStyleGetAlignSelf(self.inner_node).into() }
547	}
548
549	pub fn get_position_type(&self) -> PositionType {
550		unsafe { internal::YGNodeStyleGetPositionType(self.inner_node).into() }
551	}
552
553	pub fn get_flex_wrap(&self) -> Wrap {
554		unsafe { internal::YGNodeStyleGetFlexWrap(self.inner_node).into() }
555	}
556
557	pub fn get_overflow(&self) -> Overflow {
558		unsafe { internal::YGNodeStyleGetOverflow(self.inner_node).into() }
559	}
560
561	pub fn get_flex_grow(&self) -> f32 {
562		unsafe { internal::YGNodeStyleGetFlexGrow(self.inner_node) }
563	}
564
565	pub fn get_flex_shrink(&self) -> f32 {
566		unsafe { internal::YGNodeStyleGetFlexShrink(self.inner_node) }
567	}
568
569	pub fn get_flex_basis(&self) -> StyleUnit {
570		unsafe { internal::YGNodeStyleGetFlexBasis(self.inner_node).into() }
571	}
572
573	pub fn get_style_position_left(&self) -> StyleUnit {
574		unsafe {
575			internal::YGNodeStyleGetPosition(self.inner_node, internal::YGEdge::from(Edge::Left))
576				.into()
577		}
578	}
579
580	pub fn get_style_position_right(&self) -> StyleUnit {
581		unsafe {
582			internal::YGNodeStyleGetPosition(self.inner_node, internal::YGEdge::from(Edge::Right))
583				.into()
584		}
585	}
586
587	pub fn get_style_position_top(&self) -> StyleUnit {
588		unsafe {
589			internal::YGNodeStyleGetPosition(self.inner_node, internal::YGEdge::from(Edge::Top))
590				.into()
591		}
592	}
593
594	pub fn get_style_position_bottom(&self) -> StyleUnit {
595		unsafe {
596			internal::YGNodeStyleGetPosition(self.inner_node, internal::YGEdge::from(Edge::Bottom))
597				.into()
598		}
599	}
600
601	pub fn get_style_position_start(&self) -> StyleUnit {
602		unsafe {
603			internal::YGNodeStyleGetPosition(self.inner_node, internal::YGEdge::from(Edge::Start))
604				.into()
605		}
606	}
607
608	pub fn get_style_position_end(&self) -> StyleUnit {
609		unsafe {
610			internal::YGNodeStyleGetPosition(self.inner_node, internal::YGEdge::from(Edge::End))
611				.into()
612		}
613	}
614
615	pub fn get_style_margin_left(&self) -> StyleUnit {
616		unsafe {
617			internal::YGNodeStyleGetMargin(self.inner_node, internal::YGEdge::from(Edge::Left))
618				.into()
619		}
620	}
621
622	pub fn get_style_margin_right(&self) -> StyleUnit {
623		unsafe {
624			internal::YGNodeStyleGetMargin(self.inner_node, internal::YGEdge::from(Edge::Right))
625				.into()
626		}
627	}
628
629	pub fn get_style_margin_top(&self) -> StyleUnit {
630		unsafe {
631			internal::YGNodeStyleGetMargin(self.inner_node, internal::YGEdge::from(Edge::Top))
632				.into()
633		}
634	}
635
636	pub fn get_style_margin_bottom(&self) -> StyleUnit {
637		unsafe {
638			internal::YGNodeStyleGetMargin(self.inner_node, internal::YGEdge::from(Edge::Bottom))
639				.into()
640		}
641	}
642
643	pub fn get_style_margin_start(&self) -> StyleUnit {
644		unsafe {
645			internal::YGNodeStyleGetMargin(self.inner_node, internal::YGEdge::from(Edge::Start))
646				.into()
647		}
648	}
649
650	pub fn get_style_margin_end(&self) -> StyleUnit {
651		unsafe {
652			internal::YGNodeStyleGetMargin(self.inner_node, internal::YGEdge::from(Edge::End))
653				.into()
654		}
655	}
656
657	pub fn get_style_padding_left(&self) -> StyleUnit {
658		unsafe {
659			internal::YGNodeStyleGetPadding(self.inner_node, internal::YGEdge::from(Edge::Left))
660				.into()
661		}
662	}
663
664	pub fn get_style_padding_right(&self) -> StyleUnit {
665		unsafe {
666			internal::YGNodeStyleGetPadding(self.inner_node, internal::YGEdge::from(Edge::Right))
667				.into()
668		}
669	}
670
671	pub fn get_style_padding_top(&self) -> StyleUnit {
672		unsafe {
673			internal::YGNodeStyleGetPadding(self.inner_node, internal::YGEdge::from(Edge::Top))
674				.into()
675		}
676	}
677
678	pub fn get_style_padding_bottom(&self) -> StyleUnit {
679		unsafe {
680			internal::YGNodeStyleGetPadding(self.inner_node, internal::YGEdge::from(Edge::Bottom))
681				.into()
682		}
683	}
684
685	pub fn get_style_padding_start(&self) -> StyleUnit {
686		unsafe {
687			internal::YGNodeStyleGetPadding(self.inner_node, internal::YGEdge::from(Edge::Start))
688				.into()
689		}
690	}
691
692	pub fn get_style_padding_end(&self) -> StyleUnit {
693		unsafe {
694			internal::YGNodeStyleGetPadding(self.inner_node, internal::YGEdge::from(Edge::End))
695				.into()
696		}
697	}
698
699	pub fn get_style_border_left(&self) -> f32 {
700		unsafe {
701			internal::YGNodeStyleGetBorder(self.inner_node, internal::YGEdge::from(Edge::Left))
702		}
703	}
704
705	pub fn get_style_border_right(&self) -> f32 {
706		unsafe {
707			internal::YGNodeStyleGetBorder(self.inner_node, internal::YGEdge::from(Edge::Right))
708		}
709	}
710
711	pub fn get_style_border_top(&self) -> f32 {
712		unsafe {
713			internal::YGNodeStyleGetBorder(self.inner_node, internal::YGEdge::from(Edge::Top))
714		}
715	}
716
717	pub fn get_style_border_bottom(&self) -> f32 {
718		unsafe {
719			internal::YGNodeStyleGetBorder(self.inner_node, internal::YGEdge::from(Edge::Bottom))
720		}
721	}
722
723	pub fn get_style_border_start(&self) -> f32 {
724		unsafe {
725			internal::YGNodeStyleGetBorder(self.inner_node, internal::YGEdge::from(Edge::Start))
726		}
727	}
728
729	pub fn get_style_border_end(&self) -> f32 {
730		unsafe {
731			internal::YGNodeStyleGetBorder(self.inner_node, internal::YGEdge::from(Edge::End))
732		}
733	}
734
735	pub fn get_style_width(&self) -> StyleUnit {
736		unsafe { internal::YGNodeStyleGetWidth(self.inner_node).into() }
737	}
738
739	pub fn get_style_height(&self) -> StyleUnit {
740		unsafe { internal::YGNodeStyleGetHeight(self.inner_node).into() }
741	}
742
743	pub fn get_style_min_width(&self) -> StyleUnit {
744		unsafe { internal::YGNodeStyleGetMinWidth(self.inner_node).into() }
745	}
746
747	pub fn get_style_min_height(&self) -> StyleUnit {
748		unsafe { internal::YGNodeStyleGetMinHeight(self.inner_node).into() }
749	}
750
751	pub fn get_style_max_width(&self) -> StyleUnit {
752		unsafe { internal::YGNodeStyleGetMaxWidth(self.inner_node).into() }
753	}
754
755	pub fn get_style_max_height(&self) -> StyleUnit {
756		unsafe { internal::YGNodeStyleGetMaxHeight(self.inner_node).into() }
757	}
758
759	// Layout Getters
760	pub fn get_layout_margin_left(&self) -> f32 {
761		unsafe {
762			internal::YGNodeLayoutGetMargin(self.inner_node, internal::YGEdge::from(Edge::Left))
763		}
764	}
765
766	pub fn get_layout_margin_right(&self) -> f32 {
767		unsafe {
768			internal::YGNodeLayoutGetMargin(self.inner_node, internal::YGEdge::from(Edge::Right))
769		}
770	}
771
772	pub fn get_layout_margin_top(&self) -> f32 {
773		unsafe {
774			internal::YGNodeLayoutGetMargin(self.inner_node, internal::YGEdge::from(Edge::Top))
775		}
776	}
777
778	pub fn get_layout_margin_bottom(&self) -> f32 {
779		unsafe {
780			internal::YGNodeLayoutGetMargin(self.inner_node, internal::YGEdge::from(Edge::Bottom))
781		}
782	}
783
784	pub fn get_layout_margin_start(&self) -> f32 {
785		unsafe {
786			internal::YGNodeLayoutGetMargin(self.inner_node, internal::YGEdge::from(Edge::Start))
787		}
788	}
789
790	pub fn get_layout_margin_end(&self) -> f32 {
791		unsafe {
792			internal::YGNodeLayoutGetMargin(self.inner_node, internal::YGEdge::from(Edge::End))
793		}
794	}
795
796	pub fn get_layout_padding_left(&self) -> f32 {
797		unsafe {
798			internal::YGNodeLayoutGetPadding(self.inner_node, internal::YGEdge::from(Edge::Left))
799		}
800	}
801
802	pub fn get_layout_padding_right(&self) -> f32 {
803		unsafe {
804			internal::YGNodeLayoutGetPadding(self.inner_node, internal::YGEdge::from(Edge::Right))
805		}
806	}
807
808	pub fn get_layout_padding_top(&self) -> f32 {
809		unsafe {
810			internal::YGNodeLayoutGetPadding(self.inner_node, internal::YGEdge::from(Edge::Top))
811		}
812	}
813
814	pub fn get_layout_padding_bottom(&self) -> f32 {
815		unsafe {
816			internal::YGNodeLayoutGetPadding(self.inner_node, internal::YGEdge::from(Edge::Bottom))
817		}
818	}
819
820	pub fn get_layout_padding_start(&self) -> f32 {
821		unsafe {
822			internal::YGNodeLayoutGetPadding(self.inner_node, internal::YGEdge::from(Edge::Start))
823		}
824	}
825
826	pub fn get_layout_padding_end(&self) -> f32 {
827		unsafe {
828			internal::YGNodeLayoutGetPadding(self.inner_node, internal::YGEdge::from(Edge::End))
829		}
830	}
831
832	pub fn get_layout_left(&self) -> f32 {
833		unsafe { internal::YGNodeLayoutGetLeft(self.inner_node) }
834	}
835
836	pub fn get_layout_right(&self) -> f32 {
837		unsafe { internal::YGNodeLayoutGetRight(self.inner_node) }
838	}
839
840	pub fn get_layout_top(&self) -> f32 {
841		unsafe { internal::YGNodeLayoutGetTop(self.inner_node) }
842	}
843
844	pub fn get_layout_bottom(&self) -> f32 {
845		unsafe { internal::YGNodeLayoutGetBottom(self.inner_node) }
846	}
847
848	pub fn get_layout_border_left(&self) -> f32 {
849		unsafe {
850			internal::YGNodeLayoutGetBorder(self.inner_node, internal::YGEdge::from(Edge::Left))
851		}
852	}
853
854	pub fn get_layout_border_right(&self) -> f32 {
855		unsafe {
856			internal::YGNodeLayoutGetBorder(self.inner_node, internal::YGEdge::from(Edge::Right))
857		}
858	}
859
860	pub fn get_layout_border_top(&self) -> f32 {
861		unsafe {
862			internal::YGNodeLayoutGetBorder(self.inner_node, internal::YGEdge::from(Edge::Top))
863		}
864	}
865
866	pub fn get_layout_border_bottom(&self) -> f32 {
867		unsafe {
868			internal::YGNodeLayoutGetBorder(self.inner_node, internal::YGEdge::from(Edge::Bottom))
869		}
870	}
871
872	pub fn get_layout_width(&self) -> f32 {
873		unsafe { internal::YGNodeLayoutGetWidth(self.inner_node) }
874	}
875
876	pub fn get_layout_height(&self) -> f32 {
877		unsafe { internal::YGNodeLayoutGetHeight(self.inner_node) }
878	}
879
880	pub fn get_layout_direction(&self) -> Direction {
881		unsafe { internal::YGNodeLayoutGetDirection(self.inner_node).into() }
882	}
883
884	pub fn is_dirty(&self) -> bool {
885		unsafe { internal::YGNodeIsDirty(self.inner_node) }
886	}
887
888	pub fn copy_style(&self, src_node: &Node) {
889		unsafe { internal::YGNodeCopyStyle(self.inner_node, src_node.inner_node) }
890	}
891
892	pub fn set_display(&mut self, display: Display) {
893		unsafe {
894			internal::YGNodeStyleSetDisplay(self.inner_node, display.into());
895		}
896	}
897
898	pub fn set_measure_func(&mut self, func: MeasureFunc) {
899		match func {
900			Some(f) => unsafe {
901				type Callback = unsafe extern "C" fn(
902					internal::YGNodeRef,
903					f32,
904					internal::YGMeasureMode,
905					f32,
906					internal::YGMeasureMode,
907				) -> internal::YGSize;
908				let casted_func: Callback = std::mem::transmute(f as usize);
909				internal::YGNodeSetMeasureFunc(self.inner_node, Some(casted_func));
910			},
911			None => unsafe {
912				internal::YGNodeSetMeasureFunc(self.inner_node, None);
913			},
914		}
915	}
916
917	pub fn set_baseline_func(&mut self, func: BaselineFunc) {
918		match func {
919			Some(f) => unsafe {
920				type Callback = unsafe extern "C" fn(internal::YGNodeRef, f32, f32) -> f32;
921				let casted_func: Callback = std::mem::transmute(f as usize);
922				internal::YGNodeSetBaselineFunc(self.inner_node, Some(casted_func));
923			},
924			None => unsafe {
925				internal::YGNodeSetBaselineFunc(self.inner_node, None);
926			},
927		}
928	}
929
930	pub fn set_context(&mut self, value: Option<Context>) {
931		self.drop_context();
932
933		let raw = value.map_or_else(|| std::ptr::null_mut(), |context| context.into_raw());
934		unsafe { internal::YGNodeSetContext(self.inner_node, raw) }
935	}
936
937	pub fn get_context(node_ref: &NodeRef) -> Option<&Box<dyn Any>> {
938		let raw = unsafe { internal::YGNodeGetContext(*node_ref) };
939		Context::get_inner_ref(raw)
940	}
941
942	pub fn get_context_mut(node_ref: &NodeRef) -> Option<&mut Box<dyn Any>> {
943		let raw = unsafe { internal::YGNodeGetContext(*node_ref) };
944		Context::get_inner_mut(raw)
945	}
946
947	pub fn get_own_context(&self) -> Option<&Box<dyn Any>> {
948		Node::get_context(&self.inner_node)
949	}
950
951	pub fn get_own_context_mut(&self) -> Option<&mut Box<dyn Any>> {
952		Node::get_context_mut(&self.inner_node)
953	}
954
955	pub fn drop_context(&mut self) {
956		let prev_raw = unsafe { internal::YGNodeGetContext(self.inner_node) };
957		Context::drop_raw(prev_raw);
958	}
959}
960
961impl Drop for Node {
962	fn drop(&mut self) {
963		self.set_context(None);
964
965		unsafe {
966			// In the current revision (a20bde8444474e7a34352a78073de23c26e08fc5),
967			// YGNodeFree does not mark the parent as dirty, but YGNodeRemoveChild does.
968			// TODO remove the following lines when upgrading to a more recent revision of yoga.
969			let parent = internal::YGNodeGetParent(self.inner_node);
970			if parent != 0 as NodeRef {
971				internal::YGNodeRemoveChild(
972					internal::YGNodeGetParent(self.inner_node),
973					self.inner_node,
974				);
975			}
976
977			internal::YGNodeFree(self.inner_node);
978		}
979	}
980}