[Buoh-dev] Parche para guardar un comic como jpeg



El mar, 16-08-2005 a las 15:44 +0200, Carlos Garcia Campos escribi?:
> El lun, 15-08-2005 a las 21:34 +0200, Esteban S?nchez escribi?:
> > Pues como hemos estado hablando antes de esto, al final me he picado y
> > he hecho el guardar un comic a disco. Este es el c?digo, espero
> > opiniones :)
> 
> hay una cosa que no veo del todo claro. Por que se guarda solo en jpeg?
> quiero decir, guardar una copia es pillar el comic y guardarlo tal cual
> al disco. Si el comic es png o gif y se lo guardamos en jpeg en realidad
> no estamos guardando una copia, lo estamos exportando a otro formato. Yo
> creo que una de dos: o lo llamamos exportar a jpeg o tratamos de
> respetar el formato que tiene. 

> Para respetar el formato tenemos dos posibilidades: con gdk_pixbuf_save
> y usando gdk_pixbuf_format_is_writable para ver si el formato est?
> soportado. Si lo est?, se guarda y si no se le dice al usuario que el
> formato no est? soportado y que se exportar? o algo as?; la otra
> posibilidad es bajar directamente el comic y guardarlo en disoc tal
> cual, bit a bit y nos evitamos problemas de formatos.

Estuve mirando esas funciones y no termin? de verlo claro. Al final lo
dej? as? pero con idea de seguir mejorandolo en ese aspecto, as? que me
pondr? con ello para permitir exportar a otros formatos. Sin embargo,
la mayor?a de los comics son GIF y el GdkPixbuf solo permite PNG, JPEG,
ICO y BMP...

> Ahora paso de todas formas a comentarte cosas sobre el parche
> 
> > Saludos!
> > 
> > 

<snip>
> > Index: po/Makefile.in.in
> > ===================================================================
> > RCS file: /cvsroot/buoh/buoh/po/Makefile.in.in,v
> > retrieving revision 1.2
> > diff -u -p -u -r1.2 Makefile.in.in
> > --- po/Makefile.in.in   4 Aug 2005 19:48:12 -0000       1.2
> > +++ po/Makefile.in.in   15 Aug 2005 19:31:17 -0000
> > @@ -32,13 +32,13 @@ VPATH = @srcdir@
> >  prefix = @prefix@
> >  exec_prefix = @exec_prefix@
> >  datadir = @datadir@
> > +datarootdir = @datarootdir@
> >  libdir = @libdir@
> >  localedir = $(libdir)/locale
> >  gnulocaledir = $(datadir)/locale
> >  gettextsrcdir = $(datadir)/glib-2.0/gettext/po
> >  subdir = po
> >  install_sh = @install_sh@
> > -mkdir_p = @mkdir_p@
> >  mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
> >  
> >  INSTALL = @INSTALL@
> 
> este es un fichero generado por el condifure y por lo tanto no deber?a
> estar en el CVS (y menos es un parche)

Me extra?o verlo cuando ech? un vistazo rapido al parche y como me lio
un mont?n con estos ficheros prefer? dejarlo...

> > Index: src/buoh-view.c
> > ===================================================================
> > RCS file: /cvsroot/buoh/buoh/src/buoh-view.c,v
> > retrieving revision 1.6
> > diff -u -p -u -r1.6 buoh-view.c
> > --- src/buoh-view.c     15 Aug 2005 15:04:09 -0000      1.6
> > +++ src/buoh-view.c     15 Aug 2005 19:31:19 -0000
> > @@ -587,3 +587,4 @@ buoh_view_clear (BuohView *view)
> >  {
> >          gtk_notebook_set_current_page (GTK_NOTEBOOK (view),
> > VIEW_PAGE_EMPTY);
> >  }
> > +
> 
> interesante cambio :-DD

Uno de esos que cambias sin querer... Creo que sigue compilando :P Ahora
lo quito para que no salga en el parche (hay que hacer de nuevo autogen,
sorry)

> > Index: src/buoh-window.c
> > ===================================================================
> > RCS file: /cvsroot/buoh/buoh/src/buoh-window.c,v
> > retrieving revision 1.5
> > diff -u -p -u -r1.5 buoh-window.c
> > --- src/buoh-window.c   5 Aug 2005 09:14:54 -0000       1.5
> > +++ src/buoh-window.c   15 Aug 2005 19:31:21 -0000
> > @@ -59,6 +59,8 @@ static void buoh_window_menu_quit_cb    
> >                                                         gpointer
> > gdata);
> >  static void buoh_window_menu_add_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,
> >                                                         gpointer
> > gdata);
> >  static void buoh_window_menu_zoom_in_cb                (GtkMenuItem
> > *menuitem,
> > @@ -242,6 +244,10 @@ buoh_window_init (BuohWindow *buoh_windo
> >         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_save");
> > +       g_signal_connect (G_OBJECT (widget), "activate",
> > +                         G_CALLBACK (buoh_window_menu_save_cb),
> > +                         (gpointer) buoh_window);
> >         widget = glade_xml_get_widget (buoh_window->priv->gui,
> > "menu_properties");
> >         g_signal_connect (G_OBJECT (widget), "activate",
> >                           G_CALLBACK (buoh_window_menu_properties_cb),
> > @@ -378,6 +384,65 @@ buoh_window_menu_add_cb (GtkMenuItem *me
> >  }
> >  
> >  static void
> > +buoh_window_menu_save_cb (GtkMenuItem *menuitem, gpointer gdata)
> > +{
> > +       GtkWidget     *chooser;
> > +       GtkFileFilter *filter;
> > +       gchar         *suggested;
> > +       gchar         *name;
> > +       gchar         *page;
> > +       gchar         *filename = "juas.png";
> 
> juas.png??? que es esto tio?

Una de las pruebas que se te olvida quitar...

> > +       BuohWindow    *window = BUOH_WINDOW (gdata);
> > +       BuohComic     *comic;
> > +       GdkPixbuf     *pixbuf;
> > +       GtkWidget     *dialog;
> > +
> > +       filter = gtk_file_filter_new ();
> > +       gtk_file_filter_set_name (filter, _("JPEG Images"));
> 
> debes decirle al filtro cual es el patr?n de los archivos adem?s del
> nombre

Ok

> > +               
> > +       chooser = gtk_file_chooser_dialog_new (_("Save comic"),
> > +                                              GTK_WINDOW (window),
> > +
> > GTK_FILE_CHOOSER_ACTION_SAVE,
> > +                                              GTK_STOCK_CANCEL,
> > GTK_RESPONSE_CANCEL,
> > +                                              GTK_STOCK_SAVE,
> > GTK_RESPONSE_ACCEPT,
> > +                                              NULL);
> > +       gtk_file_chooser_set_do_overwrite_confirmation
> > (GTK_FILE_CHOOSER (chooser), TRUE);
> > +       gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser),
> > filter);
> > +       
> > +       comic     = buoh_view_get_comic (window->priv->view);
> > +       name      = buoh_comic_get_title (comic);
> > +       page      = buoh_comic_get_page (comic);
> > +       suggested = g_strconcat (name, " (", page, ").jpeg", NULL);
> > +       
> > +       gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (chooser),
> > +                                          suggested);
> > +       
> > +       if (gtk_dialog_run (GTK_DIALOG (chooser)) ==
> > GTK_RESPONSE_ACCEPT)
> > +       {
> 
> esa llave deber?a estar arriba

Cierto

> > +               pixbuf   = buoh_comic_get_pixbuf (comic);
> > +               filename = gtk_file_chooser_get_filename
> > (GTK_FILE_CHOOSER (chooser));
> > +               
> > +               if (!gdk_pixbuf_save (pixbuf, filename, "jpeg", NULL,
> > NULL)) {
> > +                       dialog = gtk_message_dialog_new (GTK_WINDOW
> > (window),
> > +
> > GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
> > +
> > GTK_MESSAGE_ERROR,
> > +
> > GTK_BUTTONS_CLOSE,
> > +                                                        _("Unable to
> > save comic"));
> > +                       gtk_dialog_run (dialog);
> > +                       gtk_widget_destroy (dialog);
> > +               }
> > +               g_free (filename);
> > +       }
> > +
> > +       g_object_unref (pixbuf);
> > +       g_free (name);
> > +       g_free (page);
> > +       g_free (suggested);
> > +       gtk_widget_destroy (chooser);
> > +       g_object_unref (filter);
> 
> mania mia, pero prefiero que las cosas se vayan liberando segun se vayan
> dejando de necesitar en vez de todo al final. Creo que es mas facil que
> no se olvide nada, pero bueno, es mania mia, no digo que est? mal ni
> mucho menos.

Yo prefiero abajo, as? hay un paralelismo entre las variables declaradas
y las liberadas. Manias, manias... :)

> > +}
> > +
> 
> varias cosas sobre esta funci?n. El filechooser debe ser un dialogo
> modal. El tema es que cuando se ejecuta el callback, pillas el comic que
> hay en la vista, ya que es el que se quiere guardar. Si el dialogo no es
> modal, se podr?a cambiar el comic de la vista seleccionando otro de la
> lista y ser?a confuso para el user saber que comic es el que se va a
> guardar (que nosotros sabemos que es el que hab?a cuando se seleccion?
> el menu)

A mi me sale modal.

> Por otro lado, si el usuario va a guardar varios comics es muy probable
> que quiera guardarlos en la misma carpeta (por el principio de localidad
> espacial, hoy estuve empollando AIC) por lo que conviene "recordar" el
> ?ltimo directorio accedido en la sessi?n. Para ello basta con usar una
> variable static que guarde la uri de la carpeta.

Pensaba que era m?s dificil pillar la carpeta, pero luego resulta que
hay una funci?n en el file chooser, as? que lo cambio en un plis.

> En cuanto al di?logo de error, tiene alguna posiblidad el usuario? por
> que podr?a fallar? lo digo porque si algo falla y el usuario puede hacer
> algo, en este caso se cerrar?n el message_dialog y el fielchooser, con
> lo que el user tendr? que volver a seleccionar guardar en el menu para
> volver a intentarlo. Si hay posibilidad de rectificar para el usuario,
> lo suyo es hacer un bucle y en caso de error volver a hacer el run para
> que el usuario pueda volver a probar en el mismo filechooser.

Podr?a fallar porque no tuviese permisos de escritura (prueba a guardar
en /). Lo que no he conseguido es sacar el error, porque el
gdk_pixbuf_save () falla si le pasas un GError (curioso).

Tienes raz?n con lo del bucle. No me di cuenta. Voy a cambiarlo.

> > +static void
> >  buoh_window_menu_properties_cb (GtkMenuItem *menuitem, gpointer
> > gdata)
> >  {
> >         BuohWindow *window = BUOH_WINDOW (gdata);
> > @@ -556,6 +621,7 @@ buoh_window_comic_actions_set_sensitive 
> >         buoh_window_zoom_out_set_sensitive (window, sensitive);
> >         buoh_window_normal_size_set_sensitive (window, sensitive);
> >         buoh_window_set_sensitive (window, "menu_properties",
> > sensitive);
> > +       buoh_window_set_sensitive (window, "menu_save", sensitive);
> >  }
> >  
> >  static void


Ahi va el nuevo parche

-- 
Esteban S?nchez
 esteban steve-0 com
 http://steve-o.org
 http://subanales.com/
 ------------------------------------------------
 PGP key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xB6E0F8AF
-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.diff
Type: text/x-patch
Size: 9736 bytes
Desc: not available
Url : http://forge.novell.com/pipermail/buoh-dev/attachments/20050816/26937ad6/patch.bin


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