3 """Public transport information for Vienna"""
5 __author__ = 'kelvan <kelvan@logic.at>'
7 __website__ = 'https://github.com/kelvan/gotoVienna/'
8 __license__ = 'GNU General Public License v3 or later'
10 from datetime import datetime
14 from PySide.QtCore import QAbstractListModel, QModelIndex, QObject, Slot, Signal
15 from PySide.QtGui import QApplication
16 from PySide.QtDeclarative import QDeclarativeView
18 from gotovienna.utils import *
19 from gotovienna.realtime import *
26 class GotoViennaListModel(QAbstractListModel):
27 def __init__(self, objects=None):
28 QAbstractListModel.__init__(self)
31 self._objects = objects
32 self.setRoleNames({0: 'modelData'})
34 def set_objects(self, objects):
35 self._objects = objects
37 def get_objects(self):
40 def get_object(self, index):
41 return self._objects[index.row()]
43 def rowCount(self, parent=QModelIndex()):
44 return len(self._objects)
46 def data(self, index, role):
49 return self.get_object(index)
55 QObject.__init__(self)
56 self.itip = ITipParser()
59 # Read line names in categorized/sorted order
60 for _, lines in categorize_lines(self.itip.lines):
61 self.lines.extend(lines)
63 self.current_line = ''
64 self.current_stations = []
65 self.current_departures = []
67 @Slot(int, result=str)
68 def get_direction(self, idx):
69 return self.current_stations[idx][0]
71 @Slot(str, str, result='QStringList')
72 def get_stations(self, line, direction):
73 print 'line:', line, 'current line:', self.current_line
74 for dx, stations in self.current_stations:
75 print 'dx:', dx, 'direction:', direction
77 return [stationname for stationname, url in stations]
79 return ['no stations found']
81 directionsLoaded = Signal()
84 def load_directions(self, line):
86 stations = sorted(self.itip.get_stations(line).items())
88 self.current_line = line
89 self.current_stations = stations
91 self.directionsLoaded.emit()
93 threading.Thread(target=load_async).start()
95 departuresLoaded = Signal()
98 def load_departures(self, url):
100 self.current_departures = [x.get_ftime() for x in
101 self.itip.get_departures(url)]
102 print self.current_departures
103 self.departuresLoaded.emit()
105 threading.Thread(target=load_async).start()
107 @Slot(str, str, str, result=str)
108 def get_directions_url(self, line, direction, station):
109 return self.itip.get_url_from_direction(line, direction, station)
111 @Slot(result='QStringList')
115 @Slot(result='QStringList')
116 def get_departures(self):
117 return self.current_departures
120 def search(self, line, station):
122 station = station.decode('utf-8')
125 if line not in self.lines:
126 return "Invalid line"
129 stations = sorted(self.itip.get_stations(line).items())
131 headers, stations = zip(*stations)
134 details = [(direction, name, url) for direction, stops in stations
135 for name, url in stops if match_station(station, name)]
137 except urllib2.URLError as e:
141 if __name__ == '__main__':
142 app = QApplication(sys.argv)
144 view = QDeclarativeView()
146 # instantiate the Python object
149 # expose the object to QML
150 context = view.rootContext()
151 context.setContextProperty('itip', itip)
153 if os.path.abspath(__file__).startswith('/usr/bin/'):
154 # Assume system-wide installation, QML from /usr/share/
155 view.setSource('/usr/share/gotovienna/qml/main.qml')
157 # Assume test from source directory, use relative path
158 view.setSource(os.path.join(os.path.dirname(__file__), 'qml/main.qml'))
160 print datetime.now() - t
162 view.showFullScreen()
164 sys.exit(app.exec_())