mirror of
https://codeberg.org/unspeaker/tengri.git
synced 2026-09-18 21:26:44 +02:00
fix x/y/xy ops; remove button_2/3
This commit is contained in:
parent
799e497622
commit
de591addb3
7 changed files with 138 additions and 144 deletions
|
|
@ -96,6 +96,76 @@ impl Sizer {
|
|||
}
|
||||
}
|
||||
|
||||
/// Some layout operations exist in multiple variants that take a single argument.
|
||||
/// Their handling in [eval_view] is uniform and goes like this:
|
||||
macro_rules! eval_enum ((
|
||||
$name:literal, $output:ident, $state:ident, $value:expr, $Enum:ident {
|
||||
$($v:literal => $V:ident),* $(,)?
|
||||
}
|
||||
) => {{
|
||||
match $value {
|
||||
$(Some($v) => $Enum::$V,)*
|
||||
frag => return Err(format!("invalid variant: {}/{frag:?}", $name).into())
|
||||
}
|
||||
}});
|
||||
|
||||
/// Some layout operations exist in XY, X, and Y variants that take 3 or 2 arguments.
|
||||
/// Their handling in [eval_view] is uniform and goes like this:
|
||||
macro_rules! eval_xy (
|
||||
// Valueless variant:
|
||||
// (fill/x ...)
|
||||
// (fill/y ...)
|
||||
// (fill/xy ...)
|
||||
(
|
||||
$name:expr => $expr:expr, $head:expr, $output:ident, $state:ident,
|
||||
$variant:expr, $xy:ident, $x:ident, $y:ident, $arg:expr,
|
||||
) => {{
|
||||
// frags.next(): 2nd slash-delimited fragment: /x, /y, /xy
|
||||
let variant = $variant;
|
||||
let thunk = draw(move|screen|$state.interpret(screen, &$arg));
|
||||
match variant {
|
||||
// X variant
|
||||
Some("x") => thunk.$x().draw($output),
|
||||
// Y variant
|
||||
Some("y") => thunk.$y().draw($output),
|
||||
// XY variant (can be omitted)
|
||||
Some("xy") | None => thunk.$xy().draw($output),
|
||||
// Other namespace members are invalid
|
||||
frag => invalid_variant($name, frag, $expr, $head)
|
||||
}
|
||||
}};
|
||||
|
||||
// Variadic variant:
|
||||
// (push/x n ...)
|
||||
// (push/y n ...)
|
||||
// (push/xy n m ...)
|
||||
(
|
||||
$name:expr => $expr:expr, $head:expr, $output:ident, $state:ident,
|
||||
$variant:expr, $xy:ident, $x:ident, $y:ident, $arg0:expr, $arg1:expr, $arg2:expr,
|
||||
) => {{
|
||||
// frags.next(): 2nd slash-delimited fragment: /x, /y, /xy
|
||||
let variant = $variant;
|
||||
let thunk = draw(move|screen|$state.interpret(screen, &match variant {
|
||||
Some("x") | Some("y") => $arg1,
|
||||
Some("xy") | None => $arg2,
|
||||
_ => panic!("{}: unsupported axis {variant:?}; try /x, /y, /xy", $name)
|
||||
}));
|
||||
match variant {
|
||||
// X variant
|
||||
Some("x") => thunk.$x($state.namespace($arg0?)?)
|
||||
.draw($output),
|
||||
// Y variant
|
||||
Some("y") => thunk.$y($state.namespace($arg0?)?)
|
||||
.draw($output),
|
||||
// XY variant (can be omitted)
|
||||
Some("xy") | None => thunk.$xy($state.namespace($arg0?)?, $state.namespace($arg1?)?)
|
||||
.draw($output),
|
||||
// Other namespace members are invalid
|
||||
frag => invalid_variant($name, frag, $expr, $head)
|
||||
}
|
||||
}};
|
||||
);
|
||||
|
||||
macro_rules! def_layout_modifier {
|
||||
(
|
||||
$Trait:ident ($fn_x:ident $fn_y:ident $fn_xy:ident),
|
||||
|
|
@ -126,7 +196,7 @@ macro_rules! def_layout_modifier {
|
|||
fn_kw_layout!($kw_name |state, output, expr| {
|
||||
let head = expr.head()?;
|
||||
let mut frags = head.src()?.unwrap_or_default().split("/");
|
||||
Ok(matches!(expr.head()?, Some("exact")).then(||{
|
||||
Ok(matches!(frags.next(), Some($name)).then(||{
|
||||
let args = expr.tail();
|
||||
let arg0 = args.head();
|
||||
let tail0 = args.tail();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue