#include static GtkWidget *window = NULL; GtkWidget *button; GtkWidget *treeview; typedef struct { const gchar *severity; const gchar *description; } Bug; enum { COLUMN_SEVERITY, COLUMN_DESCRIPTION, NUM_COLUMNS }; static Bug data[] = { { "Normal", "scrollable notebooks and hidden tabs" }, { "Critical", "gdk_window_clear_area (gdkwindow-win32.c) is not thread-safe" }, { "Major", "Xft support does not clean up correctly" }, { "Major", "GtkFileSelection needs a refresh method. " }, { "Normal", "Can't click button after setting in sensitive" }, { "Normal", "GtkLabel - Not all changes propagate correctly" }, { "Normal", "Rework width/height computations for TreeView" }, { "Normal", "gtk_dialog_set_response_sensitive () doesn't work" }, { "Normal", "Getters for all setters" }, { "Normal", "Gtkcalender size" }, { "Normal", "Selectable label needs right-click copy menu" }, { "Normal", "Add shift clicking to GtkTextView" }, { "Enhancement","netscape-like collapsable toolbars" }, { "Normal", "First bug :=)" }, }; gint selected_num; static void delete_select_list(GtkTreeModel *model,GtkTreePath *path, GtkTreeIter *iter, gpointer data){ gtk_list_store_remove (GTK_LIST_STORE(model), iter); } void button_cb (GtkButton *button, gpointer user_data){ GtkTreeSelection *selection; g_print("BUTTON\n"); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); gtk_tree_selection_selected_foreach (selection, delete_select_list, data); } static void count_select_list(GtkTreeModel *model,GtkTreePath *path, GtkTreeIter *iter, gpointer data){ selected_num++; } static void changed_cb (GtkTreeSelection *selection, gpointer data){ selected_num = 0; gtk_tree_selection_selected_foreach (selection, count_select_list, data); g_print("SELECTED %d ITEMS\n", selected_num); if (selected_num > 1) gtk_widget_set_sensitive(button, TRUE ); else gtk_widget_set_sensitive(button, FALSE ); } static GtkTreeModel * create_model (void) { gint i = 0; GtkListStore *store; GtkTreeIter iter; /* create list store */ store = gtk_list_store_new (NUM_COLUMNS, G_TYPE_STRING, G_TYPE_STRING); /* 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_SEVERITY, data[i].severity, COLUMN_DESCRIPTION, data[i].description, -1); } return GTK_TREE_MODEL (store); } static void add_columns (GtkTreeView *treeview) { GtkCellRenderer *renderer; GtkTreeViewColumn *column; GtkTreeModel *model = gtk_tree_view_get_model (treeview); /* column for severities */ renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes ("Severity", renderer, "text", COLUMN_SEVERITY, NULL); 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); gtk_tree_view_append_column (treeview, column); } GtkWidget * do_list_store (void) { if (!window) { GtkWidget *vbox; GtkWidget *sw; GtkTreeModel *model; GtkTreeSelection *select; /* create window, etc */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "GtkListStore demo"); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_widget_destroyed), &window); gtk_container_set_border_width (GTK_CONTAINER (window), 8); vbox = gtk_vbox_new (FALSE, 8); gtk_container_add (GTK_CONTAINER (window), vbox); /* button*/ button = gtk_button_new_with_label("delete"); g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(button_cb),NULL); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); sw = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_ETCHED_IN); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0); /* create tree model */ model = create_model (); /* create tree view */ treeview = gtk_tree_view_new_with_model (model); gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE); select = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); gtk_tree_selection_set_mode (GTK_TREE_SELECTION (select), GTK_SELECTION_MULTIPLE); g_signal_connect (G_OBJECT (select), "changed", G_CALLBACK (changed_cb),NULL); 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); } if (!GTK_WIDGET_VISIBLE (window)) gtk_widget_show_all (window); else { gtk_widget_destroy (window); window = NULL; } return window; } int main(int argc,char *argv[]) { gtk_init (&argc, &argv); do_list_store(); gtk_main (); return (0); }