Blame platform-demos/es/image-viewer.vala.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.vala" xml:lang="es">
Packit 1470ea
Packit 1470ea
  <info>
Packit 1470ea
  <title type="text">Visor de imágenes (Vala)</title>
Packit 1470ea
    <link type="guide" xref="vala#examples"/>
Packit 1470ea
Packit 1470ea
    <desc>Algo más que una sencilla aplicación «Hola mundo» en GTK+.</desc>
Packit 1470ea
Packit 1470ea
    <revision pkgversion="0.1" version="0.1" date="2011-03-18" status="review"/>
Packit 1470ea
    <credit type="author">
Packit 1470ea
      <name>Proyecto de documentación de GNOME</name>
Packit 1470ea
      <email its:translate="no">gnome-doc-list@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="author">
Packit 1470ea
      <name>Philip Chimento</name>
Packit 1470ea
      <email its:translate="no">philip.chimento@gmail.com</email>
Packit 1470ea
    </credit>
Packit 1470ea
    <credit type="editor">
Packit 1470ea
     <name>Tiffany Antopolski</name>
Packit 1470ea
     <email its:translate="no">tiffany.antopolski@gmail.com</email>
Packit 1470ea
    </credit>
Packit 1470ea
  <credit type="editor">
Packit 1470ea
    <name>Marta Maria Casetti</name>
Packit 1470ea
    <email its:translate="no">mmcasetti@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
<synopsis>
Packit 1470ea
  

En este tutorial se va a crear un programa que abre un archivo de imagen y lo muestra. Aprenderá a:

Packit 1470ea
  <list type="numbered">
Packit 1470ea
    <item>

Cómo configurar un proyecto básico usando el <link xref="getting-ready">EID Anjuta</link>.

</item>
Packit 1470ea
    <item>

Cómo escribir una <link href="http://developer.gnome.org/platform-overview/stable/gtk">aplicación de GTK+</link> en Vala

</item>
Packit 1470ea
    <item>

Algunos conceptos básicos de programación en <link href="http://developer.gnome.org/gobject/stable/">GObject</link>

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

Necesitará lo siguiente para poder seguir este tutorial:

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

Conocimiento básico del lenguaje de programación <link href="https://live.gnome.org/Vala/Tutorial">Vala</link>.

</item>
Packit 1470ea
    <item>

Una copia instalada de <app>Anjuta</app>.

</item>
Packit 1470ea
    <item>

Puede que la referencia de la API de <link href="http://valadoc.org/gtk+-3.0/">gtk+-3.0</link> le resulte útil, aunque no es necesaria para seguir el tutorial.

</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 <app>Anjuta</app> y pulse <gui>Crear un proyecto nuevo</gui> o <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
      

En la pestaña <gui>Vala</gui> seleccione <gui>GTK+ (simple)</gui>, pulse <gui>Continuar</gui>, y rellene los detalles en las siguientes páginas. Use <file>visor-imagenes</file> como nombre del proyecto y de la carpeta.

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

Asegúrese de que <gui>Usar GtkBuilder para la interfaz del usuario</gui> está desactivado, ya que, en este tutorial, la IU se creará manualmente.

Packit 1470ea
     <note>

Aprenderá a usar el constructor de interfaces en el tutorial del <link xref="guitar-tuner.vala">afinador de guitarra</link>.

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

Pulse <gui>Continuar</gui> y luego <gui>Aplicar</gui> y se creará el proyecto. Abra <file>src/visor-imagenes.vala</file> desde las pestañas <gui>Proyecto</gui> o <gui>Archivo</gui>. Verá el siguiente código:

Packit 1470ea
      
Packit 1470ea
using GLib;
Packit 1470ea
using Gtk;
Packit 1470ea
Packit 1470ea
public class Main : Object
Packit 1470ea
{
Packit 1470ea
Packit 1470ea
	public Main ()
Packit 1470ea
	{
Packit 1470ea
		Window window = new Window();
Packit 1470ea
		window.set_title ("Hello World");
Packit 1470ea
		window.show_all();
Packit 1470ea
		window.destroy.connect(on_destroy);
Packit 1470ea
	}
Packit 1470ea
Packit 1470ea
	public void on_destroy (Widget window)
Packit 1470ea
	{
Packit 1470ea
		Gtk.main_quit();
Packit 1470ea
	}
Packit 1470ea
Packit 1470ea
	static int main (string[] args)
Packit 1470ea
	{
Packit 1470ea
		Gtk.init (ref args);
Packit 1470ea
		var app = new Main ();
Packit 1470ea
Packit 1470ea
		Gtk.main ();
Packit 1470ea
Packit 1470ea
		return 0;
Packit 1470ea
	}
Packit 1470ea
}
Packit 1470ea
    </item>
Packit 1470ea
  </steps>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="build">
Packit 1470ea
  <title>Construir el código por primera vez</title>
Packit 1470ea
  

El código carga una ventana (vacía) desde el archivo de descripción de interfaz de usuario y la muestra. Se ofrecen más detalles a continuación; omita esta lista si entiende los conceptos básicos:

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

Las dos líneas using importan espacios de nombres, por lo que no hay que nombrarlas explícitamente.

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

El constructor de la clase Main crea una ventana (vacía) nueva y conecta una <link href="https://live.gnome.org/Vala/SignalsAndCallbacks">señal</link> para salir de la aplicación cuando se cierra esa ventana.

Packit 1470ea
      

Conectar señales es como se define lo que pasa cuando pulsa un botón, o cuando ocurre algún otro evento. Aquí, se llama a la función destroy (y se sale de la aplicación) cuando cierra la ventana.

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

La función static main se ejecuta de manera predeterminada cuando inicia una aplicación en Vala. Llama a algunas funciones que crean la clase Main y configuran y ejecutan la aplicación. La función <link href="http://valadoc.org/gtk+-3.0/Gtk.main.html">Gtk.main</link> inicia el <link href="http://en.wikipedia.org/wiki/Event_loop">bucle principal</link> de GTK+, que ejecuta la interfaz de usuario y empieza a escuchar eventos (como pulsaciones del ratón y del teclado).

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

Este código está listo para usarse, por lo que puede compilarlo pulsando <guiseq><gui>Construir</gui><gui>Construir proyecto</gui></guiseq> (o pulsando <keyseq><key>Mayús</key><key>F7</key></keyseq>).

Packit 1470ea
  

Cambie la <gui>Configuración</gui> a <gui>Predeterminada</gui> y pulse <gui>Ejecutar</gui> para configurar la carpeta de construcción. Sólo necesita hacer esto una vez, para la primera construcción.

Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="ui">
Packit 1470ea
  <title>Crear la interfaz de usuario</title>
Packit 1470ea
  

Ahora se dará vida a la ventana vacía. GTK+ organiza la interfaz de usuario con varios <link href="http://www.valadoc.org/gtk+-2.0/Gtk.Container.html">Gtk.Container</link> que pueden contener otros widgets e incluso otros contenedores. Aquí se usará el contenedor más sencillo disponible, una <link href="http://unstable.valadoc.org/gtk+-2.0/Gtk.Box.html">Gtk.Box</link>.

Packit 1470ea
Packit 1470ea

Añada las siguientes líneas a la parte superior de la clase Main:

Packit 1470ea
  
Packit 1470ea
private Window window;
Packit 1470ea
private Image image;
Packit 1470ea
Packit 1470ea
Packit 1470ea

Ahora reemplace el constructor actual con el siguiente:

Packit 1470ea
Packit 1470ea
Packit 1470ea
public Main () {
Packit 1470ea
Packit 1470ea
	window = new Window ();
Packit 1470ea
	window.set_title ("Image Viewer in Vala");
Packit 1470ea
Packit 1470ea
	// Set up the UI
Packit 1470ea
	var box = new Box (Orientation.VERTICAL, 5);
Packit 1470ea
	var button = new Button.with_label ("Open image");
Packit 1470ea
	image = new Image ();
Packit 1470ea
Packit 1470ea
	box.pack_start (image, true, true, 0);
Packit 1470ea
	box.pack_start (button, false, false, 0);
Packit 1470ea
	window.add (box);
Packit 1470ea
Packit 1470ea
	// Show open dialog when opening a file
Packit 1470ea
	button.clicked.connect (on_open_image);
Packit 1470ea
Packit 1470ea
	window.show_all ();
Packit 1470ea
	window.destroy.connect (main_quit);
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
  <steps>
Packit 1470ea
    <item>
Packit 1470ea
      

Las dos primeras líneas son partes de la IGU a las que se debe acceder desde más de un método. Se declaran aquí, por lo que son accesibles mediante la clase en vez de serlo solamente en el método en el que se crearon.

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

Las primeras líneas del constructor crean la ventana vacía. Las siguientes líneas crean los widgets que se quieren usar: un botón para abrir una imagen, el widget de la vista de la imagen en sí y la caja que se usará como contenedor.

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

Las llamadas a <link href="http://unstable.valadoc.org/gtk+-2.0/Gtk.Box.pack_start.html">pack_start</link> añaden los dos widgets a la caja y definen su comportamiento. La imagen se expandirá en cualquier espacio disponible, mientras que el botón será tan grande como se necesite. Se dará cuenta de que no se establecen tamaños explícitos de los widgets. Generalmente, en GTK+ no se necesita ya que hace que sea mucho más sencillo tener una distribución que se ve bien con diferentes tamaños de la ventana. A continuación, se añade la caja a la ventana.

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

Se debe definir qué pasa cuando el usuario pulsa en el botón. GTK+ usa el concepto de señales.

Packit 1470ea
      

Cuando se pulsa el <link href="http://valadoc.org/gtk+-3.0/Gtk.Button.html">botón</link> se emite la señal <link href="http://valadoc.org/gtk+-3.0/Gtk.Button.clicked.html">clicked</link>, que se puede conectar a alguna acción (definida en un método de un <link href="https://live.gnome.org/Vala/SignalsAndCallbacks">retorno de la llamada</link>).

Packit 1470ea
      

Esto se hace usando el método connect de la señal clicked de los botones, que en este caso indica a GTK+ que llame al método del retorno de la llamada on_image_open (todavía no definida) cuando se pulsa el botón. El retorno de la llamada se definirá en la siguiente sección.

Packit 1470ea
      

En el retorno de la llamada, se debe acceder a los widgets window y image que es por lo que se definen como miembros privados en la parte superior de la clase.

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

La última llamada a connect asegura que la aplicación termina cuando se cierra la ventana. El código generado por Anjuta llamaba a un método on_destroy que llamaba a <link href="http://www.valadoc.org/gtk+-2.0/Gtk.main_quit.html">Gtk.main_quit</link>, pero simplemente conectando la señal main_quit directamente es más fácil. Puede eliminar el método on_destroy.

Packit 1470ea
    </item>
Packit 1470ea
  </steps>
Packit 1470ea
</section>
Packit 1470ea
Packit 1470ea
<section id="image">
Packit 1470ea
  <title>Mostrar la imagen</title>
Packit 1470ea
  

Ahora se definirá el manejador de la señal clicked para el botón mencionado anteriormente. Añada este código después del constructor.

Packit 1470ea
  
Packit 1470ea
public void on_open_image (Button self) {
Packit 1470ea
	var filter = new FileFilter ();
Packit 1470ea
	var dialog = new FileChooserDialog ("Open image",
Packit 1470ea
	                                    window,
Packit 1470ea
	                                    FileChooserAction.OPEN,
Packit 1470ea
	                                    Stock.OK,     ResponseType.ACCEPT,
Packit 1470ea
	                                    Stock.CANCEL, ResponseType.CANCEL);
Packit 1470ea
	filter.add_pixbuf_formats ();
Packit 1470ea
	dialog.add_filter (filter);
Packit 1470ea
Packit 1470ea
	switch (dialog.run ())
Packit 1470ea
	{
Packit 1470ea
		case ResponseType.ACCEPT:
Packit 1470ea
			var filename = dialog.get_filename ();
Packit 1470ea
			image.set_from_file (filename);
Packit 1470ea
			break;
Packit 1470ea
		default:
Packit 1470ea
			break;
Packit 1470ea
	}
Packit 1470ea
	dialog.destroy ();
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
  

Esto es un poco más complicado, así que se puede desglosar:

Packit 1470ea
  <note>

Un manejador de señal es un tipo de método de retorno de la llamada al que se llama cuando se emite la señal. Aquí se usan los términos intercambiados.

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

El primer argumento del método del retorno de la llamada es siempre el widget que envía la señal. A veces hay otros argumentos relativos a la señal que vienen después, pero clicked no tiene ninguno.

Packit 1470ea
      

En este caso, el button envía la señal clicked, que se conecta al método del retorno de la llamada on_open_image:

Packit 1470ea
Packit 1470ea
        button.clicked.connect (on_open_image);
Packit 1470ea
Packit 1470ea
Packit 1470ea
  

El método on_open_image toma como argumento el botón que ha emitido la señal:

Packit 1470ea
 
Packit 1470ea
        public void on_open_image (Button self)
Packit 1470ea
Packit 1470ea
    </item>
Packit 1470ea
    <item>
Packit 1470ea
      

La siguiente línea interesante es en la que se crea el diálogo para elegir el archivo. El constructor de <link href="http://www.valadoc.org/gtk+-3.0/Gtk.FileChooserDialog.html">FileChooserDialog</link> toma el título del diálogo, la ventana padre del diálogo y varias opciones como el número de botones y sus valores correspondientes.

Packit 1470ea
      

Tenga en cuenta que se está usando nombres de botones del <link href="http://unstable.valadoc.org/gtk+-3.0/Gtk.Stock.html">almacén</link> 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
      

Las dos líneas siguientes restringen el diálogo <gui>Abrir</gui> para que sólo muestre archivos que se puedan abrir con GtkImage. GtkImage es un widget que muestra una imagen. Primero se crea un objeto; luego se añaden los tipos de archivos soportados por el <link href="http://www.valadoc.org/gdk-pixbuf-2.0/Gdk.Pixbuf.html">Gdk.Pixbuf</link> (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
      

<link href="http://www.valadoc.org/gtk+-3.0/Gtk.Dialog.run.html">dialog.run</link> muestra el diálogo <gui>Abrir</gui>. El diálogo esperará a que el usuario seleccione una imagen; cuando lo haga, dialog.run devolverá el valor ResponseType.ACCEPT de <link href="http://www.valadoc.org/gtk+-3.0/Gtk.ResponseType.html">ResponseType</link> (devolvería ResponseType.CANCEL si el usuario pulsara <gui>Cancel</gui>). La sentencia switch comprueba esto.

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

Asumiendo que el usuario pulsó <gui>Abrir</gui>, las siguientes líneas obtienen el nombre de archivo de la imagen seleccionada por el usuario e indican al widget GtkImage que cargue y muestre 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
      

Al destruir se oculta el diálogo automáticamente.

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

Todo el código debería estar listo para ejecutarse. Pulse <guiseq><gui>Construir</gui><gui>Construir proyecto</gui></guiseq> para construir todo otra vez y pulse <guiseq><gui>Ejecutar</gui><gui>Ejecutar</gui></guiseq> para iniciar la aplicación.

Packit 1470ea
  

Si todavía no lo ha hecho, elija la aplicación <file>src/visor-imagenes</file> en el diálogo que aparece. Finalmente, pulse <gui>Ejecutar</gui> y disfrute.

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.vala">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>

Configúrela de tal manera que la ventana se abra con un tamaño determinado. Por ejemplo, 200x200 píxeles.

</item>
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>