remove unused import
[gigfinder] / gigfinder.py
1 #!/usr/bin/env python
2
3 """Simple program to display local gigs
4
5 Intended for use on the N900, uses the devices gps to find local gigs.
6 """
7
8 __authors__ = ["Jon Staley"]
9 __copyright__ = "Copyright 2010 Jon Staley"
10 __license__ = "MIT"
11 __version__ = "0.0.1"
12
13 import gtk
14 import hildon
15 import time
16 import gobject
17 from threading import Thread
18 import thread
19
20 from locator import LocationUpdater
21 from events import Events
22
23 gtk.gdk.threads_init()
24
25 # TODO: 
26 # Add user settings for distance, date
27 # maybe switch to json
28 # maybe do km to mile conversions
29
30 class GigFinder:
31
32     def __init__(self):
33         self.lat = None
34         self.long = None
35         self.distance = '10'
36         self.banner = None
37         self.location = LocationUpdater()
38         self.events = Events()
39         self.win = hildon.StackableWindow()
40         self.app_title = "Gig Finder"
41
42     def main(self):
43         """ Build the gui and start the update thread """
44         program = hildon.Program.get_instance()
45         menu = self.create_menu()
46
47         self.win.set_title(self.app_title)
48         self.win.connect("destroy", gtk.main_quit, None)
49         self.win.set_app_menu(menu)
50
51         Thread(target=self.update_gigs).start()
52
53         self.win.show_all()
54         gtk.main()
55
56     def show_about(self, widget, data):
57         """ Show about dialog """
58         dialog = gtk.AboutDialog()
59         dialog.set_name('Gig Finder')
60         dialog.set_version(__version__)
61         dialog.set_authors(__authors__)
62         dialog.set_comments('Display gigs close by.\nUsing the http://www.last.fm api.')
63         dialog.set_license('Distributed under the MIT license.\nhttp://www.opensource.org/licenses/mit-license.php')
64         dialog.set_copyright(__copyright__)
65         dialog.show_all()
66
67     def update(self, widget, data):
68         """ Start update process """
69         self.win.set_title(self.app_title)
70         self.location.reset()
71         self.win.remove(self.pannable_area)
72         Thread(target=self.update_gigs).start()
73
74     def update_gigs(self):
75         """ Get gig info """
76         gobject.idle_add(self.show_message, "Getting events")
77         gobject.idle_add(self.location.update_location)
78
79         # if no gps fix wait
80         # TODO: needs a timeout
81         while not self.location.lat or not self.location.long:
82             time.sleep(1)
83
84         events = self.events.get_events(self.location.lat, 
85                                         self.location.long, 
86                                         self.distance)
87         gobject.idle_add(self.hide_message)
88         gobject.idle_add(self.show_events, events)
89         thread.exit()
90
91     def show_message(self, message):
92         """ Set window progress indicator and show message """
93         hildon.hildon_gtk_window_set_progress_indicator(self.win, 1)
94         self.banner = hildon.hildon_banner_show_information(self.win,
95                                                             '', 
96                                                             message)
97
98     def hide_message(self):
99         """ Hide banner and set progress indicator """
100         self.banner.hide()
101         hildon.hildon_gtk_window_set_progress_indicator(self.win, 0)
102
103     def show_events(self, events):
104         """ Sort events, set new window title and add events to table """
105         if events:
106             self.win.set_title('%s (%s)' % (self.app_title, len(events)))
107             self.add_events(events)
108         else:
109             label = gtk.Label('No events available')
110             vbox = gtk.VBox(False, 0)
111             vbox.pack_start(label, True, True, 0)
112             vbox.show_all()
113             self.win.add(vbox)
114
115     def create_menu(self):
116         """ Build application menu """
117         update_button = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
118         update_button.set_label('Update')
119         update_button.connect('clicked',
120                               self.update,
121                               None)
122
123         about_button = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
124         about_button.set_label('About')
125         about_button.connect('clicked',
126                              self.show_about,
127                              None)
128
129         menu = hildon.AppMenu()
130         menu.append(update_button)
131         menu.append(about_button)
132         menu.show_all()
133         return menu
134
135     def show_details(self, widget, data):
136         """ Open new window showing gig details """
137         win = hildon.StackableWindow()
138         win.set_title(data['title'])
139
140         win.vbox = gtk.VBox()
141         win.add(win.vbox)
142
143         scroll = hildon.PannableArea()
144         win.vbox.pack_start(scroll, True, True, 0)
145
146         view = hildon.TextView()
147         view.set_editable(False)
148         view.unset_flags(gtk.CAN_FOCUS)
149         view.set_wrap_mode(gtk.WRAP_WORD)
150         buffer = view.get_buffer()
151         end = buffer.get_end_iter()
152         buffer.insert(end, '%s\n' % data['title'])
153         buffer.insert(end, 'Artists: %s\n' % data['artists'])
154         buffer.insert(end, 'Venue: %s\n' % data['venue'])
155         buffer.insert(end, '%s\n' % data['address'])
156         buffer.insert(end, 'When: %s\n' % data['date'].strftime('%H:%M %d/%M/%Y'))
157         buffer.insert(end, '\n')
158         scroll.add_with_viewport(view)
159
160         win.show_all()
161
162     def add_table(self):
163         """ Add table for events """
164         self.table = gtk.Table(columns=1)
165         self.table.set_row_spacings(10)
166         self.table.set_col_spacings(10)
167
168         self.pannable_area = hildon.PannableArea()
169         self.pannable_area.add_with_viewport(self.table)
170         self.pannable_area.show_all()
171         self.win.add(self.pannable_area)
172         
173     def add_events(self, events):
174         """ Add a table of buttons """
175         self.add_table()
176         pos = 0
177         for event in events:
178             button = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, 
179                                    hildon.BUTTON_ARRANGEMENT_VERTICAL)
180             button.set_text(event['title'], "distance: %0.02f km" % event['distance'])
181             button.connect("clicked", self.show_details, event)
182             self.table.attach(button, 0, 1, pos, pos+1)
183             pos += 1
184         self.table.show_all()
185    
186 if __name__ == "__main__":
187     finder = GigFinder()
188     finder.main()