Blame platform-demos/es/02_welcome_to_the_grid.js.page

Packit 1470ea
Packit 1470ea
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:xi="http://www.w3.org/2001/XInclude" type="topic" style="task" id="02_welcome_to_the_grid.js" xml:lang="es">
Packit 1470ea
  <info>
Packit 1470ea
    <link type="guide" xref="beginner.js#tutorials"/>
Packit 1470ea
    <link type="seealso" xref="grid.js"/>
Packit 1470ea
    <link type="seealso" xref="image.js"/>
Packit 1470ea
    <link type="seealso" xref="label.js"/>
Packit 1470ea
    <revision version="0.1" date="2012-07-28" status="draft"/>
Packit 1470ea
Packit 1470ea
    <credit type="author copyright">
Packit 1470ea
      <name>Taryn Fox</name>
Packit 1470ea
      <email its:translate="no">jewelfox@fursona.net</email>
Packit 1470ea
      <years>2012</years>
Packit 1470ea
    </credit>
Packit 1470ea
Packit 1470ea
    <desc>Aprenda cómo distribuir componentes de la IU, como imágenes y etiquetas.</desc>
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>2. Bienvenido a la rejilla</title>
Packit 1470ea
  <synopsis>
Packit 1470ea
    

Este tutorial le mostrará cómo crear widgets básicos, o partes de la interfaz de usuario de GNOME, como imágenes y etiquetas. Después aprenderá cómo ordenarlas en una rejilla, que le permite poner widgets exactamente donde los quiere.

Packit 1470ea
    <note style="warning">

¿Ya ha hecho <link xref="hellognome.js">el primer tutorial en esta serie</link>? Querrá hacerlo antes de continuar.

</note>
Packit 1470ea
  </synopsis>
Packit 1470ea
Packit 1470ea
  <links type="section"/>
Packit 1470ea
Packit 1470ea
  <section id="native">
Packit 1470ea
    <title>Pasar a nativo</title>
Packit 1470ea
Packit 1470ea
    

En el último tutorial, se creó básicamente una ventana de GNOME como marco para una aplicación web. Todo el código específico de GNOME que necesitó aprender trataba del poner la «WebView» (el widget que contenía la aplicación) en una «ApplicationWindow», y decirle que la muestre. La aplicación en sí estaba escrita en HTML y JavaScript, al igual que la mayoría de las páginas en la web.

Packit 1470ea
    

Esta vez, solo se van a usar widgets nativos de GNOME. Un widget sólo es una cosa, como una casilla de verificación o una imagen, y GNOME tiene una amplia variedad para elegir. Se llaman widgets «nativos» para distinguirlos de cosas como el botón y la cabecera en la aplicación web que escribió. Porque en lugar de usar código web, estos van a ser 100% GNOME, usando GTK+.

Packit 1470ea
    <note style="tip">

GTK+ significa «GIMP Toolkit». Es como una caja de herramientas de widgets a la que puede acceder cuando construye sus aplicaciones. Originalmente se escribió para <link href="http://www.gimp.org/">GIMP</link>, que es un editor de imágenes de software libre.

</note>
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="setup">
Packit 1470ea
    <title>Creando la aplicación</title>
Packit 1470ea
Packit 1470ea
    

Antes de sacar ningún widget de la caja de herramientas de GTK+, se necesita escribir el código básico plantilla que la aplicación requiere.

Packit 1470ea
    
Packit 1470ea
#!/usr/bin/gjs
Packit 1470ea
Packit 1470ea
imports.gi.versions.Gtk = '3.0';
Packit 1470ea
const Gtk = imports.gi.Gtk;
Packit 1470ea
Packit 1470ea
    

Esta parte siempre va al inicio del código. Dependiendo de qué va a hacer con él, puede querer declarar más importaciones aquí. Este ejemplo es bastante básico, por lo que esto es todo lo que necesita; «Gtk» para los widgets, usando la versión estable 3.0 de la API.

Packit 1470ea
    

Hablando de eso:

Packit 1470ea
    
Packit 1470ea
class WelcomeToTheGrid {
Packit 1470ea
    // Create the application itself
Packit 1470ea
    constructor() {
Packit 1470ea
        this.application = new Gtk.Application();
Packit 1470ea
Packit 1470ea
        // Connect 'activate' and 'startup' signals to the callback functions
Packit 1470ea
        this.application.connect('activate', this._onActivate.bind(this));
Packit 1470ea
        this.application.connect('startup', this._onStartup.bind(this));
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    // Callback function for 'activate' signal presents windows when active
Packit 1470ea
    _onActivate() {
Packit 1470ea
        this._window.present();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    // Callback function for 'startup' signal builds the UI
Packit 1470ea
    _onStartup() {
Packit 1470ea
        this._buildUI ();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    

Este es el inicio de la aplicación en sí, y la función «_init» que la crea. Le dice a «_buildUI» que cree una «ApplicationWindow», a la que se llamará «_window», y le dice a la ventana que se presente cuando se la necesite.

Packit 1470ea
    

Esta parte, nuevamente, es principalmente copiar y pegar, pero siempre querrá darle a su aplicación un nombre único.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
    // Build the application's UI
Packit 1470ea
    _buildUI() {
Packit 1470ea
Packit 1470ea
        // Create the application window
Packit 1470ea
        this._window = new Gtk.ApplicationWindow({
Packit 1470ea
            application: this.application,
Packit 1470ea
            window_position: Gtk.WindowPosition.CENTER,
Packit 1470ea
            border_width: 10,
Packit 1470ea
            title: "Welcome to the Grid"});
Packit 1470ea
Packit 1470ea
    

Finalmente, se arranca la función «_buildUI» creando una «ApplicationWindow» nueva. Se especifica que va con esta aplicación, que debe aparecer en el centro de la pantalla, y que debe haber al menos 10 píxeles entre el borde exterior y cualquier widget dentro de ella. También se le da un título, que aparecerá en la parte superior de la ventana.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="toolbox">
Packit 1470ea
    <title>Usar la caja de herramientas de GTK+</title>
Packit 1470ea
    

¿Qué widgets deben usarse? Bueno, si quiere escribir una aplicación que se vea así:

Packit 1470ea
Packit 1470ea
    <media type="image" mime="image/png" src="media/02_jsgrid_01.png"/>
Packit 1470ea
Packit 1470ea
    

Necesitará, al menos, una imagen y una etiqueta de texto para acompañarla. Comience con la imagen:

Packit 1470ea
    
Packit 1470ea
        // Create an image
Packit 1470ea
        this._image = new Gtk.Image ({ file: "gnome-image.png" });
Packit 1470ea
Packit 1470ea
Packit 1470ea
    

Puede descargar el archivo de imagen usado en este ejemplo <link href="https://live.gnome.org/TarynFox?action=AttachFile&do=get&target=gnome-image.png">aquí</link>. Asegúrese de ponerlo en la misma carpeta que el código que está escribiendo.

Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Create a label
Packit 1470ea
        this._label = new Gtk.Label ({ label: "Welcome to GNOME, too!" });
Packit 1470ea
Packit 1470ea
    

Ese código añade la etiqueta debajo. Puede ver cómo se crean los widgets aquí; cada uno es una parte de GTK+, y se le pueden dar propiedades que personalizan cómo se comportan. En este caso, se establece la propiedad «file» de la imagen al nombre de archivo de la imagen que se desea, y la propiedad «label» de la etiqueta a la oración que se quiere bajo la imagen.

Packit 1470ea
    <note style="tip">

Sí, suena redundante que un objeto «Label» tenga una propiedad «label», pero no lo es. Otros widgets que contienen texto también tienen una propiedad «label», por lo que es consistente que un widget «Label» también tenga una.

</note>
Packit 1470ea
    

Sin embargo, no se pueden simplemente añadir estos widgets a la ventana en orden, como los elementos HTML aparecen en el orden en el que los escribe. Eso es porque una «ApplicationWindow» sólo puede contener un widget.

Packit 1470ea
    

¿Cómo se resuelve eso? Haciendo que ese widget sea un widget contenedor, que puede contener más de un widget y organizarlos dentro. Observe la rejilla.

Packit 1470ea
    
Packit 1470ea
        // Create the Grid
Packit 1470ea
        this._grid = new Gtk.Grid ();
Packit 1470ea
Packit 1470ea
Packit 1470ea
    

Todavía no se le da ninguna propiedad. Estas vendrán después, cuando aprenda cómo usar los poderes de la rejilla. Primero, adjúntele a su rejilla la imagen y la etiqueta que hizo.

Packit 1470ea
    
Packit 1470ea
        // Attach the image and label to the grid
Packit 1470ea
        this._grid.attach (this._image, 0, 0, 1, 1);
Packit 1470ea
        this._grid.attach (this._label, 0, 1, 1, 1);
Packit 1470ea
Packit 1470ea
Packit 1470ea
    

Este código se ve terriblemente complicado, pero no lo es. Aquí está lo que esos números significan:

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

El primer número es en qué posición de izquierda a derecha se ponen las cosas, comenzando desde 0. Cualquier widget que use un 0 aquí va todo a la izquierda.

</item>
Packit 1470ea
      <item>

El segundo número es en qué posición de arriba a abajo se pone un widget dado, comenzando desde 0. La etiqueta va debajo de la imagen, por lo que se le da a la imagen un 0 y a la etiqueta un 1 aquí.

</item>
Packit 1470ea
      <item>

Los números tercero y cuarto son cuántas columnas y filas debe ocupar un widget. Se verá cómo funciona esto en un minuto.

</item>
Packit 1470ea
    </list>
Packit 1470ea
Packit 1470ea
    
Packit 1470ea
        // Add the grid to the window
Packit 1470ea
        this._window.add (this._grid);
Packit 1470ea
Packit 1470ea
        // Show the window and all child widgets
Packit 1470ea
        this._window.show_all();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
};
Packit 1470ea
Packit 1470ea
// Run the application
Packit 1470ea
let app = new WelcomeToTheGrid ();
Packit 1470ea
app.application.run (ARGV);
Packit 1470ea
Packit 1470ea
    

Ahora que ha creado la rejilla y le ha adjuntado todos los widgets, se añade a la ventana y se le dice que se muestre, como la última parte de la función «_buildUI». Como siempre, para finalizar se crea una instancia nueva de la clase de la aplicación y se le dice que se ejecute.

Packit 1470ea
    

Guarde su aplicación como «welcome_to_the_grid.js». Después, para ejecutar su aplicación simplemente abra una terminal, vaya a la carpeta en la que está, y escriba

Packit 1470ea
      <screen> <output style="prompt">$ </output>gjs welcome_to_the_grid.js </screen>
Packit 1470ea
Packit 1470ea
    <media type="image" mime="image/png" src="media/02_jsgrid_02.png"/>
Packit 1470ea
Packit 1470ea
    

¡Allí va! Pero espere. Eso no se ve bien. ¿Por qué la etiqueta está pegada a la imagen así? Eso no se ve tan bien, y la hace difícil de leer. ¿Qué puede hacer acerca de esto?

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="tweaking">
Packit 1470ea
    <title>Configurar la rejilla</title>
Packit 1470ea
Packit 1470ea
    

Una cosa que puede hacer, es darle a la etiqueta una propiedad «margin_top» cuando la crea. Esto funciona de manera similar a establecer un margen para un elemento HTML usando estilos CSS en línea.

Packit 1470ea
    
Packit 1470ea
        // Create a label
Packit 1470ea
        this._label = new Gtk.Label ({
Packit 1470ea
            label: "Welcome to GNOME, too!",
Packit 1470ea
            margin_top: 20 });
Packit 1470ea
Packit 1470ea
Packit 1470ea
    

Por supuesto, si hace eso y después remplaza la etiqueta con otra cosa (o añade otro widget), entonces tendrá que repetir el «margin_top». De lo contrario, acabará con algo así:

Packit 1470ea
    <media type="image" mime="image/png" src="media/02_jsgrid_03.png"/>
Packit 1470ea
Packit 1470ea
    

Le podría dar una propiedad «margin_bottom» a la imagen, pero no funcionará cuando la etiqueta nueva esté en una columna separada. Entonces, mejor probar esto:

Packit 1470ea
    
Packit 1470ea
        // Create the Grid
Packit 1470ea
        this._grid = new Gtk.Grid ({
Packit 1470ea
            row_spacing: 20 });
Packit 1470ea
Packit 1470ea
Packit 1470ea
    

Eso hace que siempre hayan 20 píxeles de espacio entre cada fila horizontal.

Packit 1470ea
    <note style="tip">

Sí, también puede establecer la propiedad «column_spacing» en una rejilla, o las propiedades «margin_left» y «margin_right» en cualquier widget. Pruébelas, si quiere.

</note>
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="adding">
Packit 1470ea
    <title>Añadir más widgets</title>
Packit 1470ea
Packit 1470ea
    

Si quisiera añadir una segunda etiqueta, ¿cómo lo haría para que realmente se vea integrada? Una manera es centrar la imagen en la parte superior, para que esté encima de ambas etiquetas en lugar de sólo de la que está en la izquierda. Allí es donde los otros números en el método «attach» de la rejilla entran:

Packit 1470ea
    
Packit 1470ea
        // Create a second label
Packit 1470ea
        this._labelTwo = new Gtk.Label ({
Packit 1470ea
            label: "The cake is a pie." });
Packit 1470ea
Packit 1470ea
        // Attach the image and labels to the grid
Packit 1470ea
        this._grid.attach (this._image, 0, 0, 2, 1);
Packit 1470ea
        this._grid.attach (this._label, 0, 1, 1, 1);
Packit 1470ea
        this._grid.attach (this._labelTwo, 1, 1, 1, 1);
Packit 1470ea
Packit 1470ea
Packit 1470ea
    

Después de haber creado la segunda etiqueta, se añade a la rejilla a la derecha de la primera. Recuerde, los primeros dos números cuentan columnas y filas de izquierda a derecha y de arriba a abajo, comenzando desde 0. Por lo que si la primera etiqueta está en la columna 0 y fila 1, se puede poner la segunda en la columna 1 y fila 1 para ponerla a la derecha de la primera.

Packit 1470ea
    

Tenga en cuenta el número 2 en la declaración «attach» de la imagen. Eso es lo que hace el truco. Ese número indica cuántas columnas ocupa la imagen, ¿recuerda? Entonces, cuando se junta todo, se obtiene algo así:

Packit 1470ea
    <media type="image" mime="image/png" src="media/02_jsgrid_04.png"/>
Packit 1470ea
Packit 1470ea
    

Hay dos cosas de las que debe tomar nota, aquí.

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

Configurar la imagen para que ocupe dos columnas no la estrecha en sí horizontalmente. En vez de eso, estrecha la caja invisible que el widget «Image» ocupa para llenar ambas columnas, y luego pone la imagen en el centro de esa caja.

</item>
Packit 1470ea
      <item>

Incluso a pesar de que ha establecido las propiedades «row_spacing» de la rejilla y «border_with» de la ventana de la aplicación, todavía no ha establecido nada que ponga un borde entre las dos etiquetas. Estaban separadas anteriormente cuando la imagen estaba en una sola columna, pero ahora que ocupa ambas GNOME no ve una razón para mantenerlas separadas.

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

Existen por lo menos tres maneras de solucionar esto último. Primero, se puede establecer «margin_left» o «margin_right» en una de las etiquetas:

Packit 1470ea
    <media type="image" mime="image/png" src="media/02_jsgrid_05.png"/>
Packit 1470ea
Packit 1470ea
    

Segundo, se puede establecer la propiedad «column_homogenous» de la rejilla a «true».

Packit 1470ea
    
Packit 1470ea
        // Create the Grid
Packit 1470ea
        this._grid = new Gtk.Grid ({
Packit 1470ea
            column_homogeneous: true,
Packit 1470ea
            row_spacing: 20 });
Packit 1470ea
Packit 1470ea
Packit 1470ea
    

Eso hace que se vea algo así:

Packit 1470ea
    <media type="image" mime="image/png" src="media/02_jsgrid_06.png"/>
Packit 1470ea
Packit 1470ea
    

Y tercero, se puede establecer la propiedad «column_spacing» de la rejilla, de la misma manera que «row_spacing».

Packit 1470ea
    
Packit 1470ea
        // Create the Grid
Packit 1470ea
        this._grid = new Gtk.Grid ({
Packit 1470ea
            column_spacing: 20,
Packit 1470ea
            row_spacing: 20 });
Packit 1470ea
Packit 1470ea
    

Esto hace que se vea así:

Packit 1470ea
    <media type="image" mime="image/png" src="media/02_jsgrid_07.png"/>
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="stock">
Packit 1470ea
    <title>Usar imágenes del almacén</title>
Packit 1470ea
Packit 1470ea
    

GNOME tiene muchas imágenes del almacén disponibles que se pueden usar si no quiere crear las suyas o si quiere usar un icono universalmente reconocido. Aquí se muestra cómo crear una imagen del almacén, comparado con crear una normal:

Packit 1470ea
    
Packit 1470ea
        // Create an image
Packit 1470ea
        this._image = new Gtk.Image ({ file: "gnome-image.png" });
Packit 1470ea
Packit 1470ea
        // Create a second image using a stock icon
Packit 1470ea
        this._icon = new Gtk.Image ({ stock: 'gtk-about' });
Packit 1470ea
Packit 1470ea
    

Después de eso, se añade a la rejilla, a la izquierda de la primera etiqueta (todavía no se usa la segunda en este ejemplo).

Packit 1470ea
    
Packit 1470ea
        // Attach the images and label to the grid
Packit 1470ea
        this._grid.attach (this._image, 0, 0, 2, 1);
Packit 1470ea
        this._grid.attach (this._icon,  0, 1, 1, 1);
Packit 1470ea
        this._grid.attach (this._label, 1, 1, 1, 1);
Packit 1470ea
Packit 1470ea
    

Eso da esto, cuando se ejecuta:

Packit 1470ea
    <media type="image" mime="image/png" src="media/02_jsgrid_08.png"/>
Packit 1470ea
Packit 1470ea
    

Así se ve el icono del almacén «About». Puede ver una lista de todos los elementos del almacén comenzando con «gtk-about» en la <link href="https://developer.gnome.org/gtk3/3.4/gtk3-Stock-Items.html#GTK-STOCK-ABOUT:CAPS">documentación del desarrollador de GNOME</link>. Se escribió para programadores de C, pero no necesita saber C para usarla; simplemente consulte la parte entre comillas, como "gtk-about", y copie esa parte para usar el icono junto a ella.

Packit 1470ea
    <note style="tip">

Se ponen comillas simples alrededor de «gtk-about» aquí porque, a diferencia de cadenas de texto que tienen comillas dobles, esa parte nunca necesitará traducirse a otro lenguaje. En realidad, si se tradujera rompería el icono, porque su nombre todavía es «gtk-about» sin importar el lenguaje en el que habla.

</note>
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
Packit 1470ea
  <section id="next">
Packit 1470ea
    <title>¿Qué viene ahora?</title>
Packit 1470ea
    

Antes de continuar con el siguiente tutorial, intente algo un poco diferente:

Packit 1470ea
    
Packit 1470ea
        // Create a button
Packit 1470ea
        this._button = new Gtk.Button ({
Packit 1470ea
            label: "Welcome to GNOME, too!"});
Packit 1470ea
Packit 1470ea
        // Attach the images and button to the grid
Packit 1470ea
        this._grid.attach (this._image,  0, 0, 2, 1);
Packit 1470ea
        this._grid.attach (this._icon,   0, 1, 1, 1);
Packit 1470ea
        this._grid.attach (this._button, 1, 1, 1, 1);
Packit 1470ea
Packit 1470ea
Packit 1470ea
    

Así es, se convirtió la etiqueta en un botón simplemente cambiándole el nombre. Si ejecuta la aplicación y la pulsa, sin embargo, verá que no hace nada. ¿Cómo hacer para que el botón haga algo? Eso es lo que descubrirá, en <link xref="03_getting_the_signal.js">el próximo tutorial</link>.

Packit 1470ea
    

Si quiere, siéntase libre de experimentar con rejillas, etiquetas, e imágenes, incluyendo imágenes del almacén.

Packit 1470ea
    <note style="tip">

Un truco que puede usar para hacer distribuciones más complejas es anidar rejillas una dentro de otra. Esto le permite agrupar widgets interrelacionados, y reorganizarlos fácilmente. Eche un vistazo a la muestra de código del <link xref="radiobutton.js">botón de radio</link> si quiere ver cómo se hace esto.

</note>
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="complete">
Packit 1470ea
    <title>Código de ejemplo completo</title>
Packit 1470ea
#!/usr/bin/gjs
Packit 1470ea
Packit 1470ea
imports.gi.versions.Gtk = '3.0';
Packit 1470ea
const Gtk = imports.gi.Gtk;
Packit 1470ea
Packit 1470ea
class WelcomeToTheGrid {
Packit 1470ea
Packit 1470ea
    // Create the application itself
Packit 1470ea
    constructor() {
Packit 1470ea
        this.application = new Gtk.Application();
Packit 1470ea
Packit 1470ea
    // Connect 'activate' and 'startup' signals to the callback functions
Packit 1470ea
    this.application.connect('activate', this._onActivate.bind(this));
Packit 1470ea
    this.application.connect('startup', this._onStartup.bind(this));
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    // Callback function for 'activate' signal presents windows when active
Packit 1470ea
    _onActivate() {
Packit 1470ea
        this._window.present();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    // Callback function for 'startup' signal builds the UI
Packit 1470ea
    _onStartup() {
Packit 1470ea
        this._buildUI ();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
    // Build the application's UI
Packit 1470ea
    _buildUI() {
Packit 1470ea
Packit 1470ea
        // Create the application window
Packit 1470ea
        this._window = new Gtk.ApplicationWindow({
Packit 1470ea
            application: this.application,
Packit 1470ea
            window_position: Gtk.WindowPosition.CENTER,
Packit 1470ea
            border_width: 10,
Packit 1470ea
            title: "Welcome to the Grid"});
Packit 1470ea
Packit 1470ea
        // Create the Grid
Packit 1470ea
        this._grid = new Gtk.Grid ({
Packit 1470ea
            // column_homogeneous: true,
Packit 1470ea
            // column_spacing: 20,
Packit 1470ea
            row_spacing: 20 });
Packit 1470ea
Packit 1470ea
        // Create an image
Packit 1470ea
        this._image = new Gtk.Image ({ file: "gnome-image.png" });
Packit 1470ea
Packit 1470ea
        // Create a second image using a stock icon
Packit 1470ea
        this._icon = new Gtk.Image ({ stock: 'gtk-about' });
Packit 1470ea
Packit 1470ea
        // Create a label
Packit 1470ea
        this._label = new Gtk.Label ({
Packit 1470ea
            label: "Welcome to GNOME, too!",
Packit 1470ea
            /* margin_top: 20 */ });
Packit 1470ea
Packit 1470ea
        /* Create a second label
Packit 1470ea
        this._labelTwo = new Gtk.Label ({
Packit 1470ea
            label: "The cake is a pie." }); */
Packit 1470ea
Packit 1470ea
        /* Create a button
Packit 1470ea
        this._button = new Gtk.Button ({
Packit 1470ea
            label: "Welcome to GNOME, too!"}); */
Packit 1470ea
Packit 1470ea
        // Attach the images and button to the grid
Packit 1470ea
        this._grid.attach (this._image,  0, 0, 2, 1);
Packit 1470ea
        this._grid.attach (this._icon,   0, 1, 1, 1);
Packit 1470ea
        this._grid.attach (this._label,  1, 1, 1, 1);
Packit 1470ea
Packit 1470ea
        // this._grid.attach (this._label, 0, 1, 1, 1);
Packit 1470ea
        // this._grid.attach (this._labelTwo, 1, 1, 1, 1);
Packit 1470ea
Packit 1470ea
        // this._grid.attach (this._button, 1, 1, 1, 1);
Packit 1470ea
Packit 1470ea
        // Add the grid to the window
Packit 1470ea
        this._window.add (this._grid);
Packit 1470ea
Packit 1470ea
        // Show the window and all child widgets
Packit 1470ea
        this._window.show_all();
Packit 1470ea
    }
Packit 1470ea
Packit 1470ea
};
Packit 1470ea
Packit 1470ea
// Run the application
Packit 1470ea
let app = new WelcomeToTheGrid ();
Packit 1470ea
app.application.run (ARGV);
Packit 1470ea
Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
</page>