Blame platform-demos/es/image-viewer.js.page

Packit 1470ea
Packit 1470ea
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" type="topic" id="image-viewer.js" xml:lang="es">
Packit 1470ea
Packit 1470ea
  <info>
Packit 1470ea
  <title type="text">Visor de imágenes (JavaScript)</title>
Packit 1470ea
    <link type="guide" xref="js#examples"/>
Packit 1470ea
Packit 1470ea
    <desc>Algo más que una sencilla aplicación «Hola mundo»; escriba un visor de imágenes en GTK+. Incluye una introducción al lenguaje JavaScript.</desc>
Packit 1470ea
Packit 1470ea
    <revision pkgversion="0.1" version="0.1" date="2011-03-19" status="review"/>
Packit 1470ea
    <credit type="author">
Packit 1470ea
      <name>Jonh Wendell</name>
Packit 1470ea
      <email its:translate="no">jwendell@gnome.org</email>
Packit 1470ea
    </credit>
Packit 1470ea
    <credit type="author">
Packit 1470ea
      <name>Johannes Schmid</name>
Packit 1470ea
      <email its:translate="no">jhs@gnome.org</email>
Packit 1470ea
    </credit>
Packit 1470ea
    <credit type="editor">
Packit 1470ea
      <name>Marta Maria Casetti</name>
Packit 1470ea
      <email its:translate="no">mmcasettii@gmail.com</email>
Packit 1470ea
      <years>2013</years>
Packit 1470ea
    </credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Daniel Mustieles</mal:name>
Packit 1470ea
      <mal:email>daniel.mustieles@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2011 - 2017</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Nicolás Satragno</mal:name>
Packit 1470ea
      <mal:email>nsatragno@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2012 - 2013</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  
Packit 1470ea
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
Packit 1470ea
      <mal:name>Jorge González</mal:name>
Packit 1470ea
      <mal:email>jorgegonz@svn.gnome.org</mal:email>
Packit 1470ea
      <mal:years>2011</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
<title>Visor de imágenes</title>
Packit 1470ea
Packit 1470ea
<synopsis>
Packit 1470ea
  

En este tutorial se va a escribir una aplicación GTK+ muy sencilla que carga un archivo e imagen y lo muestra. Aprenderá a:

Packit 1470ea
  <list>
Packit 1470ea
    <item>

Escribir una interfaz GTK+ de usuario básica usando JavaScript

</item>
Packit 1470ea
    <item>

Trabajar con eventos conectando señales a manejadores de señales

</item>
Packit 1470ea
    <item>

La disposición de las interfaces de usuario usando contenedores

</item>
Packit 1470ea
    <item>

Cargar y mostrar archivos de imagen

</item>
Packit 1470ea
  </list>
Packit 1470ea
  

Necesitará lo siguiente para poder seguir este tutorial:

Packit 1470ea
  <list>
Packit 1470ea
    <item>

Una copia instalada del <link xref="getting-ready">EID Anjuta</link>

</item>
Packit 1470ea
    <item>

Una copia instalada del intérprete gjs

</item>
Packit 1470ea
    <item>

Conocimiento básico de cualquier lenguaje de programación orientado a objetos

</item>
Packit 1470ea
  </list>
Packit 1470ea
</synopsis>
Packit 1470ea
Packit 1470ea
<media type="image" mime="image/png" src="media/image-viewer.png"/>
Packit 1470ea
Packit 1470ea
<section id="anjuta">
Packit 1470ea
  <title>Crear un proyecto en Anjuta</title>
Packit 1470ea
  

Antes de empezar a programar, deberá configurar un proyecto nuevo en Anjuta. Esto creará todos los archivos que necesite para construir y ejecutar el código más adelante. También es útil para mantener todo ordenado.

Packit 1470ea
  <steps>
Packit 1470ea
    <item>
Packit 1470ea
    

Inicie Anjuta y pulse <guiseq><gui>Archivo</gui><gui>Nuevo</gui><gui>Proyecto</gui></guiseq> para abrir el asistente de proyectos.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

Elija <gui>Javascript genérico</gui> de la pestaña <gui>JS</gui>, pulse <gui>Adelante</gui> y rellene los detalles en las siguientes páginas. Use <file>visor-imágenes</file> como nombre de proyecto y de carpeta.

Packit 1470ea
   	</item>
Packit 1470ea
    <item>
Packit 1470ea
    

Pulse <gui>Aplicar</gui> y se creará el proyecto. Abra <file>src/main.js</file> desde las pestañas <gui>Proyecto</gui> o <gui>Archivo</gui>. Contiene un ejemplo de código muy básico:

Packit 1470ea
    </item>
Packit 1470ea
  </steps>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
Packit 1470ea
<section id="js">
Packit 1470ea
  <title>JavaScript básico: hola mundo</title>
Packit 1470ea
  

Antes de empezar a escribir el visor de imágenes, averigüe algo más sobre cómo se usa JavaScript en GNOME. Por supuesto que su primer contacto con un lenguaje de programación debe ser el programa «Hola mundo», que se puede encontrar en el archivo <file>main.js</file>:

Packit 1470ea
  print ("¡Hola mundo!");
Packit 1470ea
  

Esto debería resultarle natural si está familiarizado con la mayoría del resto de lenguajes de programación. La función print se llama con el argumento "¡Hola mundo!", que se mostrará en la pantalla. Tenga en cuenta que cada línea de código termina en «;».

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="classes">
Packit 1470ea
  <title>Clases en JavaScript</title>
Packit 1470ea
  

Esta es la manera estándar de definir una clase en JavaScript:

Packit 1470ea
  
Packit 1470ea
function MyClass () {
Packit 1470ea
  this._init ();
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
MyClass.prototype = {
Packit 1470ea
Packit 1470ea
  _init: function () {
Packit 1470ea
    this.propertyA = "This is an object's field";
Packit 1470ea
    this.propertyB = 10;
Packit 1470ea
  },
Packit 1470ea
Packit 1470ea
  aMethod: function (arg1, arg2) {
Packit 1470ea
    print ("inside aMethod: " + arg1 + " " + arg2);
Packit 1470ea
  },
Packit 1470ea
Packit 1470ea
  dumpProperties: function () {
Packit 1470ea
    print (this.propertyA);
Packit 1470ea
    print (this.propertyB);
Packit 1470ea
  }
Packit 1470ea
Packit 1470ea
}
Packit 1470ea
  

Esto define una clase llamada MyClass. Vea cada una de las partes de la definición de la clase:

Packit 1470ea
  <steps>
Packit 1470ea
    <item>
Packit 1470ea
    

function MyClass es el constructor de la clase; su nombre debe coincidir con el de la clase. Puede acceder a cualquier miembro de la clase usando el objeto this; aquí, el constructor llama al método _init de la clase.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

El bloque MyClass.prototype es donde define la estructura de la clase. Cada clase se compone de métodos (funciones) y campos (variables); en este ejemplo, hay tres métodos y dos campos.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

El primer método definido se llama _init, y se especifica que es una función sin argumentos:

Packit 1470ea
    _init: function ()
Packit 1470ea
    

Se escribe la función entre corchetes. Aquí se definen dos campos, propertyA y propertyB. La primera se establece como una cadena, y la segunda se establece como un entero (10). La función no retorna ningún valor.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

El siguiente método se llama aMethod y tiene dos argumentos que imprime cuando se invoca. El último método es dumpProperties, que imprime los campos propertyA y propertyB.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

Tenga en cuenta cómo se ordena la definición de la clase (prototipo); cada definición de función se separa con una coma.

Packit 1470ea
    </item>
Packit 1470ea
  </steps>
Packit 1470ea
Packit 1470ea
  

Ahora que «MyClass» se ha definido, se puede jugar con ella:

Packit 1470ea
  
Packit 1470ea
var o = new MyClass ();
Packit 1470ea
o.aMethod ("Hello", "world");
Packit 1470ea
o.propertyA = "Just changed its value!";
Packit 1470ea
o.dumpProperties ();
Packit 1470ea
  

Este código crear una instancia nueva de la clase llamada o, ejecuta aMethod, cambia propertyA a una cadena diferente y entonces llama a dumpProperties (que muestra los campos).

Packit 1470ea
  

Guarde el código en el archivo <file>main.js</file> y ejecútelo usando <guiseq><gui>Ejecutar</gui><gui>Ejecutar</gui></guiseq> desde el menú o usando la barra de herramientas.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="gtk">
Packit 1470ea
  <title>Una primera aplicación en GTK</title>
Packit 1470ea
  

Vea como queda una aplicación GTK+ muy básica en JavaScript:

Packit 1470ea
  
Packit 1470ea
const Gtk = imports.gi.Gtk;
Packit 1470ea
Packit 1470ea
Gtk.init (null, null);
Packit 1470ea
Packit 1470ea
var w = new Gtk.Window ({title: "Image Viewer Demo"});
Packit 1470ea
w.show ();
Packit 1470ea
Packit 1470ea
Gtk.main ();
Packit 1470ea
  

Eche un vistazo a lo que está pasando:

Packit 1470ea
  <list>
Packit 1470ea
    <item>
Packit 1470ea
    

La primera línea importa el espacio de nombres de GTK+ (es decir, incluye la biblioteca GTK+). Las bibliotecas las proporciona «GObject Introspection (gi)», que implementa asociaciones de lenguajes para la mayoría de las bilbiotecas de GNOME.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

Gtk.init inicializa la biblioteca GTK; esta sentencia es obligatoria para todos los programas GTK.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

La siguiente línea crea la ventana principal creando un objeto Gtk.Window. Puede pasar varias propiedades al constructor de la ventana usando la sintaxis {property: value, property: value, ...}. En este caso, se está estableciendo el título de la ventana.

</item>
Packit 1470ea
    <item>

La siguiente línea muestra explícitamente la ventana. En GTK+, cada widget está oculto de manera predeterminada.

</item>
Packit 1470ea
    <item>

Finalmente, Gtk.main ejecuta el bucle principal; en otras palabras, ejecuta el programa. El bucle principal escucha los eventos (señales) de la interfaz del usuario y llama a un manejador de la señal que hará algo útil. En breve aprenderá más cosas sobre las señales.

</item>
Packit 1470ea
  </list>
Packit 1470ea
Packit 1470ea
  

Guarde el código en <file>main.js</file> y ejecútelo. Notará que la aplicación no termina cuando cierra la ventana. Esto es porque todavía no se ha configurado un manejador de señal para gestionar la señal destroy (cerrar) de la ventana. Esto se hará en breve, pero por el momento puede pulsar <keyseq><key>Ctrl</key><key>C</key></keyseq> en la ventana de la terminal para salir del programa.

Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="classes2">
Packit 1470ea
  <title>Añadir clases</title>
Packit 1470ea
  

La manera correcta de programar en GTK+ es usando clases. Reescriba el código que acaba de escribir usando clases:

Packit 1470ea
  
Packit 1470ea
const Gtk = imports.gi.Gtk;
Packit 1470ea
Packit 1470ea
function ImageViewer () {
Packit 1470ea
  this._init ();
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
ImageViewer.prototype = {
Packit 1470ea
  _init: function () {
Packit 1470ea
    this.window = new Gtk.Window ({title: "Image Viewer Demo"});
Packit 1470ea
    this.window.show ();
Packit 1470ea
  }
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
Gtk.init (null, null);
Packit 1470ea
var iv = new ImageViewer ();
Packit 1470ea
Gtk.main ();
Packit 1470ea
  
Packit 1470ea
  

Tenga en cuenta que el programa es el mismo; simplemente se ha movido el código de creación de la ventana a la clase ImageViewer. El constructor de la clase llama al método _init, que crea y muestra la ventana. Se crea entonces una instancia de la clase antes de ejecutar el bucle principal (Gtk.main).

Packit 1470ea
  

El código es modular y se puede dividir el varios archivos fácilmente. Esto hace que sea más limpio y fácil de leer.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="signals">
Packit 1470ea
  <title>Señales</title>
Packit 1470ea
  

Las señales son un concepto clave en la programación en GTK. Cuando pasa algo en un objeto, emite una señal; por ejemplo, cuando se pulsa un botón, emite la señal clicked. Si quiere que su programa haga algo cuando ocurre ese evento, debe conectar una función (un «manejador de la señal») a esa señal. Aquí hay un ejemplo:

Packit 1470ea
  
Packit 1470ea
function button_clicked () {
Packit 1470ea
  print ("you clicked me!");
Packit 1470ea
}
Packit 1470ea
var b = new Gtk.Button ({label:"Click me"});
Packit 1470ea
b.connect ("clicked", button_clicked);
Packit 1470ea
  

Las dos últimas líneas crean un Gtk.Button llamado b y conectan su señal clicked con la función button_clicked que se ha definido anteriormente. Cada vez que se pulsa un botón, se ejecuta el código de la función button_clicked. Esto sólo imprime un mensaje aquí.

Packit 1470ea
  

La sintaxis para conectar cualquier señal a una función es:

Packit 1470ea
  
Packit 1470ea
object.connect (<signal_name>, <function_to_be_called>);
Packit 1470ea
  

Puede encontrar definiciones de señales para cualquier objeto en la <link href="https://developer.gnome.org/gtk3/stable/gtkobjects.html">referencia de clases de GTK+</link>.

Packit 1470ea
Packit 1470ea
  <note>
Packit 1470ea
    

Puede simplificar el código usando una definición de función en línea:

Packit 1470ea
    
Packit 1470ea
b.connect ("clicked", function () { print ("you clicked me!"); });
Packit 1470ea
  </note>
Packit 1470ea
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="close">
Packit 1470ea
  <title>Cerrar la ventana</title>
Packit 1470ea
  

Cuando cierra una ventana de GTK, realmente no se cierra, se oculta. Esto le permite mantener la ventana (lo que es útil si quiere preguntar al usuario si realmente quiere cerrar la ventana, por ejemplo).

Packit 1470ea
  

En este caso, simplemente se quiere cerrar la ventana. La manera más sencilla de hacerlo es conectar la señal hide del objeto GtkWindow a una función que cierra la aplicación. Vuelva al archivo <file>image-viewer.js</file> y añada el siguiente código al método _init, en la línea anterior a this.window.show:

Packit 1470ea
  this.window.connect ("hide", Gtk.main_quit);
Packit 1470ea
  

Esto conecta la señal hide de la ventana con la función main_quit de GTK, que termina la ejecución del bucle principal de GTK. Una vez que el bucle principal termina, la función Gtk.main retorna. El programa puede continuar ejecutando cualquier código que haya después de la línea Gtk.main ();, pero como no hay ningún código después de ese punto, el programa simplemente termina.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="containers2">
Packit 1470ea
  <title>Contenedores: diseñar la interfaz de usuario</title>
Packit 1470ea
  

Los widgets (controles, como botones y etiquetas) se pueden organizar en la ventana usando contenedores. Puede organizar el diseño mezclando diferentes tipos de contenedores, como cajas y rejillas.

Packit 1470ea
  

Una Gtk.Window es en sí misma un tipo de contenedor, pero sólo puede poner un widget directamente en ella. Se quieren poner dos widgets, una imagen y un botón, por lo que se necesita poner un contenedor «de mayor capacidad» dentro de la ventana para que contenga otros widgets. Hay varios <link href="http://library.gnome.org/devel/gtk/stable/GtkContainer.html">tipos de contenedores</link> disponibles, pero aquí se usará una Gtk.Box. Una Gtk.Box puede contener varios widgets, organizados horizontal o verticalmente. Se pueden hacer diseños más complejos poniendo varias cajas dentro de otras, y así sucesivamente.

Packit 1470ea
  <note>
Packit 1470ea
  

Hay un diseñador de interfaces gráficas llamado <app>Glade</app> integrado en <app>Anjuta</app> que hace que el diseño de IU sea realmente fácil. Sin embargo, para este ejemplo, se va a codificar todo manualmente.

Packit 1470ea
  </note>
Packit 1470ea
  

Añada la caja y los widgets a la ventana. Inserte el siguiente código en el método _init, justo debajo de la línea this.window.show:

Packit 1470ea
  
Packit 1470ea
var main_box = new Gtk.Box ({orientation: Gtk.Orientation.VERTICAL, spacing: 0});
Packit 1470ea
this.window.add (main_box);
Packit 1470ea
  

La primera línea crea una Gtk.Box llamada main_box y establece dos de sus propiedades: la orientation se establece a «vertical» (por lo que los widgets se ordenan en columna), y el spacing entre los widgets, que se establece a 0 píxeles. La siguiente línea añade la Gtk.Box recién creada a la ventana.

Packit 1470ea
  

De momento, la ventana sólo contiene una Gtk.Box vacía, y si ejecuta el programa ahora no verá ningún cambio (la Gtk.Box es un contenedor transparente, por lo que no puede que está ahí).

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="packing2">
Packit 1470ea
  <title>Empaquetado: añadir widgets al contenedor</title>
Packit 1470ea
  

Para añadir algunos widgets a la Gtk.Box, inserte el siguiente código justo debajo de la línea this.window.add (main_box):

Packit 1470ea
  
Packit 1470ea
this.image = new Gtk.Image ();
Packit 1470ea
main_box.pack_start (this.image, true, true, 0);
Packit 1470ea
  

La primera línea crea una Gtk.Image nueva llamada image, que se usará para mostrar un archivo de imagen. Entonces, se añade el widget de imagen (packed) al contenedor main_box usando el método <link href="http://library.gnome.org/devel/gtk/stable/GtkBox.html#gtk-box-pack-start">pack_start</link> de Gtk.Box.

Packit 1470ea
  

pack_start toma 4 argumentos: el widget que añadir a la Gtk.Box (child); indica si la Gtk.Box debe crecer a lo largo cuando se añade el widget nuevo (expand); indica si el widget nuevo debe tomar todo el espacio adicional creado si la Gtk.Box se hace más grande (fill); y cuánto espacio debe haber, en píxeles, entre el widget y los demás widgets dentro de la Gtk.Box (padding).

Packit 1470ea
  

Los contenedores (y los widgets) de GTK+ se expanden dinámicamente, si les deja, para rellenar el espacio disponible. No posicione widgets indicando unas coordenadas x-y precisas en la ventana; en lugar de eso, se posicionan relativos a otro. Esto hace que el manejo de la redimensión de las ventanas sea más fácil, y que los widgets tengan un tamaño sensible automática en la mayoría de las situaciones.

Packit 1470ea
  

También tenga en cuenta cómo se organizan los widgets de manera jerárquica. Una vez empaquetados en la Gtk.Box, la Gtk.Image se considera un hijo de la Gtk.Box. Esto le permite tratar a todos los hijos de un widget como un grupo; por ejemplo, puede ocultar la Gtk.Box, lo que haría que también se ocultaran todos sus hijos a la vez.

Packit 1470ea
  

Ahora inserte estas dos líneas, justo debajo de las dos que acaba de añadir.

Packit 1470ea
  
Packit 1470ea
var open_button = new Gtk.Button ({label: "Open a picture..."});
Packit 1470ea
main_box.pack_start (open_button, false, false, 0);
Packit 1470ea
  

Estas líneas son similares a las dos primeras, pero esta vez crean un Gtk.Button y lo añaden a la main_box. Tenga en cuenta que aquí se está estableciendo el argumento expand (el segundo) a false, mientras que para la Gtk.Image se estableció a true. Esto hará que la imagen tome todo el espacio disponible y que el botón tome sólo el espacio que necesite. Cuando se maximiza la ventana, el tamaño del botón será el mismo, pero el tamaño de la imagen aumentará junto con el resto de la ventana.

Packit 1470ea
  

Finalmente, se debe cambiar la línea this.window.show (); para leer:

Packit 1470ea
  this.window.show_all ();
Packit 1470ea
  

Esto mostrará el hijo de la ventana de GTK, y todos sus hijos, y los hijos de sus hijos, etcétera. (Recuerde que los widgets de GTK están ocultos de manera predeterminada.)

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="loading2">
Packit 1470ea
  <title>Cargar la imagen: conectar con la señal clicked del botón</title>
Packit 1470ea
  

Cuando el usuario pulse en el botón <gui>Abrir</gui>, debe aparecer un diálogo en el que el usuario pueda elegir una imagen. una vez elegida, la imagen se debe cargar y mostrar en el widget de imagen.

Packit 1470ea
  

El primer paso es conectar la señal clicked del botón a una función manejadora de la señal, llamada _openClicked. Ponga este código inmediatamente después de la línea var open_button = new Gtk.Button en la que se creó el botón:

Packit 1470ea
  
Packit 1470ea
open_button.connect ("clicked", Lang.bind (this, this._openClicked));
Packit 1470ea
  

Aquí se está usando el JavaScript auxiliar Lang. Permite conectar un método de clase a la señal, en vez de una función normal (sin clase) que se haya usado anteriormente para señal hide de la ventana. No se preocupe por esto ahora, es sólo un detalle técnico. Para que funcione, debe poner también la siguiente línea en la parte superior del archivo:

Packit 1470ea
  const Lang = imports.lang;
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="loading3">
Packit 1470ea
  <title>Cargar la imagen: escribir la llamada de retorno de la señal</title>
Packit 1470ea
  

Ahora se puede crear el método _openClicked(). Inserte el siguiente código en el bloque de código de ImageViewer.prototype, después del método _init (y no olvide la coma):

Packit 1470ea
    
Packit 1470ea
  _openClicked: function () {
Packit 1470ea
    var chooser = new Gtk.FileChooserDialog ({title: "Select an image",
Packit 1470ea
                                              action: Gtk.FileChooserAction.OPEN,
Packit 1470ea
                                              transient_for: this.window,
Packit 1470ea
                                              modal: true});
Packit 1470ea
    chooser.add_button (Gtk.STOCK_CANCEL, 0);
Packit 1470ea
    chooser.add_button (Gtk.STOCK_OPEN, 1);
Packit 1470ea
    chooser.set_default_response (1);
Packit 1470ea
Packit 1470ea
    var filter = new Gtk.FileFilter ();
Packit 1470ea
    filter.add_pixbuf_formats ();
Packit 1470ea
    chooser.filter = filter;
Packit 1470ea
Packit 1470ea
    if (chooser.run () == 1)
Packit 1470ea
      this.image.file = chooser.get_filename ();
Packit 1470ea
Packit 1470ea
    chooser.destroy ();
Packit 1470ea
  }
Packit 1470ea
  

Esto es un poco más complicado que todo lo que se ha intentado hasta ahora, así que se puede desglosar:

Packit 1470ea
  <list>
Packit 1470ea
    <item>
Packit 1470ea
      

La línea que comienza por var chooser crear un diálogo <gui>Abrir</gui>, que el usuario puede utilizar para elegir archivos. Se establecen cuatro propiedades: el título del diálogo, la acción (tipo) del diálogo (es un diálogo «open», pero se podría haber usado SAVE si la intención hubiese sido guardar un archivo; transient_for, que establece la ventana padre del diálogo; y modal, que si se establecer a true evita que el usuario pueda pulsar en otra área de la aplicación hasta que no se cierre el diálogo.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

Las dos siguientes líneas añaden los botones <gui>Cancelar</gui> y <gui>Abrir</gui> al diálogo. el segundo argumento del método add_button es el valor (entero) que se devuelve cuando se pulsa el botón: 0 para <gui>Cancelar</gui> y 1 para <gui>Abrir</gui>.

Packit 1470ea
    

Note que se está usando nombres de botones del almacén de GTK, en lugar de escribir manualmente «Cancelar» o «Abrir». La ventaja de usar nombres del almacén es que las etiquetas de los botones ya estarán traducidas en el idioma del usuario.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

set_default_response determina qué botón se activará si el usuario hace una doble pulsación o presiona <key>Intro</key>. En este caso, se usa el botón <gui>Abrir</gui> como predeterminado (que tiene el valor «1»).

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

Las tres líneas siguientes restringen el diálogo <gui>Abrir</gui> para que sólo muestre archivos que se puedan abrir con Gtk.Image. Primero se crea un objeto de filtro; luego se añaden los tipos de archivos soportados por el Gdk.Pixbuf (que incluye la mayoría de los formatos de imagen como PNG y JPEG) al filtro. Por último, se establece que este filtro sea el filtro del diálogo <gui>Abrir</gui>.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

chooser.run muestra el diálogo <gui>Abrir</gui>. El diálogo esperará a que el usuario elija una imagen; cuando lo haga, chooser.run devolverá el valor <output>1</output> (devolvería <output>0</output> si el usuario pulsara <gui>Cancelar</gui>). La sentencia if comprueba esto.

Packit 1470ea
    </item>
Packit 1470ea
    <item>

Asumiendo que el usuario pulsó <gui>Abrir</gui>, la siguiente línea establece la propiedad file de la Gtk.Image al nombre del archivo de imagen seleccionada por el usuario. La Gtk.Image cargará y mostrará la imagen elegida.

Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
    

En la última línea de este método se destruye el diálogo <gui>Abrir</gui> porque ya no se necesita.

Packit 1470ea
    </item>
Packit 1470ea
  </list>
Packit 1470ea
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
<section id="run">
Packit 1470ea
  <title>Ejecutar la aplicación</title>
Packit 1470ea
  

Todo el código que necesita debe estar en su lugar, así que trate de ejecutar el código. Esto debería ser todo; un visor de imágenes completamente funcional (y un completo tour sobre JavaScript y GTK+) en poco tiempo.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="impl">
Packit 1470ea
 <title>Implementación de referencia</title>
Packit 1470ea
 

Si tiene problemas con este tutorial, compare su código con este <link href="image-viewer/image-viewer.js">código de referencia</link>.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="next">
Packit 1470ea
  <title>Siguientes pasos</title>
Packit 1470ea
  

Aquí hay algunas ideas sobre cómo puede extender esta sencilla demostración:

Packit 1470ea
  <list>
Packit 1470ea
   <item>
Packit 1470ea
   

Haga que el usuario selecciona una carpeta en vez de un archivo, y proporcione controles para moverse por todas las imágenes de una carpeta.

Packit 1470ea
   </item>
Packit 1470ea
   <item>
Packit 1470ea
   

Aplicar filtros aleatorios y efectos a la imagen cuando se carga y permitir al usuario guardar la imagen modificada.

Packit 1470ea
   

<link href="http://www.gegl.org/api.html">GEGL</link> proporciona la capacidad de manipular imágenes de manera potente.

Packit 1470ea
   </item>
Packit 1470ea
   <item>
Packit 1470ea
   

Permitir al usuario cargar imágenes desde recursos de red compartidos, escáneres y otras fuentes más complicadas.

Packit 1470ea
   

Puede usar <link href="http://library.gnome.org/devel/gio/unstable/">GIO</link> para gestionar transferencias de archivos de red y similares, y <link href="http://library.gnome.org/devel/gnome-scan/unstable/">GNOME Scan</link> para gestionar el escaneado.

Packit 1470ea
   </item>
Packit 1470ea
  </list>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
</page>