font chooser: Redo the tweaks hookup

Make the font chooser widget export an action that the
dialog can use for the button. This has some advantages:
- we can export not just the toggle state, but also enabled
- we can reuse the same enabled state to make the select
  button insensitive when no font is selected

To determine whether a font is selected, listen to changes
of the list selection. And ensure that the font chooser is
in an initial state when mapped, even if we close the dialog
from the tweak page.
This commit is contained in:
Matthias Clasen
2017-12-29 23:07:14 -05:00
parent b2c254ea25
commit 15aa0c8ea9
4 changed files with 114 additions and 34 deletions

View File

@@ -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);
}
/**

View File

@@ -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;
}

View File

@@ -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

View File

@@ -96,6 +96,7 @@
<child internal-child="selection">
<object class="GtkTreeSelection" id="treeview-selection1">
<property name="mode">browse</property>
<signal name="changed" handler="selection_changed"/>
</object>
</child>
<child>