]> Pileus Git - ~andy/gtk/blobdiff - demos/gtk-demo/stock_browser.c
Deprecate widget flag: GTK_WIDGET_VISIBLE
[~andy/gtk] / demos / gtk-demo / stock_browser.c
index 945d3ef3351cf8fc21654155d68ac806356810ba..73a000304c15d9d444dfeda55dd23ee77c31902c 100644 (file)
@@ -1,4 +1,4 @@
-/* Stock Item/Icon Browser
+/* Stock Item and Icon Browser
  *
  * This source code for this demo doesn't demonstrate anything
  * particularly useful in applications. The purpose of the "demo" is
@@ -34,7 +34,7 @@ stock_item_info_free (StockItemInfo *info)
   g_free (info->macro);
   g_free (info->accel_str);
   if (info->small_icon)
-    g_object_unref (G_OBJECT (info->small_icon));
+    g_object_unref (info->small_icon);
   
   g_free (info);
 }
@@ -53,7 +53,7 @@ stock_item_info_copy (StockItemInfo *src)
 
   info->small_icon = src->small_icon;
   if (info->small_icon)
-    g_object_ref (G_OBJECT (info->small_icon));
+    g_object_ref (info->small_icon);
 
   return info;
 }
@@ -65,10 +65,8 @@ stock_item_info_get_type (void)
   
   if (our_type == 0)
     our_type = g_boxed_type_register_static ("StockItemInfo",
-                                            NULL,
                                              (GBoxedCopyFunc) stock_item_info_copy,
-                                             (GBoxedFreeFunc) stock_item_info_free,
-                                            FALSE);
+                                             (GBoxedFreeFunc) stock_item_info_free);
 
   return our_type;
 }
@@ -83,47 +81,36 @@ struct _StockItemDisplay
   GtkWidget *icon_image;
 };
 
-/* columns in the tree model */
-enum {
-  COLUMN_ICON_MACRO,
-  COLUMN_LABEL,
-  COLUMN_ACCEL,
-  COLUMN_ID
-};
-
 static gchar*
 id_to_macro (const gchar *id)
 {
-  GString *macro;
+  GString *macro = NULL;
   const gchar *cp;
-  gchar *p;
-
-  /* gtk-foo -> GTK_STOCK_FOO */
-  
-  cp = id;
-  while (*cp && *cp != '-')
-    ++cp;
 
-  if (*cp == '\0')
-    return g_strdup ("??UNKNOWN??");
+  /* gtk-foo-bar -> GTK_STOCK_FOO_BAR */
 
   macro = g_string_new (NULL);
   
-  g_string_append_len (macro, id, cp - id);
+  cp = id;
   
-  g_string_append (macro, "_STOCK");
-  g_string_append (macro, cp);
+  if (strncmp (cp, "gtk-", 4) == 0)
+    {
+      g_string_append (macro, "GTK_STOCK_");
+      cp += 4;
+    }
 
-  p = macro->str;
-  while (*p)
+  while (*cp)
     {
-      if (*p == '-')
-        *p = '_';
-      ++p;
+      if (*cp == '-')
+       g_string_append_c (macro, '_');
+      else if (g_ascii_islower (*cp))
+       g_string_append_c (macro, g_ascii_toupper (*cp));
+      else
+       g_string_append_c (macro, *cp);
+
+      cp++;
     }
 
-  g_ascii_strup (macro->str);
-  
   return g_string_free (macro, FALSE);
 }
 
@@ -134,7 +121,7 @@ create_model (void)
   GSList *ids;
   GSList *tmp_list;
   
-  store = gtk_list_store_new (1, STOCK_ITEM_INFO_TYPE);
+  store = gtk_list_store_new (2, STOCK_ITEM_INFO_TYPE, G_TYPE_STRING);
 
   ids = gtk_stock_list_ids ();
   ids = g_slist_sort (ids, (GCompareFunc) strcmp);
@@ -203,7 +190,7 @@ create_model (void)
                                                 w, h,
                                                 GDK_INTERP_BILINEAR);
 
-              g_object_unref (G_OBJECT (info.small_icon));
+              g_object_unref (info.small_icon);
               info.small_icon = scaled;
             }
         }
@@ -223,12 +210,12 @@ create_model (void)
       info.macro = id_to_macro (info.id);
       
       gtk_list_store_append (store, &iter);
-      gtk_list_store_set (store, &iter, 0, &info, -1);
+      gtk_list_store_set (store, &iter, 0, &info, 1, info.id, -1);
 
       g_free (info.macro);
       g_free (info.accel_str);
       if (info.small_icon)
-        g_object_unref (G_OBJECT (info.small_icon));
+        g_object_unref (info.small_icon);
       
       tmp_list = g_slist_next (tmp_list);
     }
@@ -239,6 +226,38 @@ create_model (void)
   return GTK_TREE_MODEL (store);
 }
 
+/* Finds the largest size at which the given image stock id is
+ * available. This would not be useful for a normal application
+ */
+static GtkIconSize
+get_largest_size (const char *id)
+{
+  GtkIconSet *set = gtk_icon_factory_lookup_default (id);
+  GtkIconSize *sizes;
+  gint n_sizes, i;
+  GtkIconSize best_size = GTK_ICON_SIZE_INVALID;
+  gint best_pixels = 0;
+
+  gtk_icon_set_get_sizes (set, &sizes, &n_sizes);
+
+  for (i = 0; i < n_sizes; i++)
+    {
+      gint width, height;
+      
+      gtk_icon_size_lookup (sizes[i], &width, &height);
+
+      if (width * height > best_pixels)
+       {
+         best_size = sizes[i];
+         best_pixels = width * height;
+       }
+    }
+  
+  g_free (sizes);
+
+  return best_size;
+}
+
 static void
 selection_changed (GtkTreeSelection *selection)
 {
@@ -282,12 +301,9 @@ selection_changed (GtkTreeSelection *selection)
           gtk_label_set_text (GTK_LABEL (display->label_accel_label), "");
         }
 
-      /* The problem here is that some icons don't have SIZE_LARGE_TOOLBAR,
-       * so we get a "missing image" icon...
-       */
       if (info->small_icon)
         gtk_image_set_from_stock (GTK_IMAGE (display->icon_image), info->id,
-                                  GTK_ICON_SIZE_LARGE_TOOLBAR);
+                                  get_largest_size (info->id));
       else
         gtk_image_set_from_pixbuf (GTK_IMAGE (display->icon_image), NULL);
 
@@ -304,11 +320,11 @@ selection_changed (GtkTreeSelection *selection)
 }
 
 static void
-macro_set_func (GtkTreeViewColumn *tree_column,
-                GtkCellRenderer   *cell,
-                GtkTreeModel      *model,
-                GtkTreeIter       *iter,
-                gpointer           data)
+macro_set_func_text (GtkTreeViewColumn *tree_column,
+                    GtkCellRenderer   *cell,
+                    GtkTreeModel      *model,
+                    GtkTreeIter       *iter,
+                    gpointer           data)
 {
   StockItemInfo *info;
   
@@ -318,7 +334,6 @@ macro_set_func (GtkTreeViewColumn *tree_column,
   
   g_object_set (GTK_CELL_RENDERER (cell),
                 "text", info->macro,
-                "pixbuf", info->small_icon,
                 NULL);
   
   stock_item_info_free (info);
@@ -385,7 +400,7 @@ label_set_func (GtkTreeViewColumn *tree_column,
 }
 
 GtkWidget *
-do_stock_browser (void)
+do_stock_browser (GtkWidget *do_widget)
 {  
   if (!window)
     {
@@ -399,11 +414,15 @@ do_stock_browser (void)
       GtkCellRenderer *cell_renderer;
       StockItemDisplay *display;
       GtkTreeSelection *selection;
-      
+      GtkTreeViewColumn *column;
+
       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), "Stock Icons and Items");
+      gtk_window_set_default_size (GTK_WINDOW (window), -1, 500);
 
-      gtk_signal_connect (GTK_OBJECT (window), "destroy", GTK_SIGNAL_FUNC (gtk_widget_destroyed), &window);
+      g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
       gtk_container_set_border_width (GTK_CONTAINER (window), 8);
 
       hbox = gtk_hbox_new (FALSE, 8);
@@ -419,21 +438,30 @@ do_stock_browser (void)
       
       treeview = gtk_tree_view_new_with_model (model);
 
-      g_object_unref (G_OBJECT (model));
+      g_object_unref (model);
 
       gtk_container_add (GTK_CONTAINER (sw), treeview);
       
-      cell_renderer = gtk_cell_renderer_text_pixbuf_new ();
-
-      gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
-                                                  -1,
-                                                  "Macro",
-                                                  cell_renderer,
-                                                  macro_set_func,
-                                                  NULL,
-                                                  NULL);
+      column = gtk_tree_view_column_new ();
+      gtk_tree_view_column_set_title (column, "Macro");
+
+      cell_renderer = gtk_cell_renderer_pixbuf_new ();
+      gtk_tree_view_column_pack_start (column,
+                                      cell_renderer,
+                                      FALSE);
+      gtk_tree_view_column_set_attributes (column, cell_renderer,
+                                          "stock_id", 1, NULL);
       cell_renderer = gtk_cell_renderer_text_new ();
+      gtk_tree_view_column_pack_start (column,
+                                      cell_renderer,
+                                      TRUE);
+      gtk_tree_view_column_set_cell_data_func (column, cell_renderer,
+                                              macro_set_func_text, NULL, NULL);
 
+      gtk_tree_view_append_column (GTK_TREE_VIEW (treeview),
+                                  column);
+
+      cell_renderer = gtk_cell_renderer_text_new ();
       gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
                                                   -1,
                                                   "Label",
@@ -442,6 +470,7 @@ do_stock_browser (void)
                                                   NULL,
                                                   NULL);
 
+      cell_renderer = gtk_cell_renderer_text_new ();
       gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
                                                   -1,
                                                   "Accel",
@@ -450,6 +479,7 @@ do_stock_browser (void)
                                                   NULL,
                                                   NULL);
 
+      cell_renderer = gtk_cell_renderer_text_new ();
       gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (treeview),
                                                   -1,
                                                   "ID",
@@ -496,13 +526,13 @@ do_stock_browser (void)
       selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
       gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
       
-      g_signal_connect (G_OBJECT (selection),
+      g_signal_connect (selection,
                        "changed",
                        G_CALLBACK (selection_changed),
                        NULL);
     }
 
-  if (!GTK_WIDGET_VISIBLE (window))
+  if (!gtk_widget_get_visible (window))
     {
       gtk_widget_show_all (window);
     }