=== modified file 'src/libnrtype/font-lister.cpp'
--- src/libnrtype/font-lister.cpp 2015-05-09 15:39:31 +0000
+++ src/libnrtype/font-lister.cpp 2015-11-07 14:28:20 +0000
@@ -4,7 +4,7 @@
#include <gtkmm/liststore.h>
#include <gtkmm/treemodel.h>
-
+#include "libnrtype/FontFactory.h"
#include <libnrtype/font-instance.h>
#include <libnrtype/TextWrapper.h>
#include <libnrtype/one-glyph.h>
@@ -59,8 +59,8 @@
// Get sorted font families from Pango
std::vector<PangoFontFamily *> familyVector;
+
font_factory::Default()->GetUIFamilies(familyVector);
-
// Traverse through the family names and set up the list store
for (size_t i = 0; i < familyVector.size(); ++i) {
const char* displayName = sp_font_family_get_name(familyVector[i]);
@@ -122,10 +122,21 @@
++iter;
}
}
-
-FontLister *FontLister::get_instance()
+//Añadimos un parametro a la función para que refresque/actualize la variable estatica (+- global) de la instancia de font lister
+//Si no durante el transcurso de Inkscape, FontLister seria siempre igual
+FontLister *FontLister::get_instance(bool refresh)
{
static Inkscape::FontLister *instance = new Inkscape::FontLister();
+ if(refresh){
+ //la sifuiente linea provoca que cuando llamemos despues a el constructor de
+ //font lister, este llame a font_factory::Default() generando un nuevo fontfactory
+ //con las nuevas fuentes. Estudiatelo para entender como funciona, tienes que seguir el hilo de los procesos
+ font_factory::lUsine = NULL;
+ //Creamos un nuevo valor de retorno para la variable instance
+ //que se queda guardado globalmente, asi que solo hay que llamar a get_instance(true) cuando
+ //queramos refrescar la lista de fuentes
+ instance = new Inkscape::FontLister();
+ }
return instance;
}
=== modified file 'src/libnrtype/font-lister.h'
--- src/libnrtype/font-lister.h 2014-10-17 20:03:14 +0000
+++ src/libnrtype/font-lister.h 2015-11-07 14:27:57 +0000
@@ -150,7 +150,12 @@
void update_font_list(SPDocument *document);
public:
- static Inkscape::FontLister *get_instance();
+ //a la cabecera de la función le hemos puesto un valor por defecto que en este caso
+ //hace que se pueda llamar a la función oviandolo, tal y como hacia inksape antes, es decir
+ //puedes llamarlo como originalmente get_instance() y actual normal, dandole el valor a refresh = false
+ //o puedes llamarlo get_instance(true)
+ //esto nos permite modificar la función y no tener que modificar todas las llamadas a esta dentro de inkscape
+ static Inkscape::FontLister *get_instance(bool refresh = false);
/**
* Takes a hand written font spec and returns a Pango generated one in
=== modified file 'src/widgets/text-toolbar.cpp'
--- src/widgets/text-toolbar.cpp 2015-04-29 20:51:23 +0000
+++ src/widgets/text-toolbar.cpp 2015-11-07 17:54:37 +0000
@@ -113,6 +113,25 @@
}
#endif
+//Función de callback
+//Refresca la lista de fuentes
+static void sp_refresh_combobox( Ink_ComboBoxEntry_Action *act )
+{
+ //Conseguimos el widget del combo de fuentes
+ GtkComboBox *fontCombo = act->combobox;
+ //Creamos una instancia de fonlister con overwrite a true, lo explico en otro lado
+ Inkscape::FontLister* fontlister = Inkscape::FontLister::get_instance(true);
+ //Generamos el nuevo tree model con las todas, incluidas las nuevas tipografias
+ fontlister->update_font_list( SP_ACTIVE_DESKTOP->getDocument());
+ Glib::RefPtr<Gtk::ListStore> store = fontlister->get_font_list();
+ GtkListStore* model = store->gobj();
+ //actualizamos el model de la clase contenedora
+ act->model = GTK_TREE_MODEL(model);
+ //actualizamos el combo con el nuevo modelo
+ gtk_combo_box_set_model(fontCombo, GTK_TREE_MODEL(model));
+ ink_comboboxentry_action_set_active_text( act, fontlister->get_font_family().c_str(), fontlister->get_font_family_row() );
+ ink_comboboxentry_action_set_active_text( act, fontlister->get_font_style().c_str() );
+}
// Font family
static void sp_text_fontfamily_value_changed( Ink_ComboBoxEntry_Action *act, GObject *tbl )
@@ -122,7 +141,6 @@
std::cout << "MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM" << std::endl;
std::cout << "sp_text_fontfamily_value_changed: " << std::endl;
#endif
-
// quit if run by the _changed callbacks
if (g_object_get_data(G_OBJECT(tbl), "freeze")) {
#ifdef DEBUG_TEXT
@@ -855,6 +873,10 @@
Ink_ComboBoxEntry_Action* fontStyleAction =
INK_COMBOBOXENTRY_ACTION( g_object_get_data( tbl, "TextFontStyleAction" ) );
+ //esto esta ejecutado cada vez que la seleccion del texto cambia, no me parece el mejor sitio para ejeccutarlo
+ //seguramente lo mejor seria crear un boton de refresco de fuentes tanto en esta barra como en el Font Dialog.
+ //y llamarlo desde el callback
+ sp_refresh_combobox( fontFamilyAction );
Inkscape::FontLister* fontlister = Inkscape::FontLister::get_instance();
if (!subselection) {
fontlister->update_font_list( SP_ACTIVE_DESKTOP->getDocument());
-
コメントするにはログインしてください!