[gnome-maps/wip/mlundblad/transit-routing: 14/28] Add list box row class for representing transit itineraries



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

    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/ui/transit-itinerary-row.ui     |   66 ++++++++++++++++++++++++
 src/org.gnome.Maps.src.gresource.xml |    1 +
 src/transitItineraryRow.js           |   93 ++++++++++++++++++++++++++++++++++
 3 files changed, 160 insertions(+), 0 deletions(-)
---
diff --git a/data/ui/transit-itinerary-row.ui b/data/ui/transit-itinerary-row.ui
new file mode 100644
index 0000000..d4be546
--- /dev/null
+++ b/data/ui/transit-itinerary-row.ui
@@ -0,0 +1,66 @@
+<?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="column_spacing">13</property>
+        <property name="row-spacing">2</property>
+        <child>
+          <object class="GtkLabel" id="timeLabel">
+            <property name="visible">True</property>
+            <property name="expand">False</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">5</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="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>
+          <packing>
+            <property name="top-attach">0</property>
+            <property name="left-attach">2</property>
+            <property name="height">2</property>
+            <property name="width">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 d49957b..7e90e64 100644
--- a/src/org.gnome.Maps.src.gresource.xml
+++ b/src/org.gnome.Maps.src.gresource.xml
@@ -74,6 +74,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>transitRouteLabel.js</file>
diff --git a/src/transitItineraryRow.js b/src/transitItineraryRow.js
new file mode 100644
index 0000000..05a4e7d
--- /dev/null
+++ b/src/transitItineraryRow.js
@@ -0,0 +1,93 @@
+/* -*- 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 Gtk = imports.gi.Gtk;
+
+const TransitRouteLabel = imports.transitRouteLabel;
+
+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 = this._itinerary.prettyPrintTimeInterval();
+        this._durationLabel.label = this._itinerary.prettyPrintDuration();
+
+        this._populateSummary();
+    },
+
+    get itinerary() {
+        return this._itinerary;
+    },
+
+    _populateSummary: function() {
+        /* use compacted route labels when more than 2 legs, to avoid
+         * overflowing the sidebar width */
+        let useCompact = this._itinerary.legs.length > 2;
+        /* don't show the route labels when there are more than 5 legs in an
+         * itinerary */
+        let useContractedLabels = this._itinerary.legs.length > 5;
+        for (let i = 0; i < this._itinerary.legs.length; i++) {
+            let leg = this._itinerary.legs[i];
+
+            this._summaryGrid.add(this._createLeg(leg, useCompact,
+                                                  useContractedLabels));
+            if (i !== this._itinerary.legs.length - 1) {
+                /* add a separator item between itinerary legs */
+                this._summaryGrid.add(new Gtk.Label({ visible: true,
+                                                      label: '-' }))
+            }
+        }
+    },
+
+    _createLeg: function(leg, useCompact, useContractedLabels) {
+        if (!leg.transit || useContractedLabels) {
+            /* if this is a non-transit leg (walking), or in case we should
+             * display only a mode icon (to save space), 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, column_spacing: 2 });
+
+            grid.attach(new Gtk.Image({ icon_name: leg.iconName, visible: true }),
+                        0, 0, 1, 1);
+            grid.attach(new TransitRouteLabel.TransitRouteLabel({ leg: leg,
+                                                                  compact: useCompact,
+                                                                  visible: true }),
+                        1, 0, 1, 1);
+
+            return grid;
+        }
+    }
+});


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