[Buoh-dev] menús

Carlos Garcia Campos carlosgc at gnome.org
Mon Sep 12 11:50:08 MDT 2005


El lun, 12-09-2005 a las 19:17 +0200, Pablo Arroyo escribió:
> Bueno, os mando el parche para que el menu Comic y el popup esten
> consistentes.

Comento abajo

> saludos
> 

> Index: src/buoh-properties-dialog.c
> ===================================================================
> RCS file: /cvsroot/buoh/buoh/src/buoh-properties-dialog.c,v
> retrieving revision 1.4
> diff -u -r1.4 buoh-properties-dialog.c
> --- src/buoh-properties-dialog.c        10 Sep 2005 10:33:24
> -0000      1.4
> +++ src/buoh-properties-dialog.c        12 Sep 2005 16:24:41 -0000
> @@ -115,7 +115,7 @@
>         gtk_misc_set_alignment (GTK_MISC (label_author), 0, 0.5);
>  
>         label_uri = gtk_label_new (NULL);       
> -       gtk_label_set_markup (GTK_LABEL (label_uri), "<b>Link:</b>");
> +       gtk_label_set_markup (GTK_LABEL (label_uri),
> "<b>Location:</b>");
>         gtk_misc_set_alignment (GTK_MISC (label_uri), 0, 0.5);
>  
>         label_language = gtk_label_new (NULL);  
> Index: src/buoh-window.c
> ===================================================================
> RCS file: /cvsroot/buoh/buoh/src/buoh-window.c,v
> retrieving revision 1.12
> diff -u -r1.12 buoh-window.c
> --- src/buoh-window.c   11 Sep 2005 11:20:02 -0000      1.12
> +++ src/buoh-window.c   12 Sep 2005 16:24:41 -0000
> @@ -57,11 +57,21 @@
>  static void buoh_window_class_init                  (BuohWindowClass
> *klass);
>  static void buoh_window_finalize                    (GObject
> *object);
>  
> +static void buoh_window_comic_add                   (gpointer gdata);
> +static void buoh_window_comic_delete                (gpointer gdata);
> +static void buoh_window_comic_copy                  (gpointer gdata);
> +static void buoh_window_comic_save                  (gpointer gdata);
> +static void buoh_window_comic_properties            (gpointer gdata);
> +

Estas funciones no deberían tener este prototipo y me explico. Estamos
programando POO, y puesto que estamos en un lenguaje no OO no podemos
hacer cosas como objeto.metodo () Pero su equivalente es metodo
(objeto, .........); 
Lo que quiero decir es que estas funciones en POO son métodos de la
clase BuohWindow, por lo que su prototipo debería ser metodo (BuohWindow
*window, loquesea); que sería el equivalente a window.metodo (loquesea);
Incluso aunque no vayas ausar para nada el puntero this o self (es decir
el primer parámetro) es conveniente ponerlo siempre de forma que quede
claro que se trata de métodos de clase. 

En cualquier caso creo que estas funciones no son necesarias. Gracias a
que el prototipo e los callbacks del popup y del menu son parecidos se
puede utilizar el mismo callback. Gracias a que ambos heredan de
GtkWidget puedes usar un callback en la forma

void function_cb (GtkWidget *widget, gpointer gdata);

tanto para el menu como para el popup y usar exactamente el mismo
callback, de forma que todo el código vaya en los callbacks directamente
sin necesidad de funciones auxiliares.

>  /* Callbacks */
>  static void buoh_window_menu_quit_cb                    (GtkMenuItem
> *menuitem,
>                                                          gpointer
> gdata);
>  static void buoh_window_menu_add_cb                     (GtkMenuItem
> *menuitem,
>                                                          gpointer
> gdata);
> +static void buoh_window_menu_delete_cb                  (GtkMenuItem
> *menuitem,
> +                                                        gpointer
> gdata);
> +static void buoh_window_menu_copy_cb                    (GtkMenuItem
> *menuitem,
> +                                                        gpointer
> gdata);
>  static void buoh_window_menu_save_cb                    (GtkMenuItem
> *menuitem,
>                                                          gpointer
> gdata);
>  static void buoh_window_menu_properties_cb              (GtkMenuItem
> *menuitem,
> @@ -96,7 +106,11 @@
>                                                          gpointer
> gdata);
>  static void     buoh_window_popup_delete_cb             (GtkWidget
> *widget,
>                                                          gpointer
> gdata);
> -static void     buoh_window_popup_copy_uri_cb           (GtkWidget
> *widget,
> +static void     buoh_window_popup_add_cb                (GtkWidget
> *widget,
> +                                                        gpointer
> gdata);
> +static void     buoh_window_popup_save_cb               (GtkWidget
> *widget,
> +                                                        gpointer
> gdata);
> +static void     buoh_window_popup_copy_cb               (GtkWidget
> *widget,
>                                                          gpointer
> gdata);
>  
>  /* Sensitivity */
> @@ -120,21 +134,27 @@
>  
>  /* popup menu values */
>  static GtkActionEntry popup_menu_items [] = {
> -       { "Properties",  GTK_STOCK_PROPERTIES, N_("_Properties"),
> -         NULL, NULL, G_CALLBACK (buoh_window_popup_properties_cb) },
> -       { "CopyURI",     GTK_STOCK_COPY,       N_("_Copy comic URI"),
> -         NULL, NULL, G_CALLBACK (buoh_window_popup_copy_uri_cb) },
> +       { "Add",      GTK_STOCK_ADD,     N_("_Add"),
> +         NULL, NULL, G_CALLBACK (buoh_window_popup_add_cb) },
>         { "Delete",      GTK_STOCK_DELETE,     N_("_Delete"),
> -         NULL, NULL, G_CALLBACK (buoh_window_popup_delete_cb) }
> +         NULL, NULL, G_CALLBACK (buoh_window_popup_delete_cb) },
> +       { "Copy",     GTK_STOCK_COPY,       N_("_Copy comic
> location"),
> +         NULL, NULL, G_CALLBACK (buoh_window_popup_copy_cb) },
> +       { "Save",     GTK_STOCK_SAVE,       N_("_Save a copy"),
> +         NULL, NULL, G_CALLBACK (buoh_window_popup_save_cb) }, 
> +       { "Properties",  GTK_STOCK_PROPERTIES, N_("_Properties"),
> +         NULL, NULL, G_CALLBACK (buoh_window_popup_properties_cb) }
>  };
>  
>  static const gchar *popup_ui_description =
>  "<ui>"
>  "  <popup name='MainMenu'>"
> -"    <menuitem action='Properties'/>"
> -"    <menuitem action='CopyURI'/>"
> -"    <separator/>"
> +"    <menuitem action='Add'/>"
>  "    <menuitem action='Delete'/>"
> +"    <separator/>"
> +"    <menuitem action='Copy'/>"
> +"    <menuitem action='Save'/>"
> +"    <menuitem action='Properties'/>"
>  "  </popup>"
>  "</ui>";
>  
> @@ -241,6 +261,14 @@
>         g_signal_connect (G_OBJECT (widget), "activate",
>                           G_CALLBACK (buoh_window_menu_add_cb),
>                           (gpointer) buoh_window);
> +       widget = glade_xml_get_widget (buoh_window->priv->gui,
> "menu_delete");
> +       g_signal_connect (G_OBJECT (widget), "activate",
> +                         G_CALLBACK (buoh_window_menu_delete_cb),
> +                         (gpointer) buoh_window);
> +       widget = glade_xml_get_widget (buoh_window->priv->gui,
> "menu_copy");
> +       g_signal_connect (G_OBJECT (widget), "activate",
> +                         G_CALLBACK (buoh_window_menu_copy_cb),
> +                         (gpointer) buoh_window);      
>         widget = glade_xml_get_widget (buoh_window->priv->gui,
> "menu_save");
>         g_signal_connect (G_OBJECT (widget), "activate",
>                           G_CALLBACK (buoh_window_menu_save_cb),
> @@ -358,15 +386,7 @@
>  }
>  
>  static void
> -buoh_window_menu_quit_cb (GtkMenuItem *menuitem, gpointer gdata)
> -{
> -       BuohWindow *window = BUOH_WINDOW (gdata);
> -
> -       gtk_widget_destroy (GTK_WIDGET (window));
> -}
> -
> -static void
> -buoh_window_menu_add_cb (GtkMenuItem *menuitem, gpointer gdata)
> +buoh_window_comic_add (gpointer gdata)
>  {
>         BuohWindow *window = BUOH_WINDOW (gdata);
>  
> @@ -378,11 +398,72 @@
>                                               GTK_WINDOW (window));
>         }
>  
> -       gtk_widget_show (window->priv->add_dialog);
> +       gtk_widget_show (window->priv->add_dialog);     
>  }
>  
>  static void
> -buoh_window_menu_save_cb (GtkMenuItem *menuitem, gpointer gdata)
> +buoh_window_comic_delete (gpointer gdata)
> +{
> +       BuohWindow   *window = BUOH_WINDOW (gdata);
> +       GtkTreeModel *model = buoh_get_comics_model (BUOH);
> +       GtkTreeIter   iter;
> +       BuohComic    *comic, *current_comic;
> +       gchar        *comic_id, *id;
> +       gboolean      valid;
> +
> +       current_comic = buoh_view_get_comic (window->priv->view);
> +
> +       if (current_comic) {
> +               comic_id = buoh_comic_get_id (current_comic);
> +
> +               valid = gtk_tree_model_get_iter_first (model, &iter);
> +
> +               while (valid) {
> +                       gtk_tree_model_get (model, &iter,
> +                                           COMIC_LIST_COMIC, &comic,
> +                                           -1);
> +                       id = buoh_comic_get_id (comic);
> +
> +                       if (g_ascii_strcasecmp (comic_id, id) == 0) {
> +                               buoh_comic_list_clear_selection
> (window->priv->comic_list);
> +                               gtk_list_store_set (GTK_LIST_STORE
> (model), &iter,
> +
> COMIC_LIST_VISIBLE, FALSE,
> +                                                   -1);
> +                               valid = FALSE;
> +                       } else {
> +                               valid = gtk_tree_model_iter_next
> (model, &iter);
> +                       }
> +
> +                       g_free (id);
> +               }
> +
> +               g_free (comic_id);
> +       }       
> +}
> +
> +static void
> +buoh_window_comic_copy (gpointer gdata)
> +{
> +       BuohWindow *window = BUOH_WINDOW (gdata);
> +       BuohComic  *comic = buoh_view_get_comic (window->priv->view);
> +       gchar      *uri;
> +
> +       if (comic) {
> +               uri = buoh_comic_get_uri (comic);
> +               buoh_debug ("Copy %s to clipboard", uri);
> +
> +               gtk_clipboard_set_text (gtk_clipboard_get (GDK_NONE),
> uri,
> +                                       g_utf8_strlen (uri, -1));
> +
> +               gtk_clipboard_set_text (gtk_clipboard_get
> (GDK_SELECTION_PRIMARY), uri,
> +                                       g_utf8_strlen (uri, -1));
> +
> +               g_free (uri);
> +       }       
> +}
> +
> +static void
> +buoh_window_comic_save (gpointer gdata)
>  {
>         GtkWidget     *chooser;
>         GtkFileFilter *filter;
> @@ -464,11 +545,11 @@
>         g_free (name);
>         g_free (page);
>         g_free (suggested);
> -       gtk_widget_destroy (chooser);
> +       gtk_widget_destroy (chooser);   
>  }
>  
>  static void
> -buoh_window_menu_properties_cb (GtkMenuItem *menuitem, gpointer
> gdata)
> +buoh_window_comic_properties (gpointer gdata)
>  {
>         BuohWindow *window = BUOH_WINDOW (gdata);
>         BuohComic  *comic = buoh_view_get_comic (window->priv->view);
> @@ -485,7 +566,45 @@
>                 }
>  
>                 gtk_widget_show (window->priv->properties);
> -       }
> +       }       
> +}
> +
> +static void
> +buoh_window_menu_quit_cb (GtkMenuItem *menuitem, gpointer gdata)
> +{
> +       BuohWindow *window = BUOH_WINDOW (gdata);
> +
> +       gtk_widget_destroy (GTK_WIDGET (window));
> +}
> +
> +static void
> +buoh_window_menu_add_cb (GtkMenuItem *menuitem, gpointer gdata)
> +{
> +       buoh_window_comic_add (gdata);
> +}
> +
> +static void
> +buoh_window_menu_delete_cb (GtkMenuItem *menuitem, gpointer gdata)
> +{
> +       buoh_window_comic_delete (gdata);
> +}
> +
> +static void
> +buoh_window_menu_copy_cb (GtkMenuItem *menuitem, gpointer gdata)
> +{
> +       buoh_window_comic_copy (gdata);
> +}
> +
> +static void
> +buoh_window_menu_save_cb (GtkMenuItem *menuitem, gpointer gdata)
> +{
> +       buoh_window_comic_save (gdata);
> +}
> +
> +static void
> +buoh_window_menu_properties_cb (GtkMenuItem *menuitem, gpointer
> gdata)
> +{
> +       buoh_window_comic_properties (gdata);
>  }
>  
>  static void
> @@ -641,6 +760,8 @@
>         buoh_window_zoom_in_set_sensitive (window, sensitive);
>         buoh_window_zoom_out_set_sensitive (window, sensitive);
>         buoh_window_normal_size_set_sensitive (window, sensitive);
> +       buoh_window_set_sensitive (window, "menu_delete", sensitive);
> +       buoh_window_set_sensitive (window, "menu_copy", sensitive);
>         buoh_window_set_sensitive (window, "menu_properties",
> sensitive);
>  }
>  
> @@ -727,81 +848,29 @@
>  static void
>  buoh_window_popup_properties_cb (GtkWidget *widget, gpointer gdata)
>  {
> -       BuohWindow *window = BUOH_WINDOW (gdata);
> -       BuohComic  *comic = buoh_view_get_comic (window->priv->view);
> -
> -       if (comic) {
> -               if (!window->priv->properties) {
> -                       window->priv->properties =
> buoh_properties_dialog_new ();
> -                       buoh_properties_dialog_set_comic
> (BUOH_PROPERTIES_DIALOG (window->priv->properties),
> -                                                         comic);
> -                       g_object_add_weak_pointer (G_OBJECT
> (window->priv->properties),
> -                                                  (gpointer *)
> &(window->priv->properties));
> -                       gtk_window_set_transient_for (GTK_WINDOW
> (window->priv->properties),
> -                                                     GTK_WINDOW
> (window));
> -               }
> -
> -               gtk_widget_show (window->priv->properties);
> -       }
> +       buoh_window_comic_properties (gdata);
>  }
>  
>  static void
>  buoh_window_popup_delete_cb (GtkWidget *widget, gpointer gdata)
>  {
> -       BuohWindow   *window = BUOH_WINDOW (gdata);
> -       GtkTreeModel *model = buoh_get_comics_model (BUOH);
> -       GtkTreeIter   iter;
> -       BuohComic    *comic, *current_comic;
> -       gchar        *comic_id, *id;
> -       gboolean      valid;
> -
> -       current_comic = buoh_view_get_comic (window->priv->view);
> -
> -       if (current_comic) {
> -               comic_id = buoh_comic_get_id (current_comic);
> -
> -               valid = gtk_tree_model_get_iter_first (model, &iter);
> -
> -               while (valid) {
> -                       gtk_tree_model_get (model, &iter,
> -                                           COMIC_LIST_COMIC, &comic,
> -                                           -1);
> -                       id = buoh_comic_get_id (comic);
> -
> -                       if (g_ascii_strcasecmp (comic_id, id) == 0) {
> -                               buoh_comic_list_clear_selection
> (window->priv->comic_list);
> -                               gtk_list_store_set (GTK_LIST_STORE
> (model), &iter,
> -
> COMIC_LIST_VISIBLE, FALSE,
> -                                                   -1);
> -                               valid = FALSE;
> -                       } else {
> -                               valid = gtk_tree_model_iter_next
> (model, &iter);
> -                       }
> -
> -                       g_free (id);
> -               }
> -
> -               g_free (comic_id);
> -       }
> +       buoh_window_comic_delete (gdata);
>  }
>  
>  static void
> -buoh_window_popup_copy_uri_cb (GtkWidget *widget, gpointer gdata)
> +buoh_window_popup_copy_cb (GtkWidget *widget, gpointer gdata)
>  {
> -       BuohWindow *window = BUOH_WINDOW (gdata);
> -       BuohComic  *comic = buoh_view_get_comic (window->priv->view);
> -       gchar      *uri;
> -
> -       if (comic) {
> -               uri = buoh_comic_get_uri (comic);
> -               buoh_debug ("Copy %s to clipboard", uri);
> -
> -               gtk_clipboard_set_text (gtk_clipboard_get (GDK_NONE),
> uri,
> -                                       g_utf8_strlen (uri, -1));
> +       buoh_window_comic_copy (gdata);
> +}
>  
> -               gtk_clipboard_set_text (gtk_clipboard_get
> (GDK_SELECTION_PRIMARY), uri,
> -                                       g_utf8_strlen (uri, -1));
> +static void
> +buoh_window_popup_add_cb (GtkWidget *widget, gpointer gdata)
> +{
> +       buoh_window_comic_add (gdata);
> +}
>  
> -               g_free (uri);
> -       }
> +static void
> +buoh_window_popup_save_cb (GtkWidget *widget, gpointer gdata)
> +{
> +       buoh_window_comic_save (gdata);
>  }

Creo que no lo has comprobado, pero tendrías que deshabilitar en el
popup la opción de guardar una copia si la carga del comic falló y
durante la carga del comic. 

El sensitive no es exactamente igual en el menu que en el popup. El menu
hace referencia al comic que se está viendo en ese momento, por eso la
opción de propiedades debe estar deshabilitada. Sin embargo el popup
hace referencia a un elemento de la lista, por lo que se pueden mostrar
sus propiedades incluso aunque estemos en la vista de error, ya que esa
info si que está disponible. El caso de guardar un copia debe estar
deshabilitado en ambos casos si estamos en la vista de error y el de
borrar solo en el menu, pero no en el popup.

Salu2
-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
 Carlos Garcia Campos a.k.a. KaL
   elkalmail at yahoo.es
   carlosgc at gnome.org
   http://carlosgc.linups.org
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=             
PGP key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x523E6462
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Esta parte del mensaje =?ISO-8859-1?Q?est=E1?= firmada
	digitalmente
Url : http://forge.novell.com/pipermail/buoh-dev/attachments/20050912/8dc84c8e/attachment.pgp


More information about the Buoh-dev mailing list