]> Pileus Git - ~andy/gtk/blobdiff - demos/gtk-demo/list_store.c
Deprecate widget flag: GTK_WIDGET_VISIBLE
[~andy/gtk] / demos / gtk-demo / list_store.c
index b9daf6f056f62419d0f51d507bab9853ecdbfd6f..009cd97993d042776fd562a61da0ed6c9250741e 100644 (file)
@@ -1,6 +1,6 @@
 /* Tree View/List Store
  *
- * The GtkListStore is used to store data in list form, to be used 
+ * The GtkListStore is used to store data in list form, to be used
  * later on by a GtkTreeView to display it. This demo builds a
  * simple GtkListStore and displays it. See the Stock Browser
  * demo for a more advanced example.
@@ -10,6 +10,8 @@
 #include <gtk/gtk.h>
 
 static GtkWidget *window = NULL;
+static GtkTreeModel *model = NULL;
+static guint timeout = 0;
 
 typedef struct
 {
@@ -26,6 +28,8 @@ enum
   COLUMN_NUMBER,
   COLUMN_SEVERITY,
   COLUMN_DESCRIPTION,
+  COLUMN_PULSE,
+  COLUMN_ACTIVE,
   NUM_COLUMNS
 };
 
@@ -47,6 +51,33 @@ static Bug data[] =
   { FALSE, 1,     "Normal",     "First bug :=)" },
 };
 
+static gboolean
+spinner_timeout (gpointer data)
+{
+  GtkTreeIter iter;
+  guint pulse;
+
+  if (model == NULL)
+    return FALSE;
+
+  gtk_tree_model_get_iter_first (model, &iter);
+  gtk_tree_model_get (model, &iter,
+                      COLUMN_PULSE, &pulse,
+                      -1);
+  if (pulse == G_MAXUINT)
+    pulse = 0;
+  else
+    pulse++;
+
+  gtk_list_store_set (GTK_LIST_STORE (model),
+                      &iter,
+                      COLUMN_PULSE, pulse,
+                      COLUMN_ACTIVE, TRUE,
+                      -1);
+
+  return TRUE;
+}
+
 static GtkTreeModel *
 create_model (void)
 {
@@ -56,21 +87,25 @@ create_model (void)
 
   /* create list store */
   store = gtk_list_store_new (NUM_COLUMNS,
-                             G_TYPE_BOOLEAN,
-                             G_TYPE_UINT,
-                             G_TYPE_STRING,
-                             G_TYPE_STRING);
+                              G_TYPE_BOOLEAN,
+                              G_TYPE_UINT,
+                              G_TYPE_STRING,
+                              G_TYPE_STRING,
+                              G_TYPE_UINT,
+                              G_TYPE_BOOLEAN);
 
   /* add data to the list store */
   for (i = 0; i < G_N_ELEMENTS (data); i++)
     {
       gtk_list_store_append (store, &iter);
       gtk_list_store_set (store, &iter,
-                         COLUMN_FIXED, data[i].fixed,
-                         COLUMN_NUMBER, data[i].number,
-                         COLUMN_SEVERITY, data[i].severity,
-                         COLUMN_DESCRIPTION, data[i].description,
-                         -1);
+                          COLUMN_FIXED, data[i].fixed,
+                          COLUMN_NUMBER, data[i].number,
+                          COLUMN_SEVERITY, data[i].severity,
+                          COLUMN_DESCRIPTION, data[i].description,
+                          COLUMN_PULSE, 0,
+                          COLUMN_ACTIVE, FALSE,
+                          -1);
     }
 
   return GTK_TREE_MODEL (store);
@@ -78,8 +113,8 @@ create_model (void)
 
 static void
 fixed_toggled (GtkCellRendererToggle *cell,
-              gchar                 *path_str,
-              gpointer               data)
+               gchar                 *path_str,
+               gpointer               data)
 {
   GtkTreeModel *model = (GtkTreeModel *)data;
   GtkTreeIter  iter;
@@ -92,10 +127,10 @@ fixed_toggled (GtkCellRendererToggle *cell,
 
   /* do something with the value */
   fixed ^= 1;
-  
+
   /* set new value */
   gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_FIXED, fixed, -1);
-  
+
   /* clean up */
   gtk_tree_path_free (path);
 }
@@ -109,67 +144,96 @@ add_columns (GtkTreeView *treeview)
 
   /* column for fixed toggles */
   renderer = gtk_cell_renderer_toggle_new ();
-  g_signal_connect (G_OBJECT (renderer), "toggled",
-                   G_CALLBACK (fixed_toggled), model);
+  g_signal_connect (renderer, "toggled",
+                    G_CALLBACK (fixed_toggled), model);
 
   column = gtk_tree_view_column_new_with_attributes ("Fixed?",
-                                                    renderer,
-                                                    "active", COLUMN_FIXED,
-                                                    NULL);
+                                                     renderer,
+                                                     "active", COLUMN_FIXED,
+                                                     NULL);
 
   /* set this column to a fixed sizing (of 50 pixels) */
   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
-                                  GTK_TREE_VIEW_COLUMN_FIXED);
+                                   GTK_TREE_VIEW_COLUMN_FIXED);
   gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
-  gtk_tree_view_column_set_clickable (GTK_TREE_VIEW_COLUMN (column), TRUE);
-
   gtk_tree_view_append_column (treeview, column);
 
   /* column for bug numbers */
   renderer = gtk_cell_renderer_text_new ();
   column = gtk_tree_view_column_new_with_attributes ("Bug number",
-                                                    renderer,
-                                                    "text",
-                                                    COLUMN_NUMBER,
-                                                    NULL);
+                                                     renderer,
+                                                     "text",
+                                                     COLUMN_NUMBER,
+                                                     NULL);
+  gtk_tree_view_column_set_sort_column_id (column, COLUMN_NUMBER);
   gtk_tree_view_append_column (treeview, column);
-                               
+
   /* column for severities */
   renderer = gtk_cell_renderer_text_new ();
   column = gtk_tree_view_column_new_with_attributes ("Severity",
-                                                    renderer,
-                                                    "text",
-                                                    COLUMN_SEVERITY,
-                                                    NULL);
+                                                     renderer,
+                                                     "text",
+                                                     COLUMN_SEVERITY,
+                                                     NULL);
+  gtk_tree_view_column_set_sort_column_id (column, COLUMN_SEVERITY);
   gtk_tree_view_append_column (treeview, column);
-                                                    
+
   /* column for description */
   renderer = gtk_cell_renderer_text_new ();
   column = gtk_tree_view_column_new_with_attributes ("Description",
-                                                    renderer,
-                                                    "text",
-                                                    COLUMN_DESCRIPTION,
-                                                    NULL);
+                                                     renderer,
+                                                     "text",
+                                                     COLUMN_DESCRIPTION,
+                                                     NULL);
+  gtk_tree_view_column_set_sort_column_id (column, COLUMN_DESCRIPTION);
+  gtk_tree_view_append_column (treeview, column);
+
+  /* column for spinner */
+  renderer = gtk_cell_renderer_spinner_new ();
+  column = gtk_tree_view_column_new_with_attributes ("Spinning",
+                                                     renderer,
+                                                     "pulse",
+                                                     COLUMN_PULSE,
+                                                     "active",
+                                                     COLUMN_ACTIVE,
+                                                     NULL);
+  gtk_tree_view_column_set_sort_column_id (column, COLUMN_PULSE);
   gtk_tree_view_append_column (treeview, column);
 }
 
+static gboolean
+window_closed (GtkWidget *widget,
+               GdkEvent  *event,
+               gpointer   user_data)
+{
+  model = NULL;
+  window = NULL;
+  if (timeout != 0)
+    {
+      g_source_remove (timeout);
+      timeout = 0;
+    }
+  return FALSE;
+}
+
 GtkWidget *
-do_list_store (void)
+do_list_store (GtkWidget *do_widget)
 {
   if (!window)
     {
       GtkWidget *vbox;
       GtkWidget *label;
       GtkWidget *sw;
-      GtkTreeModel *model;
       GtkWidget *treeview;
 
       /* create window, etc */
       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+      gtk_window_set_screen (GTK_WINDOW (window),
+                             gtk_widget_get_screen (do_widget));
       gtk_window_set_title (GTK_WINDOW (window), "GtkListStore demo");
 
-      g_signal_connect (G_OBJECT (window), "destroy",
-                       G_CALLBACK (gtk_widget_destroyed), &window);
+      g_signal_connect (window, "destroy",
+                        G_CALLBACK (gtk_widget_destroyed), &window);
       gtk_container_set_border_width (GTK_CONTAINER (window), 8);
 
       vbox = gtk_vbox_new (FALSE, 8);
@@ -180,12 +244,12 @@ do_list_store (void)
 
       sw = gtk_scrolled_window_new (NULL, NULL);
       gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
-                                          GTK_SHADOW_ETCHED_IN);
+                                           GTK_SHADOW_ETCHED_IN);
       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
-                                     GTK_POLICY_NEVER,
-                                     GTK_POLICY_AUTOMATIC);
+                                      GTK_POLICY_NEVER,
+                                      GTK_POLICY_AUTOMATIC);
       gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
-      
+
       /* create tree model */
       model = create_model ();
 
@@ -193,25 +257,38 @@ do_list_store (void)
       treeview = gtk_tree_view_new_with_model (model);
       gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
       gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview),
-                                      COLUMN_DESCRIPTION);
+                                       COLUMN_DESCRIPTION);
+
+      g_object_unref (model);
 
-      g_object_unref (G_OBJECT (model));
-      
       gtk_container_add (GTK_CONTAINER (sw), treeview);
-      
+
       /* add columns to the tree view */
       add_columns (GTK_TREE_VIEW (treeview));
 
       /* finish & show */
       gtk_window_set_default_size (GTK_WINDOW (window), 280, 250);
+      g_signal_connect (window, "delete-event",
+                        G_CALLBACK (window_closed), NULL);
     }
 
-  if (!GTK_WIDGET_VISIBLE (window))
-    gtk_widget_show_all (window);
+  if (!gtk_widget_get_visible (window))
+    {
+      gtk_widget_show_all (window);
+      if (timeout == 0) {
+        /* FIXME this should use the animation-duration instead */
+        timeout = g_timeout_add (80, spinner_timeout, NULL);
+      }
+    }
   else
     {
       gtk_widget_destroy (window);
       window = NULL;
+      if (timeout != 0)
+        {
+          g_source_remove (timeout);
+          timeout = 0;
+        }
     }
 
   return window;