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
12mod internal {
14 #![allow(dead_code)]
15 include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
16 pub use self::root::*;
17}
18
19mod 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 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 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 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 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 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 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 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 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}