Index: widgets/toolbox.cpp =================================================================== --- widgets/toolbox.cpp (revision 17161) +++ widgets/toolbox.cpp (working copy) @@ -335,6 +335,9 @@ " " " " + " " + " " + " " " " " " @@ -2928,16 +2931,124 @@ //######################## + static void sp_pen_toolbox_prep(SPDesktop */*desktop*/, GtkActionGroup* /*mainActions*/, GObject* /*holder*/) { // Put stuff here } -static void sp_pencil_toolbox_prep(SPDesktop */*desktop*/, GtkActionGroup* /*mainActions*/, GObject* /*holder*/) + +static void +sp_pencil_tb_defaults(GtkWidget */*widget*/, GtkObject *obj) { - // Put stuff here + GtkWidget *tbl = GTK_WIDGET(obj); + + GtkAdjustment *adj; + + // fixme: make settable + gdouble tolerance = 4; + + adj = (GtkAdjustment*)gtk_object_get_data(obj, "tolerance"); + gtk_adjustment_set_value(adj, tolerance); + gtk_adjustment_value_changed(adj); + + spinbutton_defocus(GTK_OBJECT(tbl)); } +static void +sp_pencil_tb_tolerance_value_changed(GtkAdjustment *adj, GObject *tbl) +{ + + // quit if run by the attr_changed listener + if (g_object_get_data( tbl, "freeze" )) { + return; + } + // in turn, prevent listener from responding + g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) ); + prefs_set_double_attribute("tools.freehand.pencil", + "tolerance", adj->value); + g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) ); + +} + + + +static void +sp_pencil_tb_tolerance_value_changed_external(Inkscape::XML::Node *repr, + const gchar *key, + const gchar *oldval, + const gchar *newval, + bool is_interactive, + void * data) +{ + GObject* tbl = G_OBJECT(data); + if (g_object_get_data( tbl, "freeze" )) { + return; + } + + g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) ); + + GtkAdjustment * adj = (GtkAdjustment*)g_object_get_data(tbl, + "tolerance"); + + double v = prefs_get_double_attribute("tools.freehand.pencil", + "tolerance", adj->value); + gtk_adjustment_set_value(adj, v); + g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) ); + +} + +static Inkscape::XML::NodeEventVector pencil_node_events = +{ + NULL, + NULL, + sp_pencil_tb_tolerance_value_changed_external, + NULL, + NULL, +}; + + +static void sp_pencil_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder) +{ + EgeAdjustmentAction* eact = 0; + + /* Tolerance */ + { + + eact = create_adjustment_action( "PencilToleranceAction", + _("Number of pixels allowed in interpolating"), + _("Tolerance:"), _("Tolerance"), + "tools.freehand.pencil", "tolerance", + 3.0, + GTK_WIDGET(desktop->canvas), NULL, + holder, TRUE, "altx-pencil", + 0.5, 100.0, 0.5, 1.0, + NULL, NULL, 0, + sp_pencil_tb_tolerance_value_changed, + 1, 2); + gtk_action_group_add_action( mainActions, GTK_ACTION(eact) ); + + Inkscape::XML::Node *repr = inkscape_get_repr(INKSCAPE, + "tools.freehand.pencil"); + repr->addListener(&pencil_node_events, G_OBJECT(holder)); + g_object_set_data(G_OBJECT(holder), "repr", repr); + + } + /* Reset */ + { + InkAction* inky = ink_action_new( "PencilResetAction", + _("Defaults"), + _("Reset pencil parameters to defaults (use Inkscape Preferences > Tools to change defaults)"), + GTK_STOCK_CLEAR, + Inkscape::ICON_SIZE_SMALL_TOOLBAR ); + g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_pencil_tb_defaults), holder ); + gtk_action_group_add_action( mainActions, GTK_ACTION(inky) ); + } + + g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder ); + +} + //######################## //## Tweak ## //########################