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 ##
//########################