font chooser: Make levels flags
authorMatthias Clasen <mclasen@redhat.com>
Tue, 27 Mar 2018 20:10:19 +0000 (16:10 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 27 Mar 2018 20:14:21 +0000 (16:14 -0400)
Turn the GtkFontChooserLevel field into flags, and
add flags for OpenType variations and features. The
motivation for this is to make font-features in the UI
opt-in, since applications need to support them by
applying the pango attribute.

gtk/gtkfontbutton.c
gtk/gtkfontchooser.c
gtk/gtkfontchooser.h
gtk/gtkfontchooserwidget.c

index 1046b396ce5ae6492f1431e54ddce04b5a8230cf..d8749e3ac89ec801d2f4ec069a762c186adba3c1 100644 (file)
@@ -606,6 +606,10 @@ gtk_font_button_init (GtkFontButton *font_button)
   font_button->priv->font_face = NULL;
   font_button->priv->font_size = -1;
   font_button->priv->title = g_strdup (_("Pick a Font"));
+  font_button->priv->level = GTK_FONT_CHOOSER_LEVEL_FAMILY |
+                             GTK_FONT_CHOOSER_LEVEL_STYLE |
+                             GTK_FONT_CHOOSER_LEVEL_SIZE |
+                             GTK_FONT_CHOOSER_LEVEL_VARIATION;
 
   gtk_font_button_take_font_desc (font_button, NULL);
 
@@ -659,7 +663,7 @@ gtk_font_button_set_property (GObject      *object,
       gtk_font_button_take_font_desc (font_button, g_value_dup_boxed (value));
       break;
     case GTK_FONT_CHOOSER_PROP_LEVEL:
-      gtk_font_button_set_level (font_button, g_value_get_enum (value));
+      gtk_font_button_set_level (font_button, g_value_get_flags (value));
       break;
     case GTK_FONT_CHOOSER_PROP_FONT:
       gtk_font_button_set_font_name (font_button, g_value_get_string (value));
@@ -706,7 +710,7 @@ gtk_font_button_get_property (GObject    *object,
       g_value_set_string (value, priv->language);
       break;
     case GTK_FONT_CHOOSER_PROP_LEVEL:
-      g_value_set_enum (value, priv->level);
+      g_value_set_flags (value, priv->level);
       break;
     case GTK_FONT_CHOOSER_PROP_FONT:
       g_value_set_string (value, gtk_font_button_get_font_name (font_button));
@@ -1284,15 +1288,15 @@ gtk_font_button_update_font_info (GtkFontButton *font_button)
   else
     face_name = "";
 
-  if (priv->level == GTK_FONT_CHOOSER_LEVEL_FAMILY)
-    family_style = g_strdup (fam_name);
-  else
+  if ((priv->level & GTK_FONT_CHOOSER_LEVEL_STYLE) != 0)
     family_style = g_strconcat (fam_name, " ", face_name, NULL);
+  else
+    family_style = g_strdup (fam_name);
 
   gtk_label_set_text (GTK_LABEL (font_button->priv->font_label), family_style);
   g_free (family_style);
 
-  if (priv->level == GTK_FONT_CHOOSER_LEVEL_FONT)
+  if ((priv->level & GTK_FONT_CHOOSER_LEVEL_SIZE) != 0)
     {
       /* mirror Pango, which doesn't translate this either */
       gchar *size = g_strdup_printf ("%2.4g%s",
index 078225eb1775053fa4983aa11b57f7b138894f8f..23940af7a5c33e2f59822159264e8579a6761a68 100644 (file)
@@ -112,12 +112,15 @@ gtk_font_chooser_default_init (GtkFontChooserInterface *iface)
    */
   g_object_interface_install_property
      (iface,
-      g_param_spec_enum ("level",
-                         P_("Selection level"),
-                         P_("Whether to select family, face or font"),
-                         GTK_TYPE_FONT_CHOOSER_LEVEL,
-                         GTK_FONT_CHOOSER_LEVEL_FONT,
-                         GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
+      g_param_spec_flags ("level",
+                          P_("Selection level"),
+                          P_("Whether to select family, face or font"),
+                          GTK_TYPE_FONT_CHOOSER_LEVEL,
+                          GTK_FONT_CHOOSER_LEVEL_FAMILY |
+                          GTK_FONT_CHOOSER_LEVEL_STYLE |
+                          GTK_FONT_CHOOSER_LEVEL_SIZE |
+                          GTK_FONT_CHOOSER_LEVEL_VARIATION,
+                          GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
 
   /**
    * GtkFontChooser:font-features:
index 0159e78a2d462b74a36d3d9a048df02cb21e4b3c..204c6ec49af35e339ea5fb7838d501e113893e96 100644 (file)
@@ -46,20 +46,24 @@ typedef gboolean (*GtkFontFilterFunc) (const PangoFontFamily *family,
 
 /**
  * GtkFontChooserLevel:
- * @GTK_FONT_CHOOSER_LEVEL_FONT: Select an individual
- *    font, including a size. An example would be: "Arial Bold 11"
- * @GTK_FONT_CHOOSER_LEVEL_FACE: Select a font face,
- *    without a size. An example would be: "Arial Bold"
- * @GTK_FONT_CHOOSER_LEVEL_FAMILY: Select a font family, without
- *    specifying the face. An example would be: "Arial"
+ * @GTK_FONT_CHOOSER_LEVEL_FAMILY: Allow selecting a font family
+ * @GTK_FONT_CHOOSER_LEVEL_STYLE: Allow selecting a specific font face
+ * @GTK_FONT_CHOOSER_LEVEL_SIZE: Allow selecting a specific font size
+ * @GTK_FONT_CHOOSER_LEVEL_VARIATION: Allow changing OpenType font variation axes
+ * @GTK_FONT_CHOOSER_LEVEL_FEATURES: Allow selecting specific OpenType font features
  *
  * This enumeration specifies the granularity of font selection
  * that is desired in a font chooser.
+ *
+ * This enumeration may be extended in the future; applications should
+ * ignore unknown values.
  */
 typedef enum {
-  GTK_FONT_CHOOSER_LEVEL_FONT,
-  GTK_FONT_CHOOSER_LEVEL_FACE,
-  GTK_FONT_CHOOSER_LEVEL_FAMILY
+  GTK_FONT_CHOOSER_LEVEL_FAMILY    = 0,
+  GTK_FONT_CHOOSER_LEVEL_STYLE     = 1 << 0,
+  GTK_FONT_CHOOSER_LEVEL_SIZE      = 1 << 1,
+  GTK_FONT_CHOOSER_LEVEL_VARIATION = 1 << 2,
+  GTK_FONT_CHOOSER_LEVEL_FEATURES  = 1 << 3
 } GtkFontChooserLevel;
 
 #define GTK_TYPE_FONT_CHOOSER                  (gtk_font_chooser_get_type ())
index 36088cde2f83cac410367b2918d21e3a6b1d4ad0..0eec375bb06bac4de454d1db61b487b4a5c20385 100644 (file)
@@ -305,7 +305,7 @@ gtk_font_chooser_widget_set_property (GObject         *object,
       gtk_font_chooser_widget_set_show_preview_entry (fontchooser, g_value_get_boolean (value));
       break;
     case GTK_FONT_CHOOSER_PROP_LEVEL:
-      gtk_font_chooser_widget_set_level (fontchooser, g_value_get_enum (value));
+      gtk_font_chooser_widget_set_level (fontchooser, g_value_get_flags (value));
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -339,7 +339,7 @@ gtk_font_chooser_widget_get_property (GObject         *object,
       g_value_set_boolean (value, gtk_font_chooser_widget_get_show_preview_entry (fontchooser));
       break;
     case GTK_FONT_CHOOSER_PROP_LEVEL:
-      g_value_set_enum (value, gtk_font_chooser_widget_get_level (fontchooser));
+      g_value_set_flags (value, gtk_font_chooser_widget_get_level (fontchooser));
       break;
     case GTK_FONT_CHOOSER_PROP_FONT_FEATURES:
       g_value_set_string (value, fontchooser->priv->font_features);
@@ -863,6 +863,10 @@ gtk_font_chooser_widget_init (GtkFontChooserWidget *fontchooser)
   priv->preview_text = g_strdup (pango_language_get_sample_string (NULL));
   priv->show_preview_entry = TRUE;
   priv->font_desc = pango_font_description_new ();
+  priv->level = GTK_FONT_CHOOSER_LEVEL_FAMILY |
+                GTK_FONT_CHOOSER_LEVEL_STYLE |
+                GTK_FONT_CHOOSER_LEVEL_SIZE |
+                GTK_FONT_CHOOSER_LEVEL_VARIATION;
 
   /* Set default preview text */
   gtk_entry_set_text (GTK_ENTRY (priv->preview), priv->preview_text);
@@ -981,10 +985,10 @@ gtk_font_chooser_widget_load_fonts (GtkFontChooserWidget *fontchooser,
 
           face_name = pango_font_face_get_face_name (faces[j]);
 
-          if (priv->level == GTK_FONT_CHOOSER_LEVEL_FAMILY)
-            title = g_strdup (fam_name);
-          else
+          if ((priv->level & GTK_FONT_CHOOSER_LEVEL_STYLE) != 0)
             title = g_strconcat (fam_name, " ", face_name, NULL);
+          else
+            title = g_strdup (fam_name);
 
           desc = gtk_delayed_font_description_new (faces[j]);
 
@@ -998,7 +1002,7 @@ gtk_font_chooser_widget_load_fonts (GtkFontChooserWidget *fontchooser,
           g_free (title);
           gtk_delayed_font_description_unref (desc);
 
-          if (priv->level == GTK_FONT_CHOOSER_LEVEL_FAMILY)
+          if ((priv->level & GTK_FONT_CHOOSER_LEVEL_STYLE) == 0)
             break;
         }
 
@@ -1415,10 +1419,10 @@ gtk_font_chooser_widget_update_font_name (GtkFontChooserWidget *fontchooser,
   g_object_unref (face);
   gtk_delayed_font_description_unref (desc);
 
-  if (priv->level == GTK_FONT_CHOOSER_LEVEL_FAMILY)
-    title = g_strdup (fam_name);
-  else
+  if ((priv->level & GTK_FONT_CHOOSER_LEVEL_STYLE) != 0)
     title = g_strconcat (fam_name, " ", face_name, NULL);
+  else
+    title = g_strdup (fam_name);
 
   attrs = gtk_font_chooser_widget_get_preview_attributes (fontchooser, font_desc);
   gtk_label_set_attributes (GTK_LABEL (priv->font_name_label), attrs);
@@ -1639,6 +1643,9 @@ gtk_font_chooser_widget_update_font_variations (GtkFontChooserWidget *fontchoose
   g_hash_table_foreach (priv->axes, axis_remove, NULL);
   g_hash_table_remove_all (priv->axes);
 
+  if ((priv->level & GTK_FONT_CHOOSER_LEVEL_VARIATION) == 0)
+    return FALSE;
+
   pango_font = pango_context_load_font (gtk_widget_get_pango_context (GTK_WIDGET (fontchooser)),
                                         priv->font_desc);
   ft_face = pango_fc_font_lock_face (PANGO_FC_FONT (pango_font));
@@ -2042,6 +2049,9 @@ gtk_font_chooser_widget_update_font_features (GtkFontChooserWidget *fontchooser)
       gtk_widget_hide (gtk_widget_get_parent (item->feat));
     }
 
+  if ((priv->level & GTK_FONT_CHOOSER_LEVEL_FEATURES) == 0)
+    return FALSE;
+
   pango_font = pango_context_load_font (gtk_widget_get_pango_context (GTK_WIDGET (fontchooser)),
                                         priv->font_desc);
   ft_face = pango_fc_font_lock_face (PANGO_FC_FONT (pango_font)),
@@ -2384,7 +2394,7 @@ gtk_font_chooser_widget_set_level (GtkFontChooserWidget *fontchooser,
 
   priv->level = level;
 
-  if (level == GTK_FONT_CHOOSER_LEVEL_FONT)
+  if ((level & GTK_FONT_CHOOSER_LEVEL_SIZE) != 0)
     {
       gtk_widget_show (priv->size_label);
       gtk_widget_show (priv->size_slider);