diff options
| author | John Smith <john.smith7545@yahoo.com> | 2012-08-04 01:43:12 +0000 |
|---|---|---|
| committer | John Smith <john.smith7545@yahoo.com> | 2012-08-04 01:43:12 +0000 |
| commit | fc86236d39a64a24e7483698fc205f2fa0e01330 (patch) | |
| tree | 9faca291d1d9ec0c823c46df7f251ea78aa94732 | |
| parent | Build. Activating xslt extensions on Windows (not used yet). (diff) | |
| download | inkscape-fc86236d39a64a24e7483698fc205f2fa0e01330.tar.gz inkscape-fc86236d39a64a24e7483698fc205f2fa0e01330.zip | |
Fix for 575831 : Add font variant drop-down box to new text toolbar
(bzr r11586)
| -rw-r--r-- | src/widgets/font-selector.cpp | 132 | ||||
| -rw-r--r-- | src/widgets/font-selector.h | 2 | ||||
| -rw-r--r-- | src/widgets/text-toolbar.cpp | 210 | ||||
| -rw-r--r-- | src/widgets/toolbox.cpp | 5 |
4 files changed, 194 insertions, 155 deletions
diff --git a/src/widgets/font-selector.cpp b/src/widgets/font-selector.cpp index 03d29a753..a690b6948 100644 --- a/src/widgets/font-selector.cpp +++ b/src/widgets/font-selector.cpp @@ -425,6 +425,78 @@ GtkWidget *sp_font_selector_new() return (GtkWidget *) fsel; } +/* + * Returns the index of the fonts closest style match from the provided list of styles + * Used in both the Text dialog and the Text toolbar to set the style combo on selection change + */ +unsigned int sp_font_selector_get_best_style (font_instance *font, GList *list) +{ + font_instance *tempFont = NULL; + unsigned int currentStyleNumber = 0; + unsigned int bestStyleNumber = 0; + + Glib::ustring family = font_factory::Default()->GetUIFamilyString(font->descr); + + PangoFontDescription *incomingFont = pango_font_description_copy(font->descr); + pango_font_description_unset_fields(incomingFont, PANGO_FONT_MASK_SIZE); + + char *incomingFontString = pango_font_description_to_string(incomingFont); + + tempFont = (font_factory::Default())->FaceFromUIStrings(family.c_str(), (char*)list->data); + + PangoFontDescription *bestMatchForFont = NULL; + if (tempFont) { + bestMatchForFont = pango_font_description_copy(tempFont->descr); + tempFont->Unref(); + tempFont = NULL; + } + + pango_font_description_unset_fields(bestMatchForFont, PANGO_FONT_MASK_SIZE); + + list = list->next; + + while (list) { + currentStyleNumber++; + + tempFont = font_factory::Default()->FaceFromUIStrings(family.c_str(), (char*)list->data); + + PangoFontDescription *currentMatchForFont = NULL; + if (tempFont) { + currentMatchForFont = pango_font_description_copy(tempFont->descr); + tempFont->Unref(); + tempFont = NULL; + } + + if (currentMatchForFont) { + pango_font_description_unset_fields(currentMatchForFont, PANGO_FONT_MASK_SIZE); + + char *currentMatchString = pango_font_description_to_string(currentMatchForFont); + + if (!strcmp(incomingFontString, currentMatchString) + || pango_font_description_better_match(incomingFont, bestMatchForFont, currentMatchForFont)) { + // Found a better match for the font we are looking for + pango_font_description_free(bestMatchForFont); + bestMatchForFont = pango_font_description_copy(currentMatchForFont); + bestStyleNumber = currentStyleNumber; + } + + g_free(currentMatchString); + + pango_font_description_free(currentMatchForFont); + } + + list = list->next; + } + + if (bestMatchForFont) + pango_font_description_free(bestMatchForFont); + if (incomingFont) + pango_font_description_free(incomingFont); + g_free(incomingFontString); + + return bestStyleNumber; +} + void sp_font_selector_set_font (SPFontSelector *fsel, font_instance *font, double size) { if (font) @@ -451,65 +523,7 @@ void sp_font_selector_set_font (SPFontSelector *fsel, font_instance *font, doubl gtk_tree_model_get_iter (model, &iter, path.gobj()); gtk_tree_model_get (model, &iter, 1, &list, -1); - unsigned int currentStyleNumber = 0; - unsigned int bestStyleNumber = 0; - - PangoFontDescription *incomingFont = pango_font_description_copy(font->descr); - pango_font_description_unset_fields(incomingFont, PANGO_FONT_MASK_SIZE); - - char *incomingFontString = pango_font_description_to_string(incomingFont); - - tempFont = (font_factory::Default())->FaceFromUIStrings(family.c_str(), (char*)list->data); - - PangoFontDescription *bestMatchForFont = NULL; - if (tempFont) { - bestMatchForFont = pango_font_description_copy(tempFont->descr); - tempFont->Unref(); - tempFont = NULL; - } - - pango_font_description_unset_fields(bestMatchForFont, PANGO_FONT_MASK_SIZE); - - list = list->next; - - while (list) { - currentStyleNumber++; - - tempFont = font_factory::Default()->FaceFromUIStrings(family.c_str(), (char*)list->data); - - PangoFontDescription *currentMatchForFont = NULL; - if (tempFont) { - currentMatchForFont = pango_font_description_copy(tempFont->descr); - tempFont->Unref(); - tempFont = NULL; - } - - if (currentMatchForFont) { - pango_font_description_unset_fields(currentMatchForFont, PANGO_FONT_MASK_SIZE); - - char *currentMatchString = pango_font_description_to_string(currentMatchForFont); - - if (!strcmp(incomingFontString, currentMatchString) - || pango_font_description_better_match(incomingFont, bestMatchForFont, currentMatchForFont)) { - // Found a better match for the font we are looking for - pango_font_description_free(bestMatchForFont); - bestMatchForFont = pango_font_description_copy(currentMatchForFont); - bestStyleNumber = currentStyleNumber; - } - - g_free(currentMatchString); - - pango_font_description_free(currentMatchForFont); - } - - list = list->next; - } - - if (bestMatchForFont) - pango_font_description_free(bestMatchForFont); - if (incomingFont) - pango_font_description_free(incomingFont); - g_free(incomingFontString); + unsigned int bestStyleNumber = sp_font_selector_get_best_style(font, list); GtkTreePath *path_c = gtk_tree_path_new (); gtk_tree_path_append_index (path_c, bestStyleNumber); diff --git a/src/widgets/font-selector.h b/src/widgets/font-selector.h index da32b3640..80e8b1e4d 100644 --- a/src/widgets/font-selector.h +++ b/src/widgets/font-selector.h @@ -35,7 +35,7 @@ void sp_font_selector_set_font (SPFontSelector *fsel, font_instance *font, doubl font_instance *sp_font_selector_get_font (SPFontSelector *fsel); double sp_font_selector_get_size (SPFontSelector *fsel); - +unsigned int sp_font_selector_get_best_style (font_instance *font, GList *list); #endif // SP_FONT_SELECTOR_H diff --git a/src/widgets/text-toolbar.cpp b/src/widgets/text-toolbar.cpp index 779504633..160bc22f3 100644 --- a/src/widgets/text-toolbar.cpp +++ b/src/widgets/text-toolbar.cpp @@ -70,6 +70,7 @@ #include "../libnrtype/font-instance.h" #include "../text-context.h" #include "../text-editing.h" +#include "widgets/font-selector.h" using Inkscape::UnitTracker; @@ -163,6 +164,79 @@ static void cell_data_func(GtkCellLayout * /*cell_layout*/, g_free(family_escaped); } +/* + * Fill the font style combobox with the available font styles for the selected font family + * Set the selected style to that in font + */ +static void sp_text_fontstyle_populate(GObject *tbl, font_instance *font=NULL) +{ + + Ink_ComboBoxEntry_Action* act = INK_COMBOBOXENTRY_ACTION( g_object_get_data( tbl, "TextFontFamilyAction" ) ); + GtkTreeModel *model = ink_comboboxentry_action_get_model( act ); + gchar *current_font = ink_comboboxentry_action_get_active_text( act ); + + // Get an iter to the selected font from the model data + // We cant get it from the combo, cause it might not have been created yet + gboolean found = false; + GtkTreeIter iter; + gboolean valid = gtk_tree_model_get_iter_first( model, &iter ); + while ( valid ) { + + // Get text from list entry + gchar* text = 0; + gtk_tree_model_get( model, &iter, 0, &text, -1 ); // Column 0 + + // Check for match + if( strcmp( current_font, text ) == 0 ){ + found = true; + break; + } + valid = gtk_tree_model_iter_next( model, &iter ); + } + + if (!found) { + return; + } + + // Get the list of styles from the selected font + GList *list=0; + gtk_tree_model_get (model, &iter, 1, &list, -1); + + Ink_ComboBoxEntry_Action* fontStyleAction = INK_COMBOBOXENTRY_ACTION( g_object_get_data( tbl, "TextFontStyleAction" ) ); + + gchar *current_style = ink_comboboxentry_action_get_active_text( fontStyleAction ); + + GtkListStore *store = GTK_LIST_STORE( ink_comboboxentry_action_get_model( fontStyleAction ) ); + gtk_list_store_clear ( store ); + + // Add list of styles to the style combo + for (GList *l=list; l; l = l->next) + { + gtk_list_store_append (store, &iter); + gtk_list_store_set (store, &iter, 0, (char*)l->data, -1); + } + + // Select the style in the combo that best matches font + if (font) { + + unsigned int index = sp_font_selector_get_best_style(font, list); + + Ink_ComboBoxEntry_Action* fontStyleAction = + INK_COMBOBOXENTRY_ACTION( g_object_get_data( tbl, "TextFontStyleAction" ) ); + model = ink_comboboxentry_action_get_model( fontStyleAction ); + GtkTreePath *path_c = gtk_tree_path_new (); + gtk_tree_path_append_index (path_c, index); + gtk_tree_model_get_iter(model, &iter, path_c); + gchar *name; + gtk_tree_model_get (model, &iter, 0, &name, -1); + ink_comboboxentry_action_set_active_text( fontStyleAction, name ); + + } else if (current_style) { + ink_comboboxentry_action_set_active_text( fontStyleAction, current_style ); + } + +} + // Font family // // In most cases we should just be able to set the new family name @@ -289,6 +363,10 @@ static void sp_text_fontfamily_value_changed( Ink_ComboBoxEntry_Action *act, GOb sp_repr_css_set_property (css, "font-variant", c); font->Unref(); + + // Set the list of font styles + sp_text_fontstyle_populate(tbl); + } else { g_warning(_("Failed to find font matching: %s\n"), newFontSpec.c_str()); } @@ -397,8 +475,11 @@ static void sp_text_fontsize_value_changed( Ink_ComboBoxEntry_Action *act, GObje g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) ); } -// Handles both Bold and Italic/Oblique -static void sp_text_style_changed( InkToggleAction* act, GObject *tbl ) +/* + * Font style + */ +//static void sp_text_fontstyle_value_changed( EgeSelectOneAction *act, GObject *tbl ) +static void sp_text_fontstyle_value_changed( Ink_ComboBoxEntry_Action *act, GObject *tbl ) { // quit if run by the _changed callbacks if (g_object_get_data(G_OBJECT(tbl), "freeze")) { @@ -406,15 +487,11 @@ static void sp_text_style_changed( InkToggleAction* act, GObject *tbl ) } g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) ); - // Called by Bold or Italics button? - const gchar* name = gtk_action_get_name( GTK_ACTION( act ) ); - gint prop = (strcmp(name, "TextBoldAction") == 0) ? 0 : 1; - // First query font-specification, this is the most complete font face description. SPStyle *query = sp_style_new (SP_ACTIVE_DOCUMENT); int result_fontspec = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FONT_SPECIFICATION); - // font_specification will not be set unless defined explicitely on a tspan. + // font_specification will not be set unless defined explicitily on a tspan. // This should be fixed! Glib::ustring fontSpec = query->text->font_specification.set ? query->text->font_specification.value : ""; @@ -435,60 +512,32 @@ static void sp_text_style_changed( InkToggleAction* act, GObject *tbl ) // Now that we have the old face, find the new face. Glib::ustring newFontSpec = ""; SPCSSAttr *css = sp_repr_css_attr_new (); - gboolean active = gtk_toggle_action_get_active( GTK_TOGGLE_ACTION(act) ); - switch (prop) - { - case 0: - { - // Bold - if (!fontSpec.empty()) newFontSpec = font_factory::Default()->FontSpecificationSetBold(fontSpec, active); - if ( !fontSpec.empty() && !newFontSpec.empty() ) { - - // Set weight using new font if found. - font_instance * font = font_factory::Default()->FaceFromFontSpecification(newFontSpec.c_str()); - if (font) { - gchar c[256]; - font->Attribute( "weight", c, 256); - sp_repr_css_set_property (css, "font-weight", c); - font->Unref(); - font = NULL; - } - } else { + gchar *current_style = ink_comboboxentry_action_get_active_text( act ); + Glib::ustring fontFamily = query->text->font_family.set ? query->text->font_family.value : ""; - // Blindly set weight. - sp_repr_css_set_property (css, "font-weight", (active == 0 ? "normal" : "bold") ); - } - break; - } + font_instance *font = (font_factory::Default())->FaceFromUIStrings (fontFamily.c_str(), current_style); - case 1: - { - // Italic/Oblique - if (!fontSpec.empty()) newFontSpec = font_factory::Default()->FontSpecificationSetItalic(fontSpec, active); - - if ( !fontSpec.empty() && !newFontSpec.empty() ) { - - // Don't even set the italic/oblique if the font didn't exist on the system - if ( active ) { - if ( newFontSpec.find( "Italic" ) != Glib::ustring::npos ) { - sp_repr_css_set_property (css, "font-style", "italic"); - } else { - sp_repr_css_set_property (css, "font-style", "oblique"); - } - } else { - sp_repr_css_set_property (css, "font-style", "normal"); - } + if (font) { + gchar c[256]; - } else { + font->Attribute( "weight", c, 256); + sp_repr_css_set_property (css, "font-weight", c); - // Blindly set style. - sp_repr_css_set_property (css, "font-style", (active == 0 ? "normal" : "italic") ); - } - break; - } + font->Attribute("style", c, 256); + sp_repr_css_set_property (css, "font-style", c); + + font->Attribute("stretch", c, 256); + sp_repr_css_set_property (css, "font-stretch", c); + + font->Attribute("variant", c, 256); + sp_repr_css_set_property (css, "font-variant", c); + + font->Unref(); + font = NULL; } + if (!newFontSpec.empty()) { sp_repr_css_set_property (css, "-inkscape-font-specification", newFontSpec.c_str()); } @@ -1152,23 +1201,9 @@ static void sp_text_toolbox_selection_changed(Inkscape::Selection */*selection*/ INK_COMBOBOXENTRY_ACTION( g_object_get_data( tbl, "TextFontSizeAction" ) ); ink_comboboxentry_action_set_active_text( fontSizeAction, size_text ); - - // Weight (Bold) - // Note: in the enumeration, normal and lighter come at the end so we must explicitly test for them. - gboolean boldSet = ((query->font_weight.computed >= SP_CSS_FONT_WEIGHT_700) && - (query->font_weight.computed != SP_CSS_FONT_WEIGHT_NORMAL) && - (query->font_weight.computed != SP_CSS_FONT_WEIGHT_LIGHTER)); - - InkToggleAction* textBoldAction = INK_TOGGLE_ACTION( g_object_get_data( tbl, "TextBoldAction" ) ); - gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(textBoldAction), boldSet ); - - - // Style (Italic/Oblique) - gboolean italicSet = (query->font_style.computed != SP_CSS_FONT_STYLE_NORMAL); - - InkToggleAction* textItalicAction = INK_TOGGLE_ACTION( g_object_get_data( tbl, "TextItalicAction" ) ); - gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(textItalicAction), italicSet ); - + // Font styles + font_instance *font = font_factory::Default()->FaceFromStyle(query); + sp_text_fontstyle_populate(tbl, font); // Superscript gboolean superscriptSet = @@ -1438,30 +1473,19 @@ void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje g_object_set_data( holder, "TextFontSizeAction", act ); } - /* Style - Bold */ + /* Font styles */ { - InkToggleAction* act = ink_toggle_action_new( "TextBoldAction", // Name - _("Toggle Bold"), // Label - _("Toggle bold or normal weight"), // Tooltip - GTK_STOCK_BOLD, // Icon (inkId) - secondarySize ); // Icon size - gtk_action_group_add_action( mainActions, GTK_ACTION( act ) ); - g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_text_style_changed), holder ); - gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool("/tools/text/bold", false) ); - g_object_set_data( holder, "TextBoldAction", act ); - } + GtkListStore* model_style = gtk_list_store_new( 1, G_TYPE_STRING ); - /* Style - Italic/Oblique */ - { - InkToggleAction* act = ink_toggle_action_new( "TextItalicAction", // Name - _("Toggle Italic/Oblique"), // Label - _("Toggle italic/oblique style"),// Tooltip - GTK_STOCK_ITALIC, // Icon (inkId) - secondarySize ); // Icon size - gtk_action_group_add_action( mainActions, GTK_ACTION( act ) ); - g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_text_style_changed), holder ); - gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs->getBool("/tools/text/italic", false) ); - g_object_set_data( holder, "TextItalicAction", act ); + Ink_ComboBoxEntry_Action* act = ink_comboboxentry_action_new( "TextFontStyleAction", + _("Font Style"), + _("Font style"), + NULL, + GTK_TREE_MODEL(model_style), + 12 ); // Width in characters + g_signal_connect( G_OBJECT(act), "changed", G_CALLBACK(sp_text_fontstyle_value_changed), holder ); + gtk_action_group_add_action( mainActions, GTK_ACTION(act) ); + g_object_set_data( holder, "TextFontStyleAction", act ); } /* Style - Superscript */ diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index db06b5d47..4d2fd4738 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -459,8 +459,9 @@ static gchar const * ui_descr = " <toolbar name='TextToolbar'>" " <toolitem action='TextFontFamilyAction' />" " <toolitem action='TextFontSizeAction' />" - " <toolitem action='TextBoldAction' />" - " <toolitem action='TextItalicAction' />" + " <toolitem action='TextFontStyleAction' />" +// " <toolitem action='TextBoldAction' />" +// " <toolitem action='TextItalicAction' />" " <separator />" " <toolitem action='TextAlignAction' />" " <separator />" |
