summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2017-12-21 10:51:04 -0500
committerMatthias Clasen <mclasen@redhat.com>2018-01-03 12:18:18 -0500
commitf0526359d188689cd081f2b98430fbabfa19db30 (patch)
tree41c44c63871466776e257fe564cb3c975d4067ae
parent78f9193d7ed56ea28259e5253a0fd8a9b48e4236 (diff)
downloadgtk+-f0526359d188689cd081f2b98430fbabfa19db30.tar.gz
font chooser: introduce font chooser levels
This is a more systematic approach to reducing the level of detail in the font chooser.
-rw-r--r--docs/reference/gtk/gtk4-sections.txt3
-rw-r--r--gtk/gtkfontbutton.c35
-rw-r--r--gtk/gtkfontchooser.c55
-rw-r--r--gtk/gtkfontchooser.h24
-rw-r--r--gtk/gtkfontchooserutils.c3
-rw-r--r--gtk/gtkfontchooserutils.h1
-rw-r--r--gtk/gtkfontchooserwidget.c66
-rw-r--r--gtk/ui/gtkfontchooserwidget.ui16
8 files changed, 196 insertions, 7 deletions
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index f18355717b..df119378d5 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -1313,6 +1313,9 @@ gtk_font_chooser_get_preview_text
gtk_font_chooser_set_preview_text
gtk_font_chooser_get_show_preview_entry
gtk_font_chooser_set_show_preview_entry
+GtkFontChooserLevel
+gtk_font_chooser_get_level
+gtk_font_chooser_set_level
GtkFontFilterFunc
gtk_font_chooser_set_filter_func
gtk_font_chooser_set_font_map
diff --git a/gtk/gtkfontbutton.c b/gtk/gtkfontbutton.c
index 0394b4789a..7c38119f2e 100644
--- a/gtk/gtkfontbutton.c
+++ b/gtk/gtkfontbutton.c
@@ -90,6 +90,8 @@ struct _GtkFontButtonPrivate
gpointer font_filter_data;
GDestroyNotify font_filter_data_destroy;
GtkCssProvider *provider;
+
+ GtkFontChooserLevel level;
};
/* Signals */
@@ -137,6 +139,8 @@ static void gtk_font_button_update_font_info (GtkFontButton *gfs);
static void gtk_font_button_set_font_name (GtkFontButton *button,
const char *fontname);
static const char *gtk_font_button_get_font_name (GtkFontButton *button);
+static void gtk_font_button_set_level (GtkFontButton *font_button,
+ GtkFontChooserLevel level);
static guint font_button_signals[LAST_SIGNAL] = { 0 };
@@ -693,6 +697,9 @@ gtk_font_button_set_property (GObject *object,
case GTK_FONT_CHOOSER_PROP_FONT_DESC:
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));
+ break;
case GTK_FONT_CHOOSER_PROP_FONT:
gtk_font_button_set_font_name (font_button, g_value_get_string (value));
break;
@@ -721,6 +728,7 @@ gtk_font_button_get_property (GObject *object,
GParamSpec *pspec)
{
GtkFontButton *font_button = GTK_FONT_BUTTON (object);
+ GtkFontButtonPrivate *priv = font_button->priv;
switch (param_id)
{
@@ -736,6 +744,9 @@ gtk_font_button_get_property (GObject *object,
case GTK_FONT_CHOOSER_PROP_FONT_DESC:
g_value_set_boxed (value, gtk_font_button_get_font_desc (font_button));
break;
+ case GTK_FONT_CHOOSER_PROP_LEVEL:
+ g_value_set_enum (value, priv->level);
+ break;
case GTK_FONT_CHOOSER_PROP_FONT:
g_value_set_string (value, gtk_font_button_get_font_name (font_button));
break;
@@ -1056,7 +1067,9 @@ gtk_font_button_clicked (GtkButton *button,
if (priv->font_map)
gtk_font_chooser_set_font_map (font_dialog, priv->font_map);
+
gtk_font_chooser_set_show_preview_entry (font_dialog, priv->show_preview_entry);
+ g_object_set (font_dialog, "level", priv->level, NULL);
if (priv->preview_text)
{
@@ -1373,3 +1386,25 @@ gtk_font_button_update_font_info (GtkFontButton *font_button)
gtk_font_button_label_use_font (font_button);
}
+
+static void
+gtk_font_button_set_level (GtkFontButton *button,
+ GtkFontChooserLevel level)
+{
+ GtkFontButtonPrivate *priv = button->priv;
+
+ if (priv->level == level)
+ return;
+
+ priv->level = level;
+
+ if (priv->font_dialog)
+ g_object_set (priv->font_dialog, "level", level, NULL);
+
+ g_object_set (button,
+ "show-size", level == GTK_FONT_CHOOSER_LEVEL_FONT,
+ "show-style", level != GTK_FONT_CHOOSER_LEVEL_FAMILY,
+ NULL);
+
+ g_object_notify (G_OBJECT (button), "level");
+}
diff --git a/gtk/gtkfontchooser.c b/gtk/gtkfontchooser.c
index 4502a93f9a..41bb4b4a0e 100644
--- a/gtk/gtkfontchooser.c
+++ b/gtk/gtkfontchooser.c
@@ -106,6 +106,22 @@ gtk_font_chooser_default_init (GtkFontChooserInterface *iface)
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
/**
+ * GtkFontChooser:level:
+ *
+ * The level of granularity to offer for selecting fonts.
+ *
+ * Since: 3.94
+ */
+ 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));
+
+ /**
* GtkFontChooser::font-activated:
* @self: the object which received the signal
* @fontname: the font name
@@ -481,3 +497,42 @@ gtk_font_chooser_get_font_map (GtkFontChooser *fontchooser)
return fontmap;
}
+
+/**
+ * gtk_font_chooser_set_level:
+ * @fontchooser: a #GtkFontChooser
+ * @level: the desired level of granularity
+ *
+ * Sets the desired level of granularity for selecting fonts.
+ *
+ * Since: 3.94
+ */
+void
+gtk_font_chooser_set_level (GtkFontChooser *fontchooser,
+ GtkFontChooserLevel level)
+{
+ g_return_if_fail (GTK_IS_FONT_CHOOSER (fontchooser));
+
+ g_object_set (fontchooser, "level", level, NULL);
+}
+
+/**
+ * gtk_font_chooser_get_level:
+ * @fontchooser: a #GtkFontChooser
+ *
+ * Returns the current level of granularity for selecting fonts.
+ *
+ * Returns: the current granularity level
+ * Since: 3.94
+ */
+GtkFontChooserLevel
+gtk_font_chooser_get_level (GtkFontChooser *fontchooser)
+{
+ GtkFontChooserLevel level;
+
+ g_return_val_if_fail (GTK_IS_FONT_CHOOSER (fontchooser), 0);
+
+ g_object_get (fontchooser, "level", &level, NULL);
+
+ return level;
+}
diff --git a/gtk/gtkfontchooser.h b/gtk/gtkfontchooser.h
index 8ca690f6ca..b60d92a50a 100644
--- a/gtk/gtkfontchooser.h
+++ b/gtk/gtkfontchooser.h
@@ -44,6 +44,24 @@ typedef gboolean (*GtkFontFilterFunc) (const PangoFontFamily *family,
const PangoFontFace *face,
gpointer data);
+/**
+ * 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"
+ *
+ * This enumeration specifies the granularity of font selection
+ * that is desired in a font chooser.
+ */
+typedef enum {
+ GTK_FONT_CHOOSER_LEVEL_FONT,
+ GTK_FONT_CHOOSER_LEVEL_FACE,
+ GTK_FONT_CHOOSER_LEVEL_FAMILY
+} GtkFontChooserLevel;
+
#define GTK_TYPE_FONT_CHOOSER (gtk_font_chooser_get_type ())
#define GTK_FONT_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_TYPE_FONT_CHOOSER, GtkFontChooser))
#define GTK_IS_FONT_CHOOSER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GTK_TYPE_FONT_CHOOSER))
@@ -122,6 +140,12 @@ void gtk_font_chooser_set_font_map (GtkFontChooser *fo
PangoFontMap *fontmap);
GDK_AVAILABLE_IN_3_18
PangoFontMap * gtk_font_chooser_get_font_map (GtkFontChooser *fontchooser);
+GDK_AVAILABLE_IN_3_94
+void gtk_font_chooser_set_level (GtkFontChooser *fontchooser,
+ GtkFontChooserLevel level);
+GDK_AVAILABLE_IN_3_94
+GtkFontChooserLevel
+ gtk_font_chooser_get_level (GtkFontChooser *fontchooser);
G_END_DECLS
diff --git a/gtk/gtkfontchooserutils.c b/gtk/gtkfontchooserutils.c
index 36ebd8bcd0..09469bd3c9 100644
--- a/gtk/gtkfontchooserutils.c
+++ b/gtk/gtkfontchooserutils.c
@@ -134,6 +134,9 @@ _gtk_font_chooser_install_properties (GObjectClass *klass)
g_object_class_override_property (klass,
GTK_FONT_CHOOSER_PROP_SHOW_PREVIEW_ENTRY,
"show-preview-entry");
+ g_object_class_override_property (klass,
+ GTK_FONT_CHOOSER_PROP_LEVEL,
+ "level");
}
/**
diff --git a/gtk/gtkfontchooserutils.h b/gtk/gtkfontchooserutils.h
index 7c92a64947..8d4af1bd66 100644
--- a/gtk/gtkfontchooserutils.h
+++ b/gtk/gtkfontchooserutils.h
@@ -37,6 +37,7 @@ typedef enum {
GTK_FONT_CHOOSER_PROP_FONT_DESC,
GTK_FONT_CHOOSER_PROP_PREVIEW_TEXT,
GTK_FONT_CHOOSER_PROP_SHOW_PREVIEW_ENTRY,
+ GTK_FONT_CHOOSER_PROP_LEVEL,
GTK_FONT_CHOOSER_PROP_LAST
} GtkFontChooserProp;
diff --git a/gtk/gtkfontchooserwidget.c b/gtk/gtkfontchooserwidget.c
index 652bc7d502..b019bbf08f 100644
--- a/gtk/gtkfontchooserwidget.c
+++ b/gtk/gtkfontchooserwidget.c
@@ -79,7 +79,6 @@
* Since: 3.2
*/
-
struct _GtkFontChooserWidgetPrivate
{
GtkWidget *grid;
@@ -96,6 +95,7 @@ struct _GtkFontChooserWidgetPrivate
gchar *preview_text;
gboolean show_preview_entry;
+ GtkWidget *size_label;
GtkWidget *size_spin;
GtkWidget *size_slider;
@@ -109,6 +109,8 @@ struct _GtkFontChooserWidgetPrivate
GDestroyNotify filter_data_destroy;
guint last_fontconfig_timestamp;
+
+ GtkFontChooserLevel level;
};
/* Keep in line with GtkTreeStore defined in gtkfontchooserwidget.ui */
@@ -168,6 +170,9 @@ static void gtk_font_chooser_widget_cell_data_func (GtkTreeViewColum
GtkTreeModel *tree_model,
GtkTreeIter *iter,
gpointer user_data);
+static void gtk_font_chooser_widget_set_level (GtkFontChooserWidget *fontchooser,
+ GtkFontChooserLevel level);
+static GtkFontChooserLevel gtk_font_chooser_widget_get_level (GtkFontChooserWidget *fontchooser);
static void gtk_font_chooser_widget_iface_init (GtkFontChooserIface *iface);
@@ -257,6 +262,9 @@ gtk_font_chooser_widget_set_property (GObject *object,
case GTK_FONT_CHOOSER_PROP_SHOW_PREVIEW_ENTRY:
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));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -285,6 +293,9 @@ gtk_font_chooser_widget_get_property (GObject *object,
case GTK_FONT_CHOOSER_PROP_SHOW_PREVIEW_ENTRY:
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));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -648,6 +659,7 @@ gtk_font_chooser_widget_class_init (GtkFontChooserWidgetClass *klass)
gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, model);
gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, filter_model);
gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, preview);
+ gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, size_label);
gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, size_spin);
gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, size_slider);
gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserWidget, grid);
@@ -742,7 +754,6 @@ gtk_font_chooser_widget_load_fonts (GtkFontChooserWidget *fontchooser,
GtkListStore *list_store;
gint n_families, i;
PangoFontFamily **families;
- gchar *family_and_face;
guint fontconfig_timestamp;
gboolean need_reload;
PangoFontMap *font_map;
@@ -791,21 +802,29 @@ gtk_font_chooser_widget_load_fonts (GtkFontChooserWidget *fontchooser,
{
GtkDelayedFontDescription *desc;
const gchar *face_name;
+ char *title;
face_name = pango_font_face_get_face_name (faces[j]);
- family_and_face = g_strconcat (fam_name, " ", face_name, NULL);
+ if (priv->level == GTK_FONT_CHOOSER_LEVEL_FAMILY)
+ title = g_strdup (fam_name);
+ else
+ title = g_strconcat (fam_name, " ", face_name, NULL);
+
desc = gtk_delayed_font_description_new (faces[j]);
gtk_list_store_insert_with_values (list_store, &iter, -1,
FAMILY_COLUMN, families[i],
FACE_COLUMN, faces[j],
FONT_DESC_COLUMN, desc,
- PREVIEW_TITLE_COLUMN, family_and_face,
+ PREVIEW_TITLE_COLUMN, title,
-1);
- g_free (family_and_face);
+ g_free (title);
gtk_delayed_font_description_unref (desc);
+
+ if (priv->level == GTK_FONT_CHOOSER_LEVEL_FAMILY)
+ break;
}
g_free (faces);
@@ -1374,6 +1393,43 @@ gtk_font_chooser_widget_set_filter_func (GtkFontChooser *chooser,
}
static void
+gtk_font_chooser_widget_set_level (GtkFontChooserWidget *fontchooser,
+ GtkFontChooserLevel level)
+{
+ GtkFontChooserWidgetPrivate *priv = fontchooser->priv;
+
+ if (priv->level == level)
+ return;
+
+ priv->level = level;
+
+ if (level == GTK_FONT_CHOOSER_LEVEL_FONT)
+ {
+ gtk_widget_show (priv->size_label);
+ gtk_widget_show (priv->size_slider);
+ gtk_widget_show (priv->size_spin);
+ }
+ else
+ {
+ gtk_widget_hide (priv->size_label);
+ gtk_widget_hide (priv->size_slider);
+ gtk_widget_hide (priv->size_spin);
+ }
+
+ gtk_font_chooser_widget_load_fonts (fontchooser, TRUE);
+
+ g_object_notify (G_OBJECT (fontchooser), "level");
+}
+
+static GtkFontChooserLevel
+gtk_font_chooser_widget_get_level (GtkFontChooserWidget *fontchooser)
+{
+ GtkFontChooserWidgetPrivate *priv = fontchooser->priv;
+
+ return priv->level;
+}
+
+static void
gtk_font_chooser_widget_iface_init (GtkFontChooserIface *iface)
{
iface->get_font_family = gtk_font_chooser_widget_get_family;
diff --git a/gtk/ui/gtkfontchooserwidget.ui b/gtk/ui/gtkfontchooserwidget.ui
index b77c60608d..5c95c29620 100644
--- a/gtk/ui/gtkfontchooserwidget.ui
+++ b/gtk/ui/gtkfontchooserwidget.ui
@@ -102,7 +102,7 @@
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
- <property name="width">2</property>
+ <property name="width">3</property>
</packing>
</child>
<child>
@@ -114,7 +114,19 @@
<packing>
<property name="left-attach">0</property>
<property name="top-attach">2</property>
- <property name="width">2</property>
+ <property name="width">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="size_label">
+ <property name="visible">1</property>
+ <property name="label" translatable="yes">Size</property>
+ <property name="xalign">0</property>
+ <property name="valign">baseline</property>
+ </object>
+ <packing>
+ <property name="left-attach">0</property>
+ <property name="top-attach">3</property>
</packing>
</child>
<child>