#!/usr/bin/env python
# Copyright (C) 2012 Pablo Castellano <pablog@gnome.org>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#
import gi
gi.require_version('Champlain', '0.12')
gi.require_version('Clutter', '1.0')
from gi.repository import Clutter, Champlain
Clutter.init([])
PADDING = 10
def zoom_in(widget, event, view):
view.zoom_in()
def zoom_out(widget, event, view):
view.zoom_out()
def make_button(text):
black = Clutter.Color.new(0x00, 0x00, 0x00, 0xff)
white = Clutter.Color.new(0xff, 0xff, 0xff, 0xff)
button = Clutter.Actor()
button_bg = Clutter.Actor()
button_bg.set_background_color(white)
button_bg.set_opacity(0xcc)
button.add_child(button_bg)
button_text = Clutter.Text.new_full("Sans 10", text, black)
button.add_child(button_text)
(width, height) = button_text.get_size()
button_bg.set_size(width + PADDING * 2, height + PADDING * 2)
button_bg.set_position(0, 0)
button_text.set_position(PADDING, PADDING)
return button
def append_point(layer, lon, lat):
coord = Champlain.Coordinate.new_full(lon, lat)
layer.add_node(coord)
def main_quit(data):
Clutter.main_quit()
if __name__ == '__main__':
total_width = 0
stage = Clutter.Stage()
stage.set_size(800, 600)
# It complains about the number of arguments passed to main_quit()
#stage.connect('destroy', Clutter.main_quit)
stage.connect('destroy', main_quit)
# Create the map view
view = Champlain.View()
view.set_size(800, 600)
stage.add_child(view)
# Create the buttons
buttons = Clutter.Actor()
buttons.set_position(PADDING, PADDING)
button = make_button('Zoom in')
buttons.add_child(button)
button.set_reactive(True)
(width, height) = button.get_size()
total_width += width + PADDING
#button.connect('button-release-event', zoom_in, view)
button.connect('button-release-event', zoom_in, view)
button = make_button('Zoom out')
buttons.add_child(button)
button.set_reactive(True)
button.set_position(total_width, 0)
(width, height) = button.get_size()
button.connect('button-release-event', zoom_out, view)
stage.add_child(buttons)
# Draw a line
layer = Champlain.PathLayer()
# Cheap approx of Highway 10
append_point(layer, 45.4104, -73.2846)
append_point(layer, 45.4178, -73.2239)
append_point(layer, 45.4176, -73.2181)
append_point(layer, 45.4151, -73.2126)
append_point(layer, 45.4016, -73.1926)
append_point(layer, 45.3994, -73.1877)
append_point(layer, 45.4000, -73.1815)
append_point(layer, 45.4151, -73.1218)
layer.set_stroke_width(4.0)
view.add_layer(layer)
dash = [6, 2]
layer.set_dash(dash)
# Draw a path
layer = Champlain.PathLayer()
append_point(layer, 45.1386, -73.9196)
append_point(layer, 45.1229, -73.8991)
append_point(layer, 45.0946, -73.9531)
append_point(layer, 45.1085, -73.9714)
append_point(layer, 45.1104, -73.9761)
layer.set_closed(True)
layer.set_fill(True)
layer.set_visible(True)
view.add_layer(layer)
# Finish initialising the map view
view.set_zoom_level(8)
view.set_kinetic_mode(True)
view.center_on(45.466, -73.75)
stage.show()
Clutter.main()