3 """Simple program to display local gigs
5 Intended for use on the N900, uses the devices gps to find local gigs.
8 __authors__ = ["Jon Staley"]
9 __copyright__ = "Copyright 2010 Jon Staley"
17 from threading import Thread
20 from locator import LocationUpdater
21 from events import Events
23 gtk.gdk.threads_init()
26 # Add user settings for distance, date
27 # maybe switch to json
28 # maybe do km to mile conversions
37 self.location = LocationUpdater()
38 self.events = Events()
39 self.win = hildon.StackableWindow()
40 self.app_title = "Gig Finder"
43 """ Build the gui and start the update thread """
44 program = hildon.Program.get_instance()
45 menu = self.create_menu()
47 self.win.set_title(self.app_title)
48 self.win.connect("destroy", gtk.main_quit, None)
49 self.win.set_app_menu(menu)
51 Thread(target=self.update_gigs).start()
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__)
67 def update(self, widget, data):
68 """ Start update process """
69 self.win.set_title(self.app_title)
71 self.win.remove(self.pannable_area)
72 Thread(target=self.update_gigs).start()
74 def update_gigs(self):
76 gobject.idle_add(self.show_message, "Getting events")
77 gobject.idle_add(self.location.update_location)
80 # TODO: needs a timeout
81 while not self.location.lat or not self.location.long:
84 events = self.events.get_events(self.location.lat,
87 gobject.idle_add(self.hide_message)
88 gobject.idle_add(self.show_events, events)
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,
98 def hide_message(self):
99 """ Hide banner and set progress indicator """
101 hildon.hildon_gtk_window_set_progress_indicator(self.win, 0)
103 def show_events(self, events):
104 """ Sort events, set new window title and add events to table """
106 self.win.set_title('%s (%s)' % (self.app_title, len(events)))
107 self.add_events(events)
109 label = gtk.Label('No events available')
110 vbox = gtk.VBox(False, 0)
111 vbox.pack_start(label, True, True, 0)
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',
123 about_button = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
124 about_button.set_label('About')
125 about_button.connect('clicked',
129 menu = hildon.AppMenu()
130 menu.append(update_button)
131 menu.append(about_button)
135 def show_details(self, widget, data):
136 """ Open new window showing gig details """
137 win = hildon.StackableWindow()
138 win.set_title(data['title'])
140 win.vbox = gtk.VBox()
143 scroll = hildon.PannableArea()
144 win.vbox.pack_start(scroll, True, True, 0)
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)
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)
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)
173 def add_events(self, events):
174 """ Add a table of buttons """
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)
184 self.table.show_all()
186 if __name__ == "__main__":