Blame platform-demos/cs/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="cs">
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
  </info>
Packit 1470ea
Packit 1470ea
  <title>Soubor s hlavním programem</title>
Packit 1470ea
  <synopsis>
Packit 1470ea
    

V této části lekce sestavíme hlavní programový soubor aplikace s počasím. Abyste si mohli napsat a spustit kód příkladu sami, budete potřebovat v počítači nainstalovaný editor pro psaní kódu, terminál a GNOME 3.0 nebo novější. V této lekci budeme postupovat následujícími částmi:

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

<link xref="#script">Skript pro spuštění aplikace</link>

</item>
Packit 1470ea
      <item>

<link xref="#imports">Importované knihovny</link>

</item>
Packit 1470ea
      <item>

<link xref="#mainwindow">Vytvoření hlavního okna pro aplikaci</link>

</item>
Packit 1470ea
      <item>

<link xref="#widgets">Přidání mřížky a všech potřebných widgetů do ní</link>

</item>
Packit 1470ea
      <item>

<link xref="#asynccall">Žádání o informace o počasí asynchronně</link>

</item>
Packit 1470ea
      <item>

<link xref="#connectingbuttons">Připojení signálů k tlačítkům a vstupním polím</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>Skript pro spuštění aplikace</title>
Packit 1470ea
    
Packit 1470ea
  #!/usr/bin/gjs
Packit 1470ea
    

Tento řádek říká, jak spustit skript. Musí být prvním řádek v souboru s kódem a soubor musí být spustitelný. Abyste získali práva na spuštění, jděte do terminálu a ve správné složce spusťte: chmod +x název_skriptu. Nebo můžete použít grafického správce souborů. Přejděte do správné složky s vašim kódem, klikněte na soubor s kódem pravým tlačítkem, zvolte vlastnosti, klikněte na kartu oprávnění a zaškrtněte políčko, které povoluje spuštění souboru jako programu.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="imports">
Packit 1470ea
    <title>Importované knihovny</title>
Packit 1470ea
    
Packit 1470ea
var Gtk = imports.gi.Gtk;
Packit 1470ea
const WeatherService = imports.geonames;
Packit 1470ea
    

Abychom získali funkční program, potřebujeme naimportovat GObject Introspection, což je knihovna, kterou využíváme. Pro funkční uživatelské rozhraní potřebujeme také Gtk. Gtk se importuje hned na začátku, takže jej můžeme použít kdekoliv. Importujeme také naši vlastní místní knihovnu geoname napsanou v jazyce JavaScript, protože ji zde využijeme.

Packit 1470ea
    </section>
Packit 1470ea
Packit 1470ea
   <section id="mainwindow">
Packit 1470ea
    <title>Vytvoření hlavního okna pro aplikaci</title>
Packit 1470ea
    
Packit 1470ea
// Inicializuje GTK
Packit 1470ea
Gtk.init(null, 0);
Packit 1470ea
// Vytvoří okno, pojmenuje jej a napojí tlačítko „X“ na funkci pro ukončení
Packit 1470ea
// Pamatujte, že „window“ je rezervované slovo
Packit 1470ea
var weatherwindow = new Gtk.Window({type: Gtk.WindowType.TOPLEVEL});
Packit 1470ea
weatherwindow.title = "Todays weather";
Packit 1470ea
// Okno přijímá jen jeden widget a název. Pro sloužitější struktury slouží Gtk.boxes apod.
Packit 1470ea
weatherwindow.connect("destroy", function(){Gtk.main_quit()});
Packit 1470ea
Packit 1470ea
weatherwindow.show_all();
Packit 1470ea
// A spustí ji
Packit 1470ea
Gtk.main();
Packit 1470ea
  </section>
Packit 1470ea
  <section id="widgets">
Packit 1470ea
  <title>Přidání mřížky a všech potřebných widgetů do ní</title>
Packit 1470ea
  
Packit 1470ea
var grid = new Gtk.Grid();
Packit 1470ea
weatherwindow.add(grid);
Packit 1470ea
Packit 1470ea
// Zde inicializujeme ikony, ale rozhodne se až později v geonames.js.
Packit 1470ea
var weatherIcon = new Gtk.Image();
Packit 1470ea
Packit 1470ea
// Nastaví nějaké popisky do vašeho okna
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
    

V této části vytvoříme mřížku, kterou se chystáme použít k umístění widgetů. Všechna tlačítka, popisky a vstupní pole jsou inicializována a umístěna v mřížce. Jak je vidět z umístění různých widgetů, nemusí se vztahovat jen k jednomu widgetu. V tuto chvíli nemají některé popisky žádný obsah. Ten bude doplněn později. Když aplikaci v této fázi spustíte, budete mít připravené uživatelské rozhraní, ale widgety nabudou nikam napojeny. Z tohoto důvodu potřebujeme nejprve sestavit místní knihovnu pro vyhledávání počasí a pak získávat informace, což chceme dělat asynchronně. Až budeme mít naši místní knihovnu připravenou, můžeme ji napojit na potřebné widgety.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
     <section id="asynccall">
Packit 1470ea
  <title>Žádání o informace o počasí asynchroně</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
    /* Toto funguje trochu jako signály. Tento kód bude spuštěn, kdykoliv budeme
Packit 1470ea
       mít informaci o počasí. */
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
  

Tato funkce je určena k ptaní se na informace o počasí a k odpovídající aktualizaci popisků a ikon. Na začátku této funkce získáme vstup od uživatele udávající, na co se ptát. Takže zde konečně poprvé použijeme naši vlastní knihovnu a přiřadíme ji do proměnné GeoNames. Jakmile přiřadíme WeatherService, předáme ji obsluhu. První co uděláme v GeoNames, je dotaz na počasí. Vše, co se stane po GeoNames.getWeather(function(error, weather), může být jen to, že dostaneme chybovou zprávu nebo informace o počasí. Pokud nic z toho nedorazí, bude zbytek programu normálně fungovat, včetně main_Quit.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="connectingbuttons">
Packit 1470ea
  <title>Připojení signálů k tlačítkům a vstupním polím</title>
Packit 1470ea
  
Packit 1470ea
entry.connect("key_press_event", function(widget, event) {
Packit 1470ea
  if (entry.get_text().length === 4) {
Packit 1470ea
    // To už by stačilo
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
  

A nakonec zde máme propojení, která zajistí, že celá aplikace poběží jak má. Propojíme vstupní pole a tlačítko, aby dělali to stejné, získali informace o počasí. Nebude tak záležet na tom, jestli zmáčknete <key>Enter</key> nebo kliknete na tlačítko <gui>search</gui>.

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

Soubor Weatherapp.js vypadá nějak takto:

Packit 1470ea
  
Packit 1470ea
#!/usr/bin/gjs
Packit 1470ea
// Předchozí řádek je tzv. "hash bang", který říká, jak skript spustit
Packit 1470ea
// Upozorňujeme, že skript musí být spustitelný
Packit 1470ea
// (v terminálu ve správné složce proveďte: chmod +x název_skriptu)
Packit 1470ea
Packit 1470ea
var Gtk = imports.gi.Gtk;
Packit 1470ea
Packit 1470ea
const WeatherService = imports.geonames;
Packit 1470ea
// Připraví vaši vlastní knihovnu ze stejné složky (nastaveno v GJS_PATH)
Packit 1470ea
// Pokud používáte autotools, .desktop se o to postará
Packit 1470ea
Packit 1470ea
// Inicializuje GTK
Packit 1470ea
Gtk.init(null, 0);
Packit 1470ea
// Vytvoří okno, pojmenuje jej a napojí tlačítko „X“ na funkci pro ukončení
Packit 1470ea
// Pamatujte, že „window“ je rezervované slovo
Packit 1470ea
var weatherwindow = new Gtk.Window({type: Gtk.WindowType.TOPLEVEL});
Packit 1470ea
weatherwindow.title = "Todays weather";
Packit 1470ea
// Okno přijímá jen jeden widget a název. Pro sloužitější struktury slouží Gtk.boxes apod.
Packit 1470ea
weatherwindow.connect("destroy", function(){Gtk.main_quit()});
Packit 1470ea
// Zde inicializujeme ikony, ale rozhodne se až později v geonames.js.
Packit 1470ea
Packit 1470ea
var weatherIcon = new Gtk.Image();
Packit 1470ea
Packit 1470ea
// Nastaví nějaké popisky do vašeho okna
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
// Nějaké počasí
Packit 1470ea
Packit 1470ea
entry.connect("key_press_event", function(widget, event) {
Packit 1470ea
  // FIXME: Získat počasí klávesou Enter (key 13)
Packit 1470ea
  if (entry.get_text().length === 4) {
Packit 1470ea
    // To už by stačilo
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
    // Toto funguje trochu jako signály. Tento kód bude spuštěn, kdykoliv budeme mít informaci o počasí
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
// A spustí ji
Packit 1470ea
Gtk.main();
Packit 1470ea
Packit 1470ea
  

Nechte běžet, dokud nebudou připravené všechny soubory autotools:

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

Tento příkaz použijte v terminálu při vývoji svých modulů. Když zavoláte svůj program tímto způsobem, bude vědět, kde má hledat vaše vlastí knihovny v jazyce JavaScript, v tomto případě geonames.js.

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