Advertisement
Guest User

Untitled

a guest
Oct 25th, 2021
178
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.07 KB | None | 0 0
  1. import gi
  2.  
  3. gi.require_version('Champlain', '0.12')
  4. gi.require_version('GtkChamplain', '0.12')
  5. gi.require_version('GtkClutter', '1.0')
  6. from gi.repository import GtkClutter, Clutter
  7.  
  8. GtkClutter.init([])  # Must be initialized before importing those:
  9. from gi.repository import GObject, Gtk, Champlain, GtkChamplain, Pango
  10.  
  11.  
  12. # IMPORTANT: only for reference: not use!!!
  13. class ReferenceMap:
  14.  
  15.     def __init__(self, points_tuple):
  16.         self.vbox = Gtk.VBox(False, 10)
  17.  
  18.         embed = GtkChamplain.Embed()
  19.  
  20.         self.view = embed.get_view()
  21.         self.view.set_reactive(True)
  22.  
  23.         self.view.set_property('kinetic-mode', True)
  24.         self.view.set_property('zoom-level', 5)
  25.  
  26.         scale = Champlain.Scale()
  27.         scale.connect_view(self.view)
  28.         self.view.bin_layout_add(scale, Clutter.BinAlignment.START, Clutter.BinAlignment.END)
  29.  
  30.         self.path_layer = Champlain.PathLayer()
  31.         for point in points_tuple:
  32.             self.add_node(self.path_layer, point[0], point[1])
  33.         self.view.add_layer(self.path_layer)
  34.         idx = int(len(points_tuple) / 2)
  35.         self.view.center_on(points_tuple[idx][0], points_tuple[idx][1])
  36.  
  37.         self.layer = self.create_marker_layer(self.view, points_tuple[0][0], points_tuple[0][1])
  38.         self.view.add_layer(self.layer)
  39.         #self.layer.hide_all_markers()
  40.  
  41.         bbox = Gtk.HBox(False, 10)
  42.         button = Gtk.Button(stock=Gtk.STOCK_ZOOM_IN)
  43.         button.connect("clicked", self.zoom_in)
  44.         bbox.add(button)
  45.  
  46.         button = Gtk.Button(stock=Gtk.STOCK_ZOOM_OUT)
  47.         button.connect("clicked", self.zoom_out)
  48.         bbox.add(button)
  49.  
  50.         button = Gtk.ToggleButton(label="Markers")
  51.         button.set_active(False)
  52.         button.connect("toggled", self.toggle_layer)
  53.         bbox.add(button)
  54.  
  55.         combo = Gtk.ComboBox()
  56.         map_source_factory = Champlain.MapSourceFactory.dup_default()
  57.         liststore = Gtk.ListStore(str, str)
  58.         for source in map_source_factory.get_registered():
  59.             liststore.append([source.get_id(), source.get_name()])
  60.         combo.set_model(liststore)
  61.         cell = Gtk.CellRendererText()
  62.         combo.pack_start(cell, False)
  63.         combo.add_attribute(cell, 'text', 1)
  64.         combo.connect("changed", self.map_source_changed)
  65.         combo.set_active(0)
  66.         bbox.add(combo)
  67.  
  68.         self.spinbutton = Gtk.SpinButton.new_with_range(0, 20, 1)
  69.         self.spinbutton.connect("changed", self.zoom_changed)
  70.         self.view.connect("notify::zoom-level", self.map_zoom_changed)
  71.         self.spinbutton.set_value(12)
  72.         bbox.add(self.spinbutton)
  73.  
  74.         button = Gtk.Image()
  75.         self.view.connect("notify::state", self.view_state_changed, button)
  76.         bbox.pack_end(button, False, False, 0)
  77.  
  78.         self.vbox.pack_start(bbox, expand=False, fill=False, padding=0)
  79.         self.vbox.add(embed)
  80.  
  81.     def get_vbox(self):
  82.         return self.vbox
  83.  
  84.     def add_node(self, path_layer, lat, lon):
  85.         coord = Champlain.Coordinate.new_full(lat, lon)
  86.         path_layer.add_node(coord)
  87.  
  88.     def zoom_in(self, widget):
  89.         self.view.zoom_in()
  90.  
  91.     def zoom_out(self, widget):
  92.         self.view.zoom_out()
  93.  
  94.     def toggle_layer(self, widget):
  95.         if widget.get_active():
  96.             self.path_layer.show()
  97.             self.layer.animate_in_all_markers()
  98.         else:
  99.             self.path_layer.hide()
  100.             self.layer.animate_out_all_markers()
  101.  
  102.     def zoom_changed(self, widget):
  103.         self.view.set_property("zoom-level", self.spinbutton.get_value_as_int())
  104.  
  105.     def map_source_changed(self, widget):
  106.         model = widget.get_model()
  107.         iter = widget.get_active_iter()
  108.         id = model.get_value(iter, 0)
  109.         map_source_factory = Champlain.MapSourceFactory.dup_default()
  110.         source = map_source_factory.create_cached_source(id)
  111.         self.view.set_property("map-source", source)
  112.  
  113.     def map_zoom_changed(self, widget, value):
  114.         self.spinbutton.set_value(self.view.get_property("zoom-level"))
  115.  
  116.     def view_state_changed(self, view, paramspec, image):
  117.         state = view.get_state()
  118.         if state == Champlain.State.LOADING:
  119.             image.set_from_stock(Gtk.STOCK_NETWORK, Gtk.IconSize.BUTTON)
  120.         else:
  121.             image.clear()
  122.  
  123.     def marker_button_release_cb(self, actor, event, view):
  124.         if event.button != 1 and event.click_count > 1:
  125.             return False
  126.  
  127.         print("Montreal was clicked\n")
  128.         return True
  129.  
  130.     def create_marker_layer(self, view, latitude, longitude):
  131.         orange = Clutter.Color.new(0xf3, 0x94, 0x07, 0xbb)
  132.         layer = Champlain.MarkerLayer()
  133.  
  134.         marker = Champlain.Label.new_with_text(_("Start"), "Serif 11", None, orange)
  135.         marker.set_use_markup(True)
  136.         marker.set_alignment(Pango.Alignment.RIGHT)
  137.         marker.set_color(orange)
  138.  
  139.         marker.set_location(latitude, longitude)
  140.         layer.add_marker(marker)
  141.         marker.set_reactive(True)
  142.         marker.connect("button-release-event", self.marker_button_release_cb, view)
  143.  
  144.         layer.show()
  145.         return layer
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement