diff --git a/gtk/gtkfontchooserdialog.c b/gtk/gtkfontchooserdialog.c
index c0637f53a5..ff60f5255a 100644
--- a/gtk/gtkfontchooserdialog.c
+++ b/gtk/gtkfontchooserdialog.c
@@ -38,6 +38,7 @@
#include "gtkdialogprivate.h"
#include "gtktogglebutton.h"
#include "gtkheaderbar.h"
+#include "gtkactionable.h"
struct _GtkFontChooserDialogPrivate
{
@@ -139,13 +140,6 @@ gtk_font_chooser_dialog_key_press_event (GtkWidget *dialog,
return handled;
}
-static void
-tweak_font (GtkFontChooserDialog *dialog)
-{
- gtk_font_chooser_widget_tweak_font (dialog->priv->fontchooser,
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->priv->tweak_button)));
-}
-
static void
setup_tweak_button (GtkFontChooserDialog *dialog)
{
@@ -159,17 +153,22 @@ setup_tweak_button (GtkFontChooserDialog *dialog)
{
GtkWidget *button;
GtkWidget *header;
+ GSimpleActionGroup *actions;
+
+ actions = g_simple_action_group_new ();
+ g_action_map_add_action (G_ACTION_MAP (actions), gtk_font_chooser_widget_get_tweak_action (dialog->priv->fontchooser));
+ gtk_widget_insert_action_group (GTK_WIDGET (dialog), "font", actions);
+ g_object_unref (actions);
button = gtk_toggle_button_new ();
+ gtk_actionable_set_action_name (GTK_ACTIONABLE (button), "font.tweak");
gtk_widget_set_focus_on_click (button, FALSE);
gtk_widget_set_valign (button, GTK_ALIGN_CENTER);
- gtk_button_set_icon_name (button, "emblem-system-symbolic");
+ gtk_button_set_icon_name (GTK_BUTTON (button), "emblem-system-symbolic");
header = gtk_dialog_get_header_bar (GTK_DIALOG (dialog));
gtk_header_bar_pack_end (GTK_HEADER_BAR (header), button);
- g_signal_connect_swapped (button, "notify::active", G_CALLBACK (tweak_font), dialog);
-
dialog->priv->tweak_button = button;
}
}
@@ -209,7 +208,6 @@ gtk_font_chooser_dialog_class_init (GtkFontChooserDialogClass *klass)
gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserDialog, select_button);
gtk_widget_class_bind_template_child_private (widget_class, GtkFontChooserDialog, cancel_button);
gtk_widget_class_bind_template_callback (widget_class, font_activated_cb);
- gtk_widget_class_bind_template_callback (widget_class, tweak_font);
}
static void
@@ -225,6 +223,12 @@ gtk_font_chooser_dialog_init (GtkFontChooserDialog *fontchooserdiag)
_gtk_font_chooser_set_delegate (GTK_FONT_CHOOSER (fontchooserdiag),
GTK_FONT_CHOOSER (priv->fontchooser));
+
+ g_object_bind_property (gtk_font_chooser_widget_get_tweak_action (priv->fontchooser),
+ "enabled",
+ priv->select_button,
+ "sensitive",
+ G_BINDING_SYNC_CREATE);
}
/**
diff --git a/gtk/gtkfontchooserwidget.c b/gtk/gtkfontchooserwidget.c
index 4648027aaa..580fa13863 100644
--- a/gtk/gtkfontchooserwidget.c
+++ b/gtk/gtkfontchooserwidget.c
@@ -168,6 +168,8 @@ struct _GtkFontChooserWidgetPrivate
GtkFontChooserLevel level;
GList *feature_items;
+
+ GAction *tweak_action;
};
/* Keep in line with GtkTreeStore defined in gtkfontchooserwidget.ui */
@@ -260,6 +262,8 @@ static void popover_notify (GObject *object,
GtkFontChooserWidget *fontchooser);
static void update_font_features (GtkFontChooserWidget *fontchooser);
static void update_language (GtkFontChooserWidget *fontchooser);
+static void selection_changed (GtkTreeSelection *selection,
+ GtkFontChooserWidget *fontchooser);
static void gtk_font_chooser_widget_iface_init (GtkFontChooserIface *iface);
@@ -667,11 +671,28 @@ static void
rows_changed_cb (GtkFontChooserWidget *fontchooser)
{
GtkFontChooserWidgetPrivate *priv = fontchooser->priv;
+ const char *page;
if (gtk_tree_model_iter_n_children (priv->filter_model, NULL) == 0)
- gtk_stack_set_visible_child_name (GTK_STACK (priv->list_stack), "empty");
+ page = "empty";
else
- gtk_stack_set_visible_child_name (GTK_STACK (priv->list_stack), "list");
+ page = "list";
+
+ if (strcmp (gtk_stack_get_visible_child_name (GTK_STACK (priv->list_stack)), page) != 0)
+ gtk_stack_set_visible_child_name (GTK_STACK (priv->list_stack), page);
+}
+
+static void
+gtk_font_chooser_widget_map (GtkWidget *widget)
+{
+ GtkFontChooserWidget *fontchooser = GTK_FONT_CHOOSER_WIDGET (widget);
+ GtkFontChooserWidgetPrivate *priv = fontchooser->priv;
+
+ gtk_entry_set_text (GTK_ENTRY (priv->search_entry), "");
+ gtk_stack_set_visible_child_name (GTK_STACK (priv->stack), "list");
+ g_simple_action_set_state (G_SIMPLE_ACTION (priv->tweak_action), g_variant_new_boolean (FALSE));
+
+ GTK_WIDGET_CLASS (gtk_font_chooser_widget_parent_class)->map (widget);
}
static void
@@ -743,6 +764,7 @@ gtk_font_chooser_widget_class_init (GtkFontChooserWidgetClass *klass)
widget_class->measure = gtk_font_chooser_widget_measure;
widget_class->size_allocate = gtk_font_chooser_widget_size_allocate;
widget_class->snapshot = gtk_font_chooser_widget_snapshot;
+ widget_class->map = gtk_font_chooser_widget_map;
gobject_class->finalize = gtk_font_chooser_widget_finalize;
gobject_class->dispose = gtk_font_chooser_widget_dispose;
@@ -810,6 +832,7 @@ gtk_font_chooser_widget_class_init (GtkFontChooserWidgetClass *klass)
gtk_widget_class_bind_template_callback (widget_class, popover_notify);
gtk_widget_class_bind_template_callback (widget_class, gtk_font_chooser_widget_refilter_font_list);
gtk_widget_class_bind_template_callback (widget_class, update_language);
+ gtk_widget_class_bind_template_callback (widget_class, selection_changed);
gtk_widget_class_set_css_name (widget_class, I_("fontchooser"));
}
@@ -863,6 +886,29 @@ axis_free (gpointer v)
}
#endif
+
+static void
+change_tweak (GSimpleAction *action,
+ GVariant *state,
+ gpointer data)
+{
+ GtkFontChooserWidget *fontchooser = data;
+ gboolean tweak = g_variant_get_boolean (state);
+
+ if (tweak)
+ {
+ gtk_entry_grab_focus_without_selecting (GTK_ENTRY (fontchooser->priv->preview2));
+ gtk_stack_set_visible_child_name (GTK_STACK (fontchooser->priv->stack), "tweaks");
+ }
+ else
+ {
+ gtk_entry_grab_focus_without_selecting (GTK_ENTRY (fontchooser->priv->search_entry));
+ gtk_stack_set_visible_child_name (GTK_STACK (fontchooser->priv->stack), "list");
+ }
+
+ g_simple_action_set_state (action, state);
+}
+
static void
gtk_font_chooser_widget_init (GtkFontChooserWidget *fontchooser)
{
@@ -905,6 +951,9 @@ gtk_font_chooser_widget_init (GtkFontChooserWidget *fontchooser)
fontchooser,
NULL);
+ priv->tweak_action = G_ACTION (g_simple_action_new_stateful ("tweak", NULL, g_variant_new_boolean (FALSE)));
+ g_signal_connect (priv->tweak_action, "change-state", G_CALLBACK (change_tweak), fontchooser);
+
/* Load data and set initial style-dependent parameters */
gtk_font_chooser_widget_load_fonts (fontchooser, TRUE);
gtk_font_chooser_widget_populate_filters (fontchooser);
@@ -1793,6 +1842,8 @@ gtk_font_chooser_widget_finalize (GObject *object)
g_list_free_full (priv->feature_items, g_free);
+ g_object_unref (priv->tweak_action);
+
G_OBJECT_CLASS (gtk_font_chooser_widget_parent_class)->finalize (object);
}
@@ -1929,20 +1980,36 @@ static gint
gtk_font_chooser_widget_get_size (GtkFontChooser *chooser)
{
GtkFontChooserWidget *fontchooser = GTK_FONT_CHOOSER_WIDGET (chooser);
+ PangoFontDescription *desc = gtk_font_chooser_widget_get_font_desc (fontchooser);
- return pango_font_description_get_size (fontchooser->priv->font_desc);
+ if (desc)
+ return pango_font_description_get_size (desc);
+
+ return -1;
}
static gchar *
gtk_font_chooser_widget_get_font (GtkFontChooserWidget *fontchooser)
{
- return pango_font_description_to_string (fontchooser->priv->font_desc);
+ PangoFontDescription *desc = gtk_font_chooser_widget_get_font_desc (fontchooser);
+
+ if (desc)
+ return pango_font_description_to_string (desc);
+
+ return NULL;
}
static PangoFontDescription *
gtk_font_chooser_widget_get_font_desc (GtkFontChooserWidget *fontchooser)
{
- return fontchooser->priv->font_desc;
+ GtkFontChooserWidgetPrivate *priv = fontchooser->priv;
+ GtkTreeSelection *selection;
+
+ selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->family_face_list));
+ if (gtk_tree_selection_count_selected_rows (selection) > 0)
+ return fontchooser->priv->font_desc;
+
+ return NULL;
}
static void
@@ -1955,13 +2022,33 @@ gtk_font_chooser_widget_set_font (GtkFontChooserWidget *fontchooser,
gtk_font_chooser_widget_take_font_desc (fontchooser, font_desc);
}
+static void
+selection_changed (GtkTreeSelection *selection,
+ GtkFontChooserWidget *fontchooser)
+{
+ GtkFontChooserWidgetPrivate *priv = fontchooser->priv;
+
+ g_object_notify (G_OBJECT (fontchooser), "font");
+ g_object_notify (G_OBJECT (fontchooser), "font-desc");
+
+ if (gtk_tree_selection_count_selected_rows (selection) > 0)
+ {
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (priv->tweak_action), TRUE);
+ }
+ else
+ {
+ g_simple_action_set_state (G_SIMPLE_ACTION (priv->tweak_action), g_variant_new_boolean (FALSE));
+ g_simple_action_set_enabled (G_SIMPLE_ACTION (priv->tweak_action), FALSE);
+ }
+}
+
static void
gtk_font_chooser_widget_ensure_selection (GtkFontChooserWidget *fontchooser)
{
GtkFontChooserWidgetPrivate *priv = fontchooser->priv;
GtkTreeSelection *selection;
GtkTreeIter filter_iter;
-
+
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->family_face_list));
if (gtk_list_store_iter_is_valid (GTK_LIST_STORE (priv->model), &priv->font_iter) &&
@@ -2948,20 +3035,9 @@ gtk_font_chooser_widget_handle_event (GtkWidget *widget,
return gtk_search_entry_handle_event (GTK_SEARCH_ENTRY (priv->search_entry), event);
}
-void
-gtk_font_chooser_widget_tweak_font (GtkWidget *widget,
- gboolean tweak)
+GAction *
+gtk_font_chooser_widget_get_tweak_action (GtkWidget *widget)
{
- GtkFontChooserWidget *fontchooser = GTK_FONT_CHOOSER_WIDGET (widget);
-
- if (tweak)
- {
- gtk_entry_grab_focus_without_selecting (GTK_ENTRY (fontchooser->priv->preview2));
- gtk_stack_set_visible_child_name (GTK_STACK (fontchooser->priv->stack), "tweaks");
- }
- else
- {
- gtk_entry_grab_focus_without_selecting (GTK_ENTRY (fontchooser->priv->search_entry));
- gtk_stack_set_visible_child_name (GTK_STACK (fontchooser->priv->stack), "list");
- }
+ return GTK_FONT_CHOOSER_WIDGET (widget)->priv->tweak_action;
}
+
diff --git a/gtk/gtkfontchooserwidgetprivate.h b/gtk/gtkfontchooserwidgetprivate.h
index 19a8edad91..5abdc5e47b 100644
--- a/gtk/gtkfontchooserwidgetprivate.h
+++ b/gtk/gtkfontchooserwidgetprivate.h
@@ -25,8 +25,7 @@ G_BEGIN_DECLS
gboolean gtk_font_chooser_widget_handle_event (GtkWidget *widget,
GdkEventKey *event);
-void gtk_font_chooser_widget_tweak_font (GtkWidget *fontchooser,
- gboolean tweak);
+GAction *gtk_font_chooser_widget_get_tweak_action (GtkWidget *fontchooser);
G_END_DECLS
diff --git a/gtk/ui/gtkfontchooserwidget.ui b/gtk/ui/gtkfontchooserwidget.ui
index ea0acc65bc..70fa80fa6f 100644
--- a/gtk/ui/gtkfontchooserwidget.ui
+++ b/gtk/ui/gtkfontchooserwidget.ui
@@ -96,6 +96,7 @@