home *** CD-ROM | disk | FTP | other *** search
/ Freelog 65 / Freelog065.iso / BAS / Bureautique / Gnumeric / gnumeric-1.3.92-rc1.exe / list_store.c < prev    next >
C/C++ Source or Header  |  2004-10-15  |  7KB  |  223 lines

  1. /* Tree View/List Store
  2.  *
  3.  * The GtkListStore is used to store data in list form, to be used
  4.  * later on by a GtkTreeView to display it. This demo builds a
  5.  * simple GtkListStore and displays it. See the Stock Browser
  6.  * demo for a more advanced example.
  7.  *
  8.  */
  9.  
  10. #include <config.h>
  11. #include <gtk/gtk.h>
  12.  
  13. static GtkWidget *window = NULL;
  14.  
  15. typedef struct
  16. {
  17.   const gboolean  fixed;
  18.   const guint     number;
  19.   const gchar    *severity;
  20.   const gchar    *description;
  21. }
  22. Bug;
  23.  
  24. enum
  25. {
  26.   COLUMN_FIXED,
  27.   COLUMN_NUMBER,
  28.   COLUMN_SEVERITY,
  29.   COLUMN_DESCRIPTION,
  30.   NUM_COLUMNS
  31. };
  32.  
  33. static Bug data[] =
  34. {
  35.   { FALSE, 60482, "Normal",     "scrollable notebooks and hidden tabs" },
  36.   { FALSE, 60620, "Critical",   "gdk_window_clear_area (gdkwindow-win32.c) is not thread-safe" },
  37.   { FALSE, 50214, "Major",      "Xft support does not clean up correctly" },
  38.   { TRUE,  52877, "Major",      "GtkFileSelection needs a refresh method. " },
  39.   { FALSE, 56070, "Normal",     "Can't click button after setting in sensitive" },
  40.   { TRUE,  56355, "Normal",     "GtkLabel - Not all changes propagate correctly" },
  41.   { FALSE, 50055, "Normal",     "Rework width/height computations for TreeView" },
  42.   { FALSE, 58278, "Normal",     "gtk_dialog_set_response_sensitive () doesn't work" },
  43.   { FALSE, 55767, "Normal",     "Getters for all setters" },
  44.   { FALSE, 56925, "Normal",     "Gtkcalender size" },
  45.   { FALSE, 56221, "Normal",     "Selectable label needs right-click copy menu" },
  46.   { TRUE,  50939, "Normal",     "Add shift clicking to GtkTextView" },
  47.   { FALSE, 6112,  "Enhancement","netscape-like collapsable toolbars" },
  48.   { FALSE, 1,     "Normal",     "First bug :=)" },
  49. };
  50.  
  51. static GtkTreeModel *
  52. create_model (void)
  53. {
  54.   gint i = 0;
  55.   GtkListStore *store;
  56.   GtkTreeIter iter;
  57.  
  58.   /* create list store */
  59.   store = gtk_list_store_new (NUM_COLUMNS,
  60.                   G_TYPE_BOOLEAN,
  61.                   G_TYPE_UINT,
  62.                   G_TYPE_STRING,
  63.                   G_TYPE_STRING);
  64.  
  65.   /* add data to the list store */
  66.   for (i = 0; i < G_N_ELEMENTS (data); i++)
  67.     {
  68.       gtk_list_store_append (store, &iter);
  69.       gtk_list_store_set (store, &iter,
  70.               COLUMN_FIXED, data[i].fixed,
  71.               COLUMN_NUMBER, data[i].number,
  72.               COLUMN_SEVERITY, data[i].severity,
  73.               COLUMN_DESCRIPTION, data[i].description,
  74.               -1);
  75.     }
  76.  
  77.   return GTK_TREE_MODEL (store);
  78. }
  79.  
  80. static void
  81. fixed_toggled (GtkCellRendererToggle *cell,
  82.            gchar                 *path_str,
  83.            gpointer               data)
  84. {
  85.   GtkTreeModel *model = (GtkTreeModel *)data;
  86.   GtkTreeIter  iter;
  87.   GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
  88.   gboolean fixed;
  89.  
  90.   /* get toggled iter */
  91.   gtk_tree_model_get_iter (model, &iter, path);
  92.   gtk_tree_model_get (model, &iter, COLUMN_FIXED, &fixed, -1);
  93.  
  94.   /* do something with the value */
  95.   fixed ^= 1;
  96.  
  97.   /* set new value */
  98.   gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_FIXED, fixed, -1);
  99.  
  100.   /* clean up */
  101.   gtk_tree_path_free (path);
  102. }
  103.  
  104. static void
  105. add_columns (GtkTreeView *treeview)
  106. {
  107.   GtkCellRenderer *renderer;
  108.   GtkTreeViewColumn *column;
  109.   GtkTreeModel *model = gtk_tree_view_get_model (treeview);
  110.  
  111.   /* column for fixed toggles */
  112.   renderer = gtk_cell_renderer_toggle_new ();
  113.   g_signal_connect (renderer, "toggled",
  114.             G_CALLBACK (fixed_toggled), model);
  115.  
  116.   column = gtk_tree_view_column_new_with_attributes ("Fixed?",
  117.                              renderer,
  118.                              "active", COLUMN_FIXED,
  119.                              NULL);
  120.  
  121.   /* set this column to a fixed sizing (of 50 pixels) */
  122.   gtk_tree_view_column_set_sizing (GTK_TREE_VIEW_COLUMN (column),
  123.                    GTK_TREE_VIEW_COLUMN_FIXED);
  124.   gtk_tree_view_column_set_fixed_width (GTK_TREE_VIEW_COLUMN (column), 50);
  125.   gtk_tree_view_append_column (treeview, column);
  126.  
  127.   /* column for bug numbers */
  128.   renderer = gtk_cell_renderer_text_new ();
  129.   column = gtk_tree_view_column_new_with_attributes ("Bug number",
  130.                              renderer,
  131.                              "text",
  132.                              COLUMN_NUMBER,
  133.                              NULL);
  134.   gtk_tree_view_column_set_sort_column_id (column, COLUMN_NUMBER);
  135.   gtk_tree_view_append_column (treeview, column);
  136.  
  137.   /* column for severities */
  138.   renderer = gtk_cell_renderer_text_new ();
  139.   column = gtk_tree_view_column_new_with_attributes ("Severity",
  140.                              renderer,
  141.                              "text",
  142.                              COLUMN_SEVERITY,
  143.                              NULL);
  144.   gtk_tree_view_column_set_sort_column_id (column, COLUMN_SEVERITY);
  145.   gtk_tree_view_append_column (treeview, column);
  146.  
  147.   /* column for description */
  148.   renderer = gtk_cell_renderer_text_new ();
  149.   column = gtk_tree_view_column_new_with_attributes ("Description",
  150.                              renderer,
  151.                              "text",
  152.                              COLUMN_DESCRIPTION,
  153.                              NULL);
  154.   gtk_tree_view_column_set_sort_column_id (column, COLUMN_DESCRIPTION);
  155.   gtk_tree_view_append_column (treeview, column);
  156. }
  157.  
  158. GtkWidget *
  159. do_list_store (GtkWidget *do_widget)
  160. {
  161.   if (!window)
  162.     {
  163.       GtkWidget *vbox;
  164.       GtkWidget *label;
  165.       GtkWidget *sw;
  166.       GtkTreeModel *model;
  167.       GtkWidget *treeview;
  168.  
  169.       /* create window, etc */
  170.       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  171.       gtk_window_set_screen (GTK_WINDOW (window),
  172.                  gtk_widget_get_screen (do_widget));
  173.       gtk_window_set_title (GTK_WINDOW (window), "GtkListStore demo");
  174.  
  175.       g_signal_connect (window, "destroy",
  176.             G_CALLBACK (gtk_widget_destroyed), &window);
  177.       gtk_container_set_border_width (GTK_CONTAINER (window), 8);
  178.  
  179.       vbox = gtk_vbox_new (FALSE, 8);
  180.       gtk_container_add (GTK_CONTAINER (window), vbox);
  181.  
  182.       label = gtk_label_new ("This is the bug list (note: not based on real data, it would be nice to have a nice ODBC interface to bugzilla or so, though).");
  183.       gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
  184.  
  185.       sw = gtk_scrolled_window_new (NULL, NULL);
  186.       gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
  187.                        GTK_SHADOW_ETCHED_IN);
  188.       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
  189.                       GTK_POLICY_NEVER,
  190.                       GTK_POLICY_AUTOMATIC);
  191.       gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
  192.  
  193.       /* create tree model */
  194.       model = create_model ();
  195.  
  196.       /* create tree view */
  197.       treeview = gtk_tree_view_new_with_model (model);
  198.       gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
  199.       gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview),
  200.                        COLUMN_DESCRIPTION);
  201.  
  202.       g_object_unref (model);
  203.  
  204.       gtk_container_add (GTK_CONTAINER (sw), treeview);
  205.  
  206.       /* add columns to the tree view */
  207.       add_columns (GTK_TREE_VIEW (treeview));
  208.  
  209.       /* finish & show */
  210.       gtk_window_set_default_size (GTK_WINDOW (window), 280, 250);
  211.     }
  212.  
  213.   if (!GTK_WIDGET_VISIBLE (window))
  214.     gtk_widget_show_all (window);
  215.   else
  216.     {
  217.       gtk_widget_destroy (window);
  218.       window = NULL;
  219.     }
  220.  
  221.   return window;
  222. }
  223.