pan-devel
[Top][All Lists]
Advanced

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

Re: [Pan-devel] Server list patch


From: Jacob Ilsø Christensen
Subject: Re: [Pan-devel] Server list patch
Date: 19 Sep 2002 21:19:38 +0200

And to make things look a bit more right, this line:

gtk_container_add (GTK_CONTAINER(w), d->server_tree_view);

should be replaced by this line:

gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW(w),
d->server_tree_view);

/Jacob


On Thu, 2002-09-19 at 19:36, Jacob Ilsø Christensen wrote:
> Hi.
> 
> Attached is a patch against current cvs which changes use of GtkCList
> (deprecated) to GtkTreeView in the server list (this is to warm up for
> the article list conversion ;) ).
> Comments are most welcome (especially since I don't know what
> coding/design guidelines are used in Pan).
> 
> /Jacob
> 
> 
> ----
> 

> Index: pan/server-ui.c
> ===================================================================
> RCS file: /cvs/gnome/pan/pan/server-ui.c,v
> retrieving revision 1.27
> diff -u -r1.27 server-ui.c
> --- pan/server-ui.c   2002/09/17 17:36:22     1.27
> +++ pan/server-ui.c   2002/09/19 17:20:32
> @@ -77,11 +77,18 @@
>  }
>  ServerEditDialog;
>  
> +enum
> +{
> +     SERVER_NAME_COLUMN,
> +     SERVER_DATA_COLUMN,
> +     N_COLUMNS
> +};
> +
>  typedef struct
>  {
> -     GtkWidget * server_clist;
> +     GtkWidget * server_tree_view;
>       GtkWidget * dialog;
> -
> +     GtkListStore * servers_store;
>       GtkWidget * remove_button;
>       GtkWidget * edit_button;
>  }
> @@ -472,31 +479,16 @@
>  *************  LIST DIALOG
>  ************/
>  
> -static int
> -get_selected_index (ServerListDialog * d)
> -{
> -     int sel;
> -     GtkCList * clist;
> -
> -     /* find the selected server */
> -     pan_lock ();
> -     clist = GTK_CLIST(d->server_clist);
> -     sel = -1;
> -     if (clist->selection != NULL)
> -             sel = GPOINTER_TO_INT(clist->selection->data);
> -     pan_unlock ();
> -
> -     return sel;
> -}
> -
>  static Server*
>  get_selected_server (ServerListDialog * d)
>  {
> -     Server * retval = NULL;
> +     Server * retval = NULL; 
> +     GtkTreeSelection * selection = 
> gtk_tree_view_get_selection(GTK_TREE_VIEW (d->server_tree_view));
> +     GtkTreeIter iter;
> +        GtkTreeModel *model;
>  
> -     const int index = get_selected_index (d);
> -     if (index != -1)
> -             retval = (Server*) gtk_clist_get_row_data 
> (GTK_CLIST(d->server_clist), index);
> +        if (gtk_tree_selection_get_selected (selection, &model, &iter))
> +                gtk_tree_model_get (model, &iter, SERVER_DATA_COLUMN, 
> &retval, -1);
>  
>       return retval;
>  }
> @@ -504,8 +496,7 @@
>  static void
>  button_refresh (ServerListDialog * d)
>  {
> -     const int sel = get_selected_index (d);
> -     const gboolean have_sel = sel != -1;
> +     const gboolean have_sel = (get_selected_server (d) != NULL);
>  
>       pan_lock ();
>       gtk_widget_set_sensitive (d->edit_button, have_sel);
> @@ -540,29 +531,40 @@
>  }
>  
>  static void
> -clist_refresh (ServerListDialog * d)
> +server_tree_view_refresh (ServerListDialog * d)
>  {
> -     int i;
> -     int select_row = -1;
> +
> +     GtkTreeSelection * selection = 
> gtk_tree_view_get_selection(GTK_TREE_VIEW (d->server_tree_view));
> +     gboolean found_selected = FALSE;
> +     GtkTreeIter selected_iter;
>       Server * selected_server = get_selected_server (d);
> -     GtkCList * clist = GTK_CLIST(d->server_clist);
>       GPtrArray * a = get_public_server_array ();
> +     int i;
>  
> -     pan_lock ();
> -     gtk_clist_freeze (clist);
> -     gtk_clist_clear (clist);
> +     pan_lock ();    
> +     gtk_list_store_clear (d->servers_store);
> +                     
>       for (i=0; i<a->len; ++i)
>       {
>               int row;
> +             GtkTreeIter iter;
>               Server * server = SERVER (g_ptr_array_index (a, i));
> -             row = gtk_clist_insert (clist, -1, &server->name);
> -             gtk_clist_set_row_data (clist, row, server);
> -             if (server == selected_server)
> -                     select_row = i;
> +
> +             gtk_list_store_append (d->servers_store, &iter);
> +             gtk_list_store_set (d->servers_store, &iter,
> +                                 SERVER_NAME_COLUMN, server->name,
> +                                 SERVER_DATA_COLUMN, server,
> +                                 -1);
> +             
> +             if (server == selected_server) {
> +                     found_selected = TRUE;
> +                     selected_iter = iter;
> +             }
>       }
> -     if (select_row != -1)
> -             gtk_clist_select_row (clist, select_row, 0);
> -     gtk_clist_thaw (clist);
> +
> +     if (found_selected)
> +             gtk_tree_selection_select_iter (selection, &selected_iter);
> +
>       pan_unlock ();
>  
>       g_ptr_array_free (a, TRUE);
> @@ -582,7 +584,6 @@
>  server_list_dialog_destroy_cb (GtkWidget * w, gpointer user_data)
>  {
>       g_free (user_data);
> -
>       server_menu_update ();
>  }
>  
> @@ -596,10 +597,10 @@
>  {
>       ServerListDialog * d = (ServerListDialog*) data;
>       Server * selected_server = get_selected_server (d);
> -     if (selected_server != NULL)
> -     {
> +
> +     if (selected_server != NULL) {
>               serverlist_remove_server (selected_server);
> -             clist_refresh (d);
> +             server_tree_view_refresh (d);
>               button_refresh (d);
>       }
>  }
> @@ -608,7 +609,7 @@
>  server_edit_dialog_destroy_cb (GtkWidget * w, gpointer user_data)
>  {
>       ServerListDialog * d = (ServerListDialog*) user_data;
> -     clist_refresh (d);
> +     server_tree_view_refresh (d);
>  }
>  
>  static void
> @@ -629,27 +630,23 @@
>  {
>       ServerListDialog * d = (ServerListDialog*) user_data;
>       Server * selected_server = get_selected_server (d);
> -     if (selected_server != NULL)
> -     {
> +     if (selected_server != NULL) {
>               GtkWidget * dialog = server_edit_dialog (d->dialog, 
> selected_server);
>               g_signal_connect (GTK_OBJECT(dialog), "destroy", 
> G_CALLBACK(server_edit_dialog_destroy_cb), d);
>               gtk_widget_show_all (dialog);
>       }
>  }
> +
>  static gboolean
> -server_clist_button_press_cb (GtkWidget * w, GdkEventButton * b, gpointer 
> data)
> +server_tree_view_button_press_cb (GtkWidget * w, GdkEventButton * b, 
> gpointer data)
>  {
>       if (b->button==1 && b->type==GDK_2BUTTON_PRESS)
>               edit_button_clicked_cb (NULL, data);
>       return FALSE;
>  }
>  
> -static void     
> -list_selection_changed_cb (GtkCList          * clist,
> -                           int                 row,
> -                           int                 column,
> -                           GdkEventButton    * event,
> -                           gpointer            user_data)
> +static void
> +server_tree_view_selection_changed_cb (GtkTreeSelection * selection, 
> gpointer user_data)
>  {
>       button_refresh ((ServerListDialog*)user_data);
>  }
> @@ -664,9 +661,11 @@
>       GtkWidget * w;
>       GtkWidget * hbox;
>       GtkWidget * bbox;
> +     GtkTreeViewColumn *column;
> +     GtkTreeSelection * selection;
> +     GtkCellRenderer * renderer;
>       GtkTooltips * tips = gtk_tooltips_new ();
>       ServerListDialog * d = g_new0 (ServerListDialog, 1);
> -     char * titles [1];
>  
>       /* dialog */
>       w = d->dialog = gtk_dialog_new_with_buttons (_("Pan: Servers"),
> @@ -682,22 +681,38 @@
>       hbox = gtk_hbox_new (FALSE, GUI_PAD);
>       gtk_container_set_border_width (GTK_CONTAINER(hbox), 12);
>       gtk_box_pack_start (GTK_BOX(GTK_DIALOG(w)->vbox), hbox, TRUE, TRUE, 0);
> +
>  
> -     /* clist */
> -     titles[0] = _("Servers");
> -     w = d->server_clist= gtk_clist_new_with_titles (1, titles);
> -     gtk_clist_set_selection_mode (GTK_CLIST(w), GTK_SELECTION_BROWSE);
> +     /* Create the list_store */
> +     d->servers_store = gtk_list_store_new (N_COLUMNS,
> +                                         G_TYPE_STRING,
> +                                         G_TYPE_POINTER);
> +     
> +     /* Create the tree_view */
> +     w = d->server_tree_view = gtk_tree_view_new_with_model (GTK_TREE_MODEL 
> (d->servers_store));
> +
> +     /* Add the column to the view */
> +     renderer = gtk_cell_renderer_text_new ();
> +     column = gtk_tree_view_column_new_with_attributes (_("Servers"), 
> renderer,
> +                                                        "text", 
> SERVER_NAME_COLUMN,
> +                                                        NULL);
> +     gtk_tree_view_append_column (GTK_TREE_VIEW (d->server_tree_view), 
> column);
> +
> +     /* Set the selection mode */
> +     selection = gtk_tree_view_get_selection (GTK_TREE_VIEW 
> (d->server_tree_view));
> +     gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
> +     
> +     /* Add callbacks */
>       g_signal_connect (w, "button_press_event",
> -                       G_CALLBACK(server_clist_button_press_cb), d);
> -     g_signal_connect (w, "select_row",
> -                       G_CALLBACK(list_selection_changed_cb), d);
> -     g_signal_connect (w, "unselect_row",
> -                       G_CALLBACK(list_selection_changed_cb), d);
> +                       G_CALLBACK(server_tree_view_button_press_cb), d);
> +     g_signal_connect (G_OBJECT (selection), "changed",
> +                       G_CALLBACK (server_tree_view_selection_changed_cb),
> +                       d);
>  
>  
>          w = gtk_scrolled_window_new (NULL, NULL);
>       gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(w), 
> GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
> -     gtk_container_add (GTK_CONTAINER(w), d->server_clist);
> +     gtk_container_add (GTK_CONTAINER(w), d->server_tree_view);
>       gtk_box_pack_start (GTK_BOX (hbox), w, TRUE, TRUE, 0);
>       gtk_widget_set_usize (w, 300, 300);
>  
> @@ -725,7 +740,7 @@
>       g_signal_connect (w, "clicked", G_CALLBACK(remove_button_clicked_cb), 
> d);
>       d->remove_button = w;
>  
> -     clist_refresh (d);
> +     server_tree_view_refresh (d);
>       button_refresh (d);
>       return d->dialog;
>  }






reply via email to

[Prev in Thread] Current Thread [Next in Thread]