]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkliststore.c
Move GtkTreeModel from object to interface.
[~andy/gtk] / gtk / gtkliststore.c
index 61fd18596702bc07458b336e39654483f3f1fee0..41ab68ec0792be55569d54f785a54690771d920f 100644 (file)
 #include "gtktreemodel.h"
 #include "gtkliststore.h"
 #include "gtktreedatalist.h"
+#include "gtksignal.h"
 
 #define G_SLIST(x) ((GSList *) x)
 
+enum {
+  NODE_CHANGED,
+  NODE_INSERTED,
+  NODE_CHILD_TOGGLED,
+  NODE_DELETED,
+  LAST_SIGNAL
+};
+
+static guint list_store_signals[LAST_SIGNAL] = { 0 };
+
 static void           gtk_list_store_init            (GtkListStore      *list_store);
 static void           gtk_list_store_class_init      (GtkListStoreClass *class);
+static void           gtk_list_store_tree_model_init (GtkTreeModelIface *iface);
 static gint           gtk_list_store_get_n_columns   (GtkTreeModel      *tree_model);
 static GtkTreeNode    gtk_list_store_get_node        (GtkTreeModel      *tree_model,
                                                      GtkTreePath       *path);
@@ -50,9 +62,6 @@ static GtkTreeNode    gtk_list_store_node_parent     (GtkTreeModel      *tree_mo
                                                      GtkTreeNode        node);
 
 
-static GtkTreeModelClass *parent_class = NULL;
-
-
 GtkType
 gtk_list_store_get_type (void)
 {
@@ -73,7 +82,17 @@ gtk_list_store_get_type (void)
         (GInstanceInitFunc) gtk_list_store_init,
       };
 
-      list_store_type = g_type_register_static (GTK_TYPE_TREE_MODEL, "GtkListStore", &list_store_info);
+      static const GInterfaceInfo tree_model_info =
+      {
+       (GInterfaceInitFunc) gtk_list_store_tree_model_init,
+       NULL,
+       NULL
+      };
+
+      list_store_type = g_type_register_static (GTK_TYPE_OBJECT, "GtkListStore", &list_store_info);
+      g_type_add_interface_static (list_store_type,
+                                  GTK_TYPE_TREE_MODEL,
+                                  &tree_model_info);
     }
 
   return list_store_type;
@@ -83,23 +102,62 @@ static void
 gtk_list_store_class_init (GtkListStoreClass *class)
 {
   GtkObjectClass *object_class;
-  GtkTreeModelClass *tree_model_class;
 
   object_class = (GtkObjectClass*) class;
-  tree_model_class = (GtkTreeModelClass *) class;
-
-  parent_class = gtk_type_class (gtk_tree_model_get_type ());
-
-  tree_model_class->get_n_columns = gtk_list_store_get_n_columns;
-  tree_model_class->get_node = gtk_list_store_get_node;
-  tree_model_class->get_path = gtk_list_store_get_path;
-  tree_model_class->node_get_value = gtk_list_store_node_get_value;
-  tree_model_class->node_next = gtk_list_store_node_next;
-  tree_model_class->node_children = gtk_list_store_node_children;
-  tree_model_class->node_has_child = gtk_list_store_node_has_child;
-  tree_model_class->node_n_children = gtk_list_store_node_n_children;
-  tree_model_class->node_nth_child = gtk_list_store_node_nth_child;
-  tree_model_class->node_parent = gtk_list_store_node_parent;
+
+  list_store_signals[NODE_CHANGED] =
+    gtk_signal_new ("node_changed",
+                    GTK_RUN_FIRST,
+                    GTK_CLASS_TYPE (object_class),
+                    GTK_SIGNAL_OFFSET (GtkListStoreClass, node_changed),
+                    gtk_marshal_NONE__POINTER_POINTER,
+                    GTK_TYPE_NONE, 2,
+                   GTK_TYPE_POINTER,
+                   GTK_TYPE_POINTER);
+  list_store_signals[NODE_INSERTED] =
+    gtk_signal_new ("node_inserted",
+                    GTK_RUN_FIRST,
+                    GTK_CLASS_TYPE (object_class),
+                    GTK_SIGNAL_OFFSET (GtkListStoreClass, node_inserted),
+                    gtk_marshal_NONE__POINTER_POINTER,
+                    GTK_TYPE_NONE, 2,
+                   GTK_TYPE_POINTER,
+                   GTK_TYPE_POINTER);
+  list_store_signals[NODE_CHILD_TOGGLED] =
+    gtk_signal_new ("node_child_toggled",
+                    GTK_RUN_FIRST,
+                    GTK_CLASS_TYPE (object_class),
+                    GTK_SIGNAL_OFFSET (GtkListStoreClass, node_child_toggled),
+                    gtk_marshal_NONE__POINTER_POINTER,
+                    GTK_TYPE_NONE, 2,
+                   GTK_TYPE_POINTER,
+                   GTK_TYPE_POINTER);
+  list_store_signals[NODE_DELETED] =
+    gtk_signal_new ("node_deleted",
+                    GTK_RUN_FIRST,
+                    GTK_CLASS_TYPE (object_class),
+                    GTK_SIGNAL_OFFSET (GtkListStoreClass, node_deleted),
+                    gtk_marshal_NONE__POINTER,
+                    GTK_TYPE_NONE, 1,
+                   GTK_TYPE_POINTER);
+
+
+  gtk_object_class_add_signals (object_class, list_store_signals, LAST_SIGNAL);
+}
+
+static void
+gtk_list_store_tree_model_init (GtkTreeModelIface *iface)
+{
+  iface->get_n_columns = gtk_list_store_get_n_columns;
+  iface->get_node = gtk_list_store_get_node;
+  iface->get_path = gtk_list_store_get_path;
+  iface->node_get_value = gtk_list_store_node_get_value;
+  iface->node_next = gtk_list_store_node_next;
+  iface->node_children = gtk_list_store_node_children;
+  iface->node_has_child = gtk_list_store_node_has_child;
+  iface->node_n_children = gtk_list_store_node_n_children;
+  iface->node_nth_child = gtk_list_store_node_nth_child;
+  iface->node_parent = gtk_list_store_node_parent;
 }
 
 static void