GtkFontChooser: Improvements on the size setting signals between the preview, scale and spinbutton. Adding more string fields to the model to allow for backwards compatibility.

This commit is contained in:
Alberto Ruiz 2011-04-18 22:20:15 +01:00 committed by Matthias Clasen
parent 1688512252
commit f75e4d314a

View File

@ -113,18 +113,6 @@ struct _GtkFontSelectionDialogPrivate
};
/* We don't enable the font and style entries because they don't add
* much in terms of visible effect and have a weird effect on keynav.
* the Windows font selector has entries similarly positioned but they
* act in conjunction with the associated lists to form a single focus
* location.
*/
#undef INCLUDE_FONT_ENTRIES
/* This is the default text shown in the preview entry, though the user
can set it. Remember that some fonts only have capital letters. */
#define PREVIEW_TEXT N_("abcdefghijk ABCDEFGHIJK")
#define DEFAULT_FONT_NAME "Sans 10"
#define MAX_FONT_SIZE 999
@ -138,7 +126,7 @@ struct _GtkFontSelectionDialogPrivate
#define FONT_STYLE_LIST_WIDTH 170
#define FONT_SIZE_LIST_WIDTH 60
#define ROW_FORMAT_STRING "<span size=\"small\" foreground=\"%s\">%s %s</span>\n<span size=\"x-large\" font_desc=\"%s\">%s</span>"
#define ROW_FORMAT_STRING "<span size=\"small\" foreground=\"%s\">%s</span>\n<span size=\"x-large\" font_desc=\"%s\">%s</span>"
/* These are what we use as the standard font sizes, for the size list.
*/
@ -157,8 +145,11 @@ enum {
enum {
FAMILY_COLUMN,
FACE_COLUMN,
PREVIEW_TEXT_COLUMN,
PREVIEW_TITLE_COLUMN,
/*FIXME: Remove two strings after deprecation removal */
FAMILY_NAME_COLUMN,
TEXT_COLUMN
FACE_NAME_COLUMN
};
static void gtk_font_selection_set_property (GObject *object,
@ -170,9 +161,12 @@ static void gtk_font_selection_get_property (GObject *object,
GValue *value,
GParamSpec *pspec);
static void gtk_font_selection_finalize (GObject *object);
#if 0
static void gtk_font_selection_screen_changed (GtkWidget *widget,
GdkScreen *previous_screen);
static void gtk_font_selection_style_updated (GtkWidget *widget);
#endif
static void gtk_font_selection_ref_family (GtkFontSelection *fontsel,
PangoFontFamily *family);
@ -187,15 +181,17 @@ static void
gtk_font_selection_class_init (GtkFontSelectionClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
#if 0
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
widget_class->screen_changed = gtk_font_selection_screen_changed;
widget_class->style_updated = gtk_font_selection_style_updated;
#endif
gobject_class->finalize = gtk_font_selection_finalize;
gobject_class->set_property = gtk_font_selection_set_property;
gobject_class->get_property = gtk_font_selection_get_property;
widget_class->screen_changed = gtk_font_selection_screen_changed;
widget_class->style_updated = gtk_font_selection_style_updated;
g_object_class_install_property (gobject_class,
PROP_FONT_NAME,
g_param_spec_string ("font-name",
@ -208,7 +204,7 @@ gtk_font_selection_class_init (GtkFontSelectionClass *klass)
g_param_spec_string ("preview-text",
P_("Preview text"),
P_("The text to display in order to demonstrate the selected font"),
_(PREVIEW_TEXT),
pango_language_get_sample_string (NULL),
GTK_PARAM_READWRITE));
g_type_class_add_private (klass, sizeof (GtkFontSelectionPrivate));
@ -238,7 +234,8 @@ gtk_font_selection_set_property (GObject *object,
}
}
static void gtk_font_selection_get_property (GObject *object,
static void
gtk_font_selection_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
@ -261,6 +258,30 @@ static void gtk_font_selection_get_property (GObject *object,
}
}
void
refilter_and_focus (GtkFontSelectionPrivate *priv)
{
GtkTreeIter iter;
GtkTreeView *treeview = GTK_TREE_VIEW (priv->family_face_list);
GtkTreePath *path = gtk_tree_path_new ();
gtk_tree_model_filter_refilter (GTK_TREE_MODEL_FILTER (priv->filter));
if (!path)
return;
gtk_tree_view_get_cursor (treeview, &path, NULL);
if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->filter), &iter, path))
{
gtk_tree_path_free (path);
return;
}
gtk_tree_view_scroll_to_cell (treeview, path, NULL, FALSE, 0.0, 0.0);
gtk_tree_path_free (path);
}
void
deleted_text_cb (GtkEntryBuffer *buffer,
guint position,
@ -354,28 +375,56 @@ spin_change_cb (GtkAdjustment *adjustment, gpointer data)
}
void
set_range_marks (GtkWidget* size_slider, gint* sizes, gint length)
set_range_marks (GtkFontSelectionPrivate *priv,
GtkWidget* size_slider,
gint* sizes,
gint length)
{
GtkAdjustment *adj;
gint i;
gdouble value;
if (length<2)
{
sizes = (gint*)font_sizes;
length = FONT_SIZES_LENGTH;
}
gtk_scale_clear_marks (GTK_SCALE (size_slider));
adj = gtk_range_get_adjustment(GTK_RANGE (size_slider));
gtk_adjustment_set_lower (adj, (gdouble) sizes[0]);
gtk_adjustment_set_upper (adj, (gdouble) sizes[length-1]);
value = gtk_adjustment_get_value (adj);
if (value > (gdouble) sizes[length-1])
{
gtk_adjustment_set_value (adj, (gdouble) sizes[length-1]);
priv->ignore_slider = TRUE;
}
else if (value < (gdouble) sizes[0])
{
gtk_adjustment_set_value (adj, (gdouble) sizes[0]);
priv->ignore_slider = TRUE;
}
for (i=0; i<length; i++)
gtk_scale_add_mark (GTK_SCALE (size_slider),
(gdouble) sizes[i],
GTK_POS_BOTTOM, NULL);
}
void
cursor_changed_cb (GtkTreeView *treeview, gpointer data)
{
gchar *family_name;
PangoFontFamily *family;
PangoFontFace *face;
PangoFontDescription *desc;
gint *sizes;
gint n_sizes;
gint i, n_sizes;
GtkTreeIter iter;
GtkTreePath *path = gtk_tree_path_new ();
@ -387,20 +436,25 @@ cursor_changed_cb (GtkTreeView *treeview, gpointer data)
if (!path)
return;
if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (fontsel->priv->model), &iter, path))
if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (fontsel->priv->filter), &iter, path))
{
gtk_tree_path_free (path);
return;
}
gtk_tree_model_get (GTK_TREE_MODEL (fontsel->priv->model), &iter,
gtk_tree_model_get (GTK_TREE_MODEL (fontsel->priv->filter), &iter,
FACE_COLUMN, &face,
FAMILY_COLUMN, &family,
FAMILY_NAME_COLUMN, &family_name,
-1);
gtk_tree_view_scroll_to_cell (treeview, path, NULL, FALSE, 0.0, 0.0);
gtk_tree_path_free (path);
path = NULL;
if (!face || !family_name || !family)
if (!face || !family)
{
g_free (family_name);
g_object_unref (face);
g_object_unref (family);
return;
@ -412,13 +466,15 @@ cursor_changed_cb (GtkTreeView *treeview, gpointer data)
pango_font_face_list_sizes (face, &sizes, &n_sizes);
/* It seems not many fonts actually have a sane set of sizes */
/* set_range_marks (priv->size_slider, sizes, n_sizes); */
for (i=0; i<n_sizes; i++)
sizes[i] = sizes[i] / PANGO_SCALE;
set_range_marks (fontsel->priv, fontsel->priv->size_slider, sizes, n_sizes);
gtk_font_selection_ref_family (fontsel, family);
gtk_font_selection_ref_face (fontsel, face);
/* Free resources */
g_free (family_name);
g_object_unref ((gpointer)face);
pango_font_description_free(desc);
}
@ -574,7 +630,7 @@ gtk_font_selection_init (GtkFontSelection *fontsel)
g_signal_connect (G_OBJECT (priv->size_slider), "scroll-event",
G_CALLBACK (zoom_preview_cb), priv);
set_range_marks (priv->size_slider, (gint*)font_sizes, FONT_SIZES_LENGTH);
set_range_marks (priv, priv->size_slider, (gint*)font_sizes, FONT_SIZES_LENGTH);
/* Set default focus */
gtk_widget_pop_composite_child();
@ -621,6 +677,7 @@ populate_list (GtkTreeView* treeview, GtkListStore* model)
PangoFontFamily **families;
GString *tmp = g_string_new (NULL);
GString *family_and_face = g_string_new (NULL);
pango_context_list_families (gtk_widget_get_pango_context (GTK_WIDGET (treeview)),
&families,
@ -646,6 +703,7 @@ populate_list (GtkTreeView* treeview, GtkListStore* model)
{
GtkTreeIter iter;
PangoFontFace **faces;
int j, n_faces;
const gchar *fam_name = pango_font_family_get_name (families[i]);
@ -658,20 +716,28 @@ populate_list (GtkTreeView* treeview, GtkListStore* model)
gchar *font_desc = pango_font_description_to_string (pango_desc);
/* foreground_color, family_name, face_name, desc, sample string */
g_string_printf (family_and_face, "%s %s",
fam_name,
face_name);
g_string_printf (tmp, ROW_FORMAT_STRING,
color_string,
fam_name,
face_name,
family_and_face->str,
font_desc,
PREVIEW_TEXT);
pango_language_get_sample_string (NULL));
g_debug ("asdad");
gtk_list_store_append (model, &iter);
gtk_list_store_set (model, &iter,
FAMILY_COLUMN, families[i],
FACE_COLUMN, faces[j],
PREVIEW_TITLE_COLUMN, family_and_face->str,
PREVIEW_TEXT_COLUMN, tmp->str,
/** FIXME: FAMILY_NAME_COLUMN and FACE_NAME_COLUMN
are needed only until we remove the deprecated
API **/
FAMILY_NAME_COLUMN, fam_name,
TEXT_COLUMN, tmp->str,
FACE_NAME_COLUMN, face_name,
-1);
if ((i == 0 && j == 0) ||
@ -688,9 +754,15 @@ populate_list (GtkTreeView* treeview, GtkListStore* model)
}
path = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &match_row);
gtk_tree_view_set_cursor (treeview, path, NULL, FALSE);
if (path)
{
gtk_tree_view_set_cursor (treeview, path, NULL, FALSE);
gtk_tree_path_free(path);
}
g_string_free (family_and_face, TRUE);
g_string_free (tmp, TRUE);
g_free (color_string);
g_free (families);
@ -743,10 +815,13 @@ gtk_font_selection_bootstrap_fontlist (GtkFontSelection* fontsel)
GtkCellRenderer *cell;
GtkTreeViewColumn *col;
fontsel->priv->model = gtk_list_store_new (4,
fontsel->priv->model = gtk_list_store_new (6,
PANGO_TYPE_FONT_FAMILY,
PANGO_TYPE_FONT_FACE,
G_TYPE_STRING,
G_TYPE_STRING,
/*FIXME: Remove two strings after deprecation removal */
G_TYPE_STRING,
G_TYPE_STRING);
fontsel->priv->filter = gtk_tree_model_filter_new (GTK_TREE_MODEL (fontsel->priv->model),
@ -758,7 +833,6 @@ gtk_font_selection_bootstrap_fontlist (GtkFontSelection* fontsel)
(gpointer)fontsel->priv,
NULL);
gtk_tree_view_set_model (treeview, GTK_TREE_MODEL (fontsel->priv->filter));
g_object_unref (fontsel->priv->filter);
@ -768,7 +842,7 @@ gtk_font_selection_bootstrap_fontlist (GtkFontSelection* fontsel)
cell = gtk_cell_renderer_text_new ();
col = gtk_tree_view_column_new_with_attributes ("Family",
cell,
"markup", TEXT_COLUMN,
"markup", PREVIEW_TEXT_COLUMN,
NULL);
@ -791,6 +865,7 @@ gtk_font_selection_finalize (GObject *object)
G_OBJECT_CLASS (gtk_font_selection_parent_class)->finalize (object);
}
#if 0
static void
gtk_font_selection_screen_changed (GtkWidget *widget,
GdkScreen *previous_screen)
@ -801,10 +876,10 @@ gtk_font_selection_screen_changed (GtkWidget *widget,
static void
gtk_font_selection_style_updated (GtkWidget *widget)
{
GTK_WIDGET_CLASS (gtk_font_selection_parent_class)->style_updated (widget);
/*GTK_WIDGET_CLASS (gtk_font_selection_parent_class)->style_updated (widget);*/
return;
}
#endif
static void
gtk_font_selection_ref_family (GtkFontSelection *fontsel,