def track_color_changed(selection, polys): """Update the color of any loaded GPX tracks.""" color = selection.get_color() Gst.set_color(color) one = make_clutter_color(color) two = one.lighten().lighten() for i, polygon in enumerate(polys): polygon.set_stroke_color(two if i % 2 else one)
def remember_location(view): """Add current location to history stack.""" history = list(Gst.get('history')) location = tuple([view.get_property(x) for x in ('latitude', 'longitude', 'zoom-level')]) if history[-1] != location: history.append(location) Gst.set_history(history[-30:])
def __init__(self): Clutter.Box.__init__(self) self.set_layout_manager(Clutter.BinLayout()) self.set_color(Clutter.Color.new(0, 0, 0, 96)) Gst.bind('show-map-coords', self, 'visible') MapView.bin_layout_add(self, START, START) self.get_layout_manager().add(CoordLabel, CENTER, CENTER) MapView.connect('notify::width', lambda *ignore: self.set_size(MapView.get_width(), 30))
def go_back(*ignore): """Return the map view to where the user last set it.""" history = list(Gst.get('history')) lat, lon, zoom = history.pop() if valid_coords(lat, lon): MapView.set_zoom_level(zoom) MapView.center_on(lat, lon) if len(history) > 1: Gst.set_history(history) else: Gst.reset('history')
def __init__(self): last_source = Gst.get_string('map-source-id') Gst.bind_with_convert('map-source-id', MapView, 'map-source', MAP_SOURCES.get, lambda x: x.get_id()) for source_id in sorted(MAP_SOURCES): menu_item = RadioMenuItem(MAP_SOURCES[source_id]) if last_source == source_id: menu_item.set_active(True) Widgets.map_source_menu.show_all()
def fetch_thumbnail(filename, size=Gst.get_int('thumbnail-size')): """Load a photo's thumbnail from disk, avoiding EXIF data if possible. >>> fetch_thumbnail('gg/widgets.py') Traceback (most recent call last): IOError: gg/widgets.py: The file contains data of an unknown image type >>> type(fetch_thumbnail('demo/IMG_2411.JPG')) <class 'gi.repository.GdkPixbuf.Pixbuf'> """ #TODO: The above IOError is raise by pyexiv2 in fetch_exif, # I need to find a file that pyexiv2 thinks is an image, but has # no thumbnail and thus raises IOError here anyway. try: return GdkPixbuf.Pixbuf.new_from_file_at_size(filename, size, size) except GObject.GError: exif = fetch_exif(filename) if len(exif.previews) > 0: data = exif.previews[-1].data elif len(exif.exif_thumbnail.data) > 0: data = exif.exif_thumbnail.data else: raise IOError('%s: No thumbnail found.' % filename) return GdkPixbuf.Pixbuf.new_from_stream_at_scale( Gio.MemoryInputStream.new_from_data(data, None), size, size, True, None)
def animate_in(anim=True): """Fade in all the map actors.""" for i in xrange(Gst.get_int('animation-steps') if anim else 1, 0, -1): for actor in (Crosshair, Box, Scale): actor.set_opacity(256 - i) Widgets.redraw_interface() sleep(0.01)
def launch(self): """Do some things that GtkBuilder XML can't do. Ideally this method would not exist. If you see something here that can be done directly in the GtkBuilder XML, please let me know. """ self.loaded_photos.set_sort_column_id(3, Gtk.SortType.ASCENDING) self.about.set_version(REVISION) self.about.set_program_name(APPNAME) self.about.set_logo(GdkPixbuf.Pixbuf.new_from_file_at_size( join(PKG_DATA_DIR, PACKAGE + '.svg'), 192, 192)) self.main.resize(*Gst.get('window-size')) self.main.show_all() Gst.bind('left-pane-page', self.photo_camera_gps, 'page') Gst.bind('use-dark-theme', Gtk.Settings.get_default(), 'gtk-application-prefer-dark-theme') placeholder = self.empty_photo_list toolbar = self.photo_btn_bar def photo_pane_visibility(liststore, *ignore): """Hide the placeholder and show the toolbar when appropriate.""" empty = liststore.get_iter_first() is None placeholder.set_visible(empty) toolbar.set_visible(not empty) self.loaded_photos.connect('row-inserted', photo_pane_visibility) self.loaded_photos.connect('row-deleted', photo_pane_visibility) self.photos_view.connect('button-press-event', self.photoview_pressed) self.photos_view.connect('button-release-event', self.photoview_released) self.photos_selection.connect('changed', self.update_highlights) self.photos_selection.connect('changed', self.button_sensitivity) self.error_bar.connect('response', lambda widget, signal: widget.hide())
def __init__(self, filename, root, watch): self.watchlist = watch self.filename = filename self.progress = Widgets.progressbar self.polygons = set() self.widgets = Builder('trackfile') self.append = None self.tracks = {} self.clock = clock() self.gst = GSettings('trackfile', basename(filename)) if self.gst.get_string('start-timezone') is '': # Then this is the first time this file has been loaded # and we should honor the user-selected global default # track color instead of using the schema-defined default self.gst.set_value('track-color', Gst.get_value('track-color')) self.gst.bind_with_convert( 'track-color', self.widgets.colorpicker, 'color', lambda x: Gdk.Color(*x), lambda x: (x.red, x.green, x.blue)) self.widgets.trackfile_label.set_text(basename(filename)) self.widgets.unload.connect('clicked', self.destroy) self.widgets.colorpicker.set_title(basename(filename)) self.widgets.colorpicker.connect('color-set', track_color_changed, self.polygons) Widgets.trackfile_unloads_group.add_widget(self.widgets.unload) Widgets.trackfile_colors_group.add_widget(self.widgets.colorpicker) Widgets.trackfiles_group.add_widget(self.widgets.trackfile_label) self.parse(filename, root, watch, self.element_start, self.element_end) if not self.tracks: raise IOError('No points found') points.update(self.tracks) keys = self.tracks.keys() self.alpha = min(keys) self.omega = max(keys) self.start = Coordinates(latitude = self.tracks[self.alpha].lat, longitude = self.tracks[self.alpha].lon) self.gst.set_string('start-timezone', self.start.lookup_geodata()) Widgets.trackfiles_view.add(self.widgets.trackfile_settings)
('latitude', 'longitude', 'zoom-level')]) if history[-1] != location: history.append(location) Gst.set_history(history[-30:]) def go_back(*ignore): """Return the map view to where the user last set it.""" history = list(Gst.get('history')) lat, lon, zoom = history.pop() if valid_coords(lat, lon): MapView.set_zoom_level(zoom) MapView.center_on(lat, lon) if len(history) > 1: Gst.set_history(history) else: Gst.reset('history') def zoom_button_sensitivity(view, signal, in_sensitive, out_sensitive): """Ensure zoom buttons are only sensitive when they need to be.""" zoom = view.get_zoom_level() out_sensitive(view.get_min_zoom_level() != zoom) in_sensitive( view.get_max_zoom_level() != zoom) for prop in ('latitude', 'longitude', 'zoom-level'): Gst.bind(prop, MapView, prop) MapView.connect('notify::zoom-level', zoom_button_sensitivity, Widgets.zoom_in_button.set_sensitive, Widgets.zoom_out_button.set_sensitive) MapView.connect('realize', remember_location)
def __init__(self): Champlain.Scale.__init__(self) self.connect_view(MapView) Gst.bind('show-map-scale', self, 'visible') MapView.bin_layout_add(self, START, END)
def __init__(self): Champlain.Point.__init__(self) self.set_size(4) self.set_color(Clutter.Color.new(0, 0, 0, 64)) Gst.bind('show-map-center', self, 'visible') MapView.bin_layout_add(self, CENTER, CENTER)