Macro layout

Source
macro_rules! layout {
    ($context:expr, $view:expr, left_to_left_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, left_to_right_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, right_to_left_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, top_to_bottom_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, bottom_to_top_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, top_to_top_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, bottom_to_bottom_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, right_to_right_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, right_to_right_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, right_to_left_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, bottom_to_bottom_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, bottom_to_top_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, left_to_left_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, left_to_right_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, top_to_top_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, centerh_to_centerh_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, centerh_to_left_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, centerh_to_right_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, centerv_to_centerv_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, centerv_to_top_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, centerv_to_bottom_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, left_to_centerh_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, right_to_centerh_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, left_to_centerh_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, right_to_centerh_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, top_to_centerv_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, bottom_to_centerv_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, top_to_centerv_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, bottom_to_centerv_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, top_to_bottom_of $pivot:expr $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, fill_width $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, fill_height $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, align_left $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, align_top $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, align_right $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, align_bottom $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, align_left $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, align_top $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, align_right $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, align_bottom $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, align_centerh $(, $offset:expr)?) => { ... };
    ($context:expr, $view:expr, align_centerv $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, align_centerh $(, $offset:expr)?) => { ... };
    ($context:expr, grow $view:expr, align_centerv $(, $offset:expr)?) => { ... };
    ($context:expr, centerh $view:expr, between $first:expr, $second:expr $(, $offset:expr)?) => { ... };
    ($context:expr, centerv $view:expr, between $first:expr, $second:expr $(, $offset:expr)?) => { ... };
}
Expand description

Position and size a view relative to the parent or another view

§Format

layout!(context, [command] view, alignment [pivot_view],[second_pivot_view][, offset]);

Views must impl PixelView and to use grow they must also impl LayoutView

offset replaces the default offset from context (if it was set)

§Usage

let mut view1 = Button::new(...);
let mut view2 = Button::new(...);
let context = LayoutContext::new(Rect::new((0,0), (200,200)));
layout!(context, view1, left_to_left_of view2);

§Examples

Move a button below another with some spacing

let button1 = Button::new(...);
let button2 = Button::new(...);
let context = LayoutContext::new(...);
layout!(context, button2, top_to_bottom_of button1, px(8));

Move a button to the edge of the screen and grow it’s right side to match another view

let button1 = Button::new(...);
let button2 = Button::new(...);
let context = LayoutContext::new(...);
layout!(context, button2, align_left);
layout!(context, grow button1, right_to_right_of button1);

§Command

  • grow - Moves the edge of the view, but not the position

§Alignment

View

  • left_to_left_of - Makes view.x = pivot_view.x
  • top_to_top_of - Makes view.y = pivot_view.y
  • right_to_right_of - Makes view.x = pivot_view.right - view.width
  • bottom_to_bottom_of - Makes view.y = pivot_view.bottom - view.height
  • left_to_right_of - Makes view.x = pivot_view.x + pivot_view.width
  • right_to_left_of - Makes view.x = pivot_view.x - view.width
  • top_to_bottom_of - Makes view.y = pivot_view.bottom
  • bottom_to_top_of - Makes view.y = pivot_view.y - view.height
  • centerh_to_centerh_of - Makes view.center.x = pivot_view.center.x (grow not supported)
  • centerv_to_centerv_of - Makes view.center.y = pivot_view.center.y (grow not supported)
  • centerv_to_top_of - Makes view.center.y = pivot_view.y (grow not supported)
  • centerv_to_bottom_of - Makes view.center.y = pivot_view.bottom (grow not supported)
  • centerh_to_left_of - Makes view.center.x = pivot_view.left (grow not supported)
  • centerh_to_right_of - Makes view.center.x = pivot_view.right (grow not supported)
  • left_to_centerh_of - Makes view.x = pivot_view.center.x
  • right_to_centerh_of - Makes view.x = pivot_view.center.x - view.width
  • top_to_centerv_of - Makes view.y = pivot_view.center.y
  • bottom_to_centerv_of - Makes view.y = pivot_view.center.y - view.height
  • center_between_horz - Make view.center.x = pivot_view.right midpoint second_pivot_view.left
  • center_between_vert - Make view.center.y = pivot_view.bottom midpoint second_pivot_view.top

Parent

  • fill_width - Set x to context.left, width to context.width (grow only)
  • fill_height - Set y to context.top, height to context.height (grow only)
  • align_left - Set x to context.left
  • align_right - Set x to (context.right - view.width)
  • align_top - Set y to context.top
  • align_bottom - Set y to (context.bottom - view.height)
  • align_centerh - Set x to context.center.x (when using grow moves view.left or view.right instead)
  • align_centerv - Set y to context.center.y (when using grow moves view.top or view.bottom instead)