summaryrefslogtreecommitdiffstats
path: root/src/widgets/font-selector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets/font-selector.cpp')
-rw-r--r--src/widgets/font-selector.cpp156
1 files changed, 93 insertions, 63 deletions
diff --git a/src/widgets/font-selector.cpp b/src/widgets/font-selector.cpp
index c9e5d0bbb..9da48d0e6 100644
--- a/src/widgets/font-selector.cpp
+++ b/src/widgets/font-selector.cpp
@@ -353,7 +353,7 @@ static void sp_font_selector_emit_set (SPFontSelector *fsel)
if ((!family) || (!style)) return;
- font = (font_factory::Default())->FaceFromDescr (family, style);
+ font = (font_factory::Default())->FaceFromUIStrings (family, style);
// FIXME: when a text object uses non-available font, font==NULL and we can't set size
// (and the size shown in the widget is invalid). To fix, here we must always get some
@@ -386,73 +386,103 @@ GtkWidget *sp_font_selector_new()
void sp_font_selector_set_font (SPFontSelector *fsel, font_instance *font, double size)
{
if (font)
- {
- gchar family[256];
- font->Family (family, 256);
-
- Gtk::TreePath path;
+ {
+ Gtk::TreePath path;
+ font_instance *tempFont = NULL;
+
+ Glib::ustring family = font_factory::Default()->GetUIFamilyString(font->descr);
+
+ try {
+ path = Inkscape::FontLister::get_instance()->get_row_for_font (family);
+ } catch (...) {
+ return;
+ }
- try {
- path = Inkscape::FontLister::get_instance()->get_row_for_font (family);
- } catch (...) {
- return;
+ fsel->block_emit = TRUE;
+ gtk_tree_selection_select_path (gtk_tree_view_get_selection (GTK_TREE_VIEW (fsel->family_treeview)), path.gobj());
+ gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (fsel->family_treeview), path.gobj(), NULL, TRUE, 0.5, 0.5);
+ fsel->block_emit = FALSE;
+
+ GList *list = 0;
+ GtkTreeIter iter;
+ GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(fsel->family_treeview));
+ 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;
}
-
- fsel->block_emit = TRUE;
- gtk_tree_selection_select_path (gtk_tree_view_get_selection (GTK_TREE_VIEW (fsel->family_treeview)), path.gobj());
- gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (fsel->family_treeview), path.gobj(), NULL, TRUE, 0.5, 0.5);
- fsel->block_emit = FALSE;
-
- GList *list = 0;
- GtkTreeIter iter;
- GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(fsel->family_treeview));
- gtk_tree_model_get_iter (model, &iter, path.gobj());
- gtk_tree_model_get (model, &iter, 1, &list, -1);
-
- gchar descr[256];
- font->Name(descr, 256);
- std::string descr_best (family);
- descr_best += " ";
- descr_best += ((char*)list->data);
-
- PangoFontDescription *descr_ = pango_font_description_from_string(descr);
- PangoFontDescription *best_ = pango_font_description_from_string(descr_best.c_str());
-
- unsigned int i = 0;
- unsigned int best_i = 0;
-
- // try to find best match with style description (i.e. bold, italic ?)
- for (list = list->next ; list ; list = list->next)
- {
- i++;
- std::string descr_try (family);
- descr_try += " ";
- descr_try += ((char*)list->data);
- PangoFontDescription *try_ = pango_font_description_from_string(descr_try.c_str());
- if (pango_font_description_better_match (descr_, best_, try_))
- {
- pango_font_description_free (best_);
- best_ = pango_font_description_from_string (descr_try.c_str ());
- best_i = i;
+
+ 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;
}
- pango_font_description_free(try_);
- }
- pango_font_description_free(descr_);
- pango_font_description_free(best_);
-
- GtkTreePath *path_c = gtk_tree_path_new ();
- gtk_tree_path_append_index (path_c, best_i);
- gtk_tree_selection_select_path (gtk_tree_view_get_selection (GTK_TREE_VIEW (fsel->style_treeview)), path_c);
- gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (fsel->style_treeview), path_c, NULL, TRUE, 0.5, 0.5);
-
- if (size != fsel->fontsize)
- {
- gchar s[8];
- g_snprintf (s, 8, "%.5g", size); // UI, so printf is ok
- gtk_entry_set_text (GTK_ENTRY (GTK_BIN(fsel->size)->child), s);
- fsel->fontsize = size;
+
+ 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);
+
+ GtkTreePath *path_c = gtk_tree_path_new ();
+ gtk_tree_path_append_index (path_c, bestStyleNumber);
+ gtk_tree_selection_select_path (gtk_tree_view_get_selection (GTK_TREE_VIEW (fsel->style_treeview)), path_c);
+ gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (fsel->style_treeview), path_c, NULL, TRUE, 0.5, 0.5);
+
+ if (size != fsel->fontsize)
+ {
+ gchar s[8];
+ g_snprintf (s, 8, "%.5g", size); // UI, so printf is ok
+ gtk_entry_set_text (GTK_ENTRY (GTK_BIN(fsel->size)->child), s);
+ fsel->fontsize = size;
+ }
}
+
}
font_instance* sp_font_selector_get_font(SPFontSelector *fsel)