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
use super::*;

/// The scaling style of a nine-square layout.
/// 
/// Corners, and the short axis of borders, are hardcoded against `Scale::Stretch`.
/// 
/// ```text
///    ┈┬───────────┬┈
///     │           │ 
///    ┈┼───────────┼┈
///     ┊           ┊
/// ```
/// 
/// Will use the values:
/// 
/// | axis | direction  | value |
/// | ---- | ---------- | ----- |
/// | `x` | `horizontal`    | `border.top`
/// | `y` | `vertical`      | `Scale::Stretch`
/// 
/// ```text
///  ┌──┬┈
///  │  │ 
///  ├──┼┈
///  ┊  ┊ 
/// ```
/// 
/// Will use the values:
/// 
/// | axis | direction  | value |
/// | ---- | ---------- | ----- |
/// | `x` | `horizontal`    | `Scale::Stretch`
/// | `y` | `vertical`      | `Scale::Stretch`
/// 
/// The center gets its own values:
/// 
/// ```text
///     ┊           ┊
///    ┈┼───────────┼┈
///     │           │
///     │           │
///     │           │
///    ┈┼───────────┼┈
///     ┊           ┊
/// ```
/// 
/// Will use the values:
/// 
/// | axis | direction  | value |
/// | ---- | ---------- | ----- |
/// | `x` | `horizontal`    | `center.horizontal`
/// | `y` | `vertical`      | `center.vertical`
#[derive(Clone, Copy, Debug, Default)]
pub struct Style {
    pub border:     Rect<Scale>,
    pub center:     Axises<Scale>,
}

impl Style {
    /// Create a new style with the same scaling on all axises.
    /// 
    /// ```text
    ///  ┊←→┊←─ scale ─→┊←→┊
    ///  ┌──┬───────────┬──┐┈┈┈┈
    ///  │  │           │  │   ↕
    ///  ├──┼───────────┼──┤┈┈┈┈
    ///  │  │           │  │   ↑
    ///  │  │           │  │ scale
    ///  │  │           │  │   ↓
    ///  ├──┼───────────┼──┤┈┈┈┈
    ///  │  │           │  │   ↕
    ///  └──┴───────────┴──┘┈┈┈┈
    /// ```
    pub const fn new(scale: Scale) -> Self {
        Self::new_horizontal_vertical(scale, scale)
    }

    /// Create a new style with uniform scaling along each axis.
    /// 
    /// ```text
    ///  ┊←→┊←horizontal→┊←→┊
    ///  ┌──┬────────────┬──┐┈┈┈┈┈
    ///  │  │            │  │    ↕
    ///  ├──┼────────────┼──┤┈┈┈┈┈
    ///  │  │            │  │    ↑
    ///  │  │            │  │ vertical
    ///  │  │            │  │    ↓
    ///  ├──┼────────────┼──┤┈┈┈┈┈
    ///  │  │            │  │    ↕
    ///  └──┴────────────┴──┘┈┈┈┈┈
    /// ```
    pub const fn new_horizontal_vertical(horizontal: Scale, vertical: Scale) -> Self {
        Self {
            border: Rect {
                left:   vertical,
                right:  vertical,
                top:    horizontal,
                bottom: horizontal,
            },
            center: Axises {
                horizontal,
                vertical,
            },
        }
    }
}