[gtk+] css: Implement transitions for numbers of different units
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] css: Implement transitions for numbers of different units
- Date: Sat, 13 Feb 2016 03:50:14 +0000 (UTC)
commit 93eec3e52f31f958ca7790e0eaa002e6975c4b57
Author: Benjamin Otte <otte redhat com>
Date: Sat Feb 13 04:47:51 2016 +0100
css: Implement transitions for numbers of different units
We now can transition from 10px to 100%.
Note that this requires a teensy tiny hack in
gtk_css_value_transition(), but so be it.
gtk/gtkcsscalcvalue.c | 11 +----------
gtk/gtkcssdimensionvalue.c | 17 +----------------
gtk/gtkcssnumbervalue.c | 19 +++++++++++++++++++
gtk/gtkcssnumbervalueprivate.h | 4 ++++
gtk/gtkcssvalue.c | 4 +++-
5 files changed, 28 insertions(+), 27 deletions(-)
---
diff --git a/gtk/gtkcsscalcvalue.c b/gtk/gtkcsscalcvalue.c
index e10e790..8a2741a 100644
--- a/gtk/gtkcsscalcvalue.c
+++ b/gtk/gtkcsscalcvalue.c
@@ -150,15 +150,6 @@ gtk_css_value_calc_equal (const GtkCssValue *value1,
return TRUE;
}
-static GtkCssValue *
-gtk_css_value_calc_transition (GtkCssValue *start,
- GtkCssValue *end,
- guint property_id,
- double progress)
-{
- return NULL;
-}
-
static void
gtk_css_value_calc_print (const GtkCssValue *value,
GString *string)
@@ -257,7 +248,7 @@ static const GtkCssNumberValueClass GTK_CSS_VALUE_CALC = {
gtk_css_value_calc_free,
gtk_css_value_calc_compute,
gtk_css_value_calc_equal,
- gtk_css_value_calc_transition,
+ gtk_css_number_value_transition,
gtk_css_value_calc_print
},
gtk_css_value_calc_get,
diff --git a/gtk/gtkcssdimensionvalue.c b/gtk/gtkcssdimensionvalue.c
index 87efb7a..92c2d99 100644
--- a/gtk/gtkcssdimensionvalue.c
+++ b/gtk/gtkcssdimensionvalue.c
@@ -167,21 +167,6 @@ gtk_css_value_dimension_equal (const GtkCssValue *number1,
number1->value == number2->value;
}
-static GtkCssValue *
-gtk_css_value_dimension_transition (GtkCssValue *start,
- GtkCssValue *end,
- guint property_id,
- double progress)
-{
- /* FIXME: This needs to be supported at least for percentages,
- * but for that we kinda need to support calc(5px + 50%) */
- if (start->unit != end->unit)
- return NULL;
-
- return gtk_css_dimension_value_new (start->value + (end->value - start->value) * progress,
- start->unit);
-}
-
static void
gtk_css_value_dimension_print (const GtkCssValue *number,
GString *string)
@@ -290,7 +275,7 @@ static const GtkCssNumberValueClass GTK_CSS_VALUE_DIMENSION = {
gtk_css_value_dimension_free,
gtk_css_value_dimension_compute,
gtk_css_value_dimension_equal,
- gtk_css_value_dimension_transition,
+ gtk_css_number_value_transition,
gtk_css_value_dimension_print
},
gtk_css_value_dimension_get,
diff --git a/gtk/gtkcssnumbervalue.c b/gtk/gtkcssnumbervalue.c
index d685fda..80239d6 100644
--- a/gtk/gtkcssnumbervalue.c
+++ b/gtk/gtkcssnumbervalue.c
@@ -106,6 +106,25 @@ _gtk_css_number_value_new (double value,
return gtk_css_dimension_value_new (value, unit);
}
+GtkCssValue *
+gtk_css_number_value_transition (GtkCssValue *start,
+ GtkCssValue *end,
+ guint property_id,
+ double progress)
+{
+ GtkCssValue *result, *mul_start, *mul_end;
+
+ mul_start = gtk_css_number_value_multiply (start, 1 - progress);
+ mul_end = gtk_css_number_value_multiply (end, progress);
+
+ result = gtk_css_number_value_add (mul_start, mul_end);
+
+ _gtk_css_value_unref (mul_start);
+ _gtk_css_value_unref (mul_end);
+
+ return result;
+}
+
gboolean
gtk_css_number_value_can_parse (GtkCssParser *parser)
{
diff --git a/gtk/gtkcssnumbervalueprivate.h b/gtk/gtkcssnumbervalueprivate.h
index 7cb750f..ddded66 100644
--- a/gtk/gtkcssnumbervalueprivate.h
+++ b/gtk/gtkcssnumbervalueprivate.h
@@ -54,6 +54,10 @@ struct _GtkCssNumberValueClass {
GtkCssValue * _gtk_css_number_value_new (double value,
GtkCssUnit unit);
+GtkCssValue * gtk_css_number_value_transition (GtkCssValue *start,
+ GtkCssValue *end,
+ guint property_id,
+ double progress);
gboolean gtk_css_number_value_can_parse (GtkCssParser *parser);
GtkCssValue * _gtk_css_number_value_parse (GtkCssParser *parser,
GtkCssNumberParseFlags flags);
diff --git a/gtk/gtkcssvalue.c b/gtk/gtkcssvalue.c
index 9780415..b9755cf 100644
--- a/gtk/gtkcssvalue.c
+++ b/gtk/gtkcssvalue.c
@@ -136,7 +136,9 @@ _gtk_css_value_transition (GtkCssValue *start,
gtk_internal_return_val_if_fail (start != NULL, FALSE);
gtk_internal_return_val_if_fail (end != NULL, FALSE);
- if (start->class != end->class)
+ /* We compare functions here instead of classes so that number
+ * values can all transition to each other */
+ if (start->class->transition != end->class->transition)
return NULL;
return start->class->transition (start, end, property_id, progress);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]