Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/gajim-plugins.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'set_location/set_location.py')
-rw-r--r--set_location/set_location.py156
1 files changed, 101 insertions, 55 deletions
diff --git a/set_location/set_location.py b/set_location/set_location.py
index 1111cb9..cce36ab 100644
--- a/set_location/set_location.py
+++ b/set_location/set_location.py
@@ -2,13 +2,14 @@
##
from datetime import datetime
-import time
-import gtk
+from gi.repository import Gtk
+from gi.repository import GdkPixbuf
import os
+import time
from plugins.gui import GajimPluginConfigDialog
from plugins import GajimPlugin
-from plugins.helpers import log, log_calls
+from plugins.helpers import log_calls
from common import gajim
from common import ged
import gtkgui_helpers
@@ -21,7 +22,7 @@ class SetLocationPlugin(GajimPlugin):
self.description = _('Set information about the current geographical '
'or physical location.\n'
'To be able to specify a location on the built-in card, '
- 'you must install python-osmgpsmap > 0.5')
+ 'you must install gir1.2-gtkchamplain')
self.config_dialog = SetLocationPluginConfigDialog(self)
self.config_default_values = {
'alt': (1609, ''),
@@ -81,20 +82,20 @@ class SetLocationPluginConfigDialog(GajimPluginConfigDialog):
def init(self):
self.GTK_BUILDER_FILE_PATH = self.plugin.local_file_path(
'config_dialog.ui')
- self.xml = gtk.Builder()
+ self.xml = Gtk.Builder()
self.xml.set_translation_domain('gajim_plugins')
self.xml.add_objects_from_file(self.GTK_BUILDER_FILE_PATH,
['hbox1'])
hbox = self.xml.get_object('hbox1')
- self.child.pack_start(hbox)
+ self.get_child().pack_start(hbox, True, True, 0)
self.xml.connect_signals(self)
self.connect('hide', self.on_hide)
self.is_active = None
self.preset_combo = self.xml.get_object('preset_combobox')
- self.preset_liststore = gtk.ListStore(str)
+ self.preset_liststore = Gtk.ListStore(str)
self.preset_combo.set_model(self.preset_liststore)
- cellrenderer = gtk.CellRendererText()
+ cellrenderer = Gtk.CellRendererText()
self.preset_combo.pack_start(cellrenderer, True)
self.preset_combo.add_attribute(cellrenderer, 'text', 0)
#self.plugin.config['presets'] = {'default': {}}
@@ -114,47 +115,62 @@ class SetLocationPluginConfigDialog(GajimPluginConfigDialog):
widget.set_text(str(self.plugin.config[name]))
try:
- import osmgpsmap
- if osmgpsmap.__version__ < '0.6':
- no_map = True
- log.debug('python-osmgpsmap < 0.6 detected')
+ from gi.repository import GtkClutter, Clutter
+ GtkClutter.init([]) # Must be initialized before importing those:
+ from gi.repository import Champlain, GtkChamplain
except:
no_map = True
- log.debug('python-osmgpsmap not detected')
- log.debug('python-osmgpsmap > 0.5 detected')
if not no_map and not self.is_active:
- from layers import DummyLayer
+ #from layers import DummyLayer
vbox = self.xml.get_object('vbox1')
vbox.set_size_request(400, -1)
- self.osm = osmgpsmap.GpsMap()
- self.osm.layer_add(osmgpsmap.GpsMapOsd(show_dpad=True,
- show_zoom=True))
- self.osm.layer_add(DummyLayer())
+ embed = GtkChamplain.Embed()
+
+ self.view = embed.get_view()
+ self.view.set_reactive(True)
+ self.view.set_property('kinetic-mode', True)
+ self.view.set_property('zoom-level', 12)
+ self.view.connect('button-release-event', self.map_clicked,
+ self.view)
+
+ scale = Champlain.Scale()
+ scale.connect_view(self.view)
+ self.view.bin_layout_add(scale, Clutter.BinAlignment.START,
+ Clutter.BinAlignment.END)
+
+ #license = self.view.get_license_actor()
+ #license.set_extra_text("Don't eat cereals with orange juice\nIt tastes bad")
+
lat = self.plugin.config['lat']
lon = self.plugin.config['lon']
if not self.is_valid_coord(lat, lon):
self.lat = self.lon = 0.0
self.xml.get_object('lat').set_text('0.0')
self.xml.get_object('lon').set_text('0.0')
- self.osm.set_center_and_zoom(self.lat, self.lon, 12)
+ self.view.center_on(self.lat, self.lon)
+
self.path_to_image = os.path.abspath(gtkgui_helpers.get_icon_path(
'gajim', 16))
- self.icon = gtk.gdk.pixbuf_new_from_file_at_size(
- self.path_to_image, 16, 16)
- self.osm.connect('button_release_event', self.map_clicked)
- vbox.pack_start(self.osm, expand=True, fill=True, padding=6)
- label = gtk.Label(_(
+ vbox.pack_start(embed, expand=True, fill=True, padding=6)
+ label = Gtk.Label(_(
'Click the right mouse button to specify the location, \n'\
'middle mouse button to show / hide the contacts on the map'))
vbox.pack_start(label, expand=False, fill=False, padding=6)
self.is_active = True
- self.images = []
- self.osm_image = self.osm.image_add(self.lat, self.lon, self.icon)
+ self.layer = Champlain.MarkerLayer()
+ self.marker = Champlain.Label.new_from_file(self.path_to_image)
+ self.marker.set_text("I am")
+ self.marker.set_location(self.lat, self.lon)
+ self.view.add_layer(self.layer)
+ self.layer.add_marker(self.marker)
+ self.markers_is_visible = False
self.xml.get_object('lat').connect('changed', self.on_lon_changed)
self.xml.get_object('lon').connect('changed', self.on_lon_changed)
+ self.layer.animate_in_all_markers()
+ self.show_contacts()
def on_hide(self, widget):
for name in self.plugin.config_default_values:
@@ -175,21 +191,25 @@ class SetLocationPluginConfigDialog(GajimPluginConfigDialog):
error_text = 'lat or lon field contains wrong value.'
WarningDialog(_('Wrong coordinates'), error_text, self)
- def map_clicked(self, osm, event):
- lat, lon = self.osm.get_event_location(event).get_degrees()
+ def map_clicked(self, actor, event, view):
+ x, y = event.x, event.y
+ lat, lon = view.x_to_longitude(x), view.y_to_latitude(y)
if event.button == 3:
- self.osm.image_remove(self.osm_image)
- self.osm_image = self.osm.image_add(lat, lon, self.icon)
- self.xml.get_object('lat').set_text(str(lat))
- self.xml.get_object('lon').set_text(str(lon))
+ self.marker.set_location(lat, lon)
+ self.xml.get_object('lon').set_text(str(lat))
+ self.xml.get_object('lat').set_text(str(lon))
if event.button == 2:
- self.show_contacts()
+ if self.markers_is_visible:
+ self.contacts_layer.animate_out_all_markers()
+ else:
+ self.contacts_layer.animate_in_all_markers()
+ self.markers_is_visible = not self.markers_is_visible
def is_valid_coord(self, lat, lon):
try:
self.lat = float(lat)
self.lon = float(lon)
- except ValueError, e:
+ except ValueError as e:
return
if not -85 < self.lat < 85 or not -180 < self.lon < 180:
return
@@ -199,12 +219,12 @@ class SetLocationPluginConfigDialog(GajimPluginConfigDialog):
lat = self.xml.get_object('lat').get_text()
lon = self.xml.get_object('lon').get_text()
if self.is_valid_coord(lat, lon):
- self.osm.image_remove(self.osm_image)
- self.osm_image = self.osm.image_add(self.lat, self.lon, self.icon)
- self.osm.set_center(self.lat, self.lon)
+ #self.view.center_on(self.lat, self.lon)
+ self.marker.set_location(self.lat, self.lon)
def show_contacts(self):
- if not self.images:
+ from gi.repository import Champlain
+ if not self.markers_is_visible:
data = {}
accounts = gajim.contacts._accounts
for account in accounts:
@@ -218,18 +238,44 @@ class SetLocationPluginConfigDialog(GajimPluginConfigDialog):
lon = pep['location']._pep_specific_data.get('lon', None)
if not lat or not lon:
continue
- data[contact] = (lat, lon)
+ name = accounts[account].contacts.get_first_contact_from_jid(
+ contact).name
+ data[contact] = (lat, lon, name)
for jid in data:
- path = gtkgui_helpers.get_path_to_generic_or_avatar(None,
+ path = self.get_path_to_generic_or_avatar(None,
jid=jid, suffix='')
- icon = gtk.gdk.pixbuf_new_from_file_at_size(path, 24, 24)
- image = self.osm.image_add(float(data[jid][0]),
- float(data[jid][1]), icon)
- self.images.append(image)
- else:
- for image in self.images:
- self.osm.image_remove(image)
- self.images = []
+ marker = Champlain.Label.new_from_file(path)
+ marker.set_text(data[jid][2])
+ self.contacts_layer = Champlain.MarkerLayer()
+
+ marker.set_location(float(data[jid][0]), float(data[jid][1]))
+ self.view.add_layer(self.contacts_layer)
+ self.contacts_layer.add_marker(marker)
+ self.contacts_layer.animate_in_all_markers()
+ self.markers_is_visible = True
+
+ def get_path_to_generic_or_avatar(self, generic, jid=None, suffix=None):
+ """
+ Choose between avatar image and default image
+
+ Returns full path to the avatar image if it exists, otherwise returns full
+ path to the image. generic must be with extension and suffix without
+ """
+ if jid:
+ from common import helpers
+ # we want an avatar
+ puny_jid = helpers.sanitize_filename(jid)
+ path_to_file = os.path.join(gajim.AVATAR_PATH, puny_jid) + suffix
+ path_to_local_file = path_to_file + '_local'
+ for extension in ('.png', '.jpeg'):
+ path_to_local_file_full = path_to_local_file + extension
+ if os.path.exists(path_to_local_file_full):
+ return path_to_local_file_full
+ for extension in ('.png', '.jpeg'):
+ path_to_file_full = path_to_file + extension
+ if os.path.exists(path_to_file_full):
+ return path_to_file_full
+ return os.path.abspath(generic)
def on_preset_button_clicked(self, widget):
def on_ok(preset_name):
@@ -242,9 +288,9 @@ class SetLocationPluginConfigDialog(GajimPluginConfigDialog):
widget = self.xml.get_object(name)
preset[name] = widget.get_text()
preset = {preset_name: preset}
- presets = dict(self.plugin.config['presets'].items() + \
- preset.items())
- if preset_name not in self.plugin.config['presets'].keys():
+ presets = dict(list(self.plugin.config['presets'].items()) + \
+ list(preset.items()))
+ if preset_name not in list(self.plugin.config['presets'].keys()):
iter_ = self.preset_liststore.append((preset_name,))
self.plugin.config['presets'] = presets
self.set_modal(False)
@@ -257,8 +303,8 @@ class SetLocationPluginConfigDialog(GajimPluginConfigDialog):
if active < 0:
self.xml.get_object('del_preset').set_sensitive(False)
return
- pres_name = model[active][0].decode('utf-8')
- for name in self.plugin.config['presets'][pres_name].keys():
+ pres_name = model[active][0]
+ for name in list(self.plugin.config['presets'][pres_name].keys()):
widget = self.xml.get_object(name)
widget.set_text(str(self.plugin.config['presets'][pres_name][name]))
@@ -267,7 +313,7 @@ class SetLocationPluginConfigDialog(GajimPluginConfigDialog):
def on_del_preset_clicked(self, widget):
active = self.preset_combo.get_active()
active_iter = self.preset_combo.get_active_iter()
- name = self.preset_liststore[active][0].decode('utf-8')
+ name = self.preset_liststore[active][0]
presets = self.plugin.config['presets']
del presets[name]
self.plugin.config['presets'] = presets