Blame platform-demos/es/weatherAppMain.js.page

Packit 1470ea
Packit 1470ea
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" type="topic" style="task" id="weatherAppMain.js" xml:lang="es">
Packit 1470ea
  <info>
Packit 1470ea
    <link type="guide" xref="weatherApp.js#main" group="#first"/>
Packit 1470ea
    <revision version="0.1" date="2012-03-09" status="stub"/>
Packit 1470ea
Packit 1470ea
    <credit type="author copyright">
Packit 1470ea
      <name>Susanna Huhtanen</name>
Packit 1470ea
      <email its:translate="no">ihmis.suski@gmail.com</email>
Packit 1470ea
      <years>2012</years>
Packit 1470ea
    </credit>
Packit 1470ea
Packit 1470ea
    <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>El archivo del programa principal</title>
Packit 1470ea
  <synopsis>
Packit 1470ea
    

En esta parte de la guía se construirá el archivo del programa principal de la aplicación del clima. Para escribir y ejecutar todos los ejemplos de código necesita un editor de texto en el que escribir el código, una terminal y GNOME 3 o superior instalado en su equipo. En esta guía se verán las siguientes partes:

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

<link xref="#script">Script para ejecutar la aplicación</link>

</item>
Packit 1470ea
      <item>

<link xref="#imports">Bibliotecas que importar</link>

</item>
Packit 1470ea
      <item>

<link xref="#mainwindow">Crear la ventana principal de la aplicación</link>

</item>
Packit 1470ea
      <item>

<link xref="#widgets">Añadir una rejilla y todos los widgets necesarios en ella</link>

</item>
Packit 1470ea
      <item>

<link xref="#asynccall">Solicitar la información meteorológica de manera asíncrona</link>

</item>
Packit 1470ea
      <item>

<link xref="#connectingbuttons">Conectar las señales a un botón y a una entrada</link>

</item>
Packit 1470ea
      <item>

<link xref="#weatherapp.js">weatherapp.js</link>

</item>
Packit 1470ea
    </list>
Packit 1470ea
  </synopsis>
Packit 1470ea
  <section id="script">
Packit 1470ea
    <title>Script para ejecutar la aplicación</title>
Packit 1470ea
    
Packit 1470ea
  #!/usr/bin/gjs
Packit 1470ea
    

Esta línea indica cómo ejecutar el script. Debe ser la primera línea del código y debe ser ejecutable. Para obtener permisos de ejecución vaya a la terminal y ejecute lo siguiente en la carpeta adecuada: chmod +x nombrescript. También puede usar el gestor de archivo. Simplemente vaya a la carpeta donde está el código, pulse con el botón derecho sobre el archivo de código y elija «Propiedades», pulse en la pestaña «Permisos» y marque la casilla para permitir ejecutar el archivo como un programa.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="imports">
Packit 1470ea
    <title>Bibliotecas que importar</title>
Packit 1470ea
    
Packit 1470ea
var Gtk = imports.gi.Gtk;
Packit 1470ea
const WeatherService = imports.geonames;
Packit 1470ea
    

Para que el programa funcione se debe importar una biblioteca de introspección de GObject. Para que funcione la IU se necesita GTK+, que se importa al inicio, por lo que está en uso en todos los sitios. También se importa la biblioteca local en JavaScript geonames para usarla aquí.

Packit 1470ea
    </section>
Packit 1470ea
Packit 1470ea
   <section id="mainwindow">
Packit 1470ea
    <title>Crear la ventana principal de la aplicación</title>
Packit 1470ea
    
Packit 1470ea
// Initialize the gtk
Packit 1470ea
Gtk.init(null, 0);
Packit 1470ea
//create your window, name it and connect the x to quit function. Remember that window is a taken word
Packit 1470ea
var weatherwindow = new Gtk.Window({type: Gtk.WindowType.TOPLEVEL});
Packit 1470ea
weatherwindow.title = "Todays weather";
Packit 1470ea
//Window only accepts one widget and a title. Further structure with Gtk.boxes of similar
Packit 1470ea
weatherwindow.connect("destroy", function(){Gtk.main_quit()});
Packit 1470ea
Packit 1470ea
weatherwindow.show_all();
Packit 1470ea
//and run it
Packit 1470ea
Gtk.main();
Packit 1470ea
  </section>
Packit 1470ea
  <section id="widgets">
Packit 1470ea
  <title>Añadir una rejilla y todos los widgets necesarios en ella</title>
Packit 1470ea
  
Packit 1470ea
var grid = new Gtk.Grid();
Packit 1470ea
weatherwindow.add(grid);
Packit 1470ea
Packit 1470ea
//We initialize the icon here, but deside the file later in geonames.js.
Packit 1470ea
var weatherIcon = new Gtk.Image();
Packit 1470ea
Packit 1470ea
//Set some labels to your window
Packit 1470ea
var label1 = new Gtk.Label({label: ""});
Packit 1470ea
var label2 = new Gtk.Label({label: "Looking in the sky..."});
Packit 1470ea
var label3 = new Gtk.Label({label: ""});
Packit 1470ea
Packit 1470ea
var entry = new Gtk.Entry();
Packit 1470ea
entry.set_width_chars(4);
Packit 1470ea
entry.set_max_length(4);
Packit 1470ea
var label4 = new Gtk.Label({label: "Enter ICAO station for weather: "});
Packit 1470ea
var button1 = new Gtk.Button({label: "search!"});
Packit 1470ea
Packit 1470ea
grid.attach(label4, 2, 1, 1, 1);
Packit 1470ea
grid.attach_next_to(label1,label4,3,1,1);
Packit 1470ea
grid.attach_next_to(label2,label1,3,1,1);
Packit 1470ea
grid.attach_next_to(label3,label2,3,1,1);
Packit 1470ea
grid.attach_next_to(entry,label4,1,1,1);
Packit 1470ea
grid.attach_next_to(button1,entry,1,1,1);
Packit 1470ea
grid.attach_next_to(weatherIcon,label2,1,1,1)
Packit 1470ea
Packit 1470ea
    

En esta sección se crea la rejilla que se usará para posicionar los widgets. Todos los botones, etiquetas y entradas se inicializan y colocan en la rejilla. Como se puede ver en la colocación de los diferentes widgets, no es necesario relacionarlo con un único widget. En este punto, algunas de las etiquetas no tienen contenido. El contenido para esos widgets se aplica más tarde. Si ejecuta la aplicación en este punto, tendrá lista la IU, pero los widgets no estarán conectados con nada. Para esto, se necesita construir primero la biblioteca de búsqueda de tiempo local, y obtener la información que se necesita de manera asíncrona. Cuando la biblioteca local esté lista, se podrá conectar a los widgets necesarios.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
     <section id="asynccall">
Packit 1470ea
  <title>Solicitar la información meteorológica de manera asíncrona</title>
Packit 1470ea
  
Packit 1470ea
function getWeatherForStation() {
Packit 1470ea
  var station = entry.get_text();
Packit 1470ea
Packit 1470ea
  var GeoNames = new WeatherService.GeoNames(station); //"EFHF";
Packit 1470ea
Packit 1470ea
  GeoNames.getWeather(function(error, weather) {
Packit 1470ea
    //this here works bit like signals. This code will be run when we have weather.
Packit 1470ea
    if (error) {
Packit 1470ea
      label2.set_text("Suggested ICAO station does not exist Try EFHF");
Packit 1470ea
    return; }
Packit 1470ea
    weatherIcon.file = GeoNames.getIcon(weather);
Packit 1470ea
Packit 1470ea
    label1.set_text("Temperature is " + weather.weatherObservation.temperature + " degrees.");
Packit 1470ea
    if (weather.weatherObservation.weatherCondition !== "n/a"){
Packit 1470ea
      label2.set_text("Looks like there is " + weather.weatherObservation.weatherCondition + " in the sky.");
Packit 1470ea
      }
Packit 1470ea
    else {
Packit 1470ea
      label2.set_text("Looks like there is " + weather.weatherObservation.clouds + " in the sky.");
Packit 1470ea
    }
Packit 1470ea
    label3.set_text("Windspeed is " + weather.weatherObservation.windSpeed + " m/s")
Packit 1470ea
    // ...
Packit 1470ea
  });
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
  

Esta función se dedica a llamar a la información meteorológica y a actualizar las etiquetas y los iconos correctamente. Al principio de la función, se obtiene la entrada del usuario para la búsqueda. Por lo tanto, la primera vez se usa la biblioteca propia y se asigna a la variable GeoNames. Al asignar WeatherService se da la estación. Lo primero que se hace con GeoNames es solicitar el tiempo. Todo lo que sucede después de GeoNames.getWeather(function(error, weather) ocurre sólo si se obtiene un mensaje de error o información del tiempo incorrecta. Si no pasa nada de esto, el resto del programa funciona de manera normal, por lo que «main_Quit» funciona.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="connectingbuttons">
Packit 1470ea
  <title>Conectar señales a un botón y a una entrada</title>
Packit 1470ea
  
Packit 1470ea
entry.connect("key_press_event", function(widget, event) {
Packit 1470ea
  if (entry.get_text().length === 4) {
Packit 1470ea
    // Enough is enough
Packit 1470ea
    getWeatherForStation();
Packit 1470ea
  }
Packit 1470ea
  return false;
Packit 1470ea
});
Packit 1470ea
Packit 1470ea
button1.connect("clicked", function(){
Packit 1470ea
  getWeatherForStation();
Packit 1470ea
});
Packit 1470ea
  

Finalmente se tienen las conexiones que hacen que la aplicación completa funcione como debería. Se han conectado la entrada y el botón para que hagan la misma cosa, obtener el tiempo. Por lo tanto, no importa si pulsa el botón o si pulsa «Intro».

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="weatherapp.js">
Packit 1470ea
  <title>Weatherapp.js</title>
Packit 1470ea
  

El archivo Weatherapp.js se parece a esto:

Packit 1470ea
  
Packit 1470ea
#!/usr/bin/gjs
Packit 1470ea
//The previous line is a hash bang tells how to run the script.
Packit 1470ea
// Note that the script has to be executable (run in terminal in the right folder: chmod +x scriptname)
Packit 1470ea
Packit 1470ea
var Gtk = imports.gi.Gtk;
Packit 1470ea
Packit 1470ea
const WeatherService = imports.geonames;
Packit 1470ea
//Bring your own library from same folder (as set in GJS_PATH). If using autotools .desktop will take care of this
Packit 1470ea
Packit 1470ea
// Initialize the gtk
Packit 1470ea
Gtk.init(null, 0);
Packit 1470ea
//create your window, name it and connect the x to quit function. Remember that window is a taken word
Packit 1470ea
var weatherwindow = new Gtk.Window({type: Gtk.WindowType.TOPLEVEL});
Packit 1470ea
weatherwindow.title = "Todays weather";
Packit 1470ea
//Window only accepts one widget and a title. Further structure with Gtk.boxes of similar
Packit 1470ea
weatherwindow.connect("destroy", function(){Gtk.main_quit()});
Packit 1470ea
//We initialize the icon here, but deside the file later in geonames.js.
Packit 1470ea
Packit 1470ea
var weatherIcon = new Gtk.Image();
Packit 1470ea
Packit 1470ea
//Set some labels to your window
Packit 1470ea
var label1 = new Gtk.Label({label: ""});
Packit 1470ea
var label2 = new Gtk.Label({label: "Looking in the sky..."});
Packit 1470ea
var label3 = new Gtk.Label({label: ""});
Packit 1470ea
Packit 1470ea
var grid = new Gtk.Grid();
Packit 1470ea
weatherwindow.add(grid);
Packit 1470ea
Packit 1470ea
var entry = new Gtk.Entry();
Packit 1470ea
entry.set_width_chars(4);
Packit 1470ea
entry.set_max_length(4);
Packit 1470ea
var label4 = new Gtk.Label({label: "Enter ICAO station for weather: "});
Packit 1470ea
var button1 = new Gtk.Button({label: "search!"});
Packit 1470ea
Packit 1470ea
//some weather
Packit 1470ea
Packit 1470ea
entry.connect("key_press_event", function(widget, event) {
Packit 1470ea
  // FIXME: Get weather on enter (key 13)
Packit 1470ea
  if (entry.get_text().length === 4) {
Packit 1470ea
    // Enough is enough
Packit 1470ea
    getWeatherForStation();
Packit 1470ea
  }
Packit 1470ea
  return false;
Packit 1470ea
});
Packit 1470ea
Packit 1470ea
button1.connect("clicked", function(){
Packit 1470ea
  getWeatherForStation();
Packit 1470ea
});
Packit 1470ea
Packit 1470ea
function getWeatherForStation() {
Packit 1470ea
  var station = entry.get_text();
Packit 1470ea
Packit 1470ea
  var GeoNames = new WeatherService.GeoNames(station); //"EFHF";
Packit 1470ea
Packit 1470ea
  GeoNames.getWeather(function(error, weather) {
Packit 1470ea
    //this here works bit like signals. This code will be run when we have weather.
Packit 1470ea
    if (error) {
Packit 1470ea
      label2.set_text("Suggested ICAO station does not exist Try EFHF");
Packit 1470ea
    return; }
Packit 1470ea
    weatherIcon.file = GeoNames.getIcon(weather);
Packit 1470ea
Packit 1470ea
    label1.set_text("Temperature is " + weather.weatherObservation.temperature + " degrees.");
Packit 1470ea
    if (weather.weatherObservation.weatherCondition !== "n/a"){
Packit 1470ea
      label2.set_text("Looks like there is " + weather.weatherObservation.weatherCondition + " in the sky.");
Packit 1470ea
      }
Packit 1470ea
    else {
Packit 1470ea
      label2.set_text("Looks like there is " + weather.weatherObservation.clouds + " in the sky.");
Packit 1470ea
    }
Packit 1470ea
    label3.set_text("Windspeed is " + weather.weatherObservation.windSpeed + " m/s")
Packit 1470ea
    // ...
Packit 1470ea
  });
Packit 1470ea
}
Packit 1470ea
Packit 1470ea
grid.attach(label4, 2, 1, 1, 1);
Packit 1470ea
grid.attach_next_to(label1,label4,3,1,1);
Packit 1470ea
grid.attach_next_to(label2,label1,3,1,1);
Packit 1470ea
grid.attach_next_to(label3,label2,3,1,1);
Packit 1470ea
grid.attach_next_to(entry,label4,1,1,1);
Packit 1470ea
grid.attach_next_to(button1,entry,1,1,1);
Packit 1470ea
grid.attach_next_to(weatherIcon,label2,1,1,1)
Packit 1470ea
weatherwindow.show_all();
Packit 1470ea
//and run it
Packit 1470ea
Gtk.main();
Packit 1470ea
Packit 1470ea
  

Ejecútela hasta que tenga listos todos los archivos de autotools:

Packit 1470ea
Packit 1470ea
  <screen> <output style="prompt">$ </output><input> GJS_PATH=`pwd` gjs weatherapp.js</input></screen>
Packit 1470ea
  

Use este comando en la terminal cuando desarrolle sus módulos. Al llamar a su programa de este modo, sabe dónde encontrar las bibliotecas de JavaScript personalizadas, (geonames.js en este caso).

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