diff options
Diffstat (limited to 'libnautilus-private/nautilus-font-picker.c')
-rw-r--r-- | libnautilus-private/nautilus-font-picker.c | 592 |
1 files changed, 282 insertions, 310 deletions
diff --git a/libnautilus-private/nautilus-font-picker.c b/libnautilus-private/nautilus-font-picker.c index ffe2639d5..ef6264540 100644 --- a/libnautilus-private/nautilus-font-picker.c +++ b/libnautilus-private/nautilus-font-picker.c @@ -25,81 +25,109 @@ #include <config.h> #include "nautilus-font-picker.h" + #include "nautilus-gtk-macros.h" #include "nautilus-glib-extensions.h" #include "nautilus-string-picker.h" #include "nautilus-string.h" +#include "nautilus-font-manager.h" #include <gtk/gtklabel.h> #include <gtk/gtkentry.h> #include <gtk/gtksignal.h> +#include <gtk/gtkhbox.h> #include <libgnome/gnome-i18n.h> + +typedef struct { + char *name; + char *font_file_name; +} FontStyle; + +typedef struct { + char *title; + char *foundry; + char *family; + char *name; + GList *style_list; +} FontEntry; + +static const char *black_listed_fonts[] = { + "microsoft Webdings", + "microsoft Wingdings", + "monotype OCR", + "URW Zapf Dingbats", + "URW Symbol", + "xfree86 cursor" +}; + static const gint FONT_PICKER_SPACING = 10; /* Signals */ typedef enum { - SELECTED_FONT_CHANGED, + CHANGED, LAST_SIGNAL } FontPickerSignals; -struct _NautilusFontPickerDetail +struct NautilusFontPickerDetails { - GtkWidget *family_picker; - GtkWidget *weight_picker; - GtkWidget *slant_picker; - GtkWidget *set_width_picker; - - NautilusStringList *weight_list; - NautilusStringList *slant_list; - NautilusStringList *set_width_list; + NautilusStringPicker *font_name_picker; + NautilusStringPicker *style_picker; + GList *font_entry_list; + GtkWidget *title_label; }; -/* NautilusFontPickerClass methods */ -static void nautilus_font_picker_initialize_class (NautilusFontPickerClass *klass); -static void nautilus_font_picker_initialize (NautilusFontPicker *font_picker); - - /* GtkObjectClass methods */ +static void nautilus_font_picker_initialize_class (NautilusFontPickerClass *font_picker_class); +static void nautilus_font_picker_initialize (NautilusFontPicker *font_picker); static void nautilus_font_picker_destroy (GtkObject *object); -static void family_picker_changed_callback (GtkWidget *string_picker, - gpointer user_data); -static void weight_picker_changed_callback (GtkWidget *string_picker, - gpointer user_data); -static void slant_picker_changed_callback (GtkWidget *string_picker, - gpointer user_data); -static void set_width_picker_changed_callback (GtkWidget *string_picker, - gpointer user_data); - -NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusFontPicker, nautilus_font_picker, GTK_TYPE_HBOX) +static void font_picker_update (NautilusFontPicker *font_picker); + +/* Callbacks */ +static void font_name_picker_changed_callback (GtkWidget *string_picker, + gpointer callback_data); +static void style_picker_changed_callback (GtkWidget *string_picker, + gpointer callback_data); +static void font_manager_callback (const char *font_file_name, + NautilusFontType font_type, + const char *foundry, + const char *family, + const char *weight, + const char *slant, + const char *set_width, + const char *char_set_registry, + const char *char_set_encoding, + gpointer callback_data); +static void font_entry_list_for_each_callback (gpointer data, + gpointer callback_data); +static void style_list_for_each_callback (gpointer data, + gpointer callback_data); + +NAUTILUS_DEFINE_CLASS_BOILERPLATE (NautilusFontPicker, nautilus_font_picker, GTK_TYPE_VBOX) static guint font_picker_signals[LAST_SIGNAL] = { 0 }; -/* - * NautilusFontPickerClass methods - */ +/* GtkObjectClass methods */ static void nautilus_font_picker_initialize_class (NautilusFontPickerClass *font_picker_class) { GtkObjectClass *object_class; - GtkWidgetClass *widget_class; object_class = GTK_OBJECT_CLASS (font_picker_class); - widget_class = GTK_WIDGET_CLASS (font_picker_class); /* GtkObjectClass */ object_class->destroy = nautilus_font_picker_destroy; /* Signals */ - font_picker_signals[SELECTED_FONT_CHANGED] = gtk_signal_new ("selected_font_changed", - GTK_RUN_LAST, - object_class->type, - 0, - gtk_marshal_NONE__NONE, - GTK_TYPE_NONE, - 0); + font_picker_signals[CHANGED] = gtk_signal_new ("changed", + GTK_RUN_LAST, + object_class->type, + 0, + gtk_marshal_NONE__NONE, + GTK_TYPE_NONE, + 0); gtk_object_class_add_signals (object_class, font_picker_signals, LAST_SIGNAL); } @@ -107,73 +135,55 @@ nautilus_font_picker_initialize_class (NautilusFontPickerClass *font_picker_clas static void nautilus_font_picker_initialize (NautilusFontPicker *font_picker) { - NautilusStringList *family_list; - - font_picker->detail = g_new (NautilusFontPickerDetail, 1); - - font_picker->detail->weight_list = NULL; - font_picker->detail->slant_list = NULL; - font_picker->detail->set_width_list = NULL; + GtkWidget *hbox; + font_picker->details = g_new0 (NautilusFontPickerDetails, 1); gtk_box_set_homogeneous (GTK_BOX (font_picker), FALSE); gtk_box_set_spacing (GTK_BOX (font_picker), FONT_PICKER_SPACING); - font_picker->detail->family_picker = nautilus_string_picker_new (); - font_picker->detail->weight_picker = nautilus_string_picker_new (); - font_picker->detail->slant_picker = nautilus_string_picker_new (); - font_picker->detail->set_width_picker = nautilus_string_picker_new (); - - gtk_box_pack_start (GTK_BOX (font_picker), font_picker->detail->family_picker, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (font_picker), font_picker->detail->weight_picker, TRUE, TRUE, 0); - gtk_box_pack_start (GTK_BOX (font_picker), font_picker->detail->slant_picker, TRUE, TRUE, 0); - gtk_box_pack_end (GTK_BOX (font_picker), font_picker->detail->set_width_picker, TRUE, TRUE, 0); + font_picker->details->title_label = gtk_label_new (""); + gtk_label_set_justify (GTK_LABEL (font_picker->details->title_label), + GTK_JUSTIFY_LEFT); + gtk_misc_set_alignment (GTK_MISC (font_picker->details->title_label), 0.0, 0.5); - nautilus_caption_set_title_label (NAUTILUS_CAPTION (font_picker->detail->family_picker), _("Font")); + gtk_box_pack_start (GTK_BOX (font_picker), font_picker->details->title_label, TRUE, TRUE, 0); - nautilus_caption_set_show_title (NAUTILUS_CAPTION (font_picker->detail->family_picker), FALSE); - nautilus_caption_set_show_title (NAUTILUS_CAPTION (font_picker->detail->weight_picker), FALSE); - nautilus_caption_set_show_title (NAUTILUS_CAPTION (font_picker->detail->slant_picker), FALSE); - nautilus_caption_set_show_title (NAUTILUS_CAPTION (font_picker->detail->set_width_picker), FALSE); + hbox = gtk_hbox_new (FALSE, 0); + gtk_box_pack_start (GTK_BOX (font_picker), hbox, TRUE, TRUE, 0); - family_list = nautilus_scalable_font_get_font_family_list (); + font_picker->details->font_name_picker = NAUTILUS_STRING_PICKER (nautilus_string_picker_new ()); + font_picker->details->style_picker = NAUTILUS_STRING_PICKER (nautilus_string_picker_new ()); - nautilus_string_list_sort (family_list); - - /* FIXME bugzilla.eazel.com 2557: - * Need to deal with possiblity of there being no fonts */ - g_assert (family_list != NULL); + gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (font_picker->details->font_name_picker), TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (font_picker->details->style_picker), TRUE, TRUE, 0); - nautilus_string_picker_set_string_list (NAUTILUS_STRING_PICKER (font_picker->detail->family_picker), - family_list); - - nautilus_string_list_free (family_list); + nautilus_caption_set_title_label (NAUTILUS_CAPTION (font_picker->details->font_name_picker), _("Font")); + nautilus_caption_set_show_title (NAUTILUS_CAPTION (font_picker->details->font_name_picker), FALSE); + nautilus_caption_set_show_title (NAUTILUS_CAPTION (font_picker->details->style_picker), FALSE); - gtk_signal_connect (GTK_OBJECT (font_picker->detail->family_picker), + gtk_signal_connect (GTK_OBJECT (font_picker->details->font_name_picker), "changed", - GTK_SIGNAL_FUNC (family_picker_changed_callback), + GTK_SIGNAL_FUNC (font_name_picker_changed_callback), font_picker); - gtk_signal_connect (GTK_OBJECT (font_picker->detail->weight_picker), + gtk_signal_connect (GTK_OBJECT (font_picker->details->style_picker), "changed", - GTK_SIGNAL_FUNC (weight_picker_changed_callback), + GTK_SIGNAL_FUNC (style_picker_changed_callback), font_picker); - gtk_signal_connect (GTK_OBJECT (font_picker->detail->slant_picker), - "changed", - GTK_SIGNAL_FUNC (slant_picker_changed_callback), - font_picker); + gtk_widget_show (GTK_WIDGET (font_picker->details->font_name_picker)); + gtk_widget_show (GTK_WIDGET (font_picker->details->style_picker)); + gtk_widget_show (font_picker->details->title_label); + gtk_widget_show (hbox); - gtk_signal_connect (GTK_OBJECT (font_picker->detail->set_width_picker), - "changed", - GTK_SIGNAL_FUNC (set_width_picker_changed_callback), - font_picker); + /* Populate the font table */ + nautilus_font_manager_for_each_font (font_manager_callback, font_picker); - gtk_widget_show (font_picker->detail->family_picker); - gtk_widget_show (font_picker->detail->weight_picker); - gtk_widget_show (font_picker->detail->slant_picker); - gtk_widget_show (font_picker->detail->set_width_picker); + /* Populate the font name (foundry+family) picker */ + g_list_foreach (font_picker->details->font_entry_list, font_entry_list_for_each_callback, font_picker); - family_picker_changed_callback (font_picker->detail->family_picker, font_picker); + /* Update the font picker */ + font_picker_update (font_picker);; } /* GtkObjectClass methods */ @@ -181,317 +191,279 @@ static void nautilus_font_picker_destroy (GtkObject* object) { NautilusFontPicker * font_picker; - - g_return_if_fail (object != NULL); + g_return_if_fail (NAUTILUS_IS_FONT_PICKER (object)); font_picker = NAUTILUS_FONT_PICKER (object); - - nautilus_string_list_free (font_picker->detail->weight_list); - nautilus_string_list_free (font_picker->detail->slant_list); - nautilus_string_list_free (font_picker->detail->set_width_list); - g_free (font_picker->detail); + g_free (font_picker->details); /* Chain */ NAUTILUS_CALL_PARENT (GTK_OBJECT_CLASS, destroy, (object)); } -static void -font_picker_update_weight_picker (NautilusFontPicker *font_picker) +static FontEntry * +font_entry_list_find (GList *font_entry_list, + const char *font_name) { - NautilusStringList *unique_weight_list; - char *family; - - g_return_if_fail (NAUTILUS_IS_FONT_PICKER (font_picker)); - - family = nautilus_string_picker_get_selected_string (NAUTILUS_STRING_PICKER (font_picker->detail->family_picker)); - - unique_weight_list = nautilus_string_list_new_from_string_list (font_picker->detail->weight_list, TRUE); - - nautilus_string_list_sort (unique_weight_list); - nautilus_string_list_remove_duplicates (unique_weight_list); - - nautilus_string_picker_set_string_list (NAUTILUS_STRING_PICKER (font_picker->detail->weight_picker), - unique_weight_list); + while (font_entry_list != NULL) { + FontEntry *entry; + g_assert (font_entry_list->data != NULL); + entry = font_entry_list->data; + if (nautilus_istr_is_equal (font_name, entry->name)) { + return entry; + } + + font_entry_list = font_entry_list->next; + } - nautilus_string_list_free (unique_weight_list); - - g_free (family); + return NULL; } static void -font_picker_update_slant_picker (NautilusFontPicker *font_picker) +font_picker_update (NautilusFontPicker *font_picker) { - NautilusStringList *unique_slant_list; - char *current_family; - char *current_weight; - guint i; + char *selected_font; + const FontEntry *entry; g_return_if_fail (NAUTILUS_IS_FONT_PICKER (font_picker)); - current_family = nautilus_string_picker_get_selected_string (NAUTILUS_STRING_PICKER (font_picker->detail->family_picker)); - current_weight = nautilus_string_picker_get_selected_string (NAUTILUS_STRING_PICKER (font_picker->detail->weight_picker)); - - g_assert (nautilus_string_list_get_length (font_picker->detail->slant_list) == - nautilus_string_list_get_length (font_picker->detail->weight_list)); + selected_font = nautilus_string_picker_get_selected_string (font_picker->details->font_name_picker); - unique_slant_list = nautilus_string_list_new (TRUE); + entry = font_entry_list_find (font_picker->details->font_entry_list, selected_font); + g_return_if_fail (entry != NULL); - for (i = 0; i < nautilus_string_list_get_length (font_picker->detail->slant_list); i++) { - char *weight = nautilus_string_list_nth (font_picker->detail->weight_list, i); - char *slant = nautilus_string_list_nth (font_picker->detail->slant_list, i); + nautilus_string_picker_clear (font_picker->details->style_picker); + + g_list_foreach (entry->style_list, style_list_for_each_callback, font_picker); + + g_free (selected_font); +} - if (nautilus_str_is_equal (current_weight, weight)) { - nautilus_string_list_insert (unique_slant_list, slant); - } +static void +font_name_picker_changed_callback (GtkWidget *string_picker, + gpointer callback_data) +{ + NautilusFontPicker *font_picker; - g_free (weight); - g_free (slant); - } + g_return_if_fail (NAUTILUS_IS_FONT_PICKER (callback_data)); + g_return_if_fail (NAUTILUS_IS_STRING_PICKER (string_picker)); - nautilus_string_list_sort (unique_slant_list); - nautilus_string_list_remove_duplicates (unique_slant_list); + font_picker = NAUTILUS_FONT_PICKER (callback_data); - nautilus_string_picker_set_string_list (NAUTILUS_STRING_PICKER (font_picker->detail->slant_picker), - unique_slant_list); - - nautilus_string_list_free (unique_slant_list); + font_picker_update (font_picker); - g_free (current_family); - g_free (current_weight); + gtk_signal_emit (GTK_OBJECT (font_picker), font_picker_signals[CHANGED]); } static void -font_picker_update_set_width_picker (NautilusFontPicker *font_picker) +style_picker_changed_callback (GtkWidget *string_picker, gpointer callback_data) { - NautilusStringList *unique_set_width_list; - char *current_family; - char *current_weight; - char *current_slant; - guint i; + NautilusFontPicker *font_picker; - g_return_if_fail (NAUTILUS_IS_FONT_PICKER (font_picker)); - - current_family = nautilus_string_picker_get_selected_string (NAUTILUS_STRING_PICKER (font_picker->detail->family_picker)); - current_weight = nautilus_string_picker_get_selected_string (NAUTILUS_STRING_PICKER (font_picker->detail->weight_picker)); - current_slant = nautilus_string_picker_get_selected_string (NAUTILUS_STRING_PICKER (font_picker->detail->slant_picker)); - - g_assert (nautilus_string_list_get_length (font_picker->detail->slant_list) == - nautilus_string_list_get_length (font_picker->detail->weight_list)); + g_return_if_fail (NAUTILUS_IS_FONT_PICKER (callback_data)); + g_return_if_fail (NAUTILUS_IS_STRING_PICKER (string_picker)); - g_assert (nautilus_string_list_get_length (font_picker->detail->slant_list) == - nautilus_string_list_get_length (font_picker->detail->set_width_list)); + font_picker = NAUTILUS_FONT_PICKER (callback_data); - unique_set_width_list = nautilus_string_list_new (TRUE); + gtk_signal_emit (GTK_OBJECT (font_picker), font_picker_signals[CHANGED]); +} + +static gboolean +ignore_font (const char *font_file_name, + const char *foundry, + const char *family, + const char *entry_name) +{ + guint i; - for (i = 0; i < nautilus_string_list_get_length (font_picker->detail->set_width_list); i++) { - char *weight = nautilus_string_list_nth (font_picker->detail->weight_list, i); - char *slant = nautilus_string_list_nth (font_picker->detail->slant_list, i); - char *set_width = nautilus_string_list_nth (font_picker->detail->set_width_list, i); + g_return_val_if_fail (font_file_name != NULL, TRUE); + g_return_val_if_fail (foundry != NULL, TRUE); + g_return_val_if_fail (family != NULL, TRUE); + g_return_val_if_fail (entry_name != NULL, TRUE); - if (nautilus_str_is_equal (current_weight, weight) - && nautilus_str_is_equal (current_slant, slant)) { - nautilus_string_list_insert (unique_set_width_list, set_width); + for (i = 0; i < NAUTILUS_N_ELEMENTS (black_listed_fonts); i++) { + if (nautilus_istr_is_equal (entry_name, black_listed_fonts[i])) { + return TRUE; } - - g_free (weight); - g_free (slant); - g_free (set_width); } - - nautilus_string_list_sort (unique_set_width_list); - nautilus_string_list_remove_duplicates (unique_set_width_list); - - nautilus_string_picker_set_string_list (NAUTILUS_STRING_PICKER (font_picker->detail->set_width_picker), - unique_set_width_list); - - nautilus_string_list_free (unique_set_width_list); - g_free (current_family); - g_free (current_weight); - g_free (current_slant); + return FALSE; } static void -family_picker_changed_callback (GtkWidget *string_picker, gpointer user_data) +font_manager_callback (const char *font_file_name, + NautilusFontType font_type, + const char *foundry, + const char *family, + const char *weight, + const char *slant, + const char *set_width, + const char *char_set_registry, + const char *char_set_encoding, + gpointer callback_data) { - NautilusFontPicker *font_picker; - char *family; - NautilusStringList *weight_list = NULL; - NautilusStringList *slant_list = NULL; - NautilusStringList *set_width_list = NULL; + NautilusFontPicker *font_picker; + char *entry_name; + FontEntry *entry; + FontStyle *style; - g_return_if_fail (NAUTILUS_IS_FONT_PICKER (user_data)); - g_return_if_fail (NAUTILUS_IS_STRING_PICKER (string_picker)); + g_return_if_fail (font_file_name != NULL); + g_return_if_fail (foundry != NULL); + g_return_if_fail (family != NULL); + g_return_if_fail (weight != NULL); + g_return_if_fail (slant != NULL); + g_return_if_fail (set_width != NULL); + g_return_if_fail (char_set_registry != NULL); + g_return_if_fail (char_set_encoding != NULL); + g_return_if_fail (NAUTILUS_IS_FONT_PICKER (callback_data)); - font_picker = NAUTILUS_FONT_PICKER (user_data); + font_picker = NAUTILUS_FONT_PICKER (callback_data); - family = nautilus_string_picker_get_selected_string (NAUTILUS_STRING_PICKER (string_picker)); - - if (nautilus_scalable_font_query_font (family, &weight_list, &slant_list, &set_width_list)) { - nautilus_string_list_free (font_picker->detail->weight_list); - nautilus_string_list_free (font_picker->detail->slant_list); - nautilus_string_list_free (font_picker->detail->set_width_list); - - font_picker->detail->weight_list = weight_list; - font_picker->detail->slant_list = slant_list; - font_picker->detail->set_width_list = set_width_list; - - font_picker_update_weight_picker (font_picker); - font_picker_update_slant_picker (font_picker); - font_picker_update_set_width_picker (font_picker); + entry_name = g_strdup_printf ("%s %s", foundry, family); - gtk_signal_emit (GTK_OBJECT (font_picker), font_picker_signals[SELECTED_FONT_CHANGED]); - } - else { - g_warning ("Trying to set a bogus non existant font '%s'\n", family); + if (ignore_font (font_file_name, foundry, family, entry_name)) { + g_free (entry_name); + return; } - g_free (family); -} + entry = font_entry_list_find (font_picker->details->font_entry_list, entry_name); -static void -weight_picker_changed_callback (GtkWidget *string_picker, gpointer user_data) -{ - NautilusFontPicker *font_picker; - - g_return_if_fail (NAUTILUS_IS_FONT_PICKER (user_data)); - g_return_if_fail (NAUTILUS_IS_STRING_PICKER (string_picker)); - - font_picker = NAUTILUS_FONT_PICKER (user_data); + if (entry == NULL) { + entry = g_new0 (FontEntry, 1); + entry->name = g_strdup (entry_name); + entry->foundry = g_strdup (foundry); + entry->family = g_strdup (family); + font_picker->details->font_entry_list = g_list_prepend (font_picker->details->font_entry_list, entry); + } + g_assert (entry != NULL); + g_assert (font_entry_list_find (font_picker->details->font_entry_list, entry_name) == entry); + g_free (entry_name); + + style = g_new0 (FontStyle, 1); + style->name = g_strdup_printf ("%s %s %s", weight, slant, set_width); + style->font_file_name = g_strdup (font_file_name); - gtk_signal_emit (GTK_OBJECT (font_picker), font_picker_signals[SELECTED_FONT_CHANGED]); + entry->style_list = g_list_append (entry->style_list, style); } static void -slant_picker_changed_callback (GtkWidget *string_picker, gpointer user_data) +style_list_for_each_callback (gpointer data, + gpointer callback_data) { - NautilusFontPicker *font_picker; + NautilusFontPicker *font_picker; + FontStyle *style; - g_return_if_fail (NAUTILUS_IS_FONT_PICKER (user_data)); - g_return_if_fail (NAUTILUS_IS_STRING_PICKER (string_picker)); + g_return_if_fail (data != NULL); + g_return_if_fail (NAUTILUS_IS_FONT_PICKER (callback_data)); - font_picker = NAUTILUS_FONT_PICKER (user_data); + style = data; + font_picker = NAUTILUS_FONT_PICKER (callback_data); - gtk_signal_emit (GTK_OBJECT (font_picker), font_picker_signals[SELECTED_FONT_CHANGED]); + nautilus_string_picker_insert_string (font_picker->details->style_picker, style->name); } - static void -set_width_picker_changed_callback (GtkWidget *string_picker, gpointer user_data) +font_entry_list_for_each_callback (gpointer data, + gpointer callback_data) { - NautilusFontPicker *font_picker; + NautilusFontPicker *font_picker; + FontEntry *entry; - g_return_if_fail (NAUTILUS_IS_FONT_PICKER (user_data)); - g_return_if_fail (NAUTILUS_IS_STRING_PICKER (string_picker)); + g_return_if_fail (data != NULL); + g_return_if_fail (NAUTILUS_IS_FONT_PICKER (callback_data)); - font_picker = NAUTILUS_FONT_PICKER (user_data); + font_picker = NAUTILUS_FONT_PICKER (callback_data); - gtk_signal_emit (GTK_OBJECT (font_picker), font_picker_signals[SELECTED_FONT_CHANGED]); + entry = data; + nautilus_string_picker_insert_string (font_picker->details->font_name_picker, + entry->name); } - -/* - * NautilusFontPicker public methods - */ +/* NautilusFontPicker public methods */ GtkWidget * nautilus_font_picker_new (void) { return gtk_widget_new (nautilus_font_picker_get_type (), NULL); } -void -nautilus_font_picker_set_selected_family (NautilusFontPicker *font_picker, - const char *family) +char * +nautilus_font_picker_get_selected_font (const NautilusFontPicker *font_picker) { - g_return_if_fail (NAUTILUS_IS_FONT_PICKER (font_picker)); - g_return_if_fail (family != NULL); + char *result = NULL; + char *selected_font; + char *selected_style; + const FontEntry *entry; + GList *node; - if (!nautilus_string_picker_contains (NAUTILUS_STRING_PICKER (font_picker->detail->family_picker), family)) { - g_warning ("Trying to set a bogus family '%s'\n", family); - return; - } + g_return_val_if_fail (NAUTILUS_IS_FONT_PICKER (font_picker), NULL); - nautilus_string_picker_set_selected_string (NAUTILUS_STRING_PICKER (font_picker->detail->family_picker), - family); -} + selected_font = nautilus_string_picker_get_selected_string (font_picker->details->font_name_picker); + g_return_val_if_fail (selected_font != NULL, NULL); + + selected_style = nautilus_string_picker_get_selected_string (font_picker->details->style_picker); + g_return_val_if_fail (selected_style != NULL, NULL); + + entry = font_entry_list_find (font_picker->details->font_entry_list, selected_font); + g_return_val_if_fail (entry != NULL, NULL); -void -nautilus_font_picker_set_selected_weight (NautilusFontPicker *font_picker, - const char *weight) -{ - g_return_if_fail (NAUTILUS_IS_FONT_PICKER (font_picker)); - g_return_if_fail (weight != NULL); + node = entry->style_list; + while (node != NULL && result == NULL) { + const FontStyle *style; + g_assert (node->data != NULL); + style = node->data; - if (!nautilus_string_picker_contains (NAUTILUS_STRING_PICKER (font_picker->detail->weight_picker), weight)) { - g_warning ("Trying to set a bogus weight '%s'\n", weight); - return; + if (nautilus_istr_is_equal (style->name, selected_style)) { + result = g_strdup (style->font_file_name); + } + node = node->next; } - - nautilus_string_picker_set_selected_string (NAUTILUS_STRING_PICKER (font_picker->detail->weight_picker), - weight); + + g_free (selected_font); + g_free (selected_style); + + return result; } void -nautilus_font_picker_set_selected_slant (NautilusFontPicker *font_picker, - const char *slant) +nautilus_font_picker_set_selected_font (NautilusFontPicker *font_picker, + const char *font_name) { - g_return_if_fail (NAUTILUS_IS_FONT_PICKER (font_picker)); - g_return_if_fail (slant != NULL); + const FontEntry *entry; + const FontStyle *style; + GList *font_list_node; + GList *style_list_node; - if (!nautilus_string_picker_contains (NAUTILUS_STRING_PICKER (font_picker->detail->slant_picker), slant)) { - g_warning ("Trying to set a bogus slant '%s'\n", slant); - return; - } + g_return_if_fail (NAUTILUS_IS_FONT_PICKER (font_picker)); - nautilus_string_picker_set_selected_string (NAUTILUS_STRING_PICKER (font_picker->detail->slant_picker), - slant); + font_list_node = font_picker->details->font_entry_list; + while (font_list_node != NULL) { + g_assert (font_list_node->data != NULL); + entry = font_list_node->data; + + style_list_node = entry->style_list; + while (style_list_node != NULL) { + g_assert (style_list_node->data != NULL); + style = style_list_node->data; + + if (nautilus_istr_is_equal (style->font_file_name, font_name)) { + nautilus_string_picker_set_selected_string (font_picker->details->font_name_picker, + entry->name); + font_picker_update (font_picker); + gtk_signal_emit (GTK_OBJECT (font_picker), font_picker_signals[CHANGED]); + return; + } + style_list_node = style_list_node->next; + } + + font_list_node = font_list_node->next; + } } void -nautilus_font_picker_set_selected_set_width (NautilusFontPicker *font_picker, - const char *set_width) +nautilus_font_picker_set_title_label (NautilusFontPicker *font_picker, + const char *title_label) { g_return_if_fail (NAUTILUS_IS_FONT_PICKER (font_picker)); - g_return_if_fail (set_width != NULL); - - if (!nautilus_string_picker_contains (NAUTILUS_STRING_PICKER (font_picker->detail->set_width_picker), set_width)) { - g_warning ("Trying to set a bogus set_width '%s'\n", set_width); - return; - } - - nautilus_string_picker_set_selected_string (NAUTILUS_STRING_PICKER (font_picker->detail->set_width_picker), - set_width); -} - -char * -nautilus_font_picker_get_selected_family (const NautilusFontPicker *font_picker) -{ - g_return_val_if_fail (NAUTILUS_IS_FONT_PICKER (font_picker), NULL); - - return nautilus_string_picker_get_selected_string (NAUTILUS_STRING_PICKER (font_picker->detail->family_picker)); -} - -char * -nautilus_font_picker_get_selected_weight (const NautilusFontPicker *font_picker) -{ - g_return_val_if_fail (NAUTILUS_IS_FONT_PICKER (font_picker), NULL); - - return nautilus_string_picker_get_selected_string (NAUTILUS_STRING_PICKER (font_picker->detail->weight_picker)); -} - -char * -nautilus_font_picker_get_selected_slant (const NautilusFontPicker *font_picker) -{ - g_return_val_if_fail (NAUTILUS_IS_FONT_PICKER (font_picker), NULL); - - return nautilus_string_picker_get_selected_string (NAUTILUS_STRING_PICKER (font_picker->detail->slant_picker)); -} - -char * -nautilus_font_picker_get_selected_set_width (const NautilusFontPicker *font_picker) -{ - g_return_val_if_fail (NAUTILUS_IS_FONT_PICKER (font_picker), NULL); - return nautilus_string_picker_get_selected_string (NAUTILUS_STRING_PICKER (font_picker->detail->set_width_picker)); + gtk_label_set_text (GTK_LABEL (font_picker->details->title_label), title_label); } |