Ejemplo n.º 1
0
class GigFinder:

    def __init__(self):
        self.lat = None
        self.long = None
        self.distance = '10'
	self.date = date.today()
        self.banner = None
        self.location = LocationUpdater()
        self.events = Events()
        self.win = hildon.StackableWindow()
        self.app_title = "Gig Finder"

    def main(self):
        """ Build the gui and start the update thread """
	gtk.gdk.threads_enter()
        program = hildon.Program.get_instance()
        menu = self.create_menu()

        self.win.set_title(self.app_title)
        self.win.connect("destroy", self.quit, None)
        self.win.set_app_menu(menu)

	self.update(None, None)

        self.win.show_all()
        gtk.main()
	gtk.gdk.threads_leave()

    def quit(self, widget, data):
        self.location.stop(widget, data)
	thread.exit()
	gtk.main_quit()
	return False

    def show_about(self, widget, data):
        """ Show about dialog """
        dialog = gtk.AboutDialog()
        dialog.set_name('Gig Finder')
        dialog.set_version(__version__)
        dialog.set_authors(__authors__)
        dialog.set_comments('Display gigs close by.\nUsing the http://www.last.fm api.')
        dialog.set_license('Distributed under the MIT license.\nhttp://www.opensource.org/licenses/mit-license.php')
        dialog.set_copyright(__copyright__)
        dialog.show_all()

    def show_message(self, message):
        """ Set window progress indicator and show message """
        hildon.hildon_gtk_window_set_progress_indicator(self.win, 1)
        self.banner = hildon.hildon_banner_show_information(self.win,
                                                            '', 
                                                            message)

    def hide_message(self):
        """ Hide banner and set progress indicator """
        self.banner.hide()
        hildon.hildon_gtk_window_set_progress_indicator(self.win, 0)

    def show_events(self, events):
        """ Sort events, set new window title and add events to table """
        if events:
            self.win.set_title('%s (%s)' % (self.app_title, len(events)))
            self.add_events(events)
        else:
            label = gtk.Label('No events available')
            vbox = gtk.VBox(False, 0)
            vbox.pack_start(label, True, True, 0)
            vbox.show_all()
            self.win.add(vbox)

    def create_menu(self):
        """ Build application menu """
        update_button = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
        update_button.set_label('Update')
        update_button.connect('clicked',
                              self.update,
                              None)

        about_button = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
        about_button.set_label('About')
        about_button.connect('clicked',
                             self.show_about,
                             None)
	
    	date_button = hildon.DateButton(gtk.HILDON_SIZE_AUTO,
	                                hildon.BUTTON_ARRANGEMENT_VERTICAL)
	date_button.set_title('Select date')
	date_button.connect('value-changed',
			    self.set_date,
			    None)

        menu = hildon.AppMenu()
        menu.append(update_button)
        menu.append(about_button)
	menu.append(date_button)
        menu.show_all()
        return menu

    def set_date(self, widget, data):
        year, month, day = widget.get_date()
	self.date date(year, month+1, day)

    def show_details(self, widget, data):
        """ Open new window showing gig details """
        win = hildon.StackableWindow()
        win.set_title(data.title)

        win.vbox = gtk.VBox()
        win.add(win.vbox)

        scroll = hildon.PannableArea()
        win.vbox.pack_start(scroll, True, True, 0)

        view = hildon.TextView()
        view.set_editable(False)
        view.unset_flags(gtk.CAN_FOCUS)
        view.set_wrap_mode(gtk.WRAP_WORD)
        buffer = view.get_buffer()
        end = buffer.get_end_iter()
        buffer.insert(end, '%s\n' % data.title)
        buffer.insert(end, 'Artists: %s\n' % data.artists)
        buffer.insert(end, 'Venue: %s\n' % data.venue_name)
        buffer.insert(end, '%s\n' % data.address)
        buffer.insert(end, 'When: %s\n' % data.start_date.strftime('%H:%M %d/%m/%Y'))
        buffer.insert(end, '\n')
        scroll.add_with_viewport(view)

        win.show_all()

    def add_button_area(self):
        self.box = gtk.VBox(True,0)
        self.pannable_area = hildon.PannableArea()
        self.pannable_area.add_with_viewport(self.box)
        self.pannable_area.show_all()
        self.win.add(self.pannable_area)
        
    def add_events(self, events):
        """ Add a table of buttons """
        for event in events:
            button = hildon.Button(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT, 
                                   hildon.BUTTON_ARRANGEMENT_VERTICAL)
            button.set_text(event.title, "distance: %0.02f km" % event.get_distance_from(self.location.long, self.location.lat))
            button.connect("clicked", self.show_details, event)
            self.box.pack_start(button)
        self.box.show_all()
            
    def update(self, widget, data):
        """ Start update process """
        self.win.set_title(self.app_title)
        self.location.reset()
	if getattr(self, 'pannable_area', None):
            self.win.remove(self.pannable_area)
        self.add_button_area()
	self.location.update_location()
        Thread(target=self.update_gigs).start()

    def update_gigs(self):
        """ Get gig info """
        gobject.idle_add(self.show_message, "Getting events")
        
        if not 'applications' in os.path.abspath(__file__):
            # if no gps fix wait
            while not self.location.lat or not self.location.long:
                time.sleep(1)
        else:
            self.location.lat = float(51.517369)
            self.location.long = float(-0.082998)
         
        events = self.events.get_events(self.location.lat, 
                                        self.location.long, 
                                        self.distance,)
        gobject.idle_add(self.show_events, events)
        gobject.idle_add(self.hide_message)
	return True