Code

peeled back the gboolean code as it hit on some complexity theory principles...
[inkscape.git] / src / widgets / toolbox.cpp
index 5bdf60ce5b09a7ee99b56c8e4406bc0398e9792c..ed9259aef9b93d340e37f0124c0f5b859dbe2733 100644 (file)
@@ -76,6 +76,7 @@
 #include "../prefs-utils.h"
 #include "../inkscape-stock.h"
 #include "icon.h"
+#include "graphlayout/graphlayout.h"
 
 #include "mod360.h"
 
@@ -850,7 +851,8 @@ sp_stb_magnitude_value_changed(GtkAdjustment *adj, GtkWidget *tbl)
             modmade = true;
         }
     }
-    if (modmade)  sp_document_done(sp_desktop_document(desktop));
+    if (modmade)  sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_STAR, 
+                                   /* TODO: annotate */ "toolbox.cpp:854");
 
     g_object_set_data(G_OBJECT(tbl), "freeze", GINT_TO_POINTER(FALSE));
 
@@ -894,7 +896,8 @@ sp_stb_proportion_value_changed(GtkAdjustment *adj, GtkWidget *tbl)
         }
     }
 
-    if (modmade) sp_document_done(sp_desktop_document(desktop));
+    if (modmade) sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_STAR, 
+                                  /* TODO: annotate */ "toolbox.cpp:899");
 
     g_object_set_data(G_OBJECT(tbl), "freeze", GINT_TO_POINTER(FALSE));
 
@@ -947,7 +950,8 @@ sp_stb_sides_flat_state_changed(GtkWidget *widget, GtkObject *tbl)
             }
         }
     }
-    if (modmade) sp_document_done(sp_desktop_document(desktop));
+    if (modmade) sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_STAR, 
+                                  /* TODO: annotate */ "toolbox.cpp:953");
 
     g_object_set_data(G_OBJECT(tbl), "freeze", GINT_TO_POINTER(FALSE));
 
@@ -983,7 +987,8 @@ sp_stb_rounded_value_changed(GtkAdjustment *adj, GtkWidget *tbl)
             modmade = true;
         }
     }
-    if (modmade)  sp_document_done(sp_desktop_document(desktop));
+    if (modmade)  sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_STAR, 
+                                   /* TODO: annotate */ "toolbox.cpp:990");
 
     g_object_set_data(G_OBJECT(tbl), "freeze", GINT_TO_POINTER(FALSE));
 
@@ -1020,7 +1025,8 @@ sp_stb_randomized_value_changed(GtkAdjustment *adj, GtkWidget *tbl)
             modmade = true;
         }
     }
-    if (modmade)  sp_document_done(sp_desktop_document(desktop));
+    if (modmade)  sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_STAR, 
+                                   /* TODO: annotate */ "toolbox.cpp:1028");
 
     g_object_set_data(G_OBJECT(tbl), "freeze", GINT_TO_POINTER(FALSE));
 
@@ -1359,7 +1365,8 @@ sp_rtb_value_changed(GtkAdjustment *adj, GtkWidget *tbl, gchar const *value_name
     sp_rtb_sensitivize (tbl);
 
     if (modmade) {
-        sp_document_done(sp_desktop_document(desktop));
+        sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_RECT, 
+                         /* TODO: annotate */ "toolbox.cpp:1368");
     }
 
     g_object_set_data(G_OBJECT(tbl), "freeze", GINT_TO_POINTER(FALSE));
@@ -1675,7 +1682,8 @@ sp_spl_tb_value_changed(GtkAdjustment *adj, GtkWidget *tbl, gchar const *value_n
     g_free(namespaced_name);
 
     if (modmade) {
-        sp_document_done(sp_desktop_document(desktop));
+        sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_SPIRAL, 
+                         /* TODO: annotate */ "toolbox.cpp:1685");
     }
 
     g_object_set_data(G_OBJECT(tbl), "freeze", GINT_TO_POINTER(FALSE));
@@ -2236,7 +2244,8 @@ sp_arctb_startend_value_changed(GtkAdjustment *adj, GtkWidget *tbl, gchar const
     sp_arctb_sensitivize (tbl, adj->value, other->value);
 
     if (modmade) {
-        sp_document_maybe_done(sp_desktop_document(desktop), value_name);
+        sp_document_maybe_done(sp_desktop_document(desktop), value_name, SP_VERB_CONTEXT_ARC, 
+                               /* TODO: annotate */ "toolbox.cpp:2247");
     }
 
     // defocus spinbuttons by moving focus to the canvas, unless "stay" is on
@@ -2308,7 +2317,8 @@ sp_arctb_open_state_changed(GtkWidget *widget, GtkObject *tbl)
     }
 
     if (modmade) {
-        sp_document_done(sp_desktop_document(desktop));
+        sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_ARC, 
+                         /* TODO: annotate */ "toolbox.cpp:2320");
     }
 
     g_object_set_data(G_OBJECT(tbl), "freeze", GINT_TO_POINTER(FALSE));
@@ -2526,10 +2536,22 @@ sp_arc_toolbox_new(SPDesktop *desktop)
 //##      Dropper       ##
 //########################
 
-static void toggle_dropper_color_pick (GtkWidget *button, gpointer data) {
+static void toggle_dropper_pick_alpha (GtkWidget *button, gpointer tbl) {
     prefs_set_int_attribute ("tools.dropper", "pick", 
-        // 0 and 1 are backwards here because of pref
-        gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)) ? 0 : 1);
+        gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)));
+    GtkWidget *set_checkbox = (GtkWidget*) g_object_get_data(G_OBJECT(tbl), "set_checkbox");
+    if (set_checkbox) {
+        if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button))) {
+            gtk_widget_set_sensitive (GTK_WIDGET (set_checkbox), TRUE);
+        } else {
+            gtk_widget_set_sensitive (GTK_WIDGET (set_checkbox), FALSE);
+        }
+    }
+}
+
+static void toggle_dropper_set_alpha (GtkWidget *button, gpointer data) {
+    prefs_set_int_attribute ("tools.dropper", "setalpha", 
+        gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)) ? 1 : 0);
 }
 
 
@@ -2712,26 +2734,43 @@ sp_dropper_toolbox_new(SPDesktop *desktop)
     
     {
         GtkWidget *hb = gtk_hbox_new(FALSE, 1);
-        
-        GtkWidget *button = 
-            sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
-                                     SP_BUTTON_TYPE_TOGGLE,
-                                     NULL,
-                                     "pick_color",
-                                     _("When pressed, picks visible color "
-                                      "without alpha and when not pressed, "
-                                      "picks color including its "
-                                      "alpha"),
-                                     tt);
 
+        GtkWidget *button = gtk_check_button_new_with_label(_("Pick alpha"));
+        gtk_tooltips_set_tip(tt, button, _("Pick both the color and the alpha (transparency) under cursor; otherwise, pick only the visible color premultiplied by alpha"), NULL);
+        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), 
+                                      prefs_get_int_attribute ("tools.dropper", 
+                                                               "pick", 1));
         gtk_widget_show(button);
         gtk_container_add (GTK_CONTAINER (hb), button);
+        gtk_object_set_data(GTK_OBJECT(tbl), "pick_checkbox", button);
+        g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (toggle_dropper_pick_alpha), tbl);
+        gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, 
+                   AUX_BETWEEN_BUTTON_GROUPS);
+    }
 
-        g_signal_connect_after (G_OBJECT (button), "clicked", 
-                                G_CALLBACK (toggle_dropper_color_pick), NULL);
+    {
+        GtkWidget *hb = gtk_hbox_new(FALSE, 1);
+
+        GtkWidget *button = gtk_check_button_new_with_label(_("Set alpha"));
+        gtk_tooltips_set_tip(tt, button, _("If alpha was picked, assign it to selection as fill or stroke transparency"), NULL);
         gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), 
-                                      !prefs_get_int_attribute ("tools.dropper", 
-                                                               "pick", 0));
+                                      prefs_get_int_attribute ("tools.dropper", 
+                                                               "setalpha", 1));
+        gtk_widget_show(button);
+        gtk_container_add (GTK_CONTAINER (hb), button);
+        gtk_object_set_data(GTK_OBJECT(tbl), "set_checkbox", button);
+        g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (toggle_dropper_set_alpha), tbl);
+
+        // make sure it's disabled if we're not picking alpha
+        GtkWidget *pick_checkbox = (GtkWidget*) g_object_get_data(G_OBJECT(tbl), "pick_checkbox");
+        if (pick_checkbox) {
+            if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (pick_checkbox))) {
+                gtk_widget_set_sensitive (GTK_WIDGET (button), TRUE);
+            } else {
+                gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE);
+            }
+        }
+
         gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, 
                    AUX_BETWEEN_BUTTON_GROUPS);
     }
@@ -2928,20 +2967,23 @@ sp_text_toolbox_selection_changed (Inkscape::Selection *selection, GObject *tbl)
         }
 
         //Orientation
+        //locking both buttons, changing one affect all group (both)
+        GtkWidget *button = GTK_WIDGET (g_object_get_data (G_OBJECT (tbl), "orientation-horizontal"));
+        g_object_set_data (G_OBJECT (button), "block", gpointer(1));
+        
+        GtkWidget *button1 = GTK_WIDGET (g_object_get_data (G_OBJECT (tbl), "orientation-vertical"));
+        g_object_set_data (G_OBJECT (button1), "block", gpointer(1));
+        
         if (query->writing_mode.computed == SP_CSS_WRITING_MODE_LR_TB)
         {
-            GtkWidget *button = GTK_WIDGET (g_object_get_data (G_OBJECT (tbl), "orientation-horizontal"));
-            g_object_set_data (G_OBJECT (button), "block", gpointer(1));
             gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
-            g_object_set_data (G_OBJECT (button), "block", gpointer(0));
         }
         else
         {
-            GtkWidget *button = GTK_WIDGET (g_object_get_data (G_OBJECT (tbl), "orientation-vertical"));
-            g_object_set_data (G_OBJECT (button), "block", gpointer(1));
-            gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
-            g_object_set_data (G_OBJECT (button), "block", gpointer(0));
+            gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button1), TRUE);
         }
+        g_object_set_data (G_OBJECT (button), "block", gpointer(0));
+        g_object_set_data (G_OBJECT (button1), "block", gpointer(0));
     }
 }
 
@@ -2962,16 +3004,19 @@ sp_text_toolbox_family_changed (GtkTreeSelection    *selection,
                                 GObject             *tbl) 
 {
     SPDesktop    *desktop = SP_ACTIVE_DESKTOP;
-    GtkTreeModel *model;
+    GtkTreeModel *model = 0;
     GtkWidget    *popdown = GTK_WIDGET (g_object_get_data (tbl, "family-popdown-window"));
     GtkWidget    *entry = GTK_WIDGET (g_object_get_data (tbl, "family-entry"));
     GtkTreeIter   iter;
-    char         *family;
+    char         *family = 0;
 
     gdk_pointer_ungrab (GDK_CURRENT_TIME);
     gdk_keyboard_ungrab (GDK_CURRENT_TIME);
 
-    gtk_tree_selection_get_selected (selection, &model, &iter);
+    if ( !gtk_tree_selection_get_selected( selection, &model, &iter ) ) {
+        return;
+    }
+
     gtk_tree_model_get (model, &iter, 0, &family, -1);
 
     if (g_object_get_data (G_OBJECT (selection), "block"))
@@ -3005,7 +3050,8 @@ sp_text_toolbox_family_changed (GtkTreeSelection    *selection,
         sp_desktop_set_style (desktop, css, true, true);
     }
 
-    sp_document_done (sp_desktop_document (SP_ACTIVE_DESKTOP));
+    sp_document_done (sp_desktop_document (SP_ACTIVE_DESKTOP), SP_VERB_CONTEXT_TEXT, 
+                      /* TODO: annotate */ "toolbox.cpp:3024");
     sp_repr_css_attr_unref (css);
     free (family);
     gtk_widget_hide (GTK_WIDGET (g_object_get_data (G_OBJECT(tbl), "warning-image")));        
@@ -3087,7 +3133,8 @@ sp_text_toolbox_anchoring_toggled (GtkRadioButton   *button,
     }
 
     sp_desktop_set_style (desktop, css, true, true);
-    sp_document_done (sp_desktop_document (SP_ACTIVE_DESKTOP));
+    sp_document_done (sp_desktop_document (SP_ACTIVE_DESKTOP), SP_VERB_CONTEXT_TEXT, 
+                      /* TODO: annotate */ "toolbox.cpp:3107");
     sp_repr_css_attr_unref (css);
 
     gtk_widget_grab_focus (GTK_WIDGET(desktop->canvas));
@@ -3132,7 +3179,8 @@ sp_text_toolbox_style_toggled (GtkToggleButton  *button,
     }
 
     sp_desktop_set_style (desktop, css, true, true);
-    sp_document_done (sp_desktop_document (SP_ACTIVE_DESKTOP));
+    sp_document_done (sp_desktop_document (SP_ACTIVE_DESKTOP), SP_VERB_CONTEXT_TEXT, 
+                      /* TODO: annotate */ "toolbox.cpp:3153");
     sp_repr_css_attr_unref (css);
 
     gtk_widget_grab_focus (GTK_WIDGET(desktop->canvas));
@@ -3142,8 +3190,11 @@ void
 sp_text_toolbox_orientation_toggled (GtkRadioButton  *button,
                                      gpointer         data)
 {
-    if (g_object_get_data (G_OBJECT (button), "block")) return;
-
+    if (g_object_get_data (G_OBJECT (button), "block")) {
+        g_object_set_data (G_OBJECT (button), "block", gpointer(0));
+        return;
+    }
+    
     SPDesktop   *desktop    = SP_ACTIVE_DESKTOP;
     SPCSSAttr   *css        = sp_repr_css_attr_new (); 
     int          prop       = GPOINTER_TO_INT(data); 
@@ -3175,7 +3226,8 @@ sp_text_toolbox_orientation_toggled (GtkRadioButton  *button,
     }
 
     sp_desktop_set_style (desktop, css, true, true);
-    sp_document_done (sp_desktop_document (SP_ACTIVE_DESKTOP));
+    sp_document_done (sp_desktop_document (SP_ACTIVE_DESKTOP), SP_VERB_CONTEXT_TEXT, 
+                      /* TODO: annotate */ "toolbox.cpp:3200");
     sp_repr_css_attr_unref (css);
 
     gtk_widget_grab_focus (GTK_WIDGET(desktop->canvas));
@@ -3243,7 +3295,16 @@ sp_text_toolbox_size_changed  (GtkComboBox *cbox,
 
     if (g_object_get_data (tbl, "size-block")) return;
 
+#if GTK_CHECK_VERSION(2,6,0)
     char *text = gtk_combo_box_get_active_text (cbox);
+#else // GTK_CHECK_VERSION(2,6,0)
+    GtkTreeModel *model = gtk_combo_box_get_model (cbox);
+    GtkTreeIter iter;
+    char *text = NULL;
+
+    if (gtk_combo_box_get_active_iter (cbox, &iter) && model)
+        gtk_tree_model_get (model, &iter, 0, &text, -1);
+#endif // GTK_CHECK_VERSION(2,6,0)
 
     SPCSSAttr *css = sp_repr_css_attr_new (); 
     sp_repr_css_set_property (css, "font-size", text); 
@@ -3261,7 +3322,8 @@ sp_text_toolbox_size_changed  (GtkComboBox *cbox,
     }
 
     sp_desktop_set_style (desktop, css, true, true);
-    sp_document_maybe_done (sp_desktop_document (SP_ACTIVE_DESKTOP), "ttb:size");
+    sp_document_maybe_done (sp_desktop_document (SP_ACTIVE_DESKTOP), "ttb:size", SP_VERB_NONE, 
+                            /* TODO: annotate */ "toolbox.cpp:3296");
     sp_repr_css_attr_unref (css);
 
 
@@ -3351,6 +3413,14 @@ cell_data_func  (GtkTreeViewColumn *column,
     free (sample_escaped);
 }
 
+static void delete_completion(GObject *obj, GtkWidget *entry) {
+    GObject *completion = (GObject *) gtk_object_get_data(GTK_OBJECT(entry), "completion");
+    if (completion) {
+        gtk_entry_set_completion (GTK_ENTRY(entry), NULL);
+        g_object_unref (completion);
+    }
+}
+
 GtkWidget*
 sp_text_toolbox_new (SPDesktop *desktop)
 {
@@ -3376,8 +3446,10 @@ sp_text_toolbox_new (SPDesktop *desktop)
     gtk_entry_completion_set_minimum_key_length (completion, 1); 
     g_object_set (G_OBJECT(completion), "inline-completion", TRUE, "popup-completion", TRUE, NULL);
     gtk_entry_set_completion (GTK_ENTRY(entry), completion);
+    gtk_object_set_data(GTK_OBJECT(entry), "completion", completion);
     aux_toolbox_space (tbl, 1);
     gtk_box_pack_start (GTK_BOX (tbl), entry, FALSE, FALSE, 0);
+    g_signal_connect(G_OBJECT(tbl), "destroy", G_CALLBACK(delete_completion), entry);
         
     //Button
     GtkWidget   *button = gtk_button_new ();
@@ -3397,7 +3469,9 @@ sp_text_toolbox_new (SPDesktop *desktop)
 
     gtk_tree_view_set_model (GTK_TREE_VIEW (treeview), GTK_TREE_MODEL (Glib::unwrap(store)));
     gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (treeview), FALSE);
+#if GTK_CHECK_VERSION(2,6,0)
     gtk_tree_view_set_fixed_height_mode (GTK_TREE_VIEW (treeview), TRUE);
+#endif // GTK_CHECK_VERSION(2,6,0)
 
     //gtk_tree_view_set_enable_search (GTK_TREE_VIEW (treeview), TRUE);
 
@@ -3470,7 +3544,7 @@ sp_text_toolbox_new (SPDesktop *desktop)
     gtk_box_pack_start  (GTK_BOX  (row), rbutton, FALSE, FALSE, 0);
     g_object_set_data   (G_OBJECT (tbl), "text-start", rbutton);
     g_signal_connect    (G_OBJECT (rbutton), "toggled", G_CALLBACK (sp_text_toolbox_anchoring_toggled), gpointer(0));
-    gtk_tooltips_set_tip(tt, rbutton, _("Align right"), NULL);
+    gtk_tooltips_set_tip(tt, rbutton, _("Align left"), NULL);
 
     // center
     rbutton = gtk_radio_button_new (gtk_radio_button_group (GTK_RADIO_BUTTON (group)));
@@ -3492,7 +3566,7 @@ sp_text_toolbox_new (SPDesktop *desktop)
     gtk_box_pack_start  (GTK_BOX  (row), rbutton, FALSE, FALSE, 0);
     g_object_set_data   (G_OBJECT (tbl), "text-end", rbutton);
     g_signal_connect    (G_OBJECT (rbutton), "toggled", G_CALLBACK (sp_text_toolbox_anchoring_toggled), gpointer(2));
-    gtk_tooltips_set_tip(tt, rbutton, _("Align left"), NULL);
+    gtk_tooltips_set_tip(tt, rbutton, _("Align right"), NULL);
 
     // fill
     rbutton = gtk_radio_button_new (gtk_radio_button_group (GTK_RADIO_BUTTON (group)));
@@ -3778,6 +3852,7 @@ static void sp_connector_path_set_ignore(void)
 }
 
 
+
 static void connector_spacing_changed(GtkAdjustment *adj, GtkWidget *tbl)
 {
     // quit if run by the _changed callbacks
@@ -3813,13 +3888,58 @@ static void connector_spacing_changed(GtkAdjustment *adj, GtkWidget *tbl)
         g_slist_free(items);
     }
     
-    sp_document_done(doc);
+    sp_document_done(doc, SP_VERB_CONTEXT_CONNECTOR, 
+            _("Change connector spacing distance"));
 
     g_object_set_data(G_OBJECT(tbl), "freeze", GINT_TO_POINTER(FALSE));
     
     spinbutton_defocus(GTK_OBJECT(tbl));
 }
 
+static void sp_connector_graph_layout(void)
+{
+    if (!SP_ACTIVE_DESKTOP) return;
+
+    // hack for clones, see comment in align-and-distribute.cpp
+    int saved_compensation = prefs_get_int_attribute("options.clonecompensation", "value", SP_CLONE_COMPENSATION_UNMOVED);
+    prefs_set_int_attribute("options.clonecompensation", "value", SP_CLONE_COMPENSATION_UNMOVED);
+
+    graphlayout(sp_desktop_selection(SP_ACTIVE_DESKTOP)->itemList());
+
+    prefs_set_int_attribute("options.clonecompensation", "value", saved_compensation);
+
+    sp_document_done(sp_desktop_document(SP_ACTIVE_DESKTOP), SP_VERB_DIALOG_ALIGN_DISTRIBUTE, /* TODO: annotate */ "toolbox.cpp:129");
+}
+
+static void
+sp_directed_graph_layout_toggled(GtkWidget *widget, GtkObject *tbl)
+{
+    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
+        prefs_set_string_attribute("tools.connector", "directedlayout", 
+                "true");
+    } else {
+        prefs_set_string_attribute("tools.connector", "directedlayout", 
+                "false");
+    }
+}
+static void
+sp_nooverlaps_graph_layout_toggled(GtkWidget *widget, GtkObject *tbl)
+{
+    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
+        prefs_set_string_attribute("tools.connector", "avoidoverlaplayout", 
+                "true");
+    } else {
+        prefs_set_string_attribute("tools.connector", "avoidoverlaplayout", 
+                "false");
+    }
+}
+
+
+static void connector_length_changed(GtkAdjustment *adj, GtkWidget *tbl)
+{
+    prefs_set_double_attribute("tools.connector", "length", adj->value);
+    spinbutton_defocus(GTK_OBJECT(tbl));
+}
 
 static void connector_tb_event_attr_changed(Inkscape::XML::Node *repr,
         gchar const *name, gchar const *old_value, gchar const *new_value,
@@ -3887,6 +4007,50 @@ sp_connector_toolbox_new(SPDesktop *desktop)
         gtk_box_pack_start(GTK_BOX(tbl), object_spacing, FALSE, FALSE,
                 AUX_SPACING);
     }
+    // Graph (connector network) layout
+    sp_toolbox_button_new(tbl, Inkscape::ICON_SIZE_SMALL_TOOLBAR,
+            "graph_layout", GTK_SIGNAL_FUNC(sp_connector_graph_layout),
+            tt, _("Nicely arrange selected connector network"));
+    // Default connector length spinbox
+    {
+        GtkWidget *connector_length = sp_tb_spinbutton(_("Length:"),
+                _("Ideal length for connectors when layout is applied"),
+                "tools.connector", "length", 100, NULL, tbl, TRUE,
+                "inkscape:connector-length", 10, 1000, 10.0, 100.0,
+                connector_length_changed, 1, 0);
+
+        gtk_box_pack_start(GTK_BOX(tbl), connector_length, FALSE, FALSE,
+                AUX_SPACING);
+    }
+    gchar const *tbuttonstate;
+    // Directed edges toggle button
+    {
+        GtkWidget *tbutton = gtk_toggle_button_new (); 
+        gtk_button_set_relief       (GTK_BUTTON (tbutton), GTK_RELIEF_NONE);
+        gtk_container_add           (GTK_CONTAINER (tbutton), sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, "directed_graph")); 
+        gtk_toggle_button_set_mode  (GTK_TOGGLE_BUTTON (tbutton), FALSE);
+        gtk_tooltips_set_tip(tt, tbutton, _("Make connectors with end-markers (arrows) point downwards"), NULL);
+
+        gtk_box_pack_start  (GTK_BOX  (tbl), tbutton, FALSE, FALSE, 0);
+        g_signal_connect(G_OBJECT(tbutton), "toggled", GTK_SIGNAL_FUNC(sp_directed_graph_layout_toggled), tbl);
+        tbuttonstate = prefs_get_string_attribute("tools.connector", "directedlayout");
+        gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(tbutton), 
+                (tbuttonstate && !strcmp(tbuttonstate, "true"))?TRUE:FALSE );
+    }
+    // Avoid overlaps toggle button
+    {
+        GtkWidget *tbutton = gtk_toggle_button_new (); 
+        gtk_button_set_relief       (GTK_BUTTON (tbutton), GTK_RELIEF_NONE);
+        gtk_container_add           (GTK_CONTAINER (tbutton), sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, "remove_overlaps")); 
+        gtk_toggle_button_set_mode  (GTK_TOGGLE_BUTTON (tbutton), FALSE);
+        gtk_tooltips_set_tip(tt, tbutton, _("Do not allow overlapping shapes"), NULL);
+
+        gtk_box_pack_start  (GTK_BOX  (tbl), tbutton, FALSE, FALSE, 0);
+        g_signal_connect(G_OBJECT(tbutton), "toggled", GTK_SIGNAL_FUNC(sp_nooverlaps_graph_layout_toggled), tbl);
+        tbuttonstate = prefs_get_string_attribute("tools.connector", "avoidoverlaplayout");
+        gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(tbutton), 
+                (tbuttonstate && !strcmp(tbuttonstate, "true"))?TRUE:FALSE );
+    }
 
     gtk_widget_show_all(tbl);
     sp_set_font_size_smaller (tbl);