[gnome-maps/wip/mlundblad/transit-routing: 5/7] WIP: Add list box row class for representing transit itineraries



commit 1a00c7ed34cf94a79a93f5bef4a1f83b358c5d76
Author: Marcus Lundblad <ml update uu se>
Date:   Mon May 30 22:34:39 2016 +0200

    WIP: Add list box row class for representing transit itineraries
    
    This list box class is used to render the overview items showing the list of
    found itineraries when performing a transit route search.

 data/org.gnome.Maps.data.gresource.xml |    1 +
 data/ui/transit-itinerary-row.ui       |   73 +++++++++++++++++++++
 src/org.gnome.Maps.src.gresource.xml   |    1 +
 src/transitItineraryRow.js             |  109 ++++++++++++++++++++++++++++++++
 4 files changed, 184 insertions(+), 0 deletions(-)
---
diff --git a/data/org.gnome.Maps.data.gresource.xml b/data/org.gnome.Maps.data.gresource.xml
index 2c9c82d..d859a5b 100644
--- a/data/org.gnome.Maps.data.gresource.xml
+++ b/data/org.gnome.Maps.data.gresource.xml
@@ -31,6 +31,7 @@
     <file preprocess="xml-stripblanks">ui/sidebar.ui</file>
     <file preprocess="xml-stripblanks">ui/social-place-more-results-row.ui</file>
     <file preprocess="xml-stripblanks">ui/social-place-row.ui</file>
+    <file preprocess="xml-stripblanks">ui/transit-itinerary-row.ui</file>
     <file preprocess="xml-stripblanks">ui/user-location-bubble.ui</file>
     <file preprocess="xml-stripblanks">ui/zoom-control.ui</file>
     <file preprocess="xml-stripblanks">ui/zoom-in-notification.ui</file>
diff --git a/data/ui/transit-itinerary-row.ui b/data/ui/transit-itinerary-row.ui
new file mode 100644
index 0000000..7569021
--- /dev/null
+++ b/data/ui/transit-itinerary-row.ui
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8"?>
+<interface>
+  <requires lib="gtk+" version="3.14"/>
+  <template class="Gjs_TransitItineraryRow" parent="GtkListBoxRow">
+    <property name="visible">True</property>
+    <child>
+      <object class="GtkGrid">
+        <property name="visible">True</property>
+        <property name="margin">13</property>
+        <property name="row-spacing">2</property>
+        <child>
+          <object class="GtkLabel" id="timeLabel">
+            <property name="visible">True</property>
+            <property name="expand">True</property>
+            <property name="halign">GTK_ALIGN_START</property>
+          </object>
+          <packing>
+            <property name="top-attach">0</property>
+            <property name="left-attach">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkLabel" id="durationLabel">
+            <property name="visible">True</property>
+            <property name="expand">True</property>
+            <property name="halign">GTK_ALIGN_START</property>
+            <style>
+              <class name="dim-label"/>
+            </style>
+          </object>
+          <packing>
+            <property name="top-attach">0</property>
+            <property name="left-attach">1</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkGrid" id="summaryGrid">
+            <property name="visible">True</property>
+            <property name="expand">True</property>
+            <property name="column-spacing">13</property>
+          </object>
+          <packing>
+            <property name="top-attach">1</property>
+            <property name="left-attach">0</property>
+            <property name="width">2</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkButton" id="selectButton">
+            <property name="visible">True</property>
+            <style>
+              <class name="flat"/>
+              <class name="circular"/>
+            </style>
+            <child>
+              <object class="GtkImage">
+                <property name="visible">True</property>
+                <property name="can-focus">False</property>
+                <property name="icon-name">go-next-symbolic</property>
+                <property name="pixel-size">16</property>
+              </object>
+            </child>
+          </object>
+          <packing>
+            <property name="top-attach">0</property>
+            <property name="left-attach">2</property>
+            <property name="height">2</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </template>
+</interface>
diff --git a/src/org.gnome.Maps.src.gresource.xml b/src/org.gnome.Maps.src.gresource.xml
index 8a9a218..4b6d148 100644
--- a/src/org.gnome.Maps.src.gresource.xml
+++ b/src/org.gnome.Maps.src.gresource.xml
@@ -72,6 +72,7 @@
     <file>socialPlaceMatcher.js</file>
     <file>storedRoute.js</file>
     <file>togeojson/togeojson.js</file>
+    <file>transitItineraryRow.js</file>
     <file>transitOptions.js</file>
     <file>transitPlan.js</file>
     <file>translations.js</file>
diff --git a/src/transitItineraryRow.js b/src/transitItineraryRow.js
new file mode 100644
index 0000000..54f8156
--- /dev/null
+++ b/src/transitItineraryRow.js
@@ -0,0 +1,109 @@
+/* -*- Mode: JS2; indent-tabs-mode: nil; js2-basic-offset: 4 -*- */
+/* vim: set et ts=4 sw=4: */
+/*
+ * Copyright (c) 2016 Marcus Lundblad
+ *
+ * GNOME Maps is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * GNOME Maps is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with GNOME Maps; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * Author: Marcus Lundblad <ml update uu se>
+ */
+
+const Lang = imports.lang;
+
+const Gio = imports.gi.Gio;
+const GLib = imports.gi.GLib;
+const Gtk = imports.gi.Gtk;
+
+// in org.gnome.desktop.interface
+const CLOCK_FORMAT_KEY = 'clock-format';
+
+let _desktopSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.interface' });
+let clockFormat = _desktopSettings.get_string(CLOCK_FORMAT_KEY);
+
+const TransitItineraryRow = new Lang.Class({
+    Name: 'TransitItineraryRow',
+    Extends: Gtk.ListBoxRow,
+    Template: 'resource:///org/gnome/Maps/ui/transit-itinerary-row.ui',
+    InternalChildren: ['timeLabel',
+                       'durationLabel',
+                       'summaryGrid'],
+
+    _init: function(params) {
+        this._itinerary = params.itinerary;
+        delete params.itinerary;
+
+        this.parent(params);
+
+        this._timeLabel.label =
+            _("%s \u2014 %s").format(this._getDepartureTime(),
+                                     this._getArrivalTime());
+        this._durationLabel.label =
+            _("%d minutes").format(this._itinerary.duration / 60);
+
+        this._populateSummary();
+    },
+
+    _getDepartureTime: function() {
+        /* take the itinerary departure time and offset using the timezone
+         * offset of the first leg */
+        let utcTimeWithOffset =
+            (this._itinerary.departure +
+             this._itinerary.legs[0].agencyTimezoneOffset) / 1000;
+        let date = GLib.DateTime.new_from_unix_utc(utcTimeWithOffset);
+
+        if (clockFormat === '24h')
+            return date.format('%R');
+        else
+            return date.format('%r');
+    },
+
+    _getArrivalTime: function() {
+        /* take the itinerary departure time and offset using the timezone
+         * offset of the first leg */
+        let utcTimeWithOffset =
+            (this._itinerary.arrival +
+             this._itinerary.legs[this._itinerary.legs.length - 1].agencyTimezoneOffset) / 1000;
+        let date = GLib.DateTime.new_from_unix_utc(utcTimeWithOffset);
+
+        if (clockFormat === '24h')
+            return date.format('%R');
+        else
+            return date.format('%r');
+    },
+
+    _populateSummary: function() {
+        this._itinerary.legs.forEach((function(leg) {
+            this._summaryGrid.add(this._createLeg(leg));
+        }).bind(this));
+    },
+
+    _createLeg: function(leg) {
+        if (!leg.transit) {
+            /* if this is a non-transit leg (walking), insert a sole icon */
+            return new Gtk.Image({ icon_name: leg.iconName,
+                                   visible: true })
+        } else {
+            /* for transit legs put besides a short route label */
+            let grid = new Gtk.Grid({ visible: true });
+
+            grid.attach(new Gtk.Image({ icon_name: leg.iconName, visible: true }),
+                        0, 0, 1, 1);
+            grid.attach(new Gtk.Label({ label: leg.route, visible: true }),
+                        1, 0, 1, 1);
+
+            return grid;
+        }
+    }
+});


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]