summaryrefslogtreecommitdiffstats
path: root/src/widgets
diff options
context:
space:
mode:
authorsu_v <suv-sf@users.sourceforge.net>2013-02-13 18:36:57 +0000
committer~suv <suv-sf@users.sourceforge.net>2013-02-13 18:36:57 +0000
commit77b788bb1c5fa861a3f12c76ad3f17bc8edc35b8 (patch)
tree441f798cf2c8cb3a760c1ecf259f5faff356124c /src/widgets
parentchanges_2013_02_01b.patch (diff)
parentBuild. Adding unistd header (fixes compilation on Win32 with OpenSuse cross-c... (diff)
downloadinkscape-77b788bb1c5fa861a3f12c76ad3f17bc8edc35b8.tar.gz
inkscape-77b788bb1c5fa861a3f12c76ad3f17bc8edc35b8.zip
merge from trunk (r12122)
(bzr r11668.1.51)
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/button.cpp45
-rw-r--r--src/widgets/desktop-widget.cpp82
-rw-r--r--src/widgets/desktop-widget.h8
-rw-r--r--src/widgets/font-selector.cpp21
-rw-r--r--src/widgets/icon.cpp44
-rw-r--r--src/widgets/icon.h6
-rw-r--r--src/widgets/sp-color-slider.cpp59
-rw-r--r--src/widgets/text-toolbar.cpp186
8 files changed, 248 insertions, 203 deletions
diff --git a/src/widgets/button.cpp b/src/widgets/button.cpp
index d7be6c9f0..467f0d70e 100644
--- a/src/widgets/button.cpp
+++ b/src/widgets/button.cpp
@@ -25,8 +25,6 @@
#include "button.h"
-static void sp_button_class_init (SPButtonClass *klass);
-static void sp_button_init (SPButton *button);
static void sp_button_dispose(GObject *object);
#if GTK_CHECK_VERSION(3,0,0)
@@ -50,28 +48,7 @@ static void sp_button_set_doubleclick_action (SPButton *button, SPAction *action
static void sp_button_action_set_active (SPButton *button, bool active);
static void sp_button_set_composed_tooltip (GtkWidget *widget, SPAction *action);
-static GtkToggleButtonClass *parent_class;
-
-GType sp_button_get_type(void)
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof(SPButtonClass),
- 0, // base_init
- 0, // base_finalize
- (GClassInitFunc)sp_button_class_init,
- 0, // class_finalize
- 0, // class_data
- sizeof(SPButton),
- 0, // n_preallocs
- (GInstanceInitFunc)sp_button_init,
- 0 // value_table
- };
- type = g_type_register_static(GTK_TYPE_TOGGLE_BUTTON, "SPButton", &info, static_cast<GTypeFlags>(0));
- }
- return type;
-}
+G_DEFINE_TYPE(SPButton, sp_button, GTK_TYPE_TOGGLE_BUTTON);
static void
sp_button_class_init (SPButtonClass *klass)
@@ -80,8 +57,6 @@ sp_button_class_init (SPButtonClass *klass)
GtkWidgetClass *widget_class=GTK_WIDGET_CLASS(klass);
GtkButtonClass *button_class=GTK_BUTTON_CLASS(klass);
- parent_class = GTK_TOGGLE_BUTTON_CLASS(g_type_class_peek_parent(klass));
-
object_class->dispose = sp_button_dispose;
#if GTK_CHECK_VERSION(3,0,0)
widget_class->get_preferred_width = sp_button_get_preferred_width;
@@ -120,10 +95,10 @@ static void sp_button_dispose(GObject *object)
sp_button_set_doubleclick_action (button, NULL);
}
- button->c_set_active.~connection();
- button->c_set_sensitive.~connection();
+ button->c_set_active.~connection();
+ button->c_set_sensitive.~connection();
- (G_OBJECT_CLASS(parent_class))->dispose(object);
+ (G_OBJECT_CLASS(sp_button_parent_class))->dispose(object);
}
@@ -185,7 +160,7 @@ sp_button_clicked (GtkButton *button)
SPButton *sp_button=SP_BUTTON (button);
if (sp_button->type == SP_BUTTON_TYPE_TOGGLE) {
- (GTK_BUTTON_CLASS(parent_class))->clicked (button);
+ (GTK_BUTTON_CLASS(sp_button_parent_class))->clicked (button);
}
}
@@ -340,3 +315,13 @@ sp_button_new_from_data( Inkscape::IconSize size,
return button;
}
+/*
+ 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:textwidth=99 :
diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
index a7432c32a..9e078cabb 100644
--- a/src/widgets/desktop-widget.cpp
+++ b/src/widgets/desktop-widget.cpp
@@ -313,6 +313,22 @@ sp_desktop_widget_class_init (SPDesktopWidgetClass *klass)
}
/**
+ * Callback for changes in size of the canvas table (i.e. the container for
+ * the canvas, the rulers etc).
+ *
+ * This adjusts the range of the rulers when the dock container is adjusted
+ * (fixes lp:950552)
+ */
+static void
+canvas_tbl_size_allocate(GtkWidget *widget,
+ GdkRectangle *allocation,
+ gpointer data)
+{
+ SPDesktopWidget *dtw = SP_DESKTOP_WIDGET(data);
+ sp_desktop_widget_update_rulers (dtw);
+}
+
+/**
* Callback for SPDesktopWidget object initialization.
*/
void SPDesktopWidget::init( SPDesktopWidget *dtw )
@@ -385,14 +401,14 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
#if GTK_CHECK_VERSION(3,0,0)
GtkWidget *tbl = gtk_grid_new();
- GtkWidget *canvas_tbl = gtk_grid_new();
+ dtw->canvas_tbl = gtk_grid_new();
- gtk_grid_attach(GTK_GRID(canvas_tbl), eventbox, 1, 0, 1, 1);
+ gtk_grid_attach(GTK_GRID(dtw->canvas_tbl), eventbox, 1, 0, 1, 1);
#else
GtkWidget *tbl = gtk_table_new(2, 3, FALSE);
- GtkWidget *canvas_tbl = gtk_table_new(3, 3, FALSE);
+ dtw->canvas_tbl = gtk_table_new(3, 3, FALSE);
- gtk_table_attach(GTK_TABLE(canvas_tbl),
+ gtk_table_attach(GTK_TABLE(dtw->canvas_tbl),
eventbox,
1, 2, 0, 1,
GTK_FILL, GTK_FILL,
@@ -410,9 +426,9 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
gtk_container_add (GTK_CONTAINER (eventbox), GTK_WIDGET (dtw->vruler));
#if GTK_CHECK_VERSION(3,0,0)
- gtk_grid_attach(GTK_GRID(canvas_tbl), eventbox, 0, 1, 1, 1);
+ gtk_grid_attach(GTK_GRID(dtw->canvas_tbl), eventbox, 0, 1, 1, 1);
#else
- gtk_table_attach(GTK_TABLE (canvas_tbl),
+ gtk_table_attach(GTK_TABLE (dtw->canvas_tbl),
eventbox,
0, 1, 1, 2,
GTK_FILL, GTK_FILL,
@@ -428,11 +444,11 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
#if GTK_CHECK_VERSION(3,0,0)
dtw->hscrollbar = gtk_scrollbar_new(GTK_ORIENTATION_HORIZONTAL, GTK_ADJUSTMENT (dtw->hadj));
- gtk_grid_attach(GTK_GRID(canvas_tbl), dtw->hscrollbar, 1, 2, 1, 1);
+ gtk_grid_attach(GTK_GRID(dtw->canvas_tbl), dtw->hscrollbar, 1, 2, 1, 1);
dtw->vscrollbar_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
#else
dtw->hscrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (dtw->hadj));
- gtk_table_attach(GTK_TABLE (canvas_tbl), dtw->hscrollbar, 1, 2, 2, 3,
+ gtk_table_attach(GTK_TABLE (dtw->canvas_tbl), dtw->hscrollbar, 1, 2, 2, 3,
GTK_FILL, GTK_SHRINK,
0, 0);
dtw->vscrollbar_box = gtk_vbox_new (FALSE, 0);
@@ -460,9 +476,9 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
gtk_box_pack_start (GTK_BOX (dtw->vscrollbar_box), dtw->vscrollbar, TRUE, TRUE, 0);
#if GTK_CHECK_VERSION(3,0,0)
- gtk_grid_attach(GTK_GRID(canvas_tbl), dtw->vscrollbar_box, 2, 0, 1, 2);
+ gtk_grid_attach(GTK_GRID(dtw->canvas_tbl), dtw->vscrollbar_box, 2, 0, 1, 2);
#else
- gtk_table_attach(GTK_TABLE(canvas_tbl), dtw->vscrollbar_box, 2, 3, 0, 2,
+ gtk_table_attach(GTK_TABLE(dtw->canvas_tbl), dtw->vscrollbar_box, 2, 3, 0, 2,
GTK_SHRINK, GTK_FILL,
0, 0);
#endif
@@ -498,9 +514,9 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
#if GTK_CHECK_VERSION(3,0,0)
- gtk_grid_attach( GTK_GRID(canvas_tbl), dtw->cms_adjust, 2, 2, 1, 1);
+ gtk_grid_attach( GTK_GRID(dtw->canvas_tbl), dtw->cms_adjust, 2, 2, 1, 1);
#else
- gtk_table_attach( GTK_TABLE(canvas_tbl), dtw->cms_adjust, 2, 3, 2, 3,
+ gtk_table_attach( GTK_TABLE(dtw->canvas_tbl), dtw->cms_adjust, 2, 3, 2, 3,
(GtkAttachOptions)(GTK_SHRINK),
(GtkAttachOptions)(GTK_SHRINK),
0, 0);
@@ -520,6 +536,9 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
gtk_widget_set_can_focus (GTK_WIDGET (dtw->canvas), TRUE);
+ sp_ruler_add_track_widget (SP_RULER(dtw->hruler), GTK_WIDGET(dtw->canvas));
+ sp_ruler_add_track_widget (SP_RULER(dtw->vruler), GTK_WIDGET(dtw->canvas));
+
#if GTK_CHECK_VERSION(3,0,0)
GdkRGBA white = {1,1,1,1};
gtk_widget_override_background_color(GTK_WIDGET(dtw->canvas),
@@ -541,9 +560,9 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
#if GTK_CHECK_VERSION(3,0,0)
gtk_widget_set_hexpand(GTK_WIDGET(dtw->canvas), TRUE);
gtk_widget_set_vexpand(GTK_WIDGET(dtw->canvas), TRUE);
- gtk_grid_attach(GTK_GRID(canvas_tbl), GTK_WIDGET(dtw->canvas), 1, 1, 1, 1);
+ gtk_grid_attach(GTK_GRID(dtw->canvas_tbl), GTK_WIDGET(dtw->canvas), 1, 1, 1, 1);
#else
- gtk_table_attach (GTK_TABLE (canvas_tbl), GTK_WIDGET(dtw->canvas), 1, 2, 1, 2, (GtkAttachOptions)(GTK_FILL | GTK_EXPAND), (GtkAttachOptions)(GTK_FILL | GTK_EXPAND), 0, 0);
+ gtk_table_attach (GTK_TABLE (dtw->canvas_tbl), GTK_WIDGET(dtw->canvas), 1, 2, 1, 2, (GtkAttachOptions)(GTK_FILL | GTK_EXPAND), (GtkAttachOptions)(GTK_FILL | GTK_EXPAND), 0, 0);
#endif
/* Dock */
@@ -560,7 +579,7 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
Gtk::HPaned *paned = new Gtk::HPaned();
#endif
- paned->pack1(*Glib::wrap(canvas_tbl));
+ paned->pack1(*Glib::wrap(dtw->canvas_tbl));
paned->pack2(dtw->dock->getWidget(), Gtk::FILL);
/* Prevent the paned from catching F6 and F8 by unsetting the default callbacks */
@@ -580,11 +599,11 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
} else {
#if GTK_CHECK_VERSION(3,0,0)
- gtk_widget_set_hexpand(GTK_WIDGET(canvas_tbl), TRUE);
- gtk_widget_set_vexpand(GTK_WIDGET(canvas_tbl), TRUE);
- gtk_grid_attach(GTK_GRID(tbl), GTK_WIDGET (canvas_tbl), 1, 1, 1, 1);
+ gtk_widget_set_hexpand(GTK_WIDGET(dtw->canvas_tbl), TRUE);
+ gtk_widget_set_vexpand(GTK_WIDGET(dtw->canvas_tbl), TRUE);
+ gtk_grid_attach(GTK_GRID(tbl), GTK_WIDGET (dtw->canvas_tbl), 1, 1, 1, 1);
#else
- gtk_table_attach (GTK_TABLE (tbl), GTK_WIDGET (canvas_tbl), 1, 2, 1, 2, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
+ gtk_table_attach (GTK_TABLE (tbl), GTK_WIDGET (dtw->canvas_tbl), 1, 2, 1, 2, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
(GtkAttachOptions)(GTK_EXPAND | GTK_FILL), 0, 0);
#endif
}
@@ -740,6 +759,13 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
}
overallTimer = 0;
}
+
+ // Ensure that ruler ranges are updated correctly whenever the canvas table
+ // is resized
+ g_signal_connect (G_OBJECT (dtw->canvas_tbl),
+ "size-allocate",
+ G_CALLBACK (canvas_tbl_size_allocate),
+ dtw);
}
/**
@@ -761,6 +787,8 @@ static void sp_desktop_widget_dispose(GObject *object)
g_signal_handlers_disconnect_by_func (G_OBJECT (dtw->zoom_status), (gpointer) G_CALLBACK (sp_dtw_zoom_value_changed), dtw);
g_signal_handlers_disconnect_by_func (G_OBJECT (dtw->zoom_status), (gpointer) G_CALLBACK (sp_dtw_zoom_populate_popup), dtw);
g_signal_handlers_disconnect_by_func (G_OBJECT (dtw->canvas), (gpointer) G_CALLBACK (sp_desktop_widget_event), dtw);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (dtw->canvas_tbl), (gpointer) G_CALLBACK (canvas_tbl_size_allocate), dtw);
+
dtw->layer_selector->setDesktop(NULL);
dtw->layer_selector->unreference();
@@ -970,12 +998,13 @@ sp_desktop_widget_event (GtkWidget *widget, GdkEvent *event, SPDesktopWidget *dt
if (GTK_WIDGET_CLASS (dtw_parent_class)->event) {
return (* GTK_WIDGET_CLASS (dtw_parent_class)->event) (widget, event);
} else {
- // The keypress events need to be passed to desktop handler explicitly,
- // because otherwise the event contexts only receive keypresses when the mouse cursor
- // is over the canvas. This redirection is only done for keypresses and only if there's no
+ // The key press/release events need to be passed to desktop handler explicitly,
+ // because otherwise the event contexts only receive key events when the mouse cursor
+ // is over the canvas. This redirection is only done for key events and only if there's no
// current item on the canvas, because item events and all mouse events are caught
// and passed on by the canvas acetate (I think). --bb
- if (event->type == GDK_KEY_PRESS && !dtw->canvas->current_item) {
+ if ((event->type == GDK_KEY_PRESS || event->type == GDK_KEY_RELEASE)
+ && !dtw->canvas->current_item) {
return sp_desktop_root_handler (NULL, event, dtw->desktop);
}
}
@@ -1685,13 +1714,6 @@ SPDesktopWidget* SPDesktopWidget::createInstance(SPNamedView *namedview)
return dtw;
}
-void
-SPDesktopWidget::viewSetPosition (Geom::Point p)
-{
- Geom::Point const origin = ( p - ruler_origin );
- sp_ruler_set_position(SP_RULER(hruler), origin[Geom::X]);
- sp_ruler_set_position(SP_RULER(vruler), origin[Geom::Y]);
-}
void
sp_desktop_widget_update_rulers (SPDesktopWidget *dtw)
diff --git a/src/widgets/desktop-widget.h b/src/widgets/desktop-widget.h
index 73194304f..0ffedd112 100644
--- a/src/widgets/desktop-widget.h
+++ b/src/widgets/desktop-widget.h
@@ -105,7 +105,11 @@ struct SPDesktopWidget {
unsigned int _interaction_disabled_counter;
- SPCanvas *canvas;
+ SPCanvas *canvas;
+
+ /** A table for displaying the canvas, rulers etc */
+ GtkWidget *canvas_tbl;
+
Geom::Point ruler_origin;
double dt2r;
@@ -168,8 +172,6 @@ struct SPDesktopWidget {
{ sp_dtw_desktop_activate (_dtw); }
virtual void deactivateDesktop()
{ sp_dtw_desktop_deactivate (_dtw); }
- virtual void viewSetPosition (Geom::Point p)
- { _dtw->viewSetPosition (p); }
virtual void updateRulers()
{ sp_desktop_widget_update_rulers (_dtw); }
virtual void updateScrollbars (double scale)
diff --git a/src/widgets/font-selector.cpp b/src/widgets/font-selector.cpp
index b17dcf470..013ad9e94 100644
--- a/src/widgets/font-selector.cpp
+++ b/src/widgets/font-selector.cpp
@@ -162,8 +162,21 @@ static void sp_font_selector_init(SPFontSelector *fsel)
GtkCellRenderer *cell = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_start (column, cell, FALSE);
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);
+ gtk_tree_view_set_row_separator_func( GTK_TREE_VIEW(fsel->family_treeview),
+ GtkTreeViewRowSeparatorFunc ((gpointer)font_lister_separator_func),
+ NULL, NULL );
+
+ /* Muck with style, see text-toolbar.cpp */
+ gtk_widget_set_name( GTK_WIDGET(fsel->family_treeview), "font_selector_family" );
+ gtk_rc_parse_string (
+ "widget \"*font_selector_family\" style \"fontfamily-separator-style\"");
+
+
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_container_add(GTK_CONTAINER(sw), fsel->family_treeview);
@@ -442,6 +455,10 @@ GtkWidget *sp_font_selector_new()
*/
unsigned int sp_font_selector_get_best_style (font_instance *font, GList *list)
{
+ if ( !font || !list) {
+ return 0;
+ }
+
font_instance *tempFont = NULL;
unsigned int currentStyleNumber = 0;
unsigned int bestStyleNumber = 0;
@@ -462,7 +479,9 @@ unsigned int sp_font_selector_get_best_style (font_instance *font, GList *list)
tempFont = NULL;
}
- pango_font_description_unset_fields(bestMatchForFont, PANGO_FONT_MASK_SIZE);
+ if( bestMatchForFont != NULL ) {
+ pango_font_description_unset_fields(bestMatchForFont, PANGO_FONT_MASK_SIZE);
+ }
list = list->next;
diff --git a/src/widgets/icon.cpp b/src/widgets/icon.cpp
index 7866989b1..8470e93db 100644
--- a/src/widgets/icon.cpp
+++ b/src/widgets/icon.cpp
@@ -41,9 +41,6 @@
#include "icon.h"
struct IconImpl {
- static void classInit(SPIconClass *klass);
- static void init(SPIcon *icon);
-
static GtkWidget *newFull( Inkscape::IconSize lsize, gchar const *name );
static void dispose(GObject *object);
@@ -104,12 +101,10 @@ struct IconImpl {
private:
static const std::string magicNumber;
- static GtkWidgetClass *parent_class;
static std::map<Glib::ustring, Glib::ustring> legacyNames;
};
const std::string IconImpl::magicNumber = "1.0";
-GtkWidgetClass *IconImpl::parent_class = 0;
std::map<Glib::ustring, Glib::ustring> IconImpl::legacyNames;
@@ -141,34 +136,14 @@ public:
static std::map<Glib::ustring, std::vector<IconCacheItem> > iconSetCache;
static std::set<Glib::ustring> internalNames;
-GType SPIcon::getType()
-{
- static GType type = 0;
- if (!type) {
- GTypeInfo info = {
- sizeof(SPIconClass),
- NULL,
- NULL,
- reinterpret_cast<GClassInitFunc>(IconImpl::classInit),
- NULL,
- NULL,
- sizeof(SPIcon),
- 0,
- reinterpret_cast<GInstanceInitFunc>(IconImpl::init),
- NULL
- };
- type = g_type_register_static(GTK_TYPE_WIDGET, "SPIcon", &info, (GTypeFlags)0);
- }
- return type;
-}
+G_DEFINE_TYPE(SPIcon, sp_icon, GTK_TYPE_WIDGET);
-void IconImpl::classInit(SPIconClass *klass)
+static void
+sp_icon_class_init(SPIconClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS(klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
- parent_class = GTK_WIDGET_CLASS(g_type_class_peek_parent(klass));
-
object_class->dispose = IconImpl::dispose;
#if GTK_CHECK_VERSION(3,0,0)
@@ -184,7 +159,8 @@ void IconImpl::classInit(SPIconClass *klass)
widget_class->style_set = IconImpl::styleSet;
}
-void IconImpl::init(SPIcon *icon)
+static void
+sp_icon_init(SPIcon *icon)
{
gtk_widget_set_has_window (GTK_WIDGET (icon), FALSE);
icon->lsize = Inkscape::ICON_SIZE_BUTTON;
@@ -202,7 +178,7 @@ void IconImpl::dispose(GObject *object)
icon->name = 0;
}
- (G_OBJECT_CLASS(parent_class))->dispose(object);
+ (G_OBJECT_CLASS(sp_icon_parent_class))->dispose(object);
}
void IconImpl::reset( SPIcon *icon )
@@ -375,8 +351,8 @@ GdkPixbuf* IconImpl::renderup( gchar const* name, Inkscape::IconSize lsize, unsi
void IconImpl::screenChanged( GtkWidget *widget, GdkScreen *previous_screen )
{
- if ( GTK_WIDGET_CLASS( parent_class )->screen_changed ) {
- GTK_WIDGET_CLASS( parent_class )->screen_changed( widget, previous_screen );
+ if ( GTK_WIDGET_CLASS( sp_icon_parent_class )->screen_changed ) {
+ GTK_WIDGET_CLASS( sp_icon_parent_class )->screen_changed( widget, previous_screen );
}
SPIcon *icon = SP_ICON(widget);
themeChanged(icon);
@@ -384,8 +360,8 @@ void IconImpl::screenChanged( GtkWidget *widget, GdkScreen *previous_screen )
void IconImpl::styleSet( GtkWidget *widget, GtkStyle *previous_style )
{
- if ( GTK_WIDGET_CLASS( parent_class )->style_set ) {
- GTK_WIDGET_CLASS( parent_class )->style_set( widget, previous_style );
+ if ( GTK_WIDGET_CLASS( sp_icon_parent_class )->style_set ) {
+ GTK_WIDGET_CLASS( sp_icon_parent_class )->style_set( widget, previous_style );
}
SPIcon *icon = SP_ICON(widget);
themeChanged(icon);
diff --git a/src/widgets/icon.h b/src/widgets/icon.h
index 3f6aa2455..6bce2e330 100644
--- a/src/widgets/icon.h
+++ b/src/widgets/icon.h
@@ -17,7 +17,7 @@
#include <gtkmm/widget.h>
#include "icon-size.h"
-#define SP_TYPE_ICON SPIcon::getType()
+#define SP_TYPE_ICON sp_icon_get_type()
#define SP_ICON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), SP_TYPE_ICON, SPIcon))
#define SP_IS_ICON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), SP_TYPE_ICON))
@@ -29,6 +29,8 @@ struct SPIconClass {
GtkWidgetClass parent_class;
};
+GType sp_icon_get_type() G_GNUC_CONST;
+
struct SPIcon {
GtkWidget widget;
@@ -38,8 +40,6 @@ struct SPIcon {
GdkPixbuf *pb;
- static GType getType(void);
-
friend class SPIconImpl;
};
diff --git a/src/widgets/sp-color-slider.cpp b/src/widgets/sp-color-slider.cpp
index 37cccda9f..471ee3852 100644
--- a/src/widgets/sp-color-slider.cpp
+++ b/src/widgets/sp-color-slider.cpp
@@ -642,49 +642,26 @@ static gboolean sp_color_slider_draw(GtkWidget *widget, cairo_t *cr)
gint x = (int)(slider->value * (carea.width - 1) - ARROW_SIZE / 2 + carea.x);
gint y1 = carea.y;
gint y2 = carea.y + carea.height - 1;
- gint w = ARROW_SIZE;
cairo_set_line_width(cr, 1.0);
-#if GTK_CHECK_VERSION(3,0,0)
- GdkRGBA white = {1,1,1,1};
- GdkRGBA black = {0,0,0,1};
-#else
- GdkColor white, black;
- gdk_color_parse("#fff", &white);
- gdk_color_parse("#000", &black);
-#endif
-
- while ( w > 0 )
- {
-#if GTK_CHECK_VERSION(3,0,0)
- gdk_cairo_set_source_rgba(cr, &white);
-#else
- gdk_cairo_set_source_color(cr, &white);
-#endif
- cairo_move_to(cr, x - 0.5, y1 + 0.5);
- cairo_line_to(cr, x + w - 1 + 0.5, y1 + 0.5);
- cairo_move_to(cr, x - 0.5, y2 + 0.5);
- cairo_line_to(cr, x + w - 1 + 0.5, y2 + 0.5);
- cairo_stroke(cr);
- w -=2;
- x++;
- if ( w > 0 )
- {
-#if GTK_CHECK_VERSION(3,0,0)
- gdk_cairo_set_source_rgba(cr, &black);
-#else
- gdk_cairo_set_source_color(cr, &black);
-#endif
- cairo_move_to(cr, x - 0.5, y1 + 0.5);
- cairo_line_to(cr, x + w - 1 + 0.5, y1 + 0.5);
- cairo_move_to(cr, x - 0.5, y2 + 0.5);
- cairo_line_to(cr, x + w - 1 + 0.5, y2 + 0.5);
- cairo_stroke(cr);
- }
- y1++;
- y2--;
- }
-
+ // Define top arrow
+ cairo_move_to(cr, x - 0.5, y1 + 0.5);
+ cairo_line_to(cr, x + ARROW_SIZE - 0.5, y1 + 0.5);
+ cairo_line_to(cr, x + (ARROW_SIZE-1)/2.0, y1 + ARROW_SIZE/2.0 + 0.5);
+ cairo_line_to(cr, x - 0.5, y1 + 0.5);
+
+ // Define bottom arrow
+ cairo_move_to(cr, x - 0.5, y2 + 0.5);
+ cairo_line_to(cr, x + ARROW_SIZE - 0.5, y2 + 0.5);
+ cairo_line_to(cr, x + (ARROW_SIZE-1)/2.0, y2 - ARROW_SIZE/2.0 + 0.5);
+ cairo_line_to(cr, x - 0.5, y2 + 0.5);
+
+ // Render both arrows
+ cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
+ cairo_stroke_preserve(cr);
+ cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
+ cairo_fill(cr);
+
return FALSE;
}
diff --git a/src/widgets/text-toolbar.cpp b/src/widgets/text-toolbar.cpp
index 6c22c81e3..a01f950a6 100644
--- a/src/widgets/text-toolbar.cpp
+++ b/src/widgets/text-toolbar.cpp
@@ -18,7 +18,7 @@
*
* Copyright (C) 2004 David Turner
* Copyright (C) 2003 MenTaLguY
- * Copyright (C) 1999-2011 authors
+ * Copyright (C) 1999-2013 authors
* Copyright (C) 2001-2002 Ximian, Inc.
*
* Released under GNU GPL, read the file 'COPYING' for more information
@@ -39,6 +39,7 @@
#include "../desktop-handles.h"
#include "../desktop-style.h"
#include "document-undo.h"
+#include "../sp-root.h"
#include "../verbs.h"
#include "../inkscape.h"
#include "../connection-pool.h"
@@ -105,6 +106,10 @@ static void sp_print_font( SPStyle *query ) {
<< " FontSpec: "
<< (query->text->font_specification.value ? query->text->font_specification.value : "No value")
<< std::endl;
+ std::cout << " LineHeight: " << query->line_height.computed
+ << " WordSpacing: " << query->word_spacing.computed
+ << " LetterSpacing: " << query->letter_spacing.computed
+ << std::endl;
}
static void sp_print_fontweight( SPStyle *query ) {
@@ -128,42 +133,6 @@ static void sp_print_fontstyle( SPStyle *query ) {
}
#endif
-// Format family drop-down menu.
-static void cell_data_func(GtkCellLayout * /*cell_layout*/,
- GtkCellRenderer *cell,
- GtkTreeModel *tree_model,
- GtkTreeIter *iter,
- gpointer /*data*/)
-{
- gchar *family;
- gtk_tree_model_get(tree_model, iter, 0, &family, -1);
- gchar *const family_escaped = g_markup_escape_text(family, -1);
-
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- int show_sample = prefs->getInt("/tools/text/show_sample_in_list", 1);
- if (show_sample) {
-
- Glib::ustring sample = prefs->getString("/tools/text/font_sample");
- gchar *const sample_escaped = g_markup_escape_text(sample.data(), -1);
-
- std::stringstream markup;
- markup << family_escaped << " <span foreground='gray' font_family='"
- << family_escaped << "'>" << sample_escaped << "</span>";
- g_object_set (G_OBJECT (cell), "markup", markup.str().c_str(), NULL);
-
- g_free(sample_escaped);
- } else {
- g_object_set (G_OBJECT (cell), "markup", family_escaped, NULL);
- }
- // This doesn't work for two reasons... it set both selected and not selected backgrounds
- // to white.. which means that white foreground text is invisible. It also only effects
- // the text region, leaving the padding untouched.
- // g_object_set (G_OBJECT (cell), "cell-background", "white", "cell-background-set", true, NULL);
-
- g_free(family);
- 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
@@ -178,6 +147,11 @@ static void sp_text_fontstyle_populate(GObject *tbl, font_instance *font=NULL)
return;
}
+ // If font list, take only first font in list
+ gchar** tokens = g_strsplit( current_font, ",", 0 );
+ g_strstrip( tokens[0] );
+ current_font = tokens[0];
+
// 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;
@@ -197,13 +171,7 @@ static void sp_text_fontstyle_populate(GObject *tbl, font_instance *font=NULL)
valid = gtk_tree_model_iter_next( model, &iter );
}
- if (!found) {
- return;
- }
-
- // Get the list of styles from the selected font
- GList *list = NULL;
- gtk_tree_model_get (model, &iter, 1, &list, -1);
+ g_strfreev( tokens );
Ink_ComboBoxEntry_Action* fontStyleAction = INK_COMBOBOXENTRY_ACTION( g_object_get_data( tbl, "TextFontStyleAction" ) );
@@ -212,7 +180,27 @@ static void sp_text_fontstyle_populate(GObject *tbl, font_instance *font=NULL)
GtkListStore *store = GTK_LIST_STORE( ink_comboboxentry_action_get_model( fontStyleAction ) );
gtk_list_store_clear ( store );
- // Add list of styles to the style combo
+ // Get the list of styles from the selected font.
+ GList *list = NULL;
+
+ if (found) {
+
+ // Use precompiled list if font-family on system.
+ gtk_tree_model_get (model, &iter, 1, &list, -1);
+
+ } else {
+
+ // Use generic list if font-family not on system.
+ static GList *glist = NULL;
+ if( glist == NULL ) {
+ glist = g_list_append (glist, (void*)"Normal");
+ glist = g_list_append (glist, (void*)"Italic");
+ glist = g_list_append (glist, (void*)"Bold");
+ glist = g_list_append (glist, (void*)"Bold Italic");
+ }
+ list = glist;
+ }
+
for (GList *l=list; l; l = l->next)
{
gtk_list_store_append (store, &iter);
@@ -220,7 +208,7 @@ static void sp_text_fontstyle_populate(GObject *tbl, font_instance *font=NULL)
}
// Select the style in the combo that best matches font
- if (font) {
+ if (font && list) {
unsigned int index = sp_font_selector_get_best_style(font, list);
@@ -237,7 +225,6 @@ static void sp_text_fontstyle_populate(GObject *tbl, font_instance *font=NULL)
} else if (current_style) {
ink_comboboxentry_action_set_active_text( fontStyleAction, current_style );
}
-
}
// Font family
@@ -519,7 +506,7 @@ static void sp_text_fontstyle_value_changed( Ink_ComboBoxEntry_Action *act, GObj
SPCSSAttr *css = sp_repr_css_attr_new ();
- gchar *current_style = ink_comboboxentry_action_get_active_text( act );
+ Glib::ustring current_style = ink_comboboxentry_action_get_active_text( act );
Glib::ustring fontFamily = "";
if (query->text->font_family.set) {
@@ -530,9 +517,10 @@ static void sp_text_fontstyle_value_changed( Ink_ComboBoxEntry_Action *act, GObj
fontFamily = ink_comboboxentry_action_get_active_text( act );
}
- font_instance *font = (font_factory::Default())->FaceFromUIStrings (fontFamily.c_str(), current_style);
+ font_instance *font = (font_factory::Default())->FaceFromUIStrings (fontFamily.c_str(), current_style.c_str());
if (font) {
+
gchar c[256];
font->Attribute( "weight", c, 256);
@@ -549,6 +537,19 @@ static void sp_text_fontstyle_value_changed( Ink_ComboBoxEntry_Action *act, GObj
font->Unref();
font = NULL;
+
+ } else {
+
+ // Font not found on system, blindly update style
+ // Options match choices in sp_text_fontstyle_populate
+ sp_repr_css_set_property (css, "font-weight", "normal");
+ sp_repr_css_set_property (css, "font-style", "normal" );
+ if( current_style.find("Bold") != Glib::ustring::npos ) {
+ sp_repr_css_set_property (css, "font-weight", "bold");
+ }
+ if( current_style.find("Italic") != Glib::ustring::npos ) {
+ sp_repr_css_set_property (css, "font-style", "italic");
+ }
}
// If querying returned nothing, update default style.
@@ -1151,6 +1152,15 @@ static void sp_text_toolbox_selection_changed(Inkscape::Selection */*selection*/
}
g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) );
+ // Update font list, but only if widget already created.
+ Ink_ComboBoxEntry_Action* fontFamilyAction =
+ INK_COMBOBOXENTRY_ACTION( g_object_get_data( tbl, "TextFontFamilyAction" ) );
+ if( fontFamilyAction->combobox != NULL ) {
+ Inkscape::FontLister* fontlister = Inkscape::FontLister::get_instance();
+ fontlister->update_font_list( sp_desktop_document( SP_ACTIVE_DESKTOP ));
+ }
+
+
// Only flowed text can be justified, only normal text can be kerned...
// Find out if we have flowed text now so we can use it several places
gboolean isFlow = false;
@@ -1203,7 +1213,11 @@ static void sp_text_toolbox_selection_changed(Inkscape::Selection */*selection*/
return;
}
- g_object_set_data(tbl, "text_style_from_prefs", GINT_TO_POINTER(TRUE));
+ // To ensure the value of the combobox is properly set on start-up, only mark
+ // the prefs set if the combobox has already been constructed.
+ if( fontFamilyAction->combobox != NULL ) {
+ g_object_set_data(tbl, "text_style_from_prefs", GINT_TO_POINTER(TRUE));
+ }
} else {
g_object_set_data(tbl, "text_style_from_prefs", GINT_TO_POINTER(FALSE));
}
@@ -1443,6 +1457,44 @@ sp_text_toolbox_subselection_changed (gpointer /*tc*/, GObject *tbl)
sp_text_toolbox_selection_changed (NULL, tbl);
}
+
+/* Recursively extract all "font-family" attributes from a document. */
+void
+sp_text_toolbox_get_font_list_in_doc_recursive (SPObject *r, std::list<Glib::ustring> *l)
+{
+ if (!r) {
+ return;
+ }
+
+ const gchar *style = r->getRepr()->attribute("style");
+ if( style != NULL ) {
+ //std::cout << style << std::endl;
+ std::vector<Glib::ustring> tokens = Glib::Regex::split_simple(";", style );
+ for( size_t i=0; i < tokens.size(); ++i ) {
+ Glib::ustring token = tokens[i];
+ size_t found = token.find("font-family:");
+ if( found != Glib::ustring::npos ) {
+ // Remove "font-family:"
+ token.erase(found,12);
+ // Remove any leading single or double quote
+ if( token[0] == '\'' || token[0] == '"' ) {
+ token.erase(0,1);
+ }
+ // Remove any trailing single or double quote
+ if( token[token.length()-1] == '\'' || token[token.length()-1] == '"' ) {
+ token.erase(token.length()-1);
+ }
+ l->push_back( token );
+ }
+ }
+ }
+
+ for (SPObject *child = r->firstChild(); child; child = child->getNext()) {
+ sp_text_toolbox_get_font_list_in_doc_recursive( child, l );
+ }
+}
+
+
// Define all the "widgets" in the toolbar.
void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
{
@@ -1457,18 +1509,22 @@ void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje
/* Font family */
{
// Font list
- Glib::RefPtr<Gtk::ListStore> store = Inkscape::FontLister::get_instance()->get_font_list();
+ Inkscape::FontLister* fontlister = Inkscape::FontLister::get_instance();
+ fontlister->update_font_list( sp_desktop_document( SP_ACTIVE_DESKTOP ));
+ Glib::RefPtr<Gtk::ListStore> store = fontlister->get_font_list();
GtkListStore* model = store->gobj();
- Ink_ComboBoxEntry_Action* act = ink_comboboxentry_action_new( "TextFontFamilyAction",
- _("Font Family"),
- _("Select Font Family (Alt-X to access)"),
- NULL,
- GTK_TREE_MODEL(model),
- -1, // Entry width
- 50, // Extra list width
- (gpointer)cell_data_func,// Cell layout
- GTK_WIDGET(desktop->canvas)); // Focus widget
+ Ink_ComboBoxEntry_Action* act =
+ ink_comboboxentry_action_new( "TextFontFamilyAction",
+ _("Font Family"),
+ _("Select Font Family (Alt-X to access)"),
+ NULL,
+ GTK_TREE_MODEL(model),
+ -1, // Entry width
+ 50, // Extra list width
+ (gpointer)font_lister_cell_data_func, // Cell layout
+ (gpointer)font_lister_separator_func,
+ GTK_WIDGET(desktop->canvas)); // Focus widget
ink_comboboxentry_action_popup_enable( act ); // Enable entry completion
gchar *const warning = _("Font not found on system");
ink_comboboxentry_action_set_warning( act, warning ); // Show icon with tooltip if missing font
@@ -1483,7 +1539,13 @@ void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje
"{\n"
" GtkComboBox::appears-as-list = 1\n"
"}\n"
- "widget \"*.TextFontFamilyAction_combobox\" style \"dropdown-as-list-style\"");
+ "widget \"*.TextFontFamilyAction_combobox\" style \"dropdown-as-list-style\""
+ "style \"fontfamily-separator-style\"\n"
+ "{\n"
+ " GtkWidget::wide-separators = 1\n"
+ " GtkWidget::separator-height = 6\n"
+ "}\n"
+ "widget \"*gtk-combobox-popup-window.GtkScrolledWindow.GtkTreeView\" style \"fontfamily-separator-style\"");
}
/* Font size */
@@ -1505,6 +1567,7 @@ void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje
4, // Width in characters
0, // Extra list width
NULL, // Cell layout
+ NULL, // Separator
GTK_WIDGET(desktop->canvas)); // Focus widget
g_signal_connect( G_OBJECT(act), "changed", G_CALLBACK(sp_text_fontsize_value_changed), holder );
@@ -1524,6 +1587,7 @@ void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObje
12, // Width in characters
0, // Extra list width
NULL, // Cell layout
+ NULL, // Separator
GTK_WIDGET(desktop->canvas)); // Focus widget
g_signal_connect( G_OBJECT(act), "changed", G_CALLBACK(sp_text_fontstyle_value_changed), holder );