Code

lpe interpolate: fix traversal of trajectory_path. add option for equidistant_spacing
[inkscape.git] / src / dialogs / sp-attribute-widget.cpp
index 670da965e763d8b10f75b26c6494be42006f3543..9848d9f266c86430ee12aff55b9aebac6550571b 100644 (file)
@@ -24,6 +24,9 @@
 #include "sp-object.h"
 #include <glibmm/i18n.h>
 
+#include <sigc++/functors/ptr_fun.h>
+#include <sigc++/adaptors/bind.h>
+
 #include "sp-attribute-widget.h"
 
 static void sp_attribute_widget_class_init (SPAttributeWidgetClass *klass);
@@ -32,10 +35,10 @@ static void sp_attribute_widget_destroy (GtkObject *object);
 
 static void sp_attribute_widget_changed (GtkEditable *editable);
 
-static void sp_attribute_widget_object_modified ( SPObject *object, 
-                                                  guint flags, 
+static void sp_attribute_widget_object_modified ( SPObject *object,
+                                                  guint flags,
                                                   SPAttributeWidget *spaw );
-static void sp_attribute_widget_object_release ( SPObject *object, 
+static void sp_attribute_widget_object_release ( SPObject *object,
                                                  SPAttributeWidget *spaw );
 
 static GtkEntryClass *parent_class;
@@ -43,23 +46,25 @@ static GtkEntryClass *parent_class;
 
 
 
-GtkType
-sp_attribute_widget_get_type (void)
+GType sp_attribute_widget_get_type(void)
 {
     static GtkType type = 0;
     if (!type) {
-        static const GtkTypeInfo info = {
-            "SPAttributeWidget",
-            sizeof (SPAttributeWidget),
-            sizeof (SPAttributeWidgetClass),
-            (GtkClassInitFunc) sp_attribute_widget_class_init,
-            (GtkObjectInitFunc) sp_attribute_widget_init,
-            NULL, NULL, NULL
+        GTypeInfo info = {
+            sizeof(SPAttributeWidgetClass),
+            0, // base_init
+            0, // base_finalize
+            (GClassInitFunc)sp_attribute_widget_class_init,
+            0, // class_finalize
+            0, // class_data
+            sizeof(SPAttributeWidget),
+            0, // n_preallocs
+            (GInstanceInitFunc)sp_attribute_widget_init,
+            0 // value_table
         };
-        type = gtk_type_unique (GTK_TYPE_ENTRY, &info);
+        type = g_type_register_static(GTK_TYPE_ENTRY, "SPAttributeWidget", &info, static_cast<GTypeFlags>(0));
     }
     return type;
-    
 } // end of sp_attribute_widget_get_type()
 
 
@@ -94,6 +99,9 @@ sp_attribute_widget_init (SPAttributeWidget *spaw)
     spaw->src.object = NULL;
 
     spaw->attribute = NULL;
+
+    new (&spaw->modified_connection) sigc::connection();
+    new (&spaw->release_connection) sigc::connection();
 }
 
 
@@ -101,7 +109,7 @@ sp_attribute_widget_init (SPAttributeWidget *spaw)
 static void
 sp_attribute_widget_destroy (GtkObject *object)
 {
-    
+
     SPAttributeWidget *spaw;
 
     spaw = SP_ATTRIBUTE_WIDGET (object);
@@ -111,20 +119,24 @@ sp_attribute_widget_destroy (GtkObject *object)
         spaw->attribute = NULL;
     }
 
-    
+
     if (spaw->hasobj) {
-        
+
         if (spaw->src.object) {
-            sp_signal_disconnect_by_data (spaw->src.object, spaw);
+            spaw->modified_connection.disconnect();
+            spaw->release_connection.disconnect();
             spaw->src.object = NULL;
         }
     } else {
-    
+
         if (spaw->src.repr) {
             spaw->src.repr = Inkscape::GC::release(spaw->src.repr);
         }
     } // end of if()
-    
+
+    spaw->modified_connection.~connection();
+    spaw->release_connection.~connection();
+
     ((GtkObjectClass *) parent_class)->destroy (object);
 
 }
@@ -140,38 +152,27 @@ sp_attribute_widget_changed (GtkEditable *editable)
     spaw = SP_ATTRIBUTE_WIDGET (editable);
 
     if (!spaw->blocked) {
-    
+
         const gchar *text;
         spaw->blocked = TRUE;
         text = gtk_entry_get_text (GTK_ENTRY (spaw));
-        if (!*text) 
+        if (!*text)
             text = NULL;
-        
+
         if (spaw->hasobj && spaw->src.object) {
-            
-            if (!sp_repr_set_attr ( SP_OBJECT_REPR (spaw->src.object), 
-                                    spaw->attribute, text) )
-            {
-                /* Cannot set attribute */
-                text = SP_OBJECT_REPR (spaw->src.object)->attribute(spaw->attribute);
-                gtk_entry_set_text (GTK_ENTRY (spaw), text ? text : "");
-            }
-            sp_document_done (SP_OBJECT_DOCUMENT (spaw->src.object), SP_VERB_NONE, 
-                              /* TODO: annotate */ "sp-attribute-widget.cpp:160");
-            
-        } else if (spaw->src.repr) {
         
-            if (!sp_repr_set_attr (spaw->src.repr, spaw->attribute, text))
-            {
-                /* Cannot set attribute */
-                text = spaw->src.repr->attribute(spaw->attribute);
-                gtk_entry_set_text (GTK_ENTRY (spaw), text ? text : "");
-            }
+            SP_OBJECT_REPR (spaw->src.object)->setAttribute(spaw->attribute, text, false);
+            sp_document_done (SP_OBJECT_DOCUMENT (spaw->src.object), SP_VERB_NONE,
+                              _("Set attribute"));
+
+        } else if (spaw->src.repr) {
+
+            spaw->src.repr->setAttribute(spaw->attribute, text, false);
             /* TODO: Warning! Undo will not be flushed in given case */
         }
         spaw->blocked = FALSE;
     }
-    
+
 } // end of sp_attribute_widget_changed()
 
 
@@ -189,7 +190,7 @@ sp_attribute_widget_new ( SPObject *object, const gchar *attribute )
     sp_attribute_widget_set_object (spaw, object, attribute);
 
     return GTK_WIDGET (spaw);
-    
+
 } // end of sp_attribute_widget_new()
 
 
@@ -209,8 +210,8 @@ sp_attribute_widget_new_repr ( Inkscape::XML::Node *repr, const gchar *attribute
 
 
 void
-sp_attribute_widget_set_object ( SPAttributeWidget *spaw, 
-                                 SPObject *object, 
+sp_attribute_widget_set_object ( SPAttributeWidget *spaw,
+                                 SPObject *object,
                                  const gchar *attribute )
 {
 
@@ -226,13 +227,14 @@ sp_attribute_widget_set_object ( SPAttributeWidget *spaw,
     }
 
     if (spaw->hasobj) {
-    
+
         if (spaw->src.object) {
-            sp_signal_disconnect_by_data (spaw->src.object, spaw);
+            spaw->modified_connection.disconnect();
+            spaw->release_connection.disconnect();
             spaw->src.object = NULL;
         }
     } else {
-        
+
         if (spaw->src.repr) {
             spaw->src.repr = Inkscape::GC::release(spaw->src.repr);
         }
@@ -245,12 +247,9 @@ sp_attribute_widget_set_object ( SPAttributeWidget *spaw,
 
         spaw->blocked = TRUE;
         spaw->src.object = object;
-        g_signal_connect ( G_OBJECT (object), "modified", 
-                           G_CALLBACK (sp_attribute_widget_object_modified), 
-                           spaw );
-        g_signal_connect ( G_OBJECT (object), "release", 
-                           G_CALLBACK (sp_attribute_widget_object_release), 
-                           spaw );
+
+        spaw->modified_connection = object->connectModified(sigc::bind<2>(sigc::ptr_fun(&sp_attribute_widget_object_modified), spaw));
+        spaw->release_connection = object->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_attribute_widget_object_release), spaw));
 
         spaw->attribute = g_strdup (attribute);
 
@@ -266,8 +265,8 @@ sp_attribute_widget_set_object ( SPAttributeWidget *spaw,
 
 
 void
-sp_attribute_widget_set_repr ( SPAttributeWidget *spaw, 
-                               Inkscape::XML::Node *repr, 
+sp_attribute_widget_set_repr ( SPAttributeWidget *spaw,
+                               Inkscape::XML::Node *repr,
                                const gchar *attribute )
 {
 
@@ -281,13 +280,14 @@ sp_attribute_widget_set_repr ( SPAttributeWidget *spaw,
     }
 
     if (spaw->hasobj) {
-    
+
         if (spaw->src.object) {
-            sp_signal_disconnect_by_data (spaw->src.object, spaw);
+            spaw->modified_connection.disconnect();
+            spaw->release_connection.disconnect();
             spaw->src.object = NULL;
         }
     } else {
-        
+
         if (spaw->src.repr) {
             spaw->src.repr = Inkscape::GC::release(spaw->src.repr);
         }
@@ -314,29 +314,29 @@ sp_attribute_widget_set_repr ( SPAttributeWidget *spaw,
 
 
 static void
-sp_attribute_widget_object_modified ( SPObject *object, 
-                                      guint flags, 
+sp_attribute_widget_object_modified ( SPObject */*object*/,
+                                      guint flags,
                                       SPAttributeWidget *spaw )
 {
 
     if (flags && SP_OBJECT_MODIFIED_FLAG) {
-        
+
         const gchar *val, *text;
         val = SP_OBJECT_REPR (spaw->src.object)->attribute(spaw->attribute);
         text = gtk_entry_get_text (GTK_ENTRY (spaw));
-        
+
         if (val || text) {
-            
+
             if (!val || !text || strcmp (val, text)) {
                 /* We are different */
                 spaw->blocked = TRUE;
-                gtk_entry_set_text ( GTK_ENTRY (spaw), 
+                gtk_entry_set_text ( GTK_ENTRY (spaw),
                                      val ? val : (const gchar *) "");
                 spaw->blocked = FALSE;
             } // end of if()
-        
+
         } // end of if()
-        
+
     } //end of if()
 
 } // end of sp_attribute_widget_object_modified()
@@ -344,7 +344,7 @@ sp_attribute_widget_object_modified ( SPObject *object,
 
 
 static void
-sp_attribute_widget_object_release ( SPObject *object, 
+sp_attribute_widget_object_release ( SPObject */*object*/,
                                      SPAttributeWidget *spaw )
 {
     sp_attribute_widget_set_object (spaw, NULL, NULL);
@@ -367,23 +367,25 @@ static GtkVBoxClass *table_parent_class;
 
 
 
-GtkType
-sp_attribute_table_get_type (void)
+GType sp_attribute_table_get_type(void)
 {
     static GtkType type = 0;
     if (!type) {
-        static const GtkTypeInfo info = {
-            "SPAttributeTable",
-            sizeof (SPAttributeTable),
-            sizeof (SPAttributeTableClass),
-            (GtkClassInitFunc) sp_attribute_table_class_init,
-            (GtkObjectInitFunc) sp_attribute_table_init,
-            NULL, NULL, NULL
+        GTypeInfo info = {
+            sizeof(SPAttributeTableClass),
+            0, // base_init
+            0, // base_finalize
+            (GClassInitFunc)sp_attribute_table_class_init,
+            0, // class_finalize
+            0, // class_data
+            sizeof(SPAttributeTable),
+            0, // n_preallocs
+            (GInstanceInitFunc)sp_attribute_table_init,
+            0 // value_table
         };
-        type = gtk_type_unique (GTK_TYPE_VBOX, &info);
+        type = g_type_register_static(GTK_TYPE_VBOX, "SPAttributeTable", &info, static_cast<GTypeFlags>(0));
     }
     return type;
-
 } // end of sp_attribute_table_get_type()
 
 
@@ -415,6 +417,9 @@ sp_attribute_table_init ( SPAttributeTable *spat )
     spat->num_attr = 0;
     spat->attributes = NULL;
     spat->entries = NULL;
+
+    new (&spat->modified_connection) sigc::connection();
+    new (&spat->release_connection) sigc::connection();
 }
 
 static void
@@ -434,9 +439,10 @@ sp_attribute_table_destroy ( GtkObject *object )
     }
 
     if (spat->hasobj) {
-        
+
         if (spat->src.object) {
-            sp_signal_disconnect_by_data (spat->src.object, spat);
+            spat->modified_connection.disconnect();
+            spat->release_connection.disconnect();
             spat->src.object = NULL;
         }
     } else {
@@ -445,7 +451,9 @@ sp_attribute_table_destroy ( GtkObject *object )
         }
     } // end of if()
 
-    
+    spat->modified_connection.~connection();
+    spat->release_connection.~connection();
+
     if (spat->entries) {
         g_free (spat->entries);
         spat->entries = NULL;
@@ -456,14 +464,14 @@ sp_attribute_table_destroy ( GtkObject *object )
     if (((GtkObjectClass *) table_parent_class)->destroy) {
         (* ((GtkObjectClass *) table_parent_class)->destroy) (object);
     }
-        
+
 } // end of sp_attribute_table_destroy()
 
 
 GtkWidget *
-sp_attribute_table_new ( SPObject *object, 
-                         gint num_attr, 
-                         const gchar **labels, 
+sp_attribute_table_new ( SPObject *object,
+                         gint num_attr,
+                         const gchar **labels,
                          const gchar **attributes )
 {
     SPAttributeTable *spat;
@@ -483,9 +491,9 @@ sp_attribute_table_new ( SPObject *object,
 
 
 GtkWidget *
-sp_attribute_table_new_repr ( Inkscape::XML::Node *repr, 
-                              gint num_attr, 
-                              const gchar **labels, 
+sp_attribute_table_new_repr ( Inkscape::XML::Node *repr,
+                              gint num_attr,
+                              const gchar **labels,
                               const gchar **attributes )
 {
     SPAttributeTable *spat;
@@ -506,10 +514,10 @@ sp_attribute_table_new_repr ( Inkscape::XML::Node *repr,
 #define YPAD 0
 
 void
-sp_attribute_table_set_object ( SPAttributeTable *spat, 
-                                SPObject *object, 
-                                gint num_attr, 
-                                const gchar **labels, 
+sp_attribute_table_set_object ( SPAttributeTable *spat,
+                                SPObject *object,
+                                gint num_attr,
+                                const gchar **labels,
                                 const gchar **attributes )
 {
 
@@ -540,7 +548,8 @@ sp_attribute_table_set_object ( SPAttributeTable *spat,
 
     if (spat->hasobj) {
         if (spat->src.object) {
-            sp_signal_disconnect_by_data (spat->src.object, spat);
+            spat->modified_connection.disconnect();
+            spat->release_connection.disconnect();
             spat->src.object = NULL;
         }
     } else {
@@ -559,12 +568,10 @@ sp_attribute_table_set_object ( SPAttributeTable *spat,
         /* Set up object */
         spat->src.object = object;
         spat->num_attr = num_attr;
-        g_signal_connect ( G_OBJECT (object), "modified", 
-                           G_CALLBACK (sp_attribute_table_object_modified), 
-                           spat );
-        g_signal_connect ( G_OBJECT (object), "release", 
-                           G_CALLBACK (sp_attribute_table_object_release), 
-                           spat );
+
+        spat->modified_connection = object->connectModified(sigc::bind<2>(sigc::ptr_fun(&sp_attribute_table_object_modified), spat));
+        spat->release_connection = object->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_attribute_table_object_release), spat));
+
         /* Create table */
         spat->table = gtk_table_new (num_attr, 2, FALSE);
         gtk_container_add (GTK_CONTAINER (spat), spat->table);
@@ -580,21 +587,21 @@ sp_attribute_table_set_object ( SPAttributeTable *spat,
             w = gtk_label_new (_(labels[i]));
             gtk_widget_show (w);
             gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5);
-            gtk_table_attach ( GTK_TABLE (spat->table), w, 0, 1, i, i + 1, 
-                               GTK_FILL, 
-                               (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), 
+            gtk_table_attach ( GTK_TABLE (spat->table), w, 0, 1, i, i + 1,
+                               GTK_FILL,
+                               (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
                                XPAD, YPAD );
             w = gtk_entry_new ();
             gtk_widget_show (w);
             val = SP_OBJECT_REPR (object)->attribute(attributes[i]);
             gtk_entry_set_text (GTK_ENTRY (w), val ? val : (const gchar *) "");
-            gtk_table_attach ( GTK_TABLE (spat->table), w, 1, 2, i, i + 1, 
-                               (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), 
-                               (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), 
+            gtk_table_attach ( GTK_TABLE (spat->table), w, 1, 2, i, i + 1,
+                               (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
+                               (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
                                XPAD, YPAD );
             spat->entries[i] = w;
-            g_signal_connect ( G_OBJECT (w), "changed", 
-                               G_CALLBACK (sp_attribute_table_entry_changed), 
+            g_signal_connect ( G_OBJECT (w), "changed",
+                               G_CALLBACK (sp_attribute_table_entry_changed),
                                spat );
         }
         /* Show table */
@@ -603,7 +610,7 @@ sp_attribute_table_set_object ( SPAttributeTable *spat,
         spat->blocked = FALSE;
     }
 
-    gtk_widget_set_sensitive ( GTK_WIDGET (spat), 
+    gtk_widget_set_sensitive ( GTK_WIDGET (spat),
                                (spat->src.object != NULL) );
 
 } // end of sp_attribute_table_set_object()
@@ -611,10 +618,10 @@ sp_attribute_table_set_object ( SPAttributeTable *spat,
 
 
 void
-sp_attribute_table_set_repr ( SPAttributeTable *spat, 
-                              Inkscape::XML::Node *repr, 
-                              gint num_attr, 
-                              const gchar **labels, 
+sp_attribute_table_set_repr ( SPAttributeTable *spat,
+                              Inkscape::XML::Node *repr,
+                              gint num_attr,
+                              const gchar **labels,
                               const gchar **attributes )
 {
     g_return_if_fail (spat != NULL);
@@ -642,7 +649,8 @@ sp_attribute_table_set_repr ( SPAttributeTable *spat,
 
     if (spat->hasobj) {
         if (spat->src.object) {
-            sp_signal_disconnect_by_data (spat->src.object, spat);
+            spat->modified_connection.disconnect();
+            spat->release_connection.disconnect();
             spat->src.object = NULL;
         }
     } else {
@@ -667,7 +675,7 @@ sp_attribute_table_set_repr ( SPAttributeTable *spat,
         /* Arrays */
         spat->attributes = g_new0 (gchar *, num_attr);
         spat->entries = g_new0 (GtkWidget *, num_attr);
-        
+
         /* Fill rows */
         for (i = 0; i < num_attr; i++) {
             GtkWidget *w;
@@ -677,21 +685,21 @@ sp_attribute_table_set_repr ( SPAttributeTable *spat,
             w = gtk_label_new (labels[i]);
             gtk_widget_show (w);
             gtk_misc_set_alignment (GTK_MISC (w), 1.0, 0.5);
-            gtk_table_attach ( GTK_TABLE (spat->table), w, 0, 1, i, i + 1, 
-                               GTK_FILL, 
-                               (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), 
+            gtk_table_attach ( GTK_TABLE (spat->table), w, 0, 1, i, i + 1,
+                               GTK_FILL,
+                               (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
                                XPAD, YPAD );
             w = gtk_entry_new ();
             gtk_widget_show (w);
             val = repr->attribute(attributes[i]);
             gtk_entry_set_text (GTK_ENTRY (w), val ? val : (const gchar *) "");
-            gtk_table_attach ( GTK_TABLE (spat->table), w, 1, 2, i, i + 1, 
-                               (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), 
-                               (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), 
+            gtk_table_attach ( GTK_TABLE (spat->table), w, 1, 2, i, i + 1,
+                               (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
+                               (GtkAttachOptions)(GTK_EXPAND | GTK_FILL),
                                XPAD, YPAD );
             spat->entries[i] = w;
-            g_signal_connect ( G_OBJECT (w), "changed", 
-                               G_CALLBACK (sp_attribute_table_entry_changed), 
+            g_signal_connect ( G_OBJECT (w), "changed",
+                               G_CALLBACK (sp_attribute_table_entry_changed),
                                spat );
         }
         /* Show table */
@@ -707,8 +715,8 @@ sp_attribute_table_set_repr ( SPAttributeTable *spat,
 
 
 static void
-sp_attribute_table_object_modified ( SPObject *object, 
-                                     guint flags, 
+sp_attribute_table_object_modified ( SPObject */*object*/,
+                                     guint flags,
                                      SPAttributeTable *spat )
 {
     if (flags && SP_OBJECT_MODIFIED_FLAG)
@@ -722,20 +730,20 @@ sp_attribute_table_object_modified ( SPObject *object,
                 if (!val || !text || strcmp (val, text)) {
                     /* We are different */
                     spat->blocked = TRUE;
-                    gtk_entry_set_text ( GTK_ENTRY (spat->entries[i]), 
+                    gtk_entry_set_text ( GTK_ENTRY (spat->entries[i]),
                                          val ? val : (const gchar *) "");
                     spat->blocked = FALSE;
                 }
             }
         }
     } // end of if()
-    
+
 } // end of sp_attribute_table_object_modified()
 
 
 
 static void
-sp_attribute_table_object_release (SPObject *object, SPAttributeTable *spat)
+sp_attribute_table_object_release (SPObject */*object*/, SPAttributeTable *spat)
 {
     sp_attribute_table_set_object (spat, NULL, 0, NULL, NULL);
 }
@@ -743,44 +751,30 @@ sp_attribute_table_object_release (SPObject *object, SPAttributeTable *spat)
 
 
 static void
-sp_attribute_table_entry_changed ( GtkEditable *editable, 
+sp_attribute_table_entry_changed ( GtkEditable *editable,
                                    SPAttributeTable *spat )
 {
     if (!spat->blocked)
     {
         gint i;
         for (i = 0; i < spat->num_attr; i++) {
-        
+
             if (GTK_WIDGET (editable) == spat->entries[i]) {
                 const gchar *text;
                 spat->blocked = TRUE;
                 text = gtk_entry_get_text (GTK_ENTRY (spat->entries[i]));
-                
-                if (!*text) 
+
+                if (!*text)
                     text = NULL;
-                
+
                 if (spat->hasobj && spat->src.object) {
-                    if (!sp_repr_set_attr ( SP_OBJECT_REPR (spat->src.object), 
-                                            spat->attributes[i], text))
-                    {
-                        /* Cannot set attribute */
-                        text = SP_OBJECT_REPR (spat->src.object)->attribute(spat->attributes[i]);
-                        gtk_entry_set_text ( GTK_ENTRY (spat->entries[i]), 
-                                             text ? text : (const gchar *) "");
-                    }
-                    sp_document_done (SP_OBJECT_DOCUMENT (spat->src.object), SP_VERB_NONE, 
-                                      /* TODO: annotate */ "sp-attribute-widget.cpp:772");
-                    
+                    SP_OBJECT_REPR (spat->src.object)->setAttribute(spat->attributes[i], text, false);
+                    sp_document_done (SP_OBJECT_DOCUMENT (spat->src.object), SP_VERB_NONE,
+                                      _("Set attribute"));
+
                 } else if (spat->src.repr) {
-                    
-                    if (!sp_repr_set_attr (spat->src.repr, 
-                                           spat->attributes[i], text)) 
-                    {
-                        /* Cannot set attribute */
-                        text = spat->src.repr->attribute(spat->attributes[i]);
-                        gtk_entry_set_text ( GTK_ENTRY (spat->entries[i]), 
-                                             text ? text : (const gchar *) "" );
-                    }
+
+                    spat->src.repr->setAttribute(spat->attributes[i], text, false);
                     /* TODO: Warning! Undo will not be flushed in given case */
                 }
                 spat->blocked = FALSE;