parent
d6501898d8
commit
0dde1759e8
|
@ -1,15 +1,8 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!-- Generated with glade 3.22.0 -->
|
<!-- Generated with glade 3.22.1 -->
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk+" version="3.18"/>
|
<requires lib="gtk+" version="3.18"/>
|
||||||
<object class="GtkWindow" id="profile_window">
|
<object class="GtkBox" id="profile_box">
|
||||||
<property name="can_focus">False</property>
|
|
||||||
<property name="title" translatable="yes">Profile</property>
|
|
||||||
<property name="type_hint">dialog</property>
|
|
||||||
<signal name="destroy" handler="on_profile_window_destroy" swapped="no"/>
|
|
||||||
<signal name="key-press-event" handler="on_profile_window_key_press_event" swapped="no"/>
|
|
||||||
<child>
|
|
||||||
<object class="GtkBox" id="vbox1">
|
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">False</property>
|
<property name="can_focus">False</property>
|
||||||
<property name="orientation">vertical</property>
|
<property name="orientation">vertical</property>
|
||||||
|
@ -1409,9 +1402,4 @@
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
|
||||||
<child type="titlebar">
|
|
||||||
<placeholder/>
|
|
||||||
</child>
|
|
||||||
</object>
|
|
||||||
</interface>
|
</interface>
|
||||||
|
|
|
@ -268,9 +268,11 @@ class Interface:
|
||||||
self.show_vcard_when_connect.remove(account)
|
self.show_vcard_when_connect.remove(account)
|
||||||
|
|
||||||
def edit_own_details(self, account):
|
def edit_own_details(self, account):
|
||||||
if 'profile' not in self.instances[account]:
|
window = app.get_app_window(profile_window.ProfileWindow)
|
||||||
self.instances[account]['profile'] = \
|
if window is None:
|
||||||
profile_window.ProfileWindow(account, app.interface.roster.window)
|
profile_window.ProfileWindow(account)
|
||||||
|
else:
|
||||||
|
window.present()
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def handle_gc_error(gc_control, pritext, sectext):
|
def handle_gc_error(gc_control, pritext, sectext):
|
||||||
|
|
|
@ -20,43 +20,46 @@
|
||||||
## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
|
## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
|
||||||
##
|
##
|
||||||
|
|
||||||
# THIS FILE IS FOR **OUR** PROFILE (when we edit our INFO)
|
|
||||||
|
|
||||||
from gi.repository import Gtk
|
|
||||||
from gi.repository import Gdk
|
|
||||||
from gi.repository import GLib
|
|
||||||
from gi.repository import GdkPixbuf
|
|
||||||
import base64
|
import base64
|
||||||
import time
|
import time
|
||||||
import logging
|
import logging
|
||||||
import hashlib
|
import hashlib
|
||||||
|
|
||||||
|
from gi.repository import Gtk
|
||||||
|
from gi.repository import Gdk
|
||||||
|
from gi.repository import GLib
|
||||||
|
|
||||||
from gajim import gtkgui_helpers
|
from gajim import gtkgui_helpers
|
||||||
from gajim import dialogs
|
from gajim import dialogs
|
||||||
from gajim.filechoosers import AvatarChooserDialog
|
from gajim.filechoosers import AvatarChooserDialog
|
||||||
from gajim.common.const import AvatarSize
|
from gajim.common.const import AvatarSize
|
||||||
|
|
||||||
from gajim.common import app
|
from gajim.common import app
|
||||||
from gajim.common import ged
|
from gajim.common import ged
|
||||||
|
|
||||||
log = logging.getLogger('gajim.profile')
|
log = logging.getLogger('gajim.profile')
|
||||||
|
|
||||||
class ProfileWindow:
|
|
||||||
"""
|
|
||||||
Class for our information window
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, account, transient_for=None):
|
class ProfileWindow(Gtk.ApplicationWindow):
|
||||||
|
def __init__(self, account):
|
||||||
|
Gtk.ApplicationWindow.__init__(self)
|
||||||
|
self.set_application(app.app)
|
||||||
|
self.set_position(Gtk.WindowPosition.CENTER)
|
||||||
|
self.set_show_menubar(False)
|
||||||
|
self.set_title(_('Profile'))
|
||||||
|
|
||||||
|
self.connect('destroy', self.on_profile_window_destroy)
|
||||||
|
self.connect('key-press-event', self.on_profile_window_key_press_event)
|
||||||
|
|
||||||
self.xml = gtkgui_helpers.get_gtk_builder('profile_window.ui')
|
self.xml = gtkgui_helpers.get_gtk_builder('profile_window.ui')
|
||||||
self.window = self.xml.get_object('profile_window')
|
self.add(self.xml.get_object('profile_box'))
|
||||||
self.window.set_transient_for(transient_for)
|
|
||||||
self.progressbar = self.xml.get_object('progressbar')
|
self.progressbar = self.xml.get_object('progressbar')
|
||||||
self.statusbar = self.xml.get_object('statusbar')
|
self.statusbar = self.xml.get_object('statusbar')
|
||||||
self.context_id = self.statusbar.get_context_id('profile')
|
self.context_id = self.statusbar.get_context_id('profile')
|
||||||
|
|
||||||
self.account = account
|
self.account = account
|
||||||
self.jid = app.get_jid_from_account(account)
|
self.jid = app.get_jid_from_account(account)
|
||||||
account_label = app.config.get_per('accounts', account, 'account_label')
|
account_label = app.config.get_per(
|
||||||
|
'accounts', account, 'account_label')
|
||||||
self.set_value('account_label', account_label)
|
self.set_value('account_label', account_label)
|
||||||
|
|
||||||
self.dialog = None
|
self.dialog = None
|
||||||
|
@ -65,8 +68,8 @@ class ProfileWindow:
|
||||||
self.avatar_sha = None
|
self.avatar_sha = None
|
||||||
self.message_id = self.statusbar.push(self.context_id,
|
self.message_id = self.statusbar.push(self.context_id,
|
||||||
_('Retrieving profile…'))
|
_('Retrieving profile…'))
|
||||||
self.update_progressbar_timeout_id = GLib.timeout_add(100,
|
self.update_progressbar_timeout_id = GLib.timeout_add(
|
||||||
self.update_progressbar)
|
100, self.update_progressbar)
|
||||||
self.remove_statusbar_timeout_id = None
|
self.remove_statusbar_timeout_id = None
|
||||||
|
|
||||||
self.xml.connect_signals(self)
|
self.xml.connect_signals(self)
|
||||||
|
@ -74,7 +77,8 @@ class ProfileWindow:
|
||||||
self._nec_vcard_published)
|
self._nec_vcard_published)
|
||||||
app.ged.register_event_handler('vcard-not-published', ged.GUI1,
|
app.ged.register_event_handler('vcard-not-published', ged.GUI1,
|
||||||
self._nec_vcard_not_published)
|
self._nec_vcard_not_published)
|
||||||
self.window.show_all()
|
|
||||||
|
self.show_all()
|
||||||
self.xml.get_object('ok_button').grab_focus()
|
self.xml.get_object('ok_button').grab_focus()
|
||||||
app.connections[account].get_module('VCardTemp').request_vcard(
|
app.connections[account].get_module('VCardTemp').request_vcard(
|
||||||
self._nec_vcard_received, self.jid)
|
self._nec_vcard_received, self.jid)
|
||||||
|
@ -99,13 +103,13 @@ class ProfileWindow:
|
||||||
self._nec_vcard_published)
|
self._nec_vcard_published)
|
||||||
app.ged.remove_event_handler('vcard-not-published', ged.GUI1,
|
app.ged.remove_event_handler('vcard-not-published', ged.GUI1,
|
||||||
self._nec_vcard_not_published)
|
self._nec_vcard_not_published)
|
||||||
del app.interface.instances[self.account]['profile']
|
|
||||||
if self.dialog: # Image chooser dialog
|
if self.dialog: # Image chooser dialog
|
||||||
self.dialog.destroy()
|
self.dialog.destroy()
|
||||||
|
|
||||||
def on_profile_window_key_press_event(self, widget, event):
|
def on_profile_window_key_press_event(self, widget, event):
|
||||||
if event.keyval == Gdk.KEY_Escape:
|
if event.keyval == Gdk.KEY_Escape:
|
||||||
self.window.destroy()
|
self.destroy()
|
||||||
|
|
||||||
def _clear_photo(self, widget):
|
def _clear_photo(self, widget):
|
||||||
# empty the image
|
# empty the image
|
||||||
|
@ -124,10 +128,10 @@ class ProfileWindow:
|
||||||
sha = app.interface.save_avatar(path_to_file, publish=True)
|
sha = app.interface.save_avatar(path_to_file, publish=True)
|
||||||
if sha is None:
|
if sha is None:
|
||||||
dialogs.ErrorDialog(
|
dialogs.ErrorDialog(
|
||||||
_('Could not load image'), transient_for=self.window)
|
_('Could not load image'), transient_for=self)
|
||||||
return
|
return
|
||||||
|
|
||||||
scale = self.window.get_scale_factor()
|
scale = self.get_scale_factor()
|
||||||
surface = app.interface.get_avatar(sha, AvatarSize.VCARD, scale)
|
surface = app.interface.get_avatar(sha, AvatarSize.VCARD, scale)
|
||||||
|
|
||||||
button = self.xml.get_object('PHOTO_button')
|
button = self.xml.get_object('PHOTO_button')
|
||||||
|
@ -142,7 +146,7 @@ class ProfileWindow:
|
||||||
self.avatar_encoded = base64.b64encode(publish).decode('utf-8')
|
self.avatar_encoded = base64.b64encode(publish).decode('utf-8')
|
||||||
self.avatar_mime_type = 'image/png'
|
self.avatar_mime_type = 'image/png'
|
||||||
|
|
||||||
AvatarChooserDialog(on_ok, transient_for=self.window)
|
AvatarChooserDialog(on_ok, transient_for=self)
|
||||||
|
|
||||||
def on_PHOTO_button_press_event(self, widget, event):
|
def on_PHOTO_button_press_event(self, widget, event):
|
||||||
"""
|
"""
|
||||||
|
@ -178,7 +182,7 @@ class ProfileWindow:
|
||||||
if not widget.is_focus():
|
if not widget.is_focus():
|
||||||
pritext = _('Wrong date format')
|
pritext = _('Wrong date format')
|
||||||
dialogs.ErrorDialog(pritext, _('Format of the date must be '
|
dialogs.ErrorDialog(pritext, _('Format of the date must be '
|
||||||
'YYYY-MM-DD'), transient_for=self.window)
|
'YYYY-MM-DD'), transient_for=self)
|
||||||
GLib.idle_add(lambda: widget.grab_focus())
|
GLib.idle_add(lambda: widget.grab_focus())
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@ -212,7 +216,7 @@ class ProfileWindow:
|
||||||
if 'TYPE' in vcard_[i]:
|
if 'TYPE' in vcard_[i]:
|
||||||
self.avatar_mime_type = vcard_[i]['TYPE']
|
self.avatar_mime_type = vcard_[i]['TYPE']
|
||||||
|
|
||||||
scale = self.window.get_scale_factor()
|
scale = self.get_scale_factor()
|
||||||
surface = app.interface.get_avatar(
|
surface = app.interface.get_avatar(
|
||||||
self.avatar_sha, AvatarSize.VCARD, scale)
|
self.avatar_sha, AvatarSize.VCARD, scale)
|
||||||
if surface is None:
|
if surface is None:
|
||||||
|
@ -319,7 +323,7 @@ class ProfileWindow:
|
||||||
if app.connections[self.account].connected < 2:
|
if app.connections[self.account].connected < 2:
|
||||||
dialogs.ErrorDialog(_('You are not connected to the server'),
|
dialogs.ErrorDialog(_('You are not connected to the server'),
|
||||||
_('Without a connection, you can not publish your contact '
|
_('Without a connection, you can not publish your contact '
|
||||||
'information.'), transient_for=self.window)
|
'information.'), transient_for=self)
|
||||||
return
|
return
|
||||||
vcard_, sha = self.make_vcard()
|
vcard_, sha = self.make_vcard()
|
||||||
nick = ''
|
nick = ''
|
||||||
|
@ -344,7 +348,7 @@ class ProfileWindow:
|
||||||
if self.update_progressbar_timeout_id is not None:
|
if self.update_progressbar_timeout_id is not None:
|
||||||
GLib.source_remove(self.update_progressbar_timeout_id)
|
GLib.source_remove(self.update_progressbar_timeout_id)
|
||||||
self.update_progressbar_timeout_id = None
|
self.update_progressbar_timeout_id = None
|
||||||
self.window.destroy()
|
self.destroy()
|
||||||
|
|
||||||
def _nec_vcard_not_published(self, obj):
|
def _nec_vcard_not_published(self, obj):
|
||||||
if obj.conn.name != self.account:
|
if obj.conn.name != self.account:
|
||||||
|
@ -361,7 +365,7 @@ class ProfileWindow:
|
||||||
self.update_progressbar_timeout_id = None
|
self.update_progressbar_timeout_id = None
|
||||||
dialogs.InformationDialog(_('vCard publication failed'),
|
dialogs.InformationDialog(_('vCard publication failed'),
|
||||||
_('There was an error while publishing your personal information, '
|
_('There was an error while publishing your personal information, '
|
||||||
'try again later.'), transient_for=self.window)
|
'try again later.'), transient_for=self)
|
||||||
|
|
||||||
def on_cancel_button_clicked(self, widget):
|
def on_cancel_button_clicked(self, widget):
|
||||||
self.window.destroy()
|
self.destroy()
|
||||||
|
|
Loading…
Reference in New Issue