Re: Proper way to show unique icon in treeview <-- FIXED :-)



Hello,

I need help understanding how one would create a treeview so that the
first column is an icon and the second column is text.  The icon and
text represent the type of machine the user can choose (linux
workstation, linux server, hp).  I want to have a different icon for
each machine; however, I notice that whatever icon is called last in the
code that I have written, is the icon that is shown for ALL the rows.  

Please help!  What am I doing wrong?

I forgot to attach the code!

Here it is:


void build_server_list (GtkWidget *treeview)
{
      GtkListStore *liststore;
      GtkTreeIter iter;
      GtkCellRenderer *text_renderer;
      GtkCellRenderer *icon_renderer;
      gint i = 0;
      gint count = 0;
      

      icon_renderer = gtk_cell_renderer_pixbuf_new();
      gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW(treeview),
                                               0,      
                                               " ",  
                                               icon_renderer,
                                               NULL);
      
      text_renderer = gtk_cell_renderer_text_new();
      gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW(treeview),
                                               1,      
                                               " ",  
                                               text_renderer,
                                               NULL);
      
      liststore = gtk_list_store_new(2, GDK_TYPE_PIXBUF, G_TYPE_STRING);
      
      /* workstations */
      count = g_strv_length(workstations);
      g_object_set(icon_renderer, "stock-id", "gtk-close", NULL);
      for (i=0; i<count; i++) {
              gtk_list_store_append(liststore, &iter);
              gtk_list_store_set(liststore, &iter,
                      0, icon_renderer,
                      1, workstations[i], -1);
      }
      
      /* linux servers */
      count = g_strv_length(servers_linux);
      g_object_set(icon_renderer, "stock-id", "gtk-save", NULL);
      for (i=0; i<count; i++) {
              gtk_list_store_append(liststore, &iter);
              gtk_list_store_set(liststore, &iter,
                      0, icon_renderer,
                      1, servers_linux[i], -1);
      }
      
      
      /* hp servers */
      count = g_strv_length(servers_hp);
      g_object_set(icon_renderer, "stock-id", "gtk-open", NULL);
      for (i=0; i<count; i++) {
              gtk_list_store_append(liststore, &iter);
              gtk_list_store_set(liststore, &iter,
                      0, icon_renderer,
                      1, servers_hp[i], -1);
      }
      
      gtk_tree_view_set_model(GTK_TREE_VIEW(treeview),
GTK_TREE_MODEL(liststore));
}


Thanks to all who replied with comments.  

Here is the working function:

void build_server_list (GtkWidget *treeview)
{
        GtkListStore *liststore;
        GtkTreeIter iter;
        GtkCellRenderer *text_renderer = gtk_cell_renderer_text_new();
        GtkCellRenderer *pixbuf_renderer = gtk_cell_renderer_pixbuf_new();
        GdkPixbuf *ws_pixbuf, *sv_pixbuf, *hp_pixbuf;
        GtkTreeViewColumn *pixbuf_column, *text_column;
        gint i = 0;
        gint count = 0;
        
        
        /* CREATE THE LISTSTORE MODEL */
        
        liststore = gtk_list_store_new(2, GDK_TYPE_PIXBUF, G_TYPE_STRING);
        
        
        /* ATTACHED THE LISTSTORE MODEL TO THE TREEVIEW */
        
        gtk_tree_view_set_model(GTK_TREE_VIEW(treeview),
GTK_TREE_MODEL(liststore));
        
        
        /* DESCRIBE EACH COLUMN */
        
        pixbuf_column = gtk_tree_view_column_new_with_attributes (
                                                "Icon", 
                                                pixbuf_renderer,
                                                "pixbuf", 0,
                                                NULL);
        gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), pixbuf_column);
        
        text_column = gtk_tree_view_column_new_with_attributes (
                                                "Machine", 
                                                text_renderer,
                                                "text", 1,
                                                NULL);
        
        gtk_tree_view_append_column (GTK_TREE_VIEW(treeview), text_column);
        
        
        /* GET SOME STOCK ICONS */
        /* getting a 'pixbuf' icon is the key here */
        
        ws_pixbuf = gtk_widget_render_icon(treeview, GTK_STOCK_ABOUT,
GTK_ICON_SIZE_SMALL_TOOLBAR, NULL);
        sv_pixbuf = gtk_widget_render_icon(treeview, GTK_STOCK_HARDDISK,
GTK_ICON_SIZE_SMALL_TOOLBAR, NULL);
        hp_pixbuf = gtk_widget_render_icon(treeview, GTK_STOCK_NETWORK,
GTK_ICON_SIZE_SMALL_TOOLBAR, NULL);
        
        
        /* FILL LISTSTORE MODEL WITH DATA */
        
        /* workstations */
        count = g_strv_length(workstations);
        for (i=0; i<count; i++) {
                gtk_list_store_append(liststore, &iter);
                gtk_list_store_set(liststore, &iter,
                        0, ws_pixbuf,
                        1, workstations[i], 
                        -1);
        }
        
        /* linux servers */
        count = g_strv_length(servers_linux);
        for (i=0; i<count; i++) {
                gtk_list_store_append(liststore, &iter);
                gtk_list_store_set(liststore, &iter,
                        0, sv_pixbuf,
                        1, servers_linux[i], 
                        -1);
        }
        
        /* hp servers */
        count = g_strv_length(servers_hp);
        for (i=0; i<count; i++) {
                gtk_list_store_append(liststore, &iter);
                gtk_list_store_set(liststore, &iter,
                        0, hp_pixbuf,
                        1, servers_hp[i], 
                        -1);
        }

}





[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]