1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
//! Types used by Panoramix to lay out widgets. //! //! Most of these type are copy-pasted straight from Druid's code, with some minor modifications. That said, they may change in future versions and aren't intended to be API-compatible with Druid. use druid::kurbo::Size; use druid::BoxConstraints; /// Optional parameters for a [Flex](crate::elements::Flex) container (row or column). /// /// See [Flex::with_flex_container_params](crate::elements::Flex::with_flex_container_params). #[derive(Copy, Clone, Debug, PartialEq)] pub struct FlexContainerParams { pub cross_alignment: CrossAxisAlignment, pub main_alignment: MainAxisAlignment, pub fill_major_axis: bool, } /// Optional parameters for an item in a [Flex](crate::elements::Flex) container (row or column). /// /// Elements that represent a single flex item generally have a `with_flex_params` method that you can pass this struct to. #[derive(Copy, Clone, Default, Debug, PartialEq)] pub struct FlexParams { pub flex: f64, pub alignment: Option<CrossAxisAlignment>, } #[derive(Copy, Clone, Debug, PartialEq)] pub enum Axis { Horizontal, Vertical, } /// The alignment of the widgets on the container's cross (or minor) axis. /// /// If a widget is smaller than the container on the minor axis, this determines /// where it is positioned. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum CrossAxisAlignment { /// Top or leading. /// /// In a vertical container, widgets are top aligned. In a horiziontal /// container, their leading edges are aligned. Start, /// Widgets are centered in the container. Center, /// Bottom or trailing. /// /// In a vertical container, widgets are bottom aligned. In a horiziontal /// container, their trailing edges are aligned. End, } /// Arrangement of children on the main axis. /// /// If there is surplus space on the main axis after laying out children, this /// enum represents how children are laid out in this space. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum MainAxisAlignment { /// Top or leading. /// /// Children are aligned with the top or leading edge, without padding. Start, /// Children are centered, without padding. Center, /// Bottom or trailing. /// /// Children are aligned with the bottom or trailing edge, without padding. End, /// Extra space is divided evenly between each child. SpaceBetween, /// Extra space is divided evenly between each child, as well as at the ends. SpaceEvenly, /// Space between each child, with less at the start and end. /// /// This divides space such that each child is separated by `n` units, /// and the start and end have `n/2` units of padding. SpaceAround, } impl FlexParams { /// Create custom `FlexParams` with a specific `flex_factor` and an optional /// [`CrossAxisAlignment`]. /// /// You likely only need to create these manually if you need to specify /// a custom alignment; if you only need to use a custom `flex_factor` you /// can pass an `f64` to any of the functions that take `FlexParams`. /// /// By default, the widget uses the alignment of its parent [Flex](crate::elements::Flex) container. pub fn new(flex: f64, alignment: impl Into<Option<CrossAxisAlignment>>) -> Self { FlexParams { flex, alignment: alignment.into(), } } } impl Axis { pub(crate) fn major(self, coords: Size) -> f64 { match self { Axis::Horizontal => coords.width, Axis::Vertical => coords.height, } } pub(crate) fn minor(self, coords: Size) -> f64 { match self { Axis::Horizontal => coords.height, Axis::Vertical => coords.width, } } pub(crate) fn pack(self, major: f64, minor: f64) -> (f64, f64) { match self { Axis::Horizontal => (major, minor), Axis::Vertical => (minor, major), } } /// Generate constraints with new values on the major axis. pub(crate) fn constraints( self, bc: &BoxConstraints, min_major: f64, major: f64, ) -> BoxConstraints { match self { Axis::Horizontal => BoxConstraints::new( Size::new(min_major, bc.min().height), Size::new(major, bc.max().height), ), Axis::Vertical => BoxConstraints::new( Size::new(bc.min().width, min_major), Size::new(bc.max().width, major), ), } } } impl From<f64> for FlexParams { fn from(flex: f64) -> FlexParams { FlexParams { flex, alignment: None, } } }