mirror of
https://github.com/slint-ui/slint.git
synced 2025-08-04 10:50:00 +00:00
Implements @radial-gradient(circle, ...)
Only the circle is implemented so far. Part of #263
This commit is contained in:
parent
7a1e5bef93
commit
b4ebd88d35
21 changed files with 418 additions and 56 deletions
|
@ -453,6 +453,11 @@ pub enum Expression {
|
|||
stops: Vec<(Expression, Expression)>,
|
||||
},
|
||||
|
||||
RadialGradient {
|
||||
/// First expression in the tuple is a color, second expression is the stop position
|
||||
stops: Vec<(Expression, Expression)>,
|
||||
},
|
||||
|
||||
EnumerationValue(EnumerationValue),
|
||||
|
||||
ReturnStatement(Option<Box<Expression>>),
|
||||
|
@ -604,6 +609,7 @@ impl Expression {
|
|||
Expression::ReadLocalVariable { ty, .. } => ty.clone(),
|
||||
Expression::EasingCurve(_) => Type::Easing,
|
||||
Expression::LinearGradient { .. } => Type::Brush,
|
||||
Expression::RadialGradient { .. } => Type::Brush,
|
||||
Expression::EnumerationValue(value) => Type::Enumeration(value.enumeration.clone()),
|
||||
// invalid because the expression is unreachable
|
||||
Expression::ReturnStatement(_) => Type::Invalid,
|
||||
|
@ -692,6 +698,12 @@ impl Expression {
|
|||
visitor(s);
|
||||
}
|
||||
}
|
||||
Expression::RadialGradient { stops } => {
|
||||
for (c, s) in stops {
|
||||
visitor(c);
|
||||
visitor(s);
|
||||
}
|
||||
}
|
||||
Expression::EnumerationValue(_) => {}
|
||||
Expression::ReturnStatement(expr) => {
|
||||
expr.as_deref().map(visitor);
|
||||
|
@ -785,6 +797,12 @@ impl Expression {
|
|||
visitor(s);
|
||||
}
|
||||
}
|
||||
Expression::RadialGradient { stops } => {
|
||||
for (c, s) in stops {
|
||||
visitor(c);
|
||||
visitor(s);
|
||||
}
|
||||
}
|
||||
Expression::EnumerationValue(_) => {}
|
||||
Expression::ReturnStatement(expr) => {
|
||||
expr.as_deref_mut().map(visitor);
|
||||
|
@ -856,6 +874,9 @@ impl Expression {
|
|||
Expression::LinearGradient { angle, stops } => {
|
||||
angle.is_constant() && stops.iter().all(|(c, s)| c.is_constant() && s.is_constant())
|
||||
}
|
||||
Expression::RadialGradient { stops } => {
|
||||
stops.iter().all(|(c, s)| c.is_constant() && s.is_constant())
|
||||
}
|
||||
Expression::EnumerationValue(_) => true,
|
||||
Expression::ReturnStatement(expr) => {
|
||||
expr.as_ref().map_or(true, |expr| expr.is_constant())
|
||||
|
@ -1388,6 +1409,16 @@ pub fn pretty_print(f: &mut dyn std::fmt::Write, expression: &Expression) -> std
|
|||
}
|
||||
write!(f, ")")
|
||||
}
|
||||
Expression::RadialGradient { stops } => {
|
||||
write!(f, "@radial-gradient(circle")?;
|
||||
for (c, s) in stops {
|
||||
write!(f, ", ")?;
|
||||
pretty_print(f, c)?;
|
||||
write!(f, " ")?;
|
||||
pretty_print(f, s)?;
|
||||
}
|
||||
write!(f, ")")
|
||||
}
|
||||
Expression::EnumerationValue(e) => match e.enumeration.values.get(e.value as usize) {
|
||||
Some(val) => write!(f, "{}.{}", e.enumeration.name, val),
|
||||
None => write!(f, "{}.{}", e.enumeration.name, e.value),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue