diff options
author | Denis Fomin <fominde@gmail.com> | 2013-02-05 18:26:17 +0400 |
---|---|---|
committer | Denis Fomin <fominde@gmail.com> | 2013-02-05 18:26:17 +0400 |
commit | 5f8cd57c2736102da63c0f2de9c15f237475af0e (patch) | |
tree | d4b7570a04e6823c045e62f624f609cd3bec5007 | |
parent | d2894a35853b8ffd87ad483c8b0afadfc2a7233e (diff) |
update SetLocationPlugin to py3,use libchamplain instead of python-osmgpsmap
-rw-r--r-- | set_location/__init__.py | 2 | ||||
-rw-r--r-- | set_location/config_dialog.ui | 92 | ||||
-rw-r--r-- | set_location/manifest.ini | 4 | ||||
-rw-r--r-- | set_location/set_location.py | 156 |
4 files changed, 171 insertions, 83 deletions
diff --git a/set_location/__init__.py b/set_location/__init__.py index 2e080ea..b8147cc 100644 --- a/set_location/__init__.py +++ b/set_location/__init__.py @@ -1 +1 @@ -from set_location import SetLocationPlugin +from .set_location import SetLocationPlugin diff --git a/set_location/config_dialog.ui b/set_location/config_dialog.ui index 6527ee9..386b5a0 100644 --- a/set_location/config_dialog.ui +++ b/set_location/config_dialog.ui @@ -1,21 +1,24 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?> <interface> - <requires lib="gtk+" version="2.16"/> - <!-- interface-naming-policy toplevel-contextual --> + <!-- interface-requires gtk+ 3.0 --> <object class="GtkWindow" id="window1"> + <property name="can_focus">False</property> <child> <object class="GtkHBox" id="hbox1"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkVBox" id="vbox2"> <property name="visible">True</property> - <property name="orientation">vertical</property> + <property name="can_focus">False</property> <child> <object class="GtkHBox" id="hbox2"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkLabel" id="preset"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Preset:</property> </object> @@ -29,38 +32,50 @@ <child> <object class="GtkComboBox" id="preset_combobox"> <property name="visible">True</property> - <signal name="changed" handler="on_preset_combobox_changed"/> + <property name="can_focus">False</property> + <signal name="changed" handler="on_preset_combobox_changed" swapped="no"/> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> <child> <object class="GtkButton" id="preset_button"> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="can_focus">False</property> <property name="receives_default">True</property> + <property name="use_action_appearance">False</property> <property name="xalign">0</property> - <signal name="clicked" handler="on_preset_button_clicked"/> + <signal name="clicked" handler="on_preset_button_clicked" swapped="no"/> <child> <object class="GtkHBox" id="hbox3"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkImage" id="image1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-save</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkLabel" id="label17"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">Save preset</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -76,29 +91,38 @@ </child> <child> <object class="GtkButton" id="del_preset"> + <property name="use_action_appearance">False</property> <property name="visible">True</property> <property name="sensitive">False</property> <property name="can_focus">False</property> <property name="receives_default">True</property> - <signal name="clicked" handler="on_del_preset_clicked"/> + <property name="use_action_appearance">False</property> + <signal name="clicked" handler="on_del_preset_clicked" swapped="no"/> <child> <object class="GtkHBox" id="hbox4"> <property name="visible">True</property> + <property name="can_focus">False</property> <child> <object class="GtkImage" id="image2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="stock">gtk-delete</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">0</property> </packing> </child> <child> <object class="GtkLabel" id="label18"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="label" translatable="yes">Delete preset</property> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="position">1</property> </packing> </child> @@ -121,6 +145,7 @@ <child> <object class="GtkTable" id="config_table"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="border_width">6</property> <property name="n_rows">16</property> <property name="n_columns">2</property> @@ -129,6 +154,7 @@ <child> <object class="GtkLabel" id="label1"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">alt:</property> </object> @@ -140,6 +166,7 @@ <child> <object class="GtkLabel" id="label2"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">area:</property> </object> @@ -153,6 +180,7 @@ <child> <object class="GtkLabel" id="label3"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">building:</property> </object> @@ -166,6 +194,7 @@ <child> <object class="GtkLabel" id="label4"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">country:</property> </object> @@ -177,6 +206,7 @@ <child> <object class="GtkLabel" id="label5"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">countrycode:</property> </object> @@ -188,6 +218,7 @@ <child> <object class="GtkLabel" id="label6"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">description:</property> </object> @@ -199,6 +230,7 @@ <child> <object class="GtkLabel" id="label7"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">floor:</property> </object> @@ -210,6 +242,7 @@ <child> <object class="GtkLabel" id="label8"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">locality:</property> </object> @@ -221,6 +254,7 @@ <child> <object class="GtkLabel" id="label9"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">lat:</property> </object> @@ -232,6 +266,7 @@ <child> <object class="GtkLabel" id="label10"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">lon:</property> </object> @@ -243,6 +278,7 @@ <child> <object class="GtkLabel" id="label11"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">postalcode:</property> </object> @@ -254,6 +290,7 @@ <child> <object class="GtkLabel" id="label12"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">region:</property> </object> @@ -265,6 +302,7 @@ <child> <object class="GtkLabel" id="label13"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">room:</property> </object> @@ -276,6 +314,7 @@ <child> <object class="GtkLabel" id="label14"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">street:</property> </object> @@ -287,6 +326,7 @@ <child> <object class="GtkLabel" id="label15"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">text:</property> </object> @@ -298,6 +338,7 @@ <child> <object class="GtkLabel" id="label16"> <property name="visible">True</property> + <property name="can_focus">False</property> <property name="xalign">0</property> <property name="label" translatable="yes">uri:</property> </object> @@ -312,7 +353,7 @@ <property name="can_focus">True</property> <property name="has_tooltip">True</property> <property name="tooltip_text" translatable="yes">Altitude in meters above or below sea level</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </object> <packing> <property name="left_attach">1</property> @@ -325,7 +366,7 @@ <property name="can_focus">True</property> <property name="has_tooltip">True</property> <property name="tooltip_text" translatable="yes">A named area such as a campus or neighborhood</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </object> <packing> <property name="left_attach">1</property> @@ -340,7 +381,7 @@ <property name="can_focus">True</property> <property name="has_tooltip">True</property> <property name="tooltip_text" translatable="yes">A specific building on a street or in an area</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </object> <packing> <property name="left_attach">1</property> @@ -355,7 +396,7 @@ <property name="can_focus">True</property> <property name="has_tooltip">True</property> <property name="tooltip_text" translatable="yes">The nation where the user is located</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </object> <packing> <property name="left_attach">1</property> @@ -370,7 +411,7 @@ <property name="can_focus">True</property> <property name="has_tooltip">True</property> <property name="tooltip_text" translatable="yes">The ISO 3166 two-letter country code</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </object> <packing> <property name="left_attach">1</property> @@ -385,7 +426,7 @@ <property name="can_focus">True</property> <property name="has_tooltip">True</property> <property name="tooltip_text" translatable="yes">A natural-language name for or description of the location</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </object> <packing> <property name="left_attach">1</property> @@ -400,7 +441,7 @@ <property name="can_focus">True</property> <property name="has_tooltip">True</property> <property name="tooltip_text" translatable="yes">A particular floor in a building</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </object> <packing> <property name="left_attach">1</property> @@ -415,7 +456,7 @@ <property name="can_focus">True</property> <property name="has_tooltip">True</property> <property name="tooltip_text" translatable="yes">A locality within the administrative region, such as a town or city</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </object> <packing> <property name="left_attach">1</property> @@ -430,7 +471,7 @@ <property name="can_focus">True</property> <property name="has_tooltip">True</property> <property name="tooltip_text" translatable="yes">Latitude in decimal degrees North</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </object> <packing> <property name="left_attach">1</property> @@ -445,7 +486,7 @@ <property name="can_focus">True</property> <property name="has_tooltip">True</property> <property name="tooltip_text" translatable="yes">Longitude in decimal degrees East</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </object> <packing> <property name="left_attach">1</property> @@ -460,7 +501,7 @@ <property name="can_focus">True</property> <property name="has_tooltip">True</property> <property name="tooltip_text" translatable="yes">A code used for postal delivery</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </object> <packing> <property name="left_attach">1</property> @@ -475,7 +516,7 @@ <property name="can_focus">True</property> <property name="has_tooltip">True</property> <property name="tooltip_text" translatable="yes">An administrative region of the nation, such as a state or province</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </object> <packing> <property name="left_attach">1</property> @@ -490,7 +531,7 @@ <property name="can_focus">True</property> <property name="has_tooltip">True</property> <property name="tooltip_text" translatable="yes">A particular room in a building</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </object> <packing> <property name="left_attach">1</property> @@ -505,7 +546,7 @@ <property name="can_focus">True</property> <property name="has_tooltip">True</property> <property name="tooltip_text" translatable="yes">A thoroughfare within the locality, or a crossing of two thoroughfares</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </object> <packing> <property name="left_attach">1</property> @@ -520,7 +561,7 @@ <property name="can_focus">True</property> <property name="has_tooltip">True</property> <property name="tooltip_text" translatable="yes">A catch-all element that captures any other information about the location</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </object> <packing> <property name="left_attach">1</property> @@ -535,7 +576,7 @@ <property name="can_focus">True</property> <property name="has_tooltip">True</property> <property name="tooltip_text" translatable="yes">A URI or URL pointing to information about the location</property> - <property name="invisible_char">●</property> + <property name="invisible_char">●</property> </object> <packing> <property name="left_attach">1</property> @@ -561,9 +602,8 @@ <child> <object class="GtkVBox" id="vbox1"> <property name="visible">True</property> - <property name="extension_events">all</property> + <property name="can_focus">False</property> <property name="resize_mode">immediate</property> - <property name="orientation">vertical</property> <child> <placeholder/> </child> @@ -572,6 +612,8 @@ </child> </object> <packing> + <property name="expand">True</property> + <property name="fill">True</property> <property name="padding">6</property> <property name="position">1</property> </packing> diff --git a/set_location/manifest.ini b/set_location/manifest.ini index 4d43a6a..06806cc 100644 --- a/set_location/manifest.ini +++ b/set_location/manifest.ini @@ -3,7 +3,7 @@ name: Set Location short_name: set_location version: 0.7.2 description: Set information about the current geographical or physical location. - To be able to specify a location on the built-in card, you must install python-osmgpsmap > 0.5 + To be able to specify a location on the built-in card, you must install gir1.2-gtkchamplain authors: Denis Fomin <fominde@gmail.com> homepage: http://trac-plugins.gajim.org/wiki/SetLocalitionPlugin -max_gajim_version: 0.15.9 +min_gajim_version: 0.15.10 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 |