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.cpp509
1 files changed, 0 insertions, 509 deletions
diff --git a/src/widgets/font-selector.cpp b/src/widgets/font-selector.cpp
deleted file mode 100644
index 532622bb0..000000000
--- a/src/widgets/font-selector.cpp
+++ /dev/null
@@ -1,509 +0,0 @@
-/**
- * Font selection widgets
- *
- * Authors:
- * Chris Lahey <clahey@ximian.com>
- * Lauris Kaplinski <lauris@kaplinski.com>
- * bulia byak <buliabyak@users.sf.net>
- * Johan Engelen <j.b.c.engelen@ewi.utwente.nl>
- * Tavmjong Bah <tavmjong@free.fr>
- *
- * Copyright (C) 1999-2001 Ximian, Inc.
- * Copyright (C) 2002 Lauris Kaplinski
- * Copyright (C) -2013 Authors
- *
- * Released under GNU GPL, read the file 'COPYING' for more information
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <libnrtype/font-lister.h>
-#include <libnrtype/font-instance.h>
-
-#include <glibmm/i18n.h>
-
-#include "desktop.h"
-#include "widgets/font-selector.h"
-
-/* SPFontSelector */
-
-struct SPFontSelector
-{
- GtkBox hbox;
-
- bool block_emit;
-
- GtkWidget *family;
- GtkWidget *style;
- GtkWidget *size;
-
- GtkWidget *family_treeview;
- GtkWidget *style_treeview;
-
- gfloat fontsize;
- bool fontsize_dirty;
- Glib::ustring *fontspec;
-};
-
-
-struct SPFontSelectorClass
-{
- GtkBoxClass parent_class;
-
- void (* font_set) (SPFontSelector *fsel, gchar *fontspec);
-};
-
-enum {
- FONT_SET,
- LAST_SIGNAL
-};
-
-static void sp_font_selector_dispose (GObject *object);
-
-static void sp_font_selector_family_select_row (GtkTreeSelection *selection,
- SPFontSelector *fsel);
-
-static void sp_font_selector_style_select_row (GtkTreeSelection *selection,
- SPFontSelector *fsel);
-
-static void sp_font_selector_size_changed (GtkComboBox *combobox,
- SPFontSelector *fsel);
-
-static void sp_font_selector_emit_set (SPFontSelector *fsel);
-static void sp_font_selector_set_sizes( SPFontSelector *fsel );
-
-static guint fs_signals[LAST_SIGNAL] = { 0 };
-
-G_DEFINE_TYPE(SPFontSelector, sp_font_selector, GTK_TYPE_BOX);
-
-static void sp_font_selector_class_init(SPFontSelectorClass *c)
-{
- GObjectClass *object_class = G_OBJECT_CLASS(c);
-
- fs_signals[FONT_SET] = g_signal_new ("font_set",
- G_TYPE_FROM_CLASS(object_class),
- (GSignalFlags)G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET(SPFontSelectorClass, font_set),
- NULL, NULL,
- g_cclosure_marshal_VOID__POINTER,
- G_TYPE_NONE,
- 1, G_TYPE_POINTER);
-
- object_class->dispose = sp_font_selector_dispose;
-}
-
-static void sp_font_selector_set_size_tooltip(SPFontSelector *fsel)
-{
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- int unit = prefs->getInt("/options/font/unitType", SP_CSS_UNIT_PT);
- Glib::ustring tooltip = Glib::ustring::format(_("Font size"), " (", sp_style_get_css_unit_string(unit), ")");
- gtk_widget_set_tooltip_text (fsel->size, _(tooltip.c_str()));
-}
-
-
-/*
- * Create a widget with children for selecting font-family, font-style, and font-size.
- */
-static void sp_font_selector_init(SPFontSelector *fsel)
-{
- //gtk_box_set_homogeneous(GTK_BOX(fsel), TRUE);
- //gtk_box_set_spacing(GTK_BOX(fsel), 4);
-
- /* Family frame */
- GtkWidget *f = gtk_frame_new(_("Font family"));
- gtk_widget_show (f);
- gtk_box_pack_start (GTK_BOX(fsel), f, TRUE, TRUE, 0);
-
- GtkWidget *sw = gtk_scrolled_window_new(NULL, NULL);
- gtk_widget_show(sw);
- gtk_container_set_border_width(GTK_CONTAINER (sw), 4);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
- gtk_container_add(GTK_CONTAINER(f), sw);
-
- fsel->family_treeview = gtk_tree_view_new ();
- gtk_tree_view_set_row_separator_func( GTK_TREE_VIEW(fsel->family_treeview),
- GtkTreeViewRowSeparatorFunc ((gpointer)font_lister_separator_func),
- NULL, NULL );
- gtk_widget_show_all(GTK_WIDGET (fsel->family_treeview));
- GtkTreeViewColumn *column = gtk_tree_view_column_new ();
- GtkCellRenderer *cell = gtk_cell_renderer_text_new ();
- gtk_tree_view_column_pack_start (column, cell, FALSE);
- gtk_tree_view_column_set_fixed_width (column, 200);
- gtk_tree_view_column_set_attributes (column, cell, "text", 0, NULL);
- gtk_tree_view_column_set_cell_data_func (column, cell,
- GtkTreeCellDataFunc (font_lister_cell_data_func),
- NULL, NULL );
- gtk_tree_view_append_column (GTK_TREE_VIEW(fsel->family_treeview), column);
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(fsel->family_treeview), FALSE);
-
- /* Muck with style, see text-toolbar.cpp */
- gtk_widget_set_name( GTK_WIDGET(fsel->family_treeview), "font_selector_family" );
-
- auto css_provider = gtk_css_provider_new();
- auto screen = gdk_screen_get_default();
- gtk_style_context_add_provider_for_screen(screen,
- GTK_STYLE_PROVIDER(css_provider),
- GTK_STYLE_PROVIDER_PRIORITY_USER);
-
- Inkscape::FontLister* fontlister = Inkscape::FontLister::get_instance();
- Glib::RefPtr<Gtk::ListStore> store = fontlister->get_font_list();
- gtk_tree_view_set_model (GTK_TREE_VIEW(fsel->family_treeview), GTK_TREE_MODEL (Glib::unwrap (store)));
- //gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(fsel->family_treeview),2);
- gtk_container_add(GTK_CONTAINER(sw), fsel->family_treeview);
- gtk_widget_show_all (sw);
-
- GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(fsel->family_treeview));
- g_signal_connect (G_OBJECT(selection), "changed", G_CALLBACK (sp_font_selector_family_select_row), fsel);
- g_object_set_data (G_OBJECT(fsel), "family-treeview", fsel->family_treeview);
-
-
- /* Style frame */
- f = gtk_frame_new(C_("Font selector", "Style"));
- gtk_widget_show(f);
- gtk_box_pack_start(GTK_BOX (fsel), f, FALSE, TRUE, 0);
-
- auto vb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
- gtk_box_set_homogeneous(GTK_BOX(vb), FALSE);
- gtk_widget_show(vb);
- gtk_container_set_border_width(GTK_CONTAINER (vb), 4);
- gtk_container_add(GTK_CONTAINER(f), vb);
-
- sw = gtk_scrolled_window_new(NULL, NULL);
- gtk_widget_show(sw);
- gtk_container_set_border_width(GTK_CONTAINER (sw), 4);
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN);
- gtk_box_pack_start(GTK_BOX (vb), sw, TRUE, TRUE, 0);
-
- fsel->style_treeview = gtk_tree_view_new ();
-
- // CSS Style name
- cell = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes ("CSS", cell, "text", 0, NULL );
- //gtk_tree_view_column_pack_start (column, cell, FALSE);
- gtk_tree_view_column_set_resizable (column, TRUE);
- gtk_tree_view_append_column (GTK_TREE_VIEW(fsel->style_treeview), column);
-
- // Display Style name
- cell = gtk_cell_renderer_text_new ();
- column = gtk_tree_view_column_new_with_attributes (_("Face"), cell, "text", 1, NULL );
- //gtk_tree_view_column_pack_start (column, cell, FALSE);
- gtk_tree_view_append_column (GTK_TREE_VIEW(fsel->style_treeview), column);
-
- //gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(fsel->style_treeview), 1);
- gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(fsel->style_treeview), TRUE);
- gtk_container_add(GTK_CONTAINER(sw), fsel->style_treeview);
- gtk_widget_show_all (sw);
-
- selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(fsel->style_treeview));
- g_signal_connect (G_OBJECT(selection), "changed", G_CALLBACK (sp_font_selector_style_select_row), fsel);
-
- auto hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
- gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
- gtk_widget_show(hb);
- gtk_box_pack_start(GTK_BOX(vb), hb, FALSE, FALSE, 0);
-
- // Font-size
- fsel->size = gtk_combo_box_text_new_with_entry ();
-
- sp_font_selector_set_size_tooltip(fsel);
- gtk_widget_set_size_request(fsel->size, 90, -1);
- g_signal_connect (G_OBJECT(fsel->size), "changed", G_CALLBACK (sp_font_selector_size_changed), fsel);
- gtk_box_pack_end (GTK_BOX(hb), fsel->size, FALSE, FALSE, 0);
-
- GtkWidget *l = gtk_label_new(_("Font size:"));
- gtk_widget_show_all (l);
- gtk_box_pack_end(GTK_BOX (hb), l, TRUE, TRUE, 0);
-
- sp_font_selector_set_sizes(fsel);
-
- gtk_widget_show_all (fsel->size);
-
- // Set default size... next two lines must match
- gtk_entry_set_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(fsel->size))), "18.0");
- fsel->fontsize = 18.0;
- fsel->fontsize_dirty = false;
-
- fsel->fontspec = new Glib::ustring;
-}
-
-static void sp_font_selector_dispose(GObject *object)
-{
- SPFontSelector *fsel = SP_FONT_SELECTOR (object);
-
- if (fsel->fontspec) {
- delete fsel->fontspec;
- }
-
- if (G_OBJECT_CLASS(sp_font_selector_parent_class)->dispose) {
- G_OBJECT_CLASS(sp_font_selector_parent_class)->dispose(object);
- }
-}
-
-// Callback when family changed, updates style list for new family.
-static void sp_font_selector_family_select_row(GtkTreeSelection *selection,
- SPFontSelector *fsel)
-{
-
- // We need our own copy of the style list store since the font-family
- // may not be the same in the font-selector as stored in the font-lister
- // TODO: use font-lister class for this by modifying new_font_family to accept an optional style list
- // TODO: add store to SPFontSelector struct and reuse.
-
- // Start by getting iterator to selected font
- GtkTreeModel *model;
- GtkTreeIter iter;
- if (!gtk_tree_selection_get_selected (selection, &model, &iter)) return;
-
- Inkscape::FontLister *fontlister = Inkscape::FontLister::get_instance();
- fontlister->ensureRowStyles(model, &iter);
-
- // Next get family name with its style list
- gchar *family;
- GList *list=NULL;
- gtk_tree_model_get (model, &iter, 0, &family, 1, &list, -1);
-
- // Find best style match for selected family with current style (e.g. of selected text).
- Glib::ustring style = fontlister->get_font_style();
- Glib::ustring best = fontlister->get_best_style_match (family, style);
-
- // Create our own store of styles for selected font-family and find index of best style match
- int path_index = 0;
- int index = 0;
- GtkListStore *store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); // Where is this deleted?
- for ( ; list ; list = list->next )
- {
- gtk_list_store_append (store, &iter);
- gtk_list_store_set (store, &iter,
- 0, ((StyleNames*)list->data)->CssName.c_str(),
- 1, ((StyleNames*)list->data)->DisplayName.c_str(),
- -1);
- if( best.compare( ((StyleNames*)list->data)->CssName ) == 0 ) {
- path_index = index;
- }
- ++index;
- }
-
- // Attach store to tree view. Can trigger style changed signal (but not FONT_SET):
- gtk_tree_view_set_model (GTK_TREE_VIEW (fsel->style_treeview), GTK_TREE_MODEL (store));
- //gtk_tree_view_set_tooltip_column(GTK_TREE_VIEW(fsel->style_treeview),1);
-
- // Get path to best style
- GtkTreePath *path = gtk_tree_path_new ();
- gtk_tree_path_append_index (path, path_index);
-
- // Highlight best style. Triggers style changed signal:
- gtk_tree_selection_select_path (gtk_tree_view_get_selection (GTK_TREE_VIEW (fsel->style_treeview)), path);
- gtk_tree_path_free (path);
-}
-
-// Callback when row changed
-static void sp_font_selector_style_select_row (GtkTreeSelection * /*selection*/,
- SPFontSelector *fsel)
-{
- if (!fsel->block_emit)
- {
- sp_font_selector_emit_set (fsel);
- }
-}
-
-
-/*
- * Set the default list of font sizes, scaled to the users preferred unit
- * TODO: This routine occurs both here and in text-toolbar. Move to font-lister?
- */
-static void sp_font_selector_set_sizes( SPFontSelector *fsel )
-{
- GtkListStore *store = GTK_LIST_STORE(gtk_combo_box_get_model (GTK_COMBO_BOX(fsel->size)));
- gtk_list_store_clear(store);
-
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- int unit = prefs->getInt("/options/font/unitType", SP_CSS_UNIT_PT);
-
- int sizes[] = {
- 4, 6, 8, 9, 10, 11, 12, 13, 14, 16, 18, 20, 22, 24, 28,
- 32, 36, 40, 48, 56, 64, 72, 144
- };
-
- // Array must be same length as SPCSSUnit in style.h
- float ratios[] = {1, 1, 1, 10, 4, 40, 100, 16, 8, 0.16};
-
- for (unsigned int n = 0; n < G_N_ELEMENTS(sizes); ++n)
- {
- double size = sizes[n] / ratios[unit];
-
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(fsel->size), Glib::ustring::format(size).c_str());
- }
-
-}
-
-// Callback when size changed
-static void sp_font_selector_size_changed( GtkComboBox */*cbox*/, SPFontSelector *fsel )
-{
- char *text = NULL;
- text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (fsel->size));
- gfloat old_size = fsel->fontsize;
-
- gchar *endptr;
- gdouble value = -1;
- if (text) {
- value = g_strtod (text, &endptr);
- if (endptr == text) // conversion failed, non-numeric input
- value = -1;
- free (text);
- }
-
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- int max_size = prefs->getInt("/dialogs/textandfont/maxFontSize", 10000); // somewhat arbitrary, but text&font preview freezes with too huge fontsizes
-
- if (value <= 0) {
- return; // could not parse value
- }
- if (value > max_size)
- value = max_size;
-
- fsel->fontsize = value;
- if ( fabs(fsel->fontsize-old_size) > 0.001)
- {
- fsel->fontsize_dirty = true;
- }
-
- sp_font_selector_emit_set (fsel);
-}
-
-
-// Called from sp_font_selector_style_select_row
-// Called from sp_font_selector_size_changed
-// Called indirectly for sp_font_selector_family_select_row (since style changes).
-// Emits FONT_SET signal (handled by TextEdit::onFontChange, GlyphsPanel::fontChangeCB).
-static void sp_font_selector_emit_set (SPFontSelector *fsel)
-{
-
- GtkTreeSelection *selection_family;
- GtkTreeSelection *selection_style;
- GtkTreeModel *model_family;
- GtkTreeModel *model_style;
- GtkTreeIter iter_family;
- GtkTreeIter iter_style;
- char *family=NULL, *style=NULL;
-
- //We need to check this here since most GtkTreeModel operations are not atomic
- //See GtkListStore documentation, Chapter "Atomic Operations" --mderezynski
-
- model_family = gtk_tree_view_get_model (GTK_TREE_VIEW (fsel->family_treeview));
- if (!model_family) return;
- model_style = gtk_tree_view_get_model (GTK_TREE_VIEW (fsel->style_treeview));
- if (!model_style ) return;
-
- selection_family = gtk_tree_view_get_selection (GTK_TREE_VIEW (fsel->family_treeview));
- selection_style = gtk_tree_view_get_selection (GTK_TREE_VIEW (fsel->style_treeview ));
-
- if (!gtk_tree_selection_get_selected (selection_family, NULL, &iter_family)) return;
- if (!gtk_tree_selection_get_selected (selection_style, NULL, &iter_style )) return;
-
- gtk_tree_model_get (model_family, &iter_family, 0, &family, -1);
- gtk_tree_model_get (model_style, &iter_style, 0, &style, -1);
-
- if ((!family) || (!style)) return;
-
- Glib::ustring fontspec = family;
- fontspec += ", ";
- fontspec += style;
-
- *(fsel->fontspec) = fontspec;
-
- g_signal_emit(fsel, fs_signals[FONT_SET], 0, fontspec.c_str());
-}
-
-GtkWidget *sp_font_selector_new()
-{
- SPFontSelector *fsel = SP_FONT_SELECTOR(g_object_new(SP_TYPE_FONT_SELECTOR, NULL));
-
- return GTK_WIDGET(fsel);
-}
-
-
-/*
- * Sets the values displayed in the font-selector from a fontspec.
- * It is only called from TextEdit with a new selection and from GlyphsPanel
- */
-void sp_font_selector_set_fontspec (SPFontSelector *fsel, Glib::ustring fontspec, double size)
-{
- if (!fontspec.empty())
- {
-
- Inkscape::FontLister *font_lister = Inkscape::FontLister::get_instance();
- std::pair<Glib::ustring, Glib::ustring> ui = font_lister->ui_from_fontspec( fontspec );
- Glib::ustring family = ui.first;
- Glib::ustring style = ui.second;
- Gtk::TreePath path;
- try {
- path = font_lister->get_row_for_font (family);
- } catch (...) {
- g_warning( "Couldn't find row for font-family: %s", family.c_str() );
- return;
- }
-
- // High light selected family and scroll so it is in view.
- 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; // TODO: Should this be moved to the end?
-
-
- // We don't need to get best style since this is only called on a new
- // selection where we already know the "best" style.
- // Glib::ustring bestStyle = font_lister->get_best_style_match (family, style);
- // std::cout << "Best: " << bestStyle << std::endl;
-
- // The "trial" style list and the regular list are the same in this case.
- Gtk::TreePath path_c;
- try {
- path_c = font_lister->get_row_for_style( style );
- } catch (...) {
- g_warning( "Couldn't find row for style: %s (%s)", style.c_str(), family.c_str() );
- return;
- }
-
- gtk_tree_selection_select_path (gtk_tree_view_get_selection (GTK_TREE_VIEW (fsel->style_treeview)), path_c.gobj());
- gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (fsel->style_treeview), path_c.gobj(), 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_get_child(GTK_BIN(fsel->size))), s);
- fsel->fontsize = size;
- sp_font_selector_set_size_tooltip(fsel);
- sp_font_selector_set_sizes(fsel);
- }
- }
-
-}
-
-Glib::ustring sp_font_selector_get_fontspec(SPFontSelector *fsel)
-{
- return *(fsel->fontspec);
-}
-
-/*
- * Return the font size in pixels
- */
-double sp_font_selector_get_size(SPFontSelector *fsel)
-{
- return fsel->fontsize;
-}
-
-/*
- Local Variables:
- mode:c++
- c-file-style:"stroustrup"
- c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
- indent-tabs-mode:nil
- fill-column:99
- End:
-*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8 :