]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkcssnumbervalue.c
filechooserbutton: New test for opening the Other item in the combo box and then...
[~andy/gtk] / gtk / gtkcssnumbervalue.c
index 19e4c1d198bc5019ae396dafc13f1063c0c4a960..ed2bfe506fac69de634231aa960b775f450211c8 100644 (file)
@@ -19,6 +19,8 @@
 
 #include "gtkcssnumbervalueprivate.h"
 
+#include "gtkcssenumvalueprivate.h"
+#include "gtkcssinitialvalueprivate.h"
 #include "gtkstylepropertyprivate.h"
 
 struct _GtkCssValue {
@@ -33,6 +35,94 @@ gtk_css_value_number_free (GtkCssValue *value)
   g_slice_free (GtkCssValue, value);
 }
 
+static double
+get_base_font_size (guint                    property_id,
+                    GtkStyleProviderPrivate *provider,
+                    GtkCssComputedValues    *values,
+                    GtkCssComputedValues    *parent_values,
+                    GtkCssDependencies      *dependencies)
+{
+  if (property_id == GTK_CSS_PROPERTY_FONT_SIZE)
+    {
+      *dependencies = GTK_CSS_DEPENDS_ON_PARENT;
+      if (parent_values)
+        return _gtk_css_number_value_get (_gtk_css_computed_values_get_value (parent_values, GTK_CSS_PROPERTY_FONT_SIZE), 100);
+      else
+        return _gtk_css_font_size_get_default (provider);
+    }
+
+  *dependencies = GTK_CSS_DEPENDS_ON_FONT_SIZE;
+  return _gtk_css_number_value_get (_gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_FONT_SIZE), 100);
+}
+                    
+static GtkCssValue *
+gtk_css_value_number_compute (GtkCssValue             *number,
+                              guint                    property_id,
+                              GtkStyleProviderPrivate *provider,
+                              GtkCssComputedValues    *values,
+                              GtkCssComputedValues    *parent_values,
+                              GtkCssDependencies      *dependencies)
+{
+  switch (number->unit)
+    {
+    default:
+      g_assert_not_reached();
+      /* fall through */
+    case GTK_CSS_PERCENT:
+      /* percentages for font sizes are computed, other percentages aren't */
+      if (property_id == GTK_CSS_PROPERTY_FONT_SIZE)
+        return _gtk_css_number_value_new (number->value / 100.0 * 
+                                          get_base_font_size (property_id, provider, values, parent_values, dependencies),
+                                          GTK_CSS_PX);
+    case GTK_CSS_NUMBER:
+    case GTK_CSS_PX:
+    case GTK_CSS_DEG:
+    case GTK_CSS_S:
+      return _gtk_css_value_ref (number);
+    case GTK_CSS_PT:
+      return _gtk_css_number_value_new (number->value * 96.0 / 72.0,
+                                        GTK_CSS_PX);
+    case GTK_CSS_PC:
+      return _gtk_css_number_value_new (number->value * 96.0 / 72.0 * 12.0,
+                                        GTK_CSS_PX);
+      break;
+    case GTK_CSS_IN:
+      return _gtk_css_number_value_new (number->value * 96.0,
+                                        GTK_CSS_PX);
+      break;
+    case GTK_CSS_CM:
+      return _gtk_css_number_value_new (number->value * 96.0 * 0.39370078740157477,
+                                        GTK_CSS_PX);
+      break;
+    case GTK_CSS_MM:
+      return _gtk_css_number_value_new (number->value * 96.0 * 0.039370078740157477,
+                                        GTK_CSS_PX);
+      break;
+    case GTK_CSS_EM:
+      return _gtk_css_number_value_new (number->value *
+                                        get_base_font_size (property_id, provider, values, parent_values, dependencies),
+                                        GTK_CSS_PX);
+      break;
+    case GTK_CSS_EX:
+      /* for now we pretend ex is half of em */
+      return _gtk_css_number_value_new (number->value * 0.5 * 
+                                        get_base_font_size (property_id, provider, values, parent_values, dependencies),
+                                        GTK_CSS_PX);
+    case GTK_CSS_RAD:
+      return _gtk_css_number_value_new (number->value * 360.0 / (2 * G_PI),
+                                        GTK_CSS_DEG);
+    case GTK_CSS_GRAD:
+      return _gtk_css_number_value_new (number->value * 360.0 / 400.0,
+                                        GTK_CSS_DEG);
+    case GTK_CSS_TURN:
+      return _gtk_css_number_value_new (number->value * 360.0,
+                                        GTK_CSS_DEG);
+    case GTK_CSS_MS:
+      return _gtk_css_number_value_new (number->value / 1000.0,
+                                        GTK_CSS_S);
+    }
+}
+
 static gboolean
 gtk_css_value_number_equal (const GtkCssValue *number1,
                             const GtkCssValue *number2)
@@ -41,6 +131,21 @@ gtk_css_value_number_equal (const GtkCssValue *number1,
          number1->value == number2->value;
 }
 
+static GtkCssValue *
+gtk_css_value_number_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_number_value_new (start->value + (end->value - start->value) * progress,
+                                    start->unit);
+}
+
 static void
 gtk_css_value_number_print (const GtkCssValue *number,
                             GString           *string)
@@ -62,6 +167,8 @@ gtk_css_value_number_print (const GtkCssValue *number,
     /* [GTK_CSS_DEG] = */ "deg",
     /* [GTK_CSS_GRAD] = */ "grad",
     /* [GTK_CSS_TURN] = */ "turn",
+    /* [GTK_CSS_S] = */ "s",
+    /* [GTK_CSS_MS] = */ "ms",
   };
 
   g_ascii_dtostr (buf, sizeof (buf), number->value);
@@ -72,7 +179,9 @@ gtk_css_value_number_print (const GtkCssValue *number,
 
 static const GtkCssValueClass GTK_CSS_VALUE_NUMBER = {
   gtk_css_value_number_free,
+  gtk_css_value_number_compute,
   gtk_css_value_number_equal,
+  gtk_css_value_number_transition,
   gtk_css_value_number_print
 };
 
@@ -80,7 +189,10 @@ GtkCssValue *
 _gtk_css_number_value_new (double     value,
                            GtkCssUnit unit)
 {
-  static GtkCssValue zero_singleton = { &GTK_CSS_VALUE_NUMBER, 1, GTK_CSS_NUMBER, 0 };
+  static GtkCssValue number_singletons[] = {
+    { &GTK_CSS_VALUE_NUMBER, 1, GTK_CSS_NUMBER, 0 },
+    { &GTK_CSS_VALUE_NUMBER, 1, GTK_CSS_NUMBER, 1 },
+  };
   static GtkCssValue px_singletons[] = {
     { &GTK_CSS_VALUE_NUMBER, 1, GTK_CSS_PX, 0 },
     { &GTK_CSS_VALUE_NUMBER, 1, GTK_CSS_PX, 1 },
@@ -90,8 +202,8 @@ _gtk_css_number_value_new (double     value,
   };
   GtkCssValue *result;
 
-  if (unit == GTK_CSS_NUMBER && value == 0)
-    return _gtk_css_value_ref (&zero_singleton);
+  if (unit == GTK_CSS_NUMBER && (value == 0 || value == 1))
+    return _gtk_css_value_ref (&number_singletons[(int) value]);
 
   if (unit == GTK_CSS_PX &&
       (value == 0 ||
@@ -110,18 +222,12 @@ _gtk_css_number_value_new (double     value,
   return result;
 }
 
-GtkCssValue *
-_gtk_css_number_value_parse (GtkCssParser           *parser,
-                             GtkCssNumberParseFlags  flags)
+GtkCssUnit
+_gtk_css_number_value_get_unit (const GtkCssValue *value)
 {
-  GtkCssNumber number;
+  g_return_val_if_fail (value->class == &GTK_CSS_VALUE_NUMBER, GTK_CSS_NUMBER);
 
-  g_return_val_if_fail (parser != NULL, NULL);
-
-  if (!_gtk_css_parser_read_number (parser, &number, flags))
-    return NULL;
-  
-  return _gtk_css_number_value_new (number.value, number.unit);
+  return value->unit;
 }
 
 double
@@ -137,60 +243,3 @@ _gtk_css_number_value_get (const GtkCssValue *number,
     return number->value;
 }
 
-GtkCssValue *
-_gtk_css_number_value_compute (GtkCssValue     *number,
-                               GtkStyleContext *context)
-{
-  g_return_val_if_fail (number->class == &GTK_CSS_VALUE_NUMBER, NULL);
-
-  switch (number->unit)
-    {
-    default:
-      g_assert_not_reached();
-      /* fall through */
-    case GTK_CSS_PERCENT:
-    case GTK_CSS_NUMBER:
-    case GTK_CSS_PX:
-    case GTK_CSS_DEG:
-      return _gtk_css_value_ref (number);
-    case GTK_CSS_PT:
-      return _gtk_css_number_value_new (number->value * 96.0 / 72.0,
-                                        GTK_CSS_PX);
-    case GTK_CSS_PC:
-      return _gtk_css_number_value_new (number->value * 96.0 / 72.0 * 12.0,
-                                        GTK_CSS_PX);
-      break;
-    case GTK_CSS_IN:
-      return _gtk_css_number_value_new (number->value * 96.0,
-                                        GTK_CSS_PX);
-      break;
-    case GTK_CSS_CM:
-      return _gtk_css_number_value_new (number->value * 96.0 * 0.39370078740157477,
-                                        GTK_CSS_PX);
-      break;
-    case GTK_CSS_MM:
-      return _gtk_css_number_value_new (number->value * 96.0 * 0.039370078740157477,
-                                        GTK_CSS_PX);
-      break;
-    case GTK_CSS_EM:
-      return _gtk_css_number_value_new (number->value *
-                                        _gtk_css_number_value_get (_gtk_style_context_peek_property (context, "font-size"), 100),
-                                        GTK_CSS_PX);
-      break;
-    case GTK_CSS_EX:
-      /* for now we pretend ex is half of em */
-      return _gtk_css_number_value_new (number->value * 0.5 * 
-                                        _gtk_css_number_value_get (_gtk_style_context_peek_property (context, "font-size"), 100),
-                                        GTK_CSS_PX);
-    case GTK_CSS_RAD:
-      return _gtk_css_number_value_new (number->value * 360.0 / (2 * G_PI),
-                                        GTK_CSS_DEG);
-    case GTK_CSS_GRAD:
-      return _gtk_css_number_value_new (number->value * 360.0 / 400.0,
-                                        GTK_CSS_DEG);
-    case GTK_CSS_TURN:
-      return _gtk_css_number_value_new (number->value * 360.0,
-                                        GTK_CSS_DEG);
-    }
-}
-