Advertisement
Guest User

Untitled

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