Blame platform-demos/el/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="el">
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>Ελληνική μεταφραστική ομάδα GNOME</mal:name>
Packit 1470ea
      <mal:email>team@gnome.gr</mal:email>
Packit 1470ea
      <mal:years>2012-2015</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>Δημήτρης Σπίγγος</mal:name>
Packit 1470ea
      <mal:email>dmtrs32@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>Μαρία Θουκιδίδου</mal:name>
Packit 1470ea
      <mal:email>marablack3@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2014</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>Θάνος Τρυφωνίδης</mal:name>
Packit 1470ea
      <mal:email>tomtryf@gmail.com</mal:email>
Packit 1470ea
      <mal:years>2014, 2015</mal:years>
Packit 1470ea
    </mal:credit>
Packit 1470ea
  </info>
Packit 1470ea
Packit 1470ea
  <title>Το κύριο αρχείο του προγράμματος</title>
Packit 1470ea
  <synopsis>
Packit 1470ea
    

Σε αυτό το τμήμα του οδηγού θα κατασκευάσουμε το κύριο αρχείο του προγράμματος της εφαρμογής καιρού. Για να γράψετε και να τρέξετε όλα τα παραδείγματα κώδικα οι ίδιοι, χρειαζόσαστε έναν επεξεργαστή για το γράψιμο του κώδικα, τερματικό και GNOME 3 ή μεταγενέστερο εγκατεστημένο στον υπολογιστή σας. Σε αυτό το τμήμα θα εξετάσουμε τα παρακάτω μέρη:

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

<link xref="#script">Σενάριο για εκτέλεση της εφαρμογής</link>

</item>
Packit 1470ea
      <item>

<link xref="#imports">Βιβλιοθήκες για εισαγωγή</link>

</item>
Packit 1470ea
      <item>

<link xref="#mainwindow">Δημιουργία του κύριου παραθύρου για την εφαρμογή</link>

</item>
Packit 1470ea
      <item>

<link xref="#widgets">Προσθήκη πλέγματος και όλων των απαραίτητων γραφικών στοιχείων σε αυτό</link>

</item>
Packit 1470ea
      <item>

<link xref="#asynccall">Αίτηση των πληροφοριών καιρού ασύγχρονα</link>

</item>
Packit 1470ea
      <item>

<link xref="#connectingbuttons">Σύνδεση σημάτων σε κουμπί και καταχώριση</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>Σενάριο για εκτέλεση της εφαρμογής</title>
Packit 1470ea
    
Packit 1470ea
  #!/usr/bin/gjs
Packit 1470ea
    

Αυτή η γραμμή λέει πώς θα εκτελεστεί το σενάριο. Πρέπει να είναι η πρώτη γραμμή του κώδικα και να είναι εκτελέσιμη. Για λήψη των δικαιωμάτων εκτέλεσης πηγαίνετε στον τερματικό και εκτελέστε στον σωστό φάκελο: chmod +x όνομα σεναρίου. Ή μπορείτε να χρησιμοποιήσετε τον διαχειριστή αρχείου γραφικών. Απλά πηγαίνετε στον σωστό φάκελο όπου είναι ο κώδικας σας δεξί κλικ στο αρχείο του κώδικα σας, επιλέξτε ιδιότητες, κλικ στην καρτέλα δικαιωμάτων και σημειώστε το πλαίσιο για να επιτραπεί η εκτέλεση του αρχείου ως πρόγραμμα

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="imports">
Packit 1470ea
    <title>Βιβλιοθήκες για εισαγωγή</title>
Packit 1470ea
    
Packit 1470ea
var Gtk = imports.gi.Gtk;
Packit 1470ea
const WeatherService = imports.geonames;
Packit 1470ea
    

Για να έχουμε ένα αποτελεσματικό πρόγραμμα χρειαζόμαστε να εισάγουμε μια βιβλιοθήκη GObject αυτανάλυσης για χρήση. Για χρήση UI, χρειαζόμαστε Gtk. Το Gtk εισάγεται στην αρχή, έτσι το έχουμε για χρήση παντού. Εισάγουμε επίσης τη δικιά μας τοπική βιβλιοθήκη JavaScript geonames για να χρησιμοποιηθεί εδώ.

Packit 1470ea
    </section>
Packit 1470ea
Packit 1470ea
   <section id="mainwindow">
Packit 1470ea
    <title>Δημιουργία του κύριου παραθύρου για την εφαρμογή</title>
Packit 1470ea
    
Packit 1470ea
// Αρχικοποίηση της gtk
Packit 1470ea
Gtk.init(null, 0);
Packit 1470ea
//Δημιουργία του παραθύρου σας, ονομασία του και σύνδεσή του x με τη συνάρτηση εξόδου. Να θυνάστε ότι το παράθυρο είναι μια δεδομένη λέξη
Packit 1470ea
var weatherwindow = new Gtk.Window({type: Gtk.WindowType.TOPLEVEL});
Packit 1470ea
weatherwindow.title = "Todays weather";
Packit 1470ea
//Το παράθυρο δέχεται μόνο ένα γραφικό στοιχείο και έναν τίτλο. Παραπέρα δομή με παρόμοια Gtk.boxes
Packit 1470ea
weatherwindow.connect("destroy", function(){Gtk.main_quit()});
Packit 1470ea
Packit 1470ea
weatherwindow.show_all();
Packit 1470ea
//και εκτέλεσή του
Packit 1470ea
Gtk.main();
Packit 1470ea
  </section>
Packit 1470ea
  <section id="widgets">
Packit 1470ea
  <title>Προσθήκη πλέγματος και όλων των απαραίτητων γραφικών στοιχείων σε αυτό</title>
Packit 1470ea
  
Packit 1470ea
var grid = new Gtk.Grid();
Packit 1470ea
weatherwindow.add(grid);
Packit 1470ea
Packit 1470ea
//Αρχικοποιούμε εδώ το εικονίδιο, αλλά αποφασίζει το αρχείο αργότερα στο geonames.js.
Packit 1470ea
var weatherIcon = new Gtk.Image();
Packit 1470ea
Packit 1470ea
//Ορισμός μερικών ετικετών στο παράθυρό σας
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
    

In this section we create the grid we are going to use for positioning the widgets. All the buttons, labels and entries are initialized and placed on the grid. As seen from the placing of the different widgets, they don't need to be related only to one widget. At this point some of the labels don't have any content. The content for those widgets is applied later. If you run the application at this stage, you have the UI ready, but the widgets are not connected to anything. For this we need to first build the weather searching local library, and then get the information we need asynchronously. When we have our local library ready we can connect it to the necessary widgets.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
     <section id="asynccall">
Packit 1470ea
  <title>Αίτηση των πληροφοριών καιρού ασύγχρονα</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
    //Αυτό εδώ δουλεύει λίγο σαν σήματα. Αυτός ο  κώδικας θα εκτελεστεί όταν έχουμε καιρό.
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
  

Αυτή η λειτουργία αφιερώνεται στην κλήση για τις πληροφορίες καιρού και ενημέρωση ετικετών και εικονιδίων ανάλογα. Στην αρχή της λειτουργίας παίρνουμε την είσοδο χρήστη για αναζήτηση. Έτσι εδώ για την πρώτη φορά χρησιμοποιούμε τη δική μας βιβλιοθήκη και τις αποδίδουμε τη μεταβλητή GeoNames. Ενώ εκχωρούμε την WeatherService της δίνουμε τον σταθμό. Το πρώτο πράγμα που κάνουμε με τα GeoNames είναι η αίτηση καιρού. Οτιδήποτε μετά τα GeoNamesgetWeather.getWeather (συνάρτηση (σφάλμα, καιρός) συμβαίνει μόνο εάν είτε πάρουμε ένα μήνυμα σφάλματος ή πληροφορίες καιρού. Εάν δεν έρθει κανένα, το υπόλοιπο του προγράμματος δουλεύει τόσο κανονικά, όσο το main_Quit δουλεύει.

Packit 1470ea
  </section>
Packit 1470ea
Packit 1470ea
  <section id="connectingbuttons">
Packit 1470ea
  <title>Σύνδεση σημάτων σε κουμπί και καταχώριση.</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
  

Και τελικά έχουμε τις συνδέσεις που κάνουν όλη την εφαρμογή να τρέχει όπως θα έπρεπε. Συνδέουμε και την καταχώριση και το κουμπί για να κάνουν το ίδιο πράγμα, παίρνοντας τον καιρό. Έτσι δεν πειράζει, εάν πατήσετε εάν πατήσετε εισαγωγή ή κλικ στο κουμπί αναζήτησης.

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

Το αρχείο Weatherapp.js μοιάζει με αυτό:

Packit 1470ea
  
Packit 1470ea
#!/usr/bin/gjs
Packit 1470ea
//Η προηγούμενη γραμμή αρχίζει με δίεση-θαυμαστικό που λέει π να εκτελεστεί το σενάριο.
Packit 1470ea
// Σημειώστε ότι το σενάριο πρέπει να είναι εκτελέσιμο (εκτέλεση σε τερματικό στον δεξιό φάκελο: chmod +x scriptname)
Packit 1470ea
Packit 1470ea
var Gtk = imports.gi.Gtk;
Packit 1470ea
Packit 1470ea
const WeatherService = imports.geonames;
Packit 1470ea
//Μεταφορά της δικής σας βιβλιοθήκης από τον ίδιο φάκελο (όπως ορίστηκε στο GJS_PATH). Αν χρησιμοποιείτε autotools .desktop θα φροντίσει για αυτό
Packit 1470ea
Packit 1470ea
// Αρχικοποίηση της gtk
Packit 1470ea
Gtk.init(null, 0);
Packit 1470ea
//Δημιουργία του παραθύρου σας, ονομασία του, και σύνδεση του x με τη συνάρτηση εξόδου. Να θυμάστε ότι το παράθυρο είναι μια δεσμευμένη λέξη
Packit 1470ea
var weatherwindow = new Gtk.Window({type: Gtk.WindowType.TOPLEVEL});
Packit 1470ea
weatherwindow.title = "Todays weather";
Packit 1470ea
//Το παράθυρο δέχεται μόνο ένα γραφικό στοιχείο και έναν τίτλο. Παραπέρα δομή όμοια μεGtk.boxes
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
//Ορισμός μερικών ετικετών στο παράθυρό σας
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
//Κάποιος καιρός
Packit 1470ea
Packit 1470ea
entry.connect("key_press_event", function(widget, event) {
Packit 1470ea
  // FIXME: Λήψη καιρού με την εισαγωγή (πλήκτρο 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
    //Αυτό εδώ δουλεύει λίγο σαν σήματα. Αυτός ο κώδικας θα εκτελεστεί όταν έχουμε καιρό.
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
//και εκτέλεσή του
Packit 1470ea
Gtk.main();
Packit 1470ea
Packit 1470ea
  

Εκτέλεση μέχρι να έχετε όλα τα αρχεία autotools έτοιμα. :

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

Χρησιμοποιήστε αυτήν την εντολή στο τερματικό ενώ αναπτύσσετε τα αρθρώματά σας. Όταν καλείτε το πρόγραμμά σας με αυτόν τον τρόπο, ξέρει πού θα βρει τις προσαρμοσμένες JSlibraries, σε αυτήν την περίπτωση το geonames.js.

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